@jxsuite/studio 6.1.0 → 6.1.2
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/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -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-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- 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/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- 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 +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- 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/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -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/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- 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 +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- 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 +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- 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 +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- 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 +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- 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 +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- 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 +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- 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 +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- 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 +18 -12
- 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 +8 -7
- 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 +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- 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.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- 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/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- 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/git-panel.ts +7 -15
- 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.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -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.ts +5 -6
- 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.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -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.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- 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.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- 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 +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- 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 +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- 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 +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- 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/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 +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.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-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.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-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.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-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -1,21 +1,91 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
CemParameter,
|
|
4
|
+
JxElementTagName,
|
|
5
|
+
JxMutableNode,
|
|
6
|
+
JxStateDefinition,
|
|
7
|
+
JxStateObject,
|
|
8
|
+
JsonValue,
|
|
9
|
+
} from "@jxsuite/schema/types";
|
|
3
10
|
import {
|
|
4
11
|
displayTagName,
|
|
5
12
|
isFunctionDef,
|
|
6
13
|
isJsonObject,
|
|
7
14
|
isPrivateStateKey,
|
|
15
|
+
isString,
|
|
8
16
|
} from "@jxsuite/schema/guards";
|
|
9
17
|
|
|
18
|
+
/** A CEM `{ text }` type reference. */
|
|
19
|
+
interface CemTypeText {
|
|
20
|
+
text: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** A CEM class member: a `method` (function entry) or a `field` (signal / type def). */
|
|
24
|
+
interface CemMember {
|
|
25
|
+
kind: "method" | "field";
|
|
26
|
+
name: string;
|
|
27
|
+
type?: CemTypeText;
|
|
28
|
+
default?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
parameters?: CemParameter[];
|
|
31
|
+
attribute?: string;
|
|
32
|
+
reflects?: true;
|
|
33
|
+
deprecated?: string | true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** A CEM attribute linked to a field. */
|
|
37
|
+
interface CemAttribute {
|
|
38
|
+
name: string;
|
|
39
|
+
type?: CemTypeText;
|
|
40
|
+
fieldName: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A CEM event a method dispatches. */
|
|
44
|
+
interface CemManifestEvent {
|
|
45
|
+
name: string;
|
|
46
|
+
type?: JsonValue;
|
|
47
|
+
description?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** A CEM slot; the default slot has an empty name. */
|
|
51
|
+
interface CemSlot {
|
|
52
|
+
name: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** A CEM CSS custom property. */
|
|
57
|
+
interface CemCssProperty {
|
|
58
|
+
default: string;
|
|
59
|
+
name: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** A CEM CSS part. */
|
|
63
|
+
interface CemCssPart {
|
|
64
|
+
name: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The single custom-element class declaration the manifest exports. */
|
|
68
|
+
interface CemClassDeclaration {
|
|
69
|
+
kind: "class";
|
|
70
|
+
members: CemMember[];
|
|
71
|
+
name: JxElementTagName;
|
|
72
|
+
tagName: JxElementTagName;
|
|
73
|
+
attributes?: CemAttribute[];
|
|
74
|
+
events?: CemManifestEvent[];
|
|
75
|
+
slots?: CemSlot[];
|
|
76
|
+
cssProperties?: CemCssProperty[];
|
|
77
|
+
cssParts?: CemCssPart[];
|
|
78
|
+
}
|
|
79
|
+
|
|
10
80
|
/** Collect slot elements from the document tree. Whitespace-only names count as unnamed. */
|
|
11
81
|
export function collectSlots(node?: JxMutableNode | null, slots: string[] = []) {
|
|
12
82
|
if (node?.tagName === "slot") {
|
|
13
83
|
const name = node.attributes?.name;
|
|
14
|
-
slots.push(
|
|
84
|
+
slots.push(isString(name) ? name.trim() : "");
|
|
15
85
|
}
|
|
16
86
|
if (Array.isArray(node?.children)) {
|
|
17
87
|
for (const c of node.children) {
|
|
18
|
-
collectSlots(
|
|
88
|
+
collectSlots(isString(c) ? undefined : c, slots);
|
|
19
89
|
}
|
|
20
90
|
}
|
|
21
91
|
return slots;
|
|
@@ -47,7 +117,7 @@ export function validateComponentSlots(doc: JxMutableNode): string | null {
|
|
|
47
117
|
*
|
|
48
118
|
* @param {{ document: JxMutableNode }} S - Studio state
|
|
49
119
|
* @param {{
|
|
50
|
-
* defCategory: (d:
|
|
120
|
+
* defCategory: (d: JxStateDefinition) => string;
|
|
51
121
|
* normParam: (p: string | CemParameter) => CemParameter;
|
|
52
122
|
* collectCssParts: (node: JxMutableNode) => { name: string }[];
|
|
53
123
|
* }} helpers
|
|
@@ -55,7 +125,7 @@ export function validateComponentSlots(doc: JxMutableNode): string | null {
|
|
|
55
125
|
export function exportCemManifest(
|
|
56
126
|
S: { document: JxMutableNode },
|
|
57
127
|
helpers: {
|
|
58
|
-
defCategory: (d:
|
|
128
|
+
defCategory: (d: JxStateDefinition) => string;
|
|
59
129
|
normParam: (p: string | CemParameter) => CemParameter;
|
|
60
130
|
collectCssParts: (node: JxMutableNode) => { name: string }[];
|
|
61
131
|
},
|
|
@@ -68,9 +138,9 @@ export function exportCemManifest(
|
|
|
68
138
|
}
|
|
69
139
|
|
|
70
140
|
const state = doc.state || {};
|
|
71
|
-
const members:
|
|
72
|
-
const attributes:
|
|
73
|
-
const events:
|
|
141
|
+
const members: CemMember[] = [];
|
|
142
|
+
const attributes: CemAttribute[] = [];
|
|
143
|
+
const events: CemManifestEvent[] = [];
|
|
74
144
|
const seenEvents = new Set<string>();
|
|
75
145
|
|
|
76
146
|
for (const [key, d] of Object.entries(state)) {
|
|
@@ -82,56 +152,72 @@ export function exportCemManifest(
|
|
|
82
152
|
|
|
83
153
|
if (cat === "function") {
|
|
84
154
|
if (isFunctionDef(d)) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
155
|
+
const method: CemMember = { kind: "method", name: key };
|
|
156
|
+
if (d.description) {
|
|
157
|
+
method.description = d.description;
|
|
158
|
+
}
|
|
159
|
+
if (d.parameters) {
|
|
160
|
+
method.parameters = d.parameters.map(normParam);
|
|
161
|
+
}
|
|
162
|
+
if (d.deprecated) {
|
|
163
|
+
method.deprecated = isString(d.deprecated) ? d.deprecated : true;
|
|
164
|
+
}
|
|
165
|
+
members.push(method);
|
|
94
166
|
// Collect emits
|
|
95
167
|
for (const ev of d.emits ?? []) {
|
|
96
168
|
if (ev.name && !seenEvents.has(ev.name)) {
|
|
97
169
|
seenEvents.add(ev.name);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
170
|
+
const event: CemManifestEvent = { name: ev.name };
|
|
171
|
+
if (ev.type !== undefined) {
|
|
172
|
+
event.type = ev.type;
|
|
173
|
+
}
|
|
174
|
+
if (ev.description) {
|
|
175
|
+
event.description = ev.description;
|
|
176
|
+
}
|
|
177
|
+
events.push(event);
|
|
103
178
|
}
|
|
104
179
|
}
|
|
105
180
|
} else if (isJsonObject(d)) {
|
|
106
181
|
// Legacy $handler entry — emit a bare method member
|
|
107
182
|
const { description } = d;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
183
|
+
const method: CemMember = { kind: "method", name: key };
|
|
184
|
+
if (isString(description)) {
|
|
185
|
+
method.description = description;
|
|
186
|
+
}
|
|
187
|
+
members.push(method);
|
|
113
188
|
}
|
|
114
189
|
} else if (cat === "state") {
|
|
115
190
|
// Naked primitive values carry no metadata; object defs are signals/type defs.
|
|
191
|
+
/* SAFETY: defCategory classified this entry as "state", which it only does when the entry
|
|
192
|
+
Carries no $expression, $prototype, $handler or $compute, so an object entry here is an
|
|
193
|
+
Expanded signal or schema type def: the JxStateObject shape. */
|
|
116
194
|
const def: JxStateObject | null = isJsonObject(d) ? (d as JxStateObject) : null;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
195
|
+
const field: CemMember = { kind: "field", name: key };
|
|
196
|
+
if (def?.type) {
|
|
197
|
+
field.type = { text: def.type };
|
|
198
|
+
}
|
|
199
|
+
if (def && def.default !== undefined) {
|
|
200
|
+
field.default = String(def.default);
|
|
201
|
+
}
|
|
202
|
+
if (def?.description) {
|
|
203
|
+
field.description = def.description;
|
|
204
|
+
}
|
|
205
|
+
if (def?.attribute) {
|
|
206
|
+
field.attribute = def.attribute;
|
|
207
|
+
}
|
|
208
|
+
if (def?.reflects) {
|
|
209
|
+
field.reflects = true;
|
|
210
|
+
}
|
|
211
|
+
if (def?.deprecated) {
|
|
212
|
+
field.deprecated = isString(def.deprecated) ? def.deprecated : true;
|
|
213
|
+
}
|
|
214
|
+
members.push(field);
|
|
129
215
|
if (def?.attribute) {
|
|
130
|
-
attributes.push(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
216
|
+
attributes.push(
|
|
217
|
+
def.type
|
|
218
|
+
? { name: def.attribute, type: { text: def.type }, fieldName: key }
|
|
219
|
+
: { name: def.attribute, fieldName: key },
|
|
220
|
+
);
|
|
135
221
|
}
|
|
136
222
|
}
|
|
137
223
|
}
|
|
@@ -139,7 +225,7 @@ export function exportCemManifest(
|
|
|
139
225
|
// Slots
|
|
140
226
|
const slotNames = collectSlots(doc);
|
|
141
227
|
const slots = slotNames.map((name: string) => {
|
|
142
|
-
const slot:
|
|
228
|
+
const slot: CemSlot = { name: name || "" };
|
|
143
229
|
if (!name) {
|
|
144
230
|
slot.description = "Default slot";
|
|
145
231
|
}
|
|
@@ -155,22 +241,27 @@ export function exportCemManifest(
|
|
|
155
241
|
// CSS parts
|
|
156
242
|
const cssParts = collectCssParts(doc).map((p) => ({ name: p.name }));
|
|
157
243
|
|
|
244
|
+
const declaration: CemClassDeclaration = { kind: "class", members, name: tagName, tagName };
|
|
245
|
+
if (attributes.length > 0) {
|
|
246
|
+
declaration.attributes = attributes;
|
|
247
|
+
}
|
|
248
|
+
if (events.length > 0) {
|
|
249
|
+
declaration.events = events;
|
|
250
|
+
}
|
|
251
|
+
if (slots.length > 0) {
|
|
252
|
+
declaration.slots = slots;
|
|
253
|
+
}
|
|
254
|
+
if (cssProperties.length > 0) {
|
|
255
|
+
declaration.cssProperties = cssProperties;
|
|
256
|
+
}
|
|
257
|
+
if (cssParts.length > 0) {
|
|
258
|
+
declaration.cssParts = cssParts;
|
|
259
|
+
}
|
|
260
|
+
|
|
158
261
|
const manifest = {
|
|
159
262
|
modules: [
|
|
160
263
|
{
|
|
161
|
-
declarations: [
|
|
162
|
-
{
|
|
163
|
-
kind: "class",
|
|
164
|
-
members,
|
|
165
|
-
name: tagName,
|
|
166
|
-
tagName,
|
|
167
|
-
...(attributes.length > 0 ? { attributes } : {}),
|
|
168
|
-
...(events.length > 0 ? { events } : {}),
|
|
169
|
-
...(slots.length > 0 ? { slots } : {}),
|
|
170
|
-
...(cssProperties.length > 0 ? { cssProperties } : {}),
|
|
171
|
-
...(cssParts.length > 0 ? { cssParts } : {}),
|
|
172
|
-
},
|
|
173
|
-
],
|
|
264
|
+
declarations: [declaration],
|
|
174
265
|
kind: "javascript-module",
|
|
175
266
|
path: "",
|
|
176
267
|
},
|
package/src/services/clock.ts
CHANGED
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
* value the formatter reads back.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
+
import { isNumber } from "@jxsuite/schema/guards";
|
|
23
|
+
|
|
24
|
+
/** One minute in milliseconds: the unit the relative-time formatters count up from. */
|
|
25
|
+
export const MINUTE = 60_000;
|
|
26
|
+
|
|
22
27
|
/** Epoch milliseconds the clock is pinned to, or `null` while it follows the real clock. */
|
|
23
28
|
let _pinned: number | null = null;
|
|
24
29
|
|
|
@@ -43,7 +48,7 @@ export function now(): number {
|
|
|
43
48
|
* photograph the wall clock and the capture would be accepted.
|
|
44
49
|
*/
|
|
45
50
|
export function pinClock(at: number | string | Date): number {
|
|
46
|
-
const ms = at instanceof Date ? at.getTime() :
|
|
51
|
+
const ms = at instanceof Date ? at.getTime() : isNumber(at) ? at : Date.parse(at);
|
|
47
52
|
if (!Number.isFinite(ms)) {
|
|
48
53
|
throw new TypeError(`clock: cannot pin to ${JSON.stringify(at)}`);
|
|
49
54
|
}
|
|
@@ -6,7 +6,13 @@ import { projectState } from "../state";
|
|
|
6
6
|
import { getNodeAtPath } from "../store";
|
|
7
7
|
import { loadedMonaco } from "./monaco-lazy";
|
|
8
8
|
import type { JxPath } from "../state";
|
|
9
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
JsonObject,
|
|
11
|
+
JsonValue,
|
|
12
|
+
JxDocumentValue,
|
|
13
|
+
JxFunctionDef,
|
|
14
|
+
JxMutableNode,
|
|
15
|
+
} from "@jxsuite/schema/types";
|
|
10
16
|
import type { editor } from "monaco-editor";
|
|
11
17
|
|
|
12
18
|
export interface OxLintDiagnostic {
|
|
@@ -19,15 +25,13 @@ export interface OxLintDiagnostic {
|
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
/**
|
|
28
|
+
* Run one code-service action. The payload travels to the backend as a JSON body.
|
|
29
|
+
*
|
|
22
30
|
* @param {string} action
|
|
23
|
-
* @param {
|
|
31
|
+
* @param {JsonValue} payload
|
|
24
32
|
*/
|
|
25
|
-
export async function codeService(action: string, payload:
|
|
26
|
-
|
|
27
|
-
if (!platform.codeService) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
return platform.codeService(action, payload);
|
|
33
|
+
export async function codeService(action: string, payload: JsonValue) {
|
|
34
|
+
return getPlatform().codeService(action, payload);
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
/**
|
|
@@ -36,21 +40,17 @@ export async function codeService(action: string, payload: unknown) {
|
|
|
36
40
|
* @param {string} name
|
|
37
41
|
*/
|
|
38
42
|
export async function locateDocument(name: string) {
|
|
39
|
-
|
|
40
|
-
if (!platform.locateFile) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
return platform.locateFile(name);
|
|
43
|
+
return getPlatform().locateFile(name);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/** Schema returned by a plugin's `$prototype` module (loose superset used across panels). */
|
|
47
47
|
export interface PluginSchema {
|
|
48
48
|
type?: string;
|
|
49
49
|
description?: string;
|
|
50
|
-
properties?:
|
|
50
|
+
properties?: JsonObject;
|
|
51
51
|
required?: string[];
|
|
52
52
|
returns?: { type?: string };
|
|
53
|
-
[key: string]:
|
|
53
|
+
[key: string]: JsonValue | undefined;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/** Cache of plugin schemas keyed by "$src::$prototype". */
|
|
@@ -81,12 +81,12 @@ export async function fetchPluginSchema(
|
|
|
81
81
|
|
|
82
82
|
try {
|
|
83
83
|
const platform = getPlatform();
|
|
84
|
-
if (!platform.fetchPluginSchema) {
|
|
85
|
-
pluginSchemaCache.set(cacheKey, null);
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
84
|
const base =
|
|
89
85
|
!importedPath && state.documentPath ? `${location.origin}/${state.documentPath}` : undefined;
|
|
86
|
+
/* SAFETY: every platform answers with the plugin module's JSON Schema export, parsed from JSON,
|
|
87
|
+
Or null when it has none; PluginSchema is the all-optional, JSON-open view of that object. A
|
|
88
|
+
Platform without the method throws here, and the catch below caches null exactly as for a
|
|
89
|
+
Failed fetch. */
|
|
90
90
|
const schema = (await platform.fetchPluginSchema(
|
|
91
91
|
src,
|
|
92
92
|
def.$prototype,
|
|
@@ -117,14 +117,14 @@ export function setLintMarkers(
|
|
|
117
117
|
if (!monaco) {
|
|
118
118
|
return;
|
|
119
119
|
}
|
|
120
|
-
const markers = diagnostics
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
120
|
+
const markers = diagnostics.flatMap((d) => {
|
|
121
|
+
const label = d.labels?.[0];
|
|
122
|
+
if (!label) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const { line, column, length } = label.span;
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
128
|
code: d.url ? { target: monaco.Uri.parse(d.url), value: d.code } : d.code,
|
|
129
129
|
endColumn: column + (length || 1),
|
|
130
130
|
endLineNumber: line,
|
|
@@ -134,9 +134,12 @@ export function setLintMarkers(
|
|
|
134
134
|
source: "oxlint",
|
|
135
135
|
startColumn: column,
|
|
136
136
|
startLineNumber: line,
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
});
|
|
140
|
+
/* SAFETY: each marker is an IMarkerData except that `code` (and the object form's `value`) may be
|
|
141
|
+
Undefined when oxlint reports a diagnostic without a rule code; Monaco treats an undefined code
|
|
142
|
+
Exactly like an absent one. */
|
|
140
143
|
monaco.editor.setModelMarkers(model, "oxlint", markers as editor.IMarkerData[]);
|
|
141
144
|
}
|
|
142
145
|
|
|
@@ -149,7 +152,7 @@ export function getFunctionArgs(
|
|
|
149
152
|
document: JxMutableNode | null | undefined,
|
|
150
153
|
): string[] {
|
|
151
154
|
// Read parameters off any object-shaped def (covers legacy entries without $prototype).
|
|
152
|
-
const fromDef = (def:
|
|
155
|
+
const fromDef = (def: JxDocumentValue | undefined): string[] | null => {
|
|
153
156
|
if (!isJsonObject(def)) {
|
|
154
157
|
return null;
|
|
155
158
|
}
|
|
@@ -157,6 +160,9 @@ export function getFunctionArgs(
|
|
|
157
160
|
if (!Array.isArray(params) || params.length === 0) {
|
|
158
161
|
return null;
|
|
159
162
|
}
|
|
163
|
+
/* SAFETY: a def's `parameters` array holds bare names or CEM parameter objects — the form the
|
|
164
|
+
Schema admits for Function, prototype and legacy handler entries alike — which is the
|
|
165
|
+
Element type paramNames reads. */
|
|
160
166
|
return paramNames(params as JxFunctionDef["parameters"]);
|
|
161
167
|
};
|
|
162
168
|
if (editing.type === "def") {
|
|
@@ -12,14 +12,23 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import type { createChatState } from "@jxsuite/ai/chat-state";
|
|
15
|
+
import { CHARS_PER_TOKEN } from "@jxsuite/ai/harness";
|
|
15
16
|
import {
|
|
16
17
|
SEAL_RELOADED,
|
|
17
18
|
repairToolPairs,
|
|
18
19
|
toChatMessages,
|
|
19
20
|
toLiveMessages,
|
|
20
21
|
} from "@jxsuite/ai/messages";
|
|
22
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
21
23
|
import { modelContextWindow } from "./ai-models";
|
|
22
24
|
|
|
25
|
+
/** How many tool messages {@link pruneOrphanToolMessages} dropped, moved and sealed. */
|
|
26
|
+
export interface OrphanToolRepair {
|
|
27
|
+
dropped: number;
|
|
28
|
+
moved: number;
|
|
29
|
+
sealed: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
23
32
|
/** Shape of a single entry returned by `chatState.toMessagesArray()`. */
|
|
24
33
|
interface MessageArrayEntry {
|
|
25
34
|
role: string;
|
|
@@ -31,9 +40,6 @@ interface MessageArrayEntry {
|
|
|
31
40
|
|
|
32
41
|
// ─── Constants ──────────────────────────────────────────────────────────────
|
|
33
42
|
|
|
34
|
-
/** Rough heuristic: average 4 characters per token. */
|
|
35
|
-
const CHARS_PER_TOKEN = 4;
|
|
36
|
-
|
|
37
43
|
/**
|
|
38
44
|
* Approximate context windows (in tokens) per model id, longest-prefix matched. Used to derive a
|
|
39
45
|
* model-aware budget instead of a flat cap (specs/ai.md §2.1). Conservative fallback for unknown
|
|
@@ -109,7 +115,7 @@ const MIN_USER_TURNS = 3;
|
|
|
109
115
|
* @returns {number}
|
|
110
116
|
*/
|
|
111
117
|
function estimateTokens(input: string | MessageArrayEntry[]): number {
|
|
112
|
-
if (
|
|
118
|
+
if (isString(input)) {
|
|
113
119
|
return Math.ceil(input.length / CHARS_PER_TOKEN);
|
|
114
120
|
}
|
|
115
121
|
let total = 0;
|
|
@@ -174,7 +180,7 @@ function contextTokens(
|
|
|
174
180
|
return reused;
|
|
175
181
|
}
|
|
176
182
|
}
|
|
177
|
-
return systemTokens + estimateTokens(chatState.toMessagesArray()
|
|
183
|
+
return systemTokens + estimateTokens(chatState.toMessagesArray());
|
|
178
184
|
}
|
|
179
185
|
|
|
180
186
|
/**
|
|
@@ -316,11 +322,9 @@ export const UNANSWERED_TOOL_RESULT = JSON.stringify({ success: false, error: SE
|
|
|
316
322
|
* @param {ReturnType<typeof createChatState>} chatState
|
|
317
323
|
* @returns {{ dropped: number; moved: number; sealed: number }}
|
|
318
324
|
*/
|
|
319
|
-
export function pruneOrphanToolMessages(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
sealed: number;
|
|
323
|
-
} {
|
|
325
|
+
export function pruneOrphanToolMessages(
|
|
326
|
+
chatState: ReturnType<typeof createChatState>,
|
|
327
|
+
): OrphanToolRepair {
|
|
324
328
|
const live = chatState.messages;
|
|
325
329
|
const neutral = toChatMessages(live);
|
|
326
330
|
const { messages, sealed, dropped, moved } = repairToolPairs(neutral);
|
|
@@ -7,12 +7,15 @@
|
|
|
7
7
|
* resolves to the registered format names instead of a project.json key.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
11
|
+
import type { JsonObject, JsonValue, ProjectConfig } from "@jxsuite/schema/types";
|
|
12
|
+
|
|
10
13
|
/** Options for {@link resolveContextPointer}. */
|
|
11
14
|
export interface ResolveContextOptions {
|
|
12
15
|
/** The project configuration object the pointer walks over. */
|
|
13
|
-
projectConfig:
|
|
16
|
+
projectConfig: ProjectConfig;
|
|
14
17
|
/** Scope record supplying `{@param}` substitutions (e.g. the enclosing form value). */
|
|
15
|
-
scope?:
|
|
18
|
+
scope?: JsonObject | undefined;
|
|
16
19
|
/** Registered formats backing the `$formats` virtual root. */
|
|
17
20
|
formats?: { name: string }[] | undefined;
|
|
18
21
|
}
|
|
@@ -30,9 +33,13 @@ const PARAM_SEGMENT = /^\{@(\w+)\}$/;
|
|
|
30
33
|
*
|
|
31
34
|
* @param {string} pointer
|
|
32
35
|
* @param {ResolveContextOptions} opts
|
|
33
|
-
* @returns {
|
|
36
|
+
* @returns {JsonValue | undefined} The resolved value, or `undefined` when the pointer does not
|
|
37
|
+
* resolve.
|
|
34
38
|
*/
|
|
35
|
-
export function resolveContextPointer(
|
|
39
|
+
export function resolveContextPointer(
|
|
40
|
+
pointer: string,
|
|
41
|
+
opts: ResolveContextOptions,
|
|
42
|
+
): JsonValue | undefined {
|
|
36
43
|
if (!pointer.startsWith("#/$context/")) {
|
|
37
44
|
return undefined;
|
|
38
45
|
}
|
|
@@ -42,7 +49,7 @@ export function resolveContextPointer(pointer: string, opts: ResolveContextOptio
|
|
|
42
49
|
const match = raw.match(PARAM_SEGMENT);
|
|
43
50
|
if (match) {
|
|
44
51
|
const value = opts.scope?.[match[1]!];
|
|
45
|
-
if (
|
|
52
|
+
if (!isString(value) && !isNumber(value)) {
|
|
46
53
|
return undefined;
|
|
47
54
|
}
|
|
48
55
|
const substituted = String(value);
|
|
@@ -62,12 +69,17 @@ export function resolveContextPointer(pointer: string, opts: ResolveContextOptio
|
|
|
62
69
|
return (opts.formats ?? []).map((format) => format.name);
|
|
63
70
|
}
|
|
64
71
|
|
|
65
|
-
|
|
72
|
+
/* SAFETY: the project config is parsed project.json, so every value under it is JSON;
|
|
73
|
+
ProjectConfig is the typed reading of that same object. */
|
|
74
|
+
let node: JsonValue | undefined = opts.projectConfig as JsonObject;
|
|
66
75
|
for (const segment of segments) {
|
|
67
|
-
if (node
|
|
76
|
+
if (!isNonNullObject(node)) {
|
|
68
77
|
return undefined;
|
|
69
78
|
}
|
|
70
|
-
|
|
79
|
+
/* SAFETY: node is a JSON object or array, and a pointer segment reads an array by its own
|
|
80
|
+
Index (and `length`) keys exactly as it reads an object's members, so the object view of
|
|
81
|
+
an array addresses the same values. */
|
|
82
|
+
node = (node as JsonObject)[segment];
|
|
71
83
|
}
|
|
72
84
|
return node;
|
|
73
85
|
}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* (specs/extensions.md §13).
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
11
12
|
import { getPlatform } from "../platform";
|
|
12
13
|
import type {
|
|
13
14
|
DataConnectionsResponse,
|
|
@@ -18,7 +19,7 @@ import type {
|
|
|
18
19
|
DataRowsQuery,
|
|
19
20
|
DataRowsResult,
|
|
20
21
|
DataRowUpdate,
|
|
21
|
-
|
|
22
|
+
KeyValuePatch,
|
|
22
23
|
SecretsSetResponse,
|
|
23
24
|
StudioPlatform,
|
|
24
25
|
} from "../types";
|
|
@@ -34,18 +35,18 @@ function platformOrNull(): StudioPlatform | null {
|
|
|
34
35
|
|
|
35
36
|
/** True when the platform serves the data grid (the family's gating member is dataRows). */
|
|
36
37
|
export function dataSurfaceAvailable(): boolean {
|
|
37
|
-
return
|
|
38
|
+
return isFunction(platformOrNull()?.dataRows);
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
/** True when the platform can store secret values (backs the "secret" form control). */
|
|
41
42
|
export function secretsAvailable(): boolean {
|
|
42
|
-
return
|
|
43
|
+
return isFunction(platformOrNull()?.setSecrets);
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
/** Connections with configured state and table names; null when the backend lacks the route. */
|
|
46
47
|
export async function fetchConnections(): Promise<DataConnectionsResponse | null> {
|
|
47
48
|
const platform = platformOrNull();
|
|
48
|
-
if (
|
|
49
|
+
if (!isFunction(platform?.dataConnections)) {
|
|
49
50
|
return null;
|
|
50
51
|
}
|
|
51
52
|
return platform.dataConnections();
|
|
@@ -54,7 +55,7 @@ export async function fetchConnections(): Promise<DataConnectionsResponse | null
|
|
|
54
55
|
/** Probe one connection; degrades to an error result instead of throwing. */
|
|
55
56
|
export async function testConnection(connection: string): Promise<DataConnectionTestResult> {
|
|
56
57
|
const platform = platformOrNull();
|
|
57
|
-
if (
|
|
58
|
+
if (!isFunction(platform?.dataConnectionTest)) {
|
|
58
59
|
return { error: "Connection tests are not supported by this backend", ok: false };
|
|
59
60
|
}
|
|
60
61
|
try {
|
|
@@ -70,7 +71,7 @@ export async function pushSchema(opts?: {
|
|
|
70
71
|
dryRun?: boolean;
|
|
71
72
|
}): Promise<DataPushResult> {
|
|
72
73
|
const platform = platformOrNull();
|
|
73
|
-
if (
|
|
74
|
+
if (!isFunction(platform?.dataPush)) {
|
|
74
75
|
return { applied: false, errors: ["Schema push is not supported by this backend"], plan: [] };
|
|
75
76
|
}
|
|
76
77
|
try {
|
|
@@ -88,10 +89,10 @@ export async function pushSchema(opts?: {
|
|
|
88
89
|
function requireMember<K extends keyof StudioPlatform>(name: K): NonNullable<StudioPlatform[K]> {
|
|
89
90
|
const platform = platformOrNull();
|
|
90
91
|
const member = platform?.[name];
|
|
91
|
-
if (member === undefined
|
|
92
|
+
if (member === undefined) {
|
|
92
93
|
throw new Error(`The ${String(name)} surface is not supported by this backend`);
|
|
93
94
|
}
|
|
94
|
-
return member
|
|
95
|
+
return member;
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
/** Page a table's rows (grid callers handle errors per load). */
|
|
@@ -99,11 +100,13 @@ export function fetchRows(query: DataRowsQuery): Promise<DataRowsResult> {
|
|
|
99
100
|
return requireMember("dataRows")(query);
|
|
100
101
|
}
|
|
101
102
|
|
|
102
|
-
|
|
103
|
+
/** Insert one row; the platform answers with the row as stored. */
|
|
104
|
+
export function insertRow(req: DataRowInsert) {
|
|
103
105
|
return requireMember("dataInsertRow")(req);
|
|
104
106
|
}
|
|
105
107
|
|
|
106
|
-
|
|
108
|
+
/** Update one row; the platform answers with the row as stored. */
|
|
109
|
+
export function updateRow(req: DataRowUpdate) {
|
|
107
110
|
return requireMember("dataUpdateRow")(req);
|
|
108
111
|
}
|
|
109
112
|
|
|
@@ -114,14 +117,14 @@ export function deleteRow(req: DataRowDelete): Promise<{ ok: boolean }> {
|
|
|
114
117
|
/** Configured secret env-var NAMES; null when the backend has no secrets surface. */
|
|
115
118
|
export async function listSecretNames(): Promise<string[] | null> {
|
|
116
119
|
const platform = platformOrNull();
|
|
117
|
-
if (
|
|
120
|
+
if (!isFunction(platform?.listSecrets)) {
|
|
118
121
|
return null;
|
|
119
122
|
}
|
|
120
123
|
return platform.listSecrets();
|
|
121
124
|
}
|
|
122
125
|
|
|
123
126
|
/** Write/remove secrets through the platform store (values flow in, names come back). */
|
|
124
|
-
export function saveSecrets(req:
|
|
127
|
+
export function saveSecrets(req: KeyValuePatch): Promise<SecretsSetResponse> {
|
|
125
128
|
return requireMember("setSecrets")(req);
|
|
126
129
|
}
|
|
127
130
|
|
|
@@ -147,9 +150,10 @@ export function deriveSecretEnvName(
|
|
|
147
150
|
.replaceAll(/[^A-Za-z0-9]+/g, "_")
|
|
148
151
|
.replaceAll(/^_+|_+$/g, "")
|
|
149
152
|
.toUpperCase();
|
|
150
|
-
const parts = [entryKey ?? sectionKey, fieldKey.replace(/Env$/, "")]
|
|
151
|
-
|
|
152
|
-
|
|
153
|
+
const parts = [entryKey ?? sectionKey, fieldKey.replace(/Env$/, "")].flatMap((part) => {
|
|
154
|
+
const segment = constant(part);
|
|
155
|
+
return segment ? [segment] : [];
|
|
156
|
+
});
|
|
153
157
|
const name = parts.join("_") || "SECRET";
|
|
154
158
|
return /^\d/.test(name) ? `JX_${name}` : name;
|
|
155
159
|
}
|