@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
package/src/media/media-pane.ts
CHANGED
|
@@ -29,9 +29,16 @@
|
|
|
29
29
|
|
|
30
30
|
import { effect, effectScope } from "../reactivity";
|
|
31
31
|
import { paneRegion } from "../ui/regions";
|
|
32
|
+
import { localDay } from "../utils/local-day";
|
|
32
33
|
import { mediaSiteUrl, previewFileSrc } from "../files/media-paths";
|
|
33
|
-
import {
|
|
34
|
-
|
|
34
|
+
import {
|
|
35
|
+
formatBytes,
|
|
36
|
+
loadMediaMeta,
|
|
37
|
+
mediaMetaSettled,
|
|
38
|
+
peekMediaMeta,
|
|
39
|
+
recordImageSize,
|
|
40
|
+
} from "../files/media-meta";
|
|
41
|
+
import { FONT_EXTENSIONS, extensionOf, mediaKind } from "../files/media-upload";
|
|
35
42
|
import { loadMediaUsages, mediaUsageHeadline, peekMediaUsages } from "../files/media-usage";
|
|
36
43
|
import { mountMediaSurface } from "../surfaces/media-pane";
|
|
37
44
|
import type { MediaStage, MediaSurfaceHandle, MediaView } from "../surfaces/media-pane";
|
|
@@ -43,9 +50,6 @@ import type { CanvasSurface } from "../canvas/canvas-surface";
|
|
|
43
50
|
/** The `canvasMode` the media viewer draws under. */
|
|
44
51
|
export const MEDIA_MODE = "media";
|
|
45
52
|
|
|
46
|
-
/** Extensions the viewer renders as a font specimen rather than as a file it cannot show. */
|
|
47
|
-
const FONT_EXTENSIONS = new Set([".woff", ".woff2", ".ttf", ".otf"]);
|
|
48
|
-
|
|
49
53
|
/** The pangram the font specimen is set in — short, and every letter of the alphabet once. */
|
|
50
54
|
const SPECIMEN = "The quick brown fox jumps over the lazy dog";
|
|
51
55
|
|
|
@@ -97,9 +101,11 @@ export function detachMediaPane(paneId: string): void {
|
|
|
97
101
|
* Which element the stage should draw this file in.
|
|
98
102
|
*
|
|
99
103
|
* A font is decided by extension before anything else: `mediaKind` calls a `.woff2` a plain file,
|
|
100
|
-
* and a file the browser cannot render is the last answer here rather than the first.
|
|
104
|
+
* and a file the browser cannot render is the last answer here rather than the first. Exported
|
|
105
|
+
* because the Media workspace's detail pane (`media/media-library.ts`) asks the same question, and
|
|
106
|
+
* two answers to it would drift.
|
|
101
107
|
*/
|
|
102
|
-
function
|
|
108
|
+
export function mediaStageFor(path: string): MediaStage {
|
|
103
109
|
const ext = extensionOf(path);
|
|
104
110
|
if (FONT_EXTENSIONS.has(ext)) {
|
|
105
111
|
return "font";
|
|
@@ -112,7 +118,7 @@ function stageFor(path: string): MediaStage {
|
|
|
112
118
|
}
|
|
113
119
|
|
|
114
120
|
/** Kind, dimensions, size and modified time — each omitted rather than zeroed when unknown. */
|
|
115
|
-
function factsLine(path: string, meta: MediaMeta | null): string {
|
|
121
|
+
export function factsLine(path: string, meta: MediaMeta | null): string {
|
|
116
122
|
const facts: string[] = [mediaKind({ name: path })];
|
|
117
123
|
if (meta?.width != null && meta.height != null) {
|
|
118
124
|
facts.push(`${meta.width} × ${meta.height}`);
|
|
@@ -121,7 +127,8 @@ function factsLine(path: string, meta: MediaMeta | null): string {
|
|
|
121
127
|
facts.push(formatBytes(meta.bytes));
|
|
122
128
|
}
|
|
123
129
|
if (meta?.modified) {
|
|
124
|
-
|
|
130
|
+
// The local day it was modified on (`utils/local-day.ts`), not the UTC one.
|
|
131
|
+
facts.push(`modified ${localDay(new Date(meta.modified))}`);
|
|
125
132
|
}
|
|
126
133
|
return facts.join(" · ");
|
|
127
134
|
}
|
|
@@ -131,8 +138,30 @@ function specimenFamily(path: string): string {
|
|
|
131
138
|
return `jx-specimen-${path.replaceAll(/[^a-zA-Z0-9]/g, "-")}`;
|
|
132
139
|
}
|
|
133
140
|
|
|
141
|
+
/** What a font specimen draws: its scoped face, the custom property naming it, and the pangram. */
|
|
142
|
+
export interface FontSpecimen {
|
|
143
|
+
/** A `@font-face` rule for the generated family, loading the file from its preview src. */
|
|
144
|
+
fontFace: string;
|
|
145
|
+
/** `--jx-specimen-family: "<family>"`, the one inline declaration a specimen element carries. */
|
|
146
|
+
specimenFamily: string;
|
|
147
|
+
specimen: string;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* The specimen for a font file, shared by the viewer and the Media workspace's detail pane, so a
|
|
152
|
+
* font is shown by being USED in both and the face is scoped the same way in both.
|
|
153
|
+
*/
|
|
154
|
+
export function specimenOf(path: string): FontSpecimen {
|
|
155
|
+
const family = specimenFamily(path);
|
|
156
|
+
return {
|
|
157
|
+
fontFace: `@font-face { font-family: "${family}"; src: url("${previewFileSrc(path)}"); }`,
|
|
158
|
+
specimen: SPECIMEN,
|
|
159
|
+
specimenFamily: `--jx-specimen-family: "${family}"`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
134
163
|
/** Which documents reference this file, or the honest reason there is no list. */
|
|
135
|
-
function usageOf(
|
|
164
|
+
export function usageOf(
|
|
136
165
|
usage: UsageState | null,
|
|
137
166
|
): Pick<MediaView, "usageState" | "usageHeadline" | "usageFiles"> {
|
|
138
167
|
const headline = mediaUsageHeadline(usage);
|
|
@@ -179,11 +208,10 @@ export function renderMediaMode(surface: CanvasSurface, tab: Tab): void {
|
|
|
179
208
|
detachMediaPane(paneId);
|
|
180
209
|
|
|
181
210
|
const path = tab.documentPath ?? "";
|
|
182
|
-
const family = specimenFamily(path);
|
|
183
211
|
const src = previewFileSrc(path);
|
|
184
212
|
const ref = mediaSiteUrl(path);
|
|
185
213
|
const ext = extensionOf(path);
|
|
186
|
-
const kind =
|
|
214
|
+
const kind = mediaStageFor(path);
|
|
187
215
|
|
|
188
216
|
let panel: ActiveMediaPane | null = null;
|
|
189
217
|
const redraw = () => {
|
|
@@ -197,25 +225,25 @@ export function renderMediaMode(surface: CanvasSurface, tab: Tab): void {
|
|
|
197
225
|
const usage = peekMediaUsages(path);
|
|
198
226
|
/* Asked on the first paint that finds it missing, never on every paint: both loaders cache and
|
|
199
227
|
de-duplicate in flight, and both repaint through `redraw` when they land. */
|
|
200
|
-
if (
|
|
228
|
+
if (!mediaMetaSettled(path)) {
|
|
201
229
|
void loadMediaMeta(path).then(redraw);
|
|
202
230
|
}
|
|
203
231
|
if (usage === null || usage.status === "pending") {
|
|
204
232
|
void loadMediaUsages(path).then(redraw);
|
|
205
233
|
}
|
|
234
|
+
/* The face is scoped to the generated family name, so two specimens open side by side cannot
|
|
235
|
+
claim the same one. Written only for a font: every other stage carries an empty sheet. */
|
|
236
|
+
const specimen = specimenOf(path);
|
|
206
237
|
return {
|
|
207
238
|
extLabel: ext || "this file",
|
|
208
239
|
facts: factsLine(path, meta),
|
|
209
|
-
|
|
210
|
-
claim the same one. Written only for a font: every other stage carries an empty sheet. */
|
|
211
|
-
fontFace:
|
|
212
|
-
kind === "font" ? `@font-face { font-family: "${family}"; src: url("${src}"); }` : "",
|
|
240
|
+
fontFace: kind === "font" ? specimen.fontFace : "",
|
|
213
241
|
kind,
|
|
214
242
|
name: path.split("/").pop() ?? "",
|
|
215
243
|
ref,
|
|
216
244
|
region: paneRegion(paneId, "media"),
|
|
217
|
-
specimen:
|
|
218
|
-
specimenFamily:
|
|
245
|
+
specimen: specimen.specimen,
|
|
246
|
+
specimenFamily: specimen.specimenFamily,
|
|
219
247
|
src,
|
|
220
248
|
...usageOf(usage),
|
|
221
249
|
};
|
|
@@ -228,7 +256,10 @@ export function renderMediaMode(surface: CanvasSurface, tab: Tab): void {
|
|
|
228
256
|
const scope = effectScope();
|
|
229
257
|
const mounted = mountMediaSurface(canvasWrap, view(), {
|
|
230
258
|
copyRef: () => {
|
|
231
|
-
|
|
259
|
+
// `navigator.clipboard` is [SecureContext]: a plain-http host has none, whatever lib.dom says.
|
|
260
|
+
if ("clipboard" in navigator) {
|
|
261
|
+
void navigator.clipboard.writeText(ref);
|
|
262
|
+
}
|
|
232
263
|
},
|
|
233
264
|
imageLoaded: (width, height) => {
|
|
234
265
|
/* The only honest source of pixel dimensions in a browser is an image that has loaded, and
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
import { actIfRequired } from "../account/action-flow";
|
|
37
37
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
38
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
38
39
|
import {
|
|
39
40
|
getAccountStatus,
|
|
40
41
|
getRepoAccessLinks,
|
|
@@ -90,7 +91,7 @@ let _resolve: ((result: { root: string } | null) => void) | null = null;
|
|
|
90
91
|
/** True when the active platform can browse + adopt existing repositories. */
|
|
91
92
|
export function platformSupportsAddRepo(): boolean {
|
|
92
93
|
const platform = getPlatform();
|
|
93
|
-
return
|
|
94
|
+
return isFunction(platform.listRepos) && isFunction(platform.importProject);
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
/** True when the active platform routes Open Project through this repo picker. */
|
|
@@ -207,7 +208,7 @@ function loadRepos(): void {
|
|
|
207
208
|
requestScan(_selected, "now");
|
|
208
209
|
}
|
|
209
210
|
})
|
|
210
|
-
.catch((error
|
|
211
|
+
.catch((error) => {
|
|
211
212
|
_repos = [];
|
|
212
213
|
_error = errorMessage(error);
|
|
213
214
|
})
|
|
@@ -492,11 +493,8 @@ async function adopt(fullName: string, dir: string, retried = false): Promise<vo
|
|
|
492
493
|
_error = "";
|
|
493
494
|
redraw();
|
|
494
495
|
try {
|
|
495
|
-
const
|
|
496
|
-
|
|
497
|
-
owner: repo.owner,
|
|
498
|
-
...(dir ? { dir } : {}),
|
|
499
|
-
});
|
|
496
|
+
const request = { name: repo.name, owner: repo.owner };
|
|
497
|
+
const imported = await getPlatform().importProject?.(dir ? { ...request, dir } : request);
|
|
500
498
|
if (_handle !== handle) {
|
|
501
499
|
return;
|
|
502
500
|
}
|
|
@@ -604,13 +602,16 @@ function accessOf(): AddRepoView["access"] {
|
|
|
604
602
|
];
|
|
605
603
|
}
|
|
606
604
|
|
|
607
|
-
/** The chosen repository's pane
|
|
608
|
-
|
|
605
|
+
/** The chosen repository's pane, plus the branch it is read at. */
|
|
606
|
+
interface RepoDetail extends Pick<
|
|
609
607
|
AddRepoView,
|
|
610
608
|
"detailState" | "detailName" | "detailMeta" | "locations" | "folderHelp"
|
|
611
|
-
>
|
|
609
|
+
> {
|
|
612
610
|
branch: string;
|
|
613
|
-
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/** The chosen repository's pane: its state, its rows, and the sentence under the folder field. */
|
|
614
|
+
function detailOf(repo: RepoInfo | undefined): RepoDetail {
|
|
614
615
|
if (!repo) {
|
|
615
616
|
return {
|
|
616
617
|
branch: "",
|
|
@@ -623,12 +624,13 @@ function detailOf(repo: RepoInfo | undefined): Pick<
|
|
|
623
624
|
}
|
|
624
625
|
const scanned = _scans.get(repo.fullName);
|
|
625
626
|
const branch = scanned?.status === "done" ? scanned.projects.branch : repo.defaultBranch;
|
|
627
|
+
const noLocations: AddRepoLocation[] = [];
|
|
626
628
|
const base = {
|
|
627
629
|
branch,
|
|
628
630
|
detailMeta: [branch, repo.permission, ...(repo.private ? ["private"] : [])].join(" · "),
|
|
629
631
|
detailName: repo.fullName,
|
|
630
632
|
folderHelp: "The folder that holds project.json. Leave it empty for the repository root.",
|
|
631
|
-
locations:
|
|
633
|
+
locations: noLocations,
|
|
632
634
|
};
|
|
633
635
|
if (!getPlatform().listRepoProjects) {
|
|
634
636
|
return { ...base, detailState: "unlisted" };
|
|
@@ -640,17 +642,16 @@ function detailOf(repo: RepoInfo | undefined): Pick<
|
|
|
640
642
|
return { ...base, detailState: "failed" };
|
|
641
643
|
}
|
|
642
644
|
const { locations, truncated } = scanned.projects;
|
|
643
|
-
|
|
645
|
+
const detail: RepoDetail = {
|
|
644
646
|
...base,
|
|
645
647
|
detailState: locations.length > 0 ? "listed" : "empty",
|
|
646
|
-
...(truncated
|
|
647
|
-
? {
|
|
648
|
-
folderHelp:
|
|
649
|
-
"This repository is too large to scan in full. Name the folder if its project isn't listed.",
|
|
650
|
-
}
|
|
651
|
-
: {}),
|
|
652
648
|
locations: locations.map((location) => locationOf(location, repo)),
|
|
653
649
|
};
|
|
650
|
+
if (truncated) {
|
|
651
|
+
detail.folderHelp =
|
|
652
|
+
"This repository is too large to scan in full. Name the folder if its project isn't listed.";
|
|
653
|
+
}
|
|
654
|
+
return detail;
|
|
654
655
|
}
|
|
655
656
|
|
|
656
657
|
/** Everything the dialog draws, as one record. The only place this module's state becomes a view. */
|
|
@@ -25,7 +25,9 @@ import { createModelPicker } from "../ui/ai-model-picker";
|
|
|
25
25
|
import { destinationPath } from "./location-fields";
|
|
26
26
|
import type { CreateProjectDestination, ImportBreakpointPolicy } from "../types";
|
|
27
27
|
|
|
28
|
-
import {
|
|
28
|
+
import { IMPORT_MAX_BREAKPOINTS } from "@jxsuite/protocol";
|
|
29
|
+
|
|
30
|
+
import { MAX_IMPORT_DEPTH, setPendingImportBrief } from "../services/import-seed";
|
|
29
31
|
import type { ImportBrief } from "../services/import-seed";
|
|
30
32
|
|
|
31
33
|
/** The three answers the Breakpoints control offers. */
|
|
@@ -34,17 +36,6 @@ type BreakpointMode = "all" | "limit" | "explicit";
|
|
|
34
36
|
/** How a kept width matches one the site declared. */
|
|
35
37
|
type BreakpointRounding = "nearest" | "down" | "up";
|
|
36
38
|
|
|
37
|
-
/** The most breakpoints the control will offer to keep — `@jxsuite/import`'s own ceiling. */
|
|
38
|
-
const MAX_BREAKPOINTS = 12;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* The deepest crawl the pipeline accepts.
|
|
42
|
-
*
|
|
43
|
-
* The field said 2 while `import_site` and the endpoint both clamped to 5, so the wizard could not
|
|
44
|
-
* ask for a depth the backend was willing to run.
|
|
45
|
-
*/
|
|
46
|
-
const MAX_DEPTH = 5;
|
|
47
|
-
|
|
48
39
|
export interface ImportTabCtx {
|
|
49
40
|
/** The wizard's shared name/directory state (the import destination slug). */
|
|
50
41
|
form: { name: string; directory: string };
|
|
@@ -383,8 +374,8 @@ export function importView(ctx: ImportTabCtx): ImportView {
|
|
|
383
374
|
canVerify: canVerify(),
|
|
384
375
|
depth: String(_depth),
|
|
385
376
|
error: _errorMsg,
|
|
386
|
-
maxBreakpoints: String(
|
|
387
|
-
maxDepth: String(
|
|
377
|
+
maxBreakpoints: String(IMPORT_MAX_BREAKPOINTS),
|
|
378
|
+
maxDepth: String(MAX_IMPORT_DEPTH),
|
|
388
379
|
maxPages: String(_maxPages),
|
|
389
380
|
minFidelity: String(_minFidelity),
|
|
390
381
|
prompt: _prompt,
|
|
@@ -438,6 +429,8 @@ export function setImportMaxPages(value: string): void {
|
|
|
438
429
|
|
|
439
430
|
/** Which of the three breakpoint answers the reader chose. */
|
|
440
431
|
export function setBreakpointMode(value: string): void {
|
|
432
|
+
/* SAFETY: Studio's one caller is the `bp-mode` select's change handler (surfaces/new-project.json),
|
|
433
|
+
and that select's options are `importView().breakpointModes`: "limit", "explicit" and "all". */
|
|
441
434
|
_breakpointMode = value as BreakpointMode;
|
|
442
435
|
}
|
|
443
436
|
|
|
@@ -453,6 +446,9 @@ export function setBreakpointWidths(value: string): void {
|
|
|
453
446
|
|
|
454
447
|
/** Which declared width backs a kept one. */
|
|
455
448
|
export function setBreakpointRounding(value: string): void {
|
|
449
|
+
/* SAFETY: Studio's one caller is the `bp-rounding` select's change handler (surfaces/
|
|
450
|
+
new-project.json), and that select's options are `importView().roundings`: "nearest", "down"
|
|
451
|
+
and "up". */
|
|
456
452
|
_breakpointRounding = value as BreakpointRounding;
|
|
457
453
|
}
|
|
458
454
|
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
25
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
25
26
|
import { getPlatform } from "../platform";
|
|
26
27
|
import type { CreateProjectDestination, RepoInfo } from "../types";
|
|
27
28
|
|
|
@@ -211,7 +212,7 @@ export function locationView(slug: string): LocationView {
|
|
|
211
212
|
return {
|
|
212
213
|
browseLabel: _browsing ? "Choosing…" : "Browse…",
|
|
213
214
|
browsing: _browsing,
|
|
214
|
-
canBrowse:
|
|
215
|
+
canBrowse: isFunction(platform.pickDirectory),
|
|
215
216
|
destination: isRepo ? "repo" : "path",
|
|
216
217
|
error: _error,
|
|
217
218
|
owner: _owner,
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
42
42
|
import { layerHost } from "../ui/layers";
|
|
43
43
|
import { enumArg, enumProperty } from "../commands/command-args";
|
|
44
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
44
45
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
45
46
|
import { getPlatform } from "../platform";
|
|
46
47
|
import { installUrlOf } from "../platform-errors";
|
|
@@ -118,9 +119,9 @@ let _nameError = "";
|
|
|
118
119
|
/** GitHub-App install link carried by a structured needs_installation_access failure. */
|
|
119
120
|
let _errorInstallUrl = "";
|
|
120
121
|
|
|
121
|
-
function captureError(
|
|
122
|
-
_error = errorMessage(
|
|
123
|
-
_errorInstallUrl = installUrlOf(
|
|
122
|
+
function captureError(cause: unknown) {
|
|
123
|
+
_error = errorMessage(cause);
|
|
124
|
+
_errorInstallUrl = installUrlOf(cause) ?? "";
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
let _creating = false;
|
|
@@ -244,6 +245,8 @@ export function openNewProjectModal(options?: { tab?: NewProjectTab }): Promise<
|
|
|
244
245
|
if (_creating) {
|
|
245
246
|
return;
|
|
246
247
|
}
|
|
248
|
+
/* SAFETY: `value` is the selected `jx-tab`'s value, and the strip renders one tab per
|
|
249
|
+
`viewOf().tabs` entry, whose values are "starter", "import" and "agent". */
|
|
247
250
|
_tab = value as NewProjectTab;
|
|
248
251
|
_error = "";
|
|
249
252
|
redraw();
|
|
@@ -348,10 +351,10 @@ async function finishCreated(result: { root: string; config: ProjectConfig }) {
|
|
|
348
351
|
getTab: () => null,
|
|
349
352
|
});
|
|
350
353
|
if (!adopted && !openedElsewhere) {
|
|
351
|
-
notify.warn(
|
|
352
|
-
|
|
353
|
-
source: "New Project",
|
|
354
|
-
|
|
354
|
+
notify.warn(
|
|
355
|
+
"Created the project, but could not open it here.",
|
|
356
|
+
error === null ? { source: "New Project" } : { detail: error, source: "New Project" },
|
|
357
|
+
);
|
|
355
358
|
}
|
|
356
359
|
finish(result);
|
|
357
360
|
}
|
|
@@ -708,9 +711,9 @@ export function newProjectCommands(): AnyCommand[] {
|
|
|
708
711
|
group: "1_file",
|
|
709
712
|
/* No `aiTool`: application-level, refused at registration; it opens the wizard, and the
|
|
710
713
|
model's own door is `create_project` / `import_site` (studio-ui-guidelines.md §12.4). */
|
|
711
|
-
run: (_commandCtx, args) => {
|
|
714
|
+
run: (_commandCtx, args: CommandArgValues) => {
|
|
712
715
|
const tab =
|
|
713
|
-
|
|
716
|
+
args.tab === undefined
|
|
714
717
|
? undefined
|
|
715
718
|
: enumArg("project.new", args, "tab", NEW_PROJECT_TABS);
|
|
716
719
|
void openNewProjectModal(tab === undefined ? {} : { tab });
|
|
@@ -29,9 +29,10 @@ import { openJxsuiteUpdateSurface } from "../surfaces/jxsuite-update";
|
|
|
29
29
|
import { showProgressModal } from "../ui/progress-modal";
|
|
30
30
|
import { notify } from "../services/notify";
|
|
31
31
|
import { isUpgrade } from "./semver";
|
|
32
|
-
import type {
|
|
32
|
+
import type { DialogLayerHandle } from "../ui/surface";
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
/** The npm scope every first-party package is published under. */
|
|
35
|
+
export const JXSUITE_PREFIX = "@jxsuite/";
|
|
35
36
|
|
|
36
37
|
export interface JxsuiteUpdate {
|
|
37
38
|
name: string;
|
|
@@ -170,7 +171,7 @@ function askToUpdate(outdated: JxsuiteUpdate[]): Promise<boolean> {
|
|
|
170
171
|
closing = true;
|
|
171
172
|
handle.close();
|
|
172
173
|
};
|
|
173
|
-
const handle:
|
|
174
|
+
const handle: DialogLayerHandle = openJxsuiteUpdateSurface({
|
|
174
175
|
layer: layerHost("dialog"),
|
|
175
176
|
onCancel: () => {
|
|
176
177
|
takeDown();
|
|
@@ -10,11 +10,13 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
13
|
+
import { isJsonObject } from "@jxsuite/schema/guards";
|
|
14
|
+
import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
|
|
13
15
|
import { getPlatform } from "../platform";
|
|
14
16
|
import { showConfirmDialog } from "../ui/layers";
|
|
15
17
|
import { showProgressModal } from "../ui/progress-modal";
|
|
16
18
|
import { notify } from "../services/notify";
|
|
17
|
-
import { applyJxsuiteUpdate, checkJxsuiteUpdate } from "./jxsuite-update";
|
|
19
|
+
import { JXSUITE_PREFIX, applyJxsuiteUpdate, checkJxsuiteUpdate } from "./jxsuite-update";
|
|
18
20
|
import type { GitStatusResult } from "../types";
|
|
19
21
|
|
|
20
22
|
const PKG_PATHS = ["package.json", "bun.lock", "bun.lockb"];
|
|
@@ -29,20 +31,16 @@ const UNTRACKED_STATUSES = new Set(["??", "U"]);
|
|
|
29
31
|
/** Above this many dirty files, skip the per-file upstream comparison and leave the error as-is. */
|
|
30
32
|
const MAX_CONFLICT_SCAN = 25;
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
35
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function sortKeys(value: unknown): unknown {
|
|
34
|
+
/** A copy of a JSON value with every object's keys in sorted order, so equal data prints equal. */
|
|
35
|
+
function sortKeys(value: JsonValue): JsonValue {
|
|
39
36
|
if (Array.isArray(value)) {
|
|
40
37
|
return value.map((entry) => sortKeys(entry));
|
|
41
38
|
}
|
|
42
|
-
if (
|
|
43
|
-
const out:
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
if (isJsonObject(value)) {
|
|
40
|
+
const out: JsonObject = {};
|
|
41
|
+
// Keys are unique, so the comparator never sees a tie; `<` is the default sort's code-unit order.
|
|
42
|
+
for (const [key, entry] of Object.entries(value).toSorted(([a], [b]) => (a < b ? -1 : 1))) {
|
|
43
|
+
out[key] = sortKeys(entry);
|
|
46
44
|
}
|
|
47
45
|
return out;
|
|
48
46
|
}
|
|
@@ -50,11 +48,11 @@ function sortKeys(value: unknown): unknown {
|
|
|
50
48
|
}
|
|
51
49
|
|
|
52
50
|
/** Replace every @jxsuite/* version in dependencies/devDependencies so they compare equal. */
|
|
53
|
-
function maskJxsuiteVersions(pkg:
|
|
51
|
+
function maskJxsuiteVersions(pkg: JsonObject): JsonObject {
|
|
54
52
|
const out = { ...pkg };
|
|
55
53
|
for (const section of ["dependencies", "devDependencies"]) {
|
|
56
54
|
const deps = out[section];
|
|
57
|
-
if (!
|
|
55
|
+
if (!isJsonObject(deps)) {
|
|
58
56
|
continue;
|
|
59
57
|
}
|
|
60
58
|
const masked = { ...deps };
|
|
@@ -88,7 +86,7 @@ export function isAutomatedPackageDiff(
|
|
|
88
86
|
} catch {
|
|
89
87
|
return false;
|
|
90
88
|
}
|
|
91
|
-
if (!
|
|
89
|
+
if (!isJsonObject(head) || !isJsonObject(working)) {
|
|
92
90
|
return false;
|
|
93
91
|
}
|
|
94
92
|
return (
|
|
@@ -251,20 +249,20 @@ async function discardPullAndSync(plan: PackagePullPlan): Promise<void> {
|
|
|
251
249
|
await syncPackagesAfterPull();
|
|
252
250
|
}
|
|
253
251
|
|
|
254
|
-
async function recoverAfterFailedPull(
|
|
252
|
+
async function recoverAfterFailedPull(cause: unknown): Promise<void> {
|
|
255
253
|
const platform = getPlatform();
|
|
256
254
|
let status: GitStatusResult;
|
|
257
255
|
try {
|
|
258
256
|
status = await platform.gitStatus();
|
|
259
257
|
} catch {
|
|
260
|
-
throw
|
|
258
|
+
throw cause;
|
|
261
259
|
}
|
|
262
260
|
if (!(status.behind > 0)) {
|
|
263
|
-
throw
|
|
261
|
+
throw cause;
|
|
264
262
|
}
|
|
265
263
|
const plan = await planPackageDiscard(status);
|
|
266
264
|
if (planIsEmpty(plan) || (await otherFilesConflict(status))) {
|
|
267
|
-
throw
|
|
265
|
+
throw cause;
|
|
268
266
|
}
|
|
269
267
|
if (!plan.automated) {
|
|
270
268
|
const confirmed = await showConfirmDialog(
|
|
@@ -273,7 +271,7 @@ async function recoverAfterFailedPull(original: unknown): Promise<void> {
|
|
|
273
271
|
{ confirmLabel: "Discard and pull", destructive: true },
|
|
274
272
|
);
|
|
275
273
|
if (!confirmed) {
|
|
276
|
-
throw
|
|
274
|
+
throw cause;
|
|
277
275
|
}
|
|
278
276
|
}
|
|
279
277
|
await discardPullAndSync(plan);
|
|
@@ -346,15 +344,18 @@ export async function pullWithPackageSync(): Promise<void> {
|
|
|
346
344
|
*/
|
|
347
345
|
export async function autoSyncProjectOnOpen(): Promise<void> {
|
|
348
346
|
const platform = getPlatform();
|
|
349
|
-
let status: GitStatusResult;
|
|
350
347
|
try {
|
|
351
|
-
status
|
|
348
|
+
/* The status is host wire data. A host may leave `remotes` out (as `deploy-checklist.ts` and
|
|
349
|
+
`publish-changes.ts` also allow), which reads as "nothing to sync"; a host that sends no status at
|
|
350
|
+
all throws on the first read and is caught below the same way, so a malformed status never
|
|
351
|
+
aborts the project open that awaits this. */
|
|
352
|
+
const status = await platform.gitStatus();
|
|
353
|
+
if (!status.isRepo || !Array.isArray(status.remotes) || status.remotes.length === 0) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
352
356
|
} catch {
|
|
353
357
|
return;
|
|
354
358
|
}
|
|
355
|
-
if (!status?.isRepo || (status.remotes?.length ?? 0) === 0) {
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
359
|
notify.info("Syncing project…", { key: "project.sync", source: "Source Control" });
|
|
359
360
|
try {
|
|
360
361
|
await pullWithPackageSync();
|