@flanksource/clicky-ui 0.3.34 → 0.3.35
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 +4 -0
- package/dist/ai.cjs +3 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +3 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentThread.d.ts +1 -1
- package/dist/comments/CommentThreadList.d.ts +1 -1
- package/dist/comments/MentionTextarea.d.ts +1 -1
- package/dist/comments/comment-context.d.ts +4 -4
- package/dist/comments/comment-fixtures.d.ts +1 -1
- package/dist/comments/comment-types.d.ts +1 -1
- package/dist/components/AccordionList.d.ts +1 -1
- package/dist/components/ComboboxControl.d.ts +1 -1
- package/dist/components/ComboboxMenu.d.ts +2 -2
- package/dist/components/ComboboxTags.cjs +41 -11
- package/dist/components/ComboboxTags.cjs.map +1 -1
- package/dist/components/ComboboxTags.d.ts +6 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -1
- package/dist/components/ComboboxTags.js +41 -11
- package/dist/components/ComboboxTags.js.map +1 -1
- package/dist/components/DateField.d.ts +3 -3
- package/dist/components/DatePicker.d.ts +3 -3
- package/dist/components/DateTimePicker.d.ts +3 -3
- package/dist/components/ErrorWrapper.d.ts +2 -2
- package/dist/components/Field.d.ts +1 -1
- package/dist/components/FilterBar.d.ts +1 -1
- package/dist/components/FormLookupProvider.d.ts +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -1
- package/dist/components/IconButton.d.ts +3 -3
- package/dist/components/InputField.d.ts +2 -2
- package/dist/components/ItemActions.d.ts +1 -1
- package/dist/components/JsonSchemaForm.cjs +17 -36
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +17 -36
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/ListMenu.d.ts +1 -1
- package/dist/components/MultiSelect.d.ts +1 -1
- package/dist/components/SearchInput.d.ts +1 -1
- package/dist/components/SegmentedControl.d.ts +1 -1
- package/dist/components/SplitButton.d.ts +1 -1
- package/dist/components/Switch.d.ts +1 -1
- package/dist/components/TreePickerField.cjs +11 -2
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +13 -4
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +11 -2
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/UnitStepControls.d.ts +1 -1
- package/dist/components/button.d.ts +3 -3
- package/dist/components/combobox-types.d.ts +1 -1
- package/dist/components/density-switcher.d.ts +1 -1
- package/dist/components/filter-bar-context.d.ts +1 -1
- package/dist/components/filter-bar-field-utils.d.ts +2 -2
- package/dist/components/form-lookup-context.d.ts +1 -1
- package/dist/components/icon-menu-picker.d.ts +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +44 -21
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +47 -24
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array.cjs +53 -30
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +54 -31
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-cards-array.cjs +32 -22
- package/dist/components/json-schema-form-cards-array.cjs.map +1 -1
- package/dist/components/json-schema-form-cards-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-cards-array.js +33 -23
- package/dist/components/json-schema-form-cards-array.js.map +1 -1
- package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts +44 -0
- package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-discriminator.d.ts +1 -1
- package/dist/components/json-schema-form-errors.cjs +5 -1
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +2 -1
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +6 -2
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-extensions.d.ts +1 -1
- package/dist/components/json-schema-form-filter-input.cjs +50 -0
- package/dist/components/json-schema-form-filter-input.cjs.map +1 -0
- package/dist/components/json-schema-form-filter-input.d.ts +5 -0
- package/dist/components/json-schema-form-filter-input.d.ts.map +1 -0
- package/dist/components/json-schema-form-filter-input.js +50 -0
- package/dist/components/json-schema-form-filter-input.js.map +1 -0
- package/dist/components/json-schema-form-filter.cjs +49 -0
- package/dist/components/json-schema-form-filter.cjs.map +1 -0
- package/dist/components/json-schema-form-filter.d.ts +8 -0
- package/dist/components/json-schema-form-filter.d.ts.map +1 -0
- package/dist/components/json-schema-form-filter.js +49 -0
- package/dist/components/json-schema-form-filter.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +84 -17
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +1 -1
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +84 -17
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-list-array.cjs +16 -5
- package/dist/components/json-schema-form-list-array.cjs.map +1 -1
- package/dist/components/json-schema-form-list-array.d.ts +2 -1
- package/dist/components/json-schema-form-list-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-list-array.js +16 -5
- package/dist/components/json-schema-form-list-array.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +239 -85
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts +2 -2
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +241 -87
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -1
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -1
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -1
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-properties-errors.fixtures.d.ts +14 -0
- package/dist/components/json-schema-form-properties-errors.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties-size.cjs +19 -0
- package/dist/components/json-schema-form-properties-size.cjs.map +1 -0
- package/dist/components/json-schema-form-properties-size.d.ts +4 -0
- package/dist/components/json-schema-form-properties-size.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties-size.js +19 -0
- package/dist/components/json-schema-form-properties-size.js.map +1 -0
- package/dist/components/json-schema-form-properties.cjs +305 -0
- package/dist/components/json-schema-form-properties.cjs.map +1 -0
- package/dist/components/json-schema-form-properties.d.ts +20 -0
- package/dist/components/json-schema-form-properties.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties.fixtures.d.ts +157 -0
- package/dist/components/json-schema-form-properties.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties.js +305 -0
- package/dist/components/json-schema-form-properties.js.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.cjs +6 -0
- package/dist/components/json-schema-form-property-actions-context.cjs.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.d.ts +2 -0
- package/dist/components/json-schema-form-property-actions-context.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.js +6 -0
- package/dist/components/json-schema-form-property-actions-context.js.map +1 -0
- package/dist/components/json-schema-form-property-collection.cjs +31 -0
- package/dist/components/json-schema-form-property-collection.cjs.map +1 -0
- package/dist/components/json-schema-form-property-collection.d.ts +6 -0
- package/dist/components/json-schema-form-property-collection.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-collection.js +31 -0
- package/dist/components/json-schema-form-property-collection.js.map +1 -0
- package/dist/components/json-schema-form-property-draft.cjs +45 -0
- package/dist/components/json-schema-form-property-draft.cjs.map +1 -0
- package/dist/components/json-schema-form-property-draft.d.ts +8 -0
- package/dist/components/json-schema-form-property-draft.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-draft.js +45 -0
- package/dist/components/json-schema-form-property-draft.js.map +1 -0
- package/dist/components/json-schema-form-property-preview.cjs +68 -0
- package/dist/components/json-schema-form-property-preview.cjs.map +1 -0
- package/dist/components/json-schema-form-property-preview.d.ts +7 -0
- package/dist/components/json-schema-form-property-preview.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-preview.js +68 -0
- package/dist/components/json-schema-form-property-preview.js.map +1 -0
- package/dist/components/json-schema-form-property-selection.cjs +89 -0
- package/dist/components/json-schema-form-property-selection.cjs.map +1 -0
- package/dist/components/json-schema-form-property-selection.d.ts +6 -0
- package/dist/components/json-schema-form-property-selection.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-selection.js +89 -0
- package/dist/components/json-schema-form-property-selection.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +41 -4
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +42 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +2 -0
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +2 -0
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +222 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.cjs +82 -51
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +84 -53
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-template-menu.d.ts +1 -1
- package/dist/components/json-schema-form-template.d.ts +1 -1
- package/dist/components/json-schema-form-types.d.ts +7 -179
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +10 -9
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +11 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +10 -9
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/loading.d.ts +4 -4
- package/dist/components/mdx-editor-callout.d.ts +1 -1
- package/dist/components/mdx-editor-options.d.ts +1 -1
- package/dist/components/select.d.ts +3 -3
- package/dist/components/theme-switcher.d.ts +1 -1
- package/dist/components/use-list-menu-selection.d.ts +1 -1
- package/dist/components/useComboboxLayout.d.ts +1 -1
- package/dist/components/workload-picker-utils.d.ts +1 -1
- package/dist/data/Avatar.d.ts +1 -1
- package/dist/data/AvatarBadge.d.ts +1 -1
- package/dist/data/Badge.d.ts +1 -1
- package/dist/data/Callout.d.ts +1 -1
- package/dist/data/DataTable.cjs +575 -435
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +21 -13
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +1 -1
- package/dist/data/DataTable.js +575 -435
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/ExecutionTree.d.ts +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FixtureEditor/RawFenceEditor.d.ts +1 -1
- package/dist/data/FixtureEditor/types.d.ts +1 -1
- package/dist/data/Gauge.d.ts +1 -1
- package/dist/data/GaugeHoverCard.d.ts +1 -1
- package/dist/data/Icon.d.ts +1 -1
- package/dist/data/KeyValueList.d.ts +1 -1
- package/dist/data/MarkdownEditor.d.ts +1 -1
- package/dist/data/MatrixTable.d.ts +1 -1
- package/dist/data/ObjectGraph.d.ts +1 -1
- package/dist/data/ProgressBars.d.ts +1 -1
- package/dist/data/Properties.cjs +86 -35
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +2 -2
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +87 -36
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/RadialGauge.d.ts +1 -1
- package/dist/data/SchemaViewer.d.ts +1 -1
- package/dist/data/SortableHeader.d.ts +1 -1
- package/dist/data/StatStrip.d.ts +1 -1
- package/dist/data/StatusBreakdown.d.ts +1 -1
- package/dist/data/TabButton.d.ts +1 -1
- package/dist/data/TaskManager.cjs +9 -17
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +9 -17
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +17 -34
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.d.ts.map +1 -1
- package/dist/data/TaskManagerButton.js +18 -35
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProcessDetails.cjs +5 -26
- package/dist/data/TaskProcessDetails.cjs.map +1 -1
- package/dist/data/TaskProcessDetails.d.ts +2 -1
- package/dist/data/TaskProcessDetails.d.ts.map +1 -1
- package/dist/data/TaskProcessDetails.js +5 -26
- package/dist/data/TaskProcessDetails.js.map +1 -1
- package/dist/data/TaskProgress.cjs +24 -15
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +2 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +24 -15
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskResourceReadings.cjs +42 -0
- package/dist/data/TaskResourceReadings.cjs.map +1 -0
- package/dist/data/TaskResourceReadings.d.ts +6 -0
- package/dist/data/TaskResourceReadings.d.ts.map +1 -0
- package/dist/data/TaskResourceReadings.js +42 -0
- package/dist/data/TaskResourceReadings.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +14 -1
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Timeline.d.ts +1 -1
- package/dist/data/Tree.d.ts +1 -1
- package/dist/data/TreeGroupHeader.d.ts +1 -1
- package/dist/data/TreeNode.d.ts +1 -1
- package/dist/data/Version.d.ts +3 -3
- package/dist/data/ai/ChatWindow.cjs +22 -12
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +22 -12
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +4 -2
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +2 -0
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +2 -0
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PolicyTree.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/types.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +4 -0
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +5 -2
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +4 -0
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +147 -0
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.d.ts +21 -0
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.js +147 -0
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +21 -8
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +6 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +1 -1
- package/dist/data/ai/SessionInspector.js +21 -8
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.panel-parts.cjs +47 -0
- package/dist/data/ai/SessionInspector.panel-parts.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panel-parts.d.ts +20 -0
- package/dist/data/ai/SessionInspector.panel-parts.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panel-parts.js +47 -0
- package/dist/data/ai/SessionInspector.panel-parts.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +40 -99
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts +3 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +12 -71
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +23 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/Footer.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/Rail.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +3 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +3 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +1 -0
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +13 -5
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +1 -0
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +1 -1
- package/dist/data/cache-browser/adapter.d.ts +1 -1
- package/dist/data/cells/CellFilterActions.d.ts +1 -1
- package/dist/data/cells/EntityCell.d.ts +1 -1
- package/dist/data/cells/tag-utils.d.ts +1 -1
- package/dist/data/chat/Chat.cjs +42 -46
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +16 -5
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +43 -47
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts +1 -1
- package/dist/data/chat/PromptInput.cjs +13 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +8 -2
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +14 -1
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.d.ts +1 -1
- package/dist/data/chat/tool-render/ToolParams.d.ts +1 -1
- package/dist/data/chat/tool-render/ToolValue.d.ts +1 -1
- package/dist/data/chat/tool-render/adapter.d.ts +1 -1
- package/dist/data/chat/tool-render/context.d.ts +1 -1
- package/dist/data/chat/tool-render/defaults.d.ts +1 -1
- package/dist/data/chat/tool-render/known-tool-views.d.ts +1 -1
- package/dist/data/chat/tool-render/summary.d.ts +1 -1
- package/dist/data/chat/types.d.ts +1 -1
- package/dist/data/clicky-export/useClickyExport.d.ts +1 -1
- package/dist/data/data-table-server-filters.d.ts +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +1 -1
- package/dist/data/diagnostics/StackFrameRow.d.ts +1 -1
- package/dist/data/git/GitChangeList.d.ts +1 -1
- package/dist/data/icon-fallback.d.ts +1 -1
- package/dist/data/properties-context.cjs +6 -0
- package/dist/data/properties-context.cjs.map +1 -0
- package/dist/data/properties-context.d.ts +7 -0
- package/dist/data/properties-context.d.ts.map +1 -0
- package/dist/data/properties-context.js +6 -0
- package/dist/data/properties-context.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.types.d.ts +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +7 -3
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +7 -3
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/task-copy.cjs +1 -1
- package/dist/data/task-copy.cjs.map +1 -1
- package/dist/data/task-copy.js +1 -1
- package/dist/data/task-copy.js.map +1 -1
- package/dist/data/task-resource-summary.cjs +30 -0
- package/dist/data/task-resource-summary.cjs.map +1 -0
- package/dist/data/task-resource-summary.d.ts +15 -0
- package/dist/data/task-resource-summary.d.ts.map +1 -0
- package/dist/data/task-resource-summary.js +30 -0
- package/dist/data/task-resource-summary.js.map +1 -0
- package/dist/data/task-status.cjs +8 -2
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.d.ts +3 -0
- package/dist/data/task-status.d.ts.map +1 -1
- package/dist/data/task-status.js +8 -2
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/task-work-progress.cjs +24 -0
- package/dist/data/task-work-progress.cjs.map +1 -0
- package/dist/data/task-work-progress.d.ts +21 -0
- package/dist/data/task-work-progress.d.ts.map +1 -0
- package/dist/data/task-work-progress.js +24 -0
- package/dist/data/task-work-progress.js.map +1 -0
- package/dist/data/test-runner/TestRunner.d.ts +1 -1
- package/dist/data/test-runner/adapter.d.ts +1 -1
- package/dist/data/test-runner/context.d.ts +1 -1
- package/dist/data/use-data-table-virtual.cjs +73 -0
- package/dist/data/use-data-table-virtual.cjs.map +1 -0
- package/dist/data/use-data-table-virtual.d.ts +40 -0
- package/dist/data/use-data-table-virtual.d.ts.map +1 -0
- package/dist/data/use-data-table-virtual.js +73 -0
- package/dist/data/use-data-table-virtual.js.map +1 -0
- package/dist/data/verification/VerificationResults.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/expressions/lang/attributes.cjs +56 -0
- package/dist/expressions/lang/attributes.cjs.map +1 -0
- package/dist/expressions/lang/attributes.d.ts +22 -0
- package/dist/expressions/lang/attributes.d.ts.map +1 -0
- package/dist/expressions/lang/attributes.js +56 -0
- package/dist/expressions/lang/attributes.js.map +1 -0
- package/dist/expressions/lang/completion.cjs +164 -0
- package/dist/expressions/lang/completion.cjs.map +1 -0
- package/dist/expressions/lang/completion.d.ts +29 -0
- package/dist/expressions/lang/completion.d.ts.map +1 -0
- package/dist/expressions/lang/completion.js +164 -0
- package/dist/expressions/lang/completion.js.map +1 -0
- package/dist/expressions/lang/environment.cjs +115 -0
- package/dist/expressions/lang/environment.cjs.map +1 -0
- package/dist/expressions/lang/environment.d.ts +54 -0
- package/dist/expressions/lang/environment.d.ts.map +1 -0
- package/dist/expressions/lang/environment.js +115 -0
- package/dist/expressions/lang/environment.js.map +1 -0
- package/dist/expressions/lang/generated/conformance.json.d.ts +4962 -0
- package/dist/expressions/lang/generated/index.cjs +18 -0
- package/dist/expressions/lang/generated/index.cjs.map +1 -0
- package/dist/expressions/lang/generated/index.d.ts +9 -0
- package/dist/expressions/lang/generated/index.d.ts.map +1 -0
- package/dist/expressions/lang/generated/index.js +18 -0
- package/dist/expressions/lang/generated/index.js.map +1 -0
- package/dist/expressions/lang/generated/languages.json.cjs +18 -0
- package/dist/expressions/lang/generated/languages.json.cjs.map +1 -0
- package/dist/expressions/lang/generated/languages.json.d.ts +2305 -0
- package/dist/expressions/lang/generated/languages.json.js +18 -0
- package/dist/expressions/lang/generated/languages.json.js.map +1 -0
- package/dist/expressions/lang/generated/spec.json.cjs +12 -0
- package/dist/expressions/lang/generated/spec.json.cjs.map +1 -0
- package/dist/expressions/lang/generated/spec.json.d.ts +6260 -0
- package/dist/expressions/lang/generated/spec.json.js +12 -0
- package/dist/expressions/lang/generated/spec.json.js.map +1 -0
- package/dist/expressions/lang/hover.cjs +106 -0
- package/dist/expressions/lang/hover.cjs.map +1 -0
- package/dist/expressions/lang/hover.d.ts +54 -0
- package/dist/expressions/lang/hover.d.ts.map +1 -0
- package/dist/expressions/lang/hover.js +106 -0
- package/dist/expressions/lang/hover.js.map +1 -0
- package/dist/expressions/lang/index.cjs +87 -0
- package/dist/expressions/lang/index.cjs.map +1 -0
- package/dist/expressions/lang/index.d.ts +65 -0
- package/dist/expressions/lang/index.d.ts.map +1 -0
- package/dist/expressions/lang/index.js +90 -0
- package/dist/expressions/lang/index.js.map +1 -0
- package/dist/expressions/lang/merge.cjs +52 -0
- package/dist/expressions/lang/merge.cjs.map +1 -0
- package/dist/expressions/lang/merge.d.ts +12 -0
- package/dist/expressions/lang/merge.d.ts.map +1 -0
- package/dist/expressions/lang/merge.js +52 -0
- package/dist/expressions/lang/merge.js.map +1 -0
- package/dist/expressions/lang/prefix.cjs +91 -0
- package/dist/expressions/lang/prefix.cjs.map +1 -0
- package/dist/expressions/lang/prefix.d.ts +36 -0
- package/dist/expressions/lang/prefix.d.ts.map +1 -0
- package/dist/expressions/lang/prefix.js +91 -0
- package/dist/expressions/lang/prefix.js.map +1 -0
- package/dist/expressions/lang/spec.d.ts +13 -0
- package/dist/expressions/lang/spec.d.ts.map +1 -0
- package/dist/expressions/lang/theme.cjs +97 -0
- package/dist/expressions/lang/theme.cjs.map +1 -0
- package/dist/expressions/lang/theme.d.ts +6 -0
- package/dist/expressions/lang/theme.d.ts.map +1 -0
- package/dist/expressions/lang/theme.js +97 -0
- package/dist/expressions/lang/theme.js.map +1 -0
- package/dist/expressions/lang/types.d.ts +81 -0
- package/dist/expressions/lang/types.d.ts.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.cjs +308 -0
- package/dist/expressions/playground/ExpressionPlayground.cjs.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.d.ts +42 -0
- package/dist/expressions/playground/ExpressionPlayground.d.ts.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.js +291 -0
- package/dist/expressions/playground/ExpressionPlayground.js.map +1 -0
- package/dist/expressions/playground/RunControls.cjs +51 -0
- package/dist/expressions/playground/RunControls.cjs.map +1 -0
- package/dist/expressions/playground/RunControls.d.ts +7 -0
- package/dist/expressions/playground/RunControls.d.ts.map +1 -0
- package/dist/expressions/playground/RunControls.js +51 -0
- package/dist/expressions/playground/RunControls.js.map +1 -0
- package/dist/expressions/playground/VerticalSplit.cjs +109 -0
- package/dist/expressions/playground/VerticalSplit.cjs.map +1 -0
- package/dist/expressions/playground/VerticalSplit.d.ts +23 -0
- package/dist/expressions/playground/VerticalSplit.d.ts.map +1 -0
- package/dist/expressions/playground/VerticalSplit.js +109 -0
- package/dist/expressions/playground/VerticalSplit.js.map +1 -0
- package/dist/expressions/playground/api.cjs +49 -0
- package/dist/expressions/playground/api.cjs.map +1 -0
- package/dist/expressions/playground/api.d.ts +53 -0
- package/dist/expressions/playground/api.d.ts.map +1 -0
- package/dist/expressions/playground/api.js +49 -0
- package/dist/expressions/playground/api.js.map +1 -0
- package/dist/expressions/playground/languages.cjs +88 -0
- package/dist/expressions/playground/languages.cjs.map +1 -0
- package/dist/expressions/playground/languages.d.ts +43 -0
- package/dist/expressions/playground/languages.d.ts.map +1 -0
- package/dist/expressions/playground/languages.js +88 -0
- package/dist/expressions/playground/languages.js.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.cjs +72 -0
- package/dist/expressions/playground/panels/GraphPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.d.ts +19 -0
- package/dist/expressions/playground/panels/GraphPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.js +72 -0
- package/dist/expressions/playground/panels/GraphPanel.js.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.cjs +82 -0
- package/dist/expressions/playground/panels/ResultPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.d.ts +11 -0
- package/dist/expressions/playground/panels/ResultPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.js +82 -0
- package/dist/expressions/playground/panels/ResultPanel.js.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.cjs +76 -0
- package/dist/expressions/playground/panels/SpecPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.d.ts +18 -0
- package/dist/expressions/playground/panels/SpecPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.js +76 -0
- package/dist/expressions/playground/panels/SpecPanel.js.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.cjs +89 -0
- package/dist/expressions/playground/panels/TokensPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.d.ts +15 -0
- package/dist/expressions/playground/panels/TokensPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.js +72 -0
- package/dist/expressions/playground/panels/TokensPanel.js.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.cjs +35 -0
- package/dist/expressions/playground/panels/graphNodes.cjs.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.d.ts +19 -0
- package/dist/expressions/playground/panels/graphNodes.d.ts.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.js +35 -0
- package/dist/expressions/playground/panels/graphNodes.js.map +1 -0
- package/dist/expressions/playground/runAction.cjs +12 -0
- package/dist/expressions/playground/runAction.cjs.map +1 -0
- package/dist/expressions/playground/runAction.d.ts +15 -0
- package/dist/expressions/playground/runAction.d.ts.map +1 -0
- package/dist/expressions/playground/runAction.js +12 -0
- package/dist/expressions/playground/runAction.js.map +1 -0
- package/dist/expressions/playground/runShortcut.cjs +9 -0
- package/dist/expressions/playground/runShortcut.cjs.map +1 -0
- package/dist/expressions/playground/runShortcut.d.ts +2 -0
- package/dist/expressions/playground/runShortcut.d.ts.map +1 -0
- package/dist/expressions/playground/runShortcut.js +9 -0
- package/dist/expressions/playground/runShortcut.js.map +1 -0
- package/dist/expressions/playground/useEditorTheme.cjs +40 -0
- package/dist/expressions/playground/useEditorTheme.cjs.map +1 -0
- package/dist/expressions/playground/useEditorTheme.d.ts +16 -0
- package/dist/expressions/playground/useEditorTheme.d.ts.map +1 -0
- package/dist/expressions/playground/useEditorTheme.js +23 -0
- package/dist/expressions/playground/useEditorTheme.js.map +1 -0
- package/dist/expressions/playground/useEvaluator.cjs +72 -0
- package/dist/expressions/playground/useEvaluator.cjs.map +1 -0
- package/dist/expressions/playground/useEvaluator.d.ts +25 -0
- package/dist/expressions/playground/useEvaluator.d.ts.map +1 -0
- package/dist/expressions/playground/useEvaluator.js +72 -0
- package/dist/expressions/playground/useEvaluator.js.map +1 -0
- package/dist/expressions/playground/useParsedInput.cjs +22 -0
- package/dist/expressions/playground/useParsedInput.cjs.map +1 -0
- package/dist/expressions/playground/useParsedInput.d.ts +20 -0
- package/dist/expressions/playground/useParsedInput.d.ts.map +1 -0
- package/dist/expressions/playground/useParsedInput.js +22 -0
- package/dist/expressions/playground/useParsedInput.js.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.cjs +11 -0
- package/dist/expressions/playground/verticalSplitModel.cjs.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.d.ts +3 -0
- package/dist/expressions/playground/verticalSplitModel.d.ts.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.js +11 -0
- package/dist/expressions/playground/verticalSplitModel.js.map +1 -0
- package/dist/expressions/playground.cjs +18 -0
- package/dist/expressions/playground.cjs.map +1 -0
- package/dist/expressions/playground.d.ts +18 -0
- package/dist/expressions/playground.d.ts.map +1 -0
- package/dist/expressions/playground.js +18 -0
- package/dist/expressions/playground.js.map +1 -0
- package/dist/expressions.cjs +28 -0
- package/dist/expressions.cjs.map +1 -0
- package/dist/expressions.d.ts +10 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +28 -0
- package/dist/expressions.js.map +1 -0
- package/dist/hooks/density-provider.d.ts +1 -1
- package/dist/hooks/theme-provider.d.ts +1 -1
- package/dist/hooks/use-density.d.ts +1 -1
- package/dist/hooks/use-resource-clock.cjs +14 -0
- package/dist/hooks/use-resource-clock.cjs.map +1 -0
- package/dist/hooks/use-resource-clock.d.ts +2 -0
- package/dist/hooks/use-resource-clock.d.ts.map +1 -0
- package/dist/hooks/use-resource-clock.js +14 -0
- package/dist/hooks/use-resource-clock.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +12 -3
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +12 -3
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks/use-theme.d.ts +1 -1
- package/dist/icons/registry.d.ts +1 -1
- package/dist/icons/types.d.ts +1 -1
- package/dist/layout/AppShell.d.ts +1 -1
- package/dist/layout/AppShell.nav.drag.d.ts +1 -1
- package/dist/layout/AppSidebar.d.ts +1 -1
- package/dist/layout/Panel.d.ts +1 -1
- package/dist/layout/PanelFrame.d.ts +1 -1
- package/dist/layout/Section.d.ts +1 -1
- package/dist/layout/SplitPane.d.ts +1 -1
- package/dist/layout/Tabs.d.ts +1 -1
- package/dist/layout/Workspace.d.ts +1 -1
- package/dist/layout/Workspace.model.d.ts +1 -1
- package/dist/lib/combobox-values.d.ts +1 -1
- package/dist/monaco/MonacoEditor.cjs +3 -3
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.js +2 -2
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +1 -1
- package/dist/monaco/use-monaco-worker.d.ts +1 -1
- package/dist/overlay/CellActions.d.ts +1 -1
- package/dist/overlay/CommandPalette.d.ts +2 -2
- package/dist/overlay/CommandPalette.model.d.ts +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +1 -1
- package/dist/overlay/DropdownMenu.d.ts +1 -1
- package/dist/overlay/HoverCard.d.ts +1 -1
- package/dist/overlay/Modal.d.ts +2 -2
- package/dist/overlay/Toast.d.ts +1 -1
- package/dist/overlay/TourCard.d.ts +1 -1
- package/dist/overlay/TourProvider.d.ts +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/overlay/toast-context.d.ts +2 -2
- package/dist/overlay/tour-context.d.ts +1 -1
- package/dist/overlay/tour-types.d.ts +1 -1
- package/dist/profiles/connections/connectionBrowserModel.d.ts +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts +1 -1
- package/dist/profiles/editor/profileBuilder.d.ts +1 -1
- package/dist/profiles/elasticsearch/esParamOperandExtension.d.ts +1 -1
- package/dist/profiles/fields/profileFieldControls.d.ts +1 -1
- package/dist/profiles/fields/profileFieldIcons.d.ts +1 -1
- package/dist/profiles/fields/profileFieldState.d.ts +1 -1
- package/dist/profiles/query/jsonPathSample.d.ts +1 -1
- package/dist/profiles/query/jsonPathSampleRow.d.ts +1 -1
- package/dist/profiles/query/prometheusResults.d.ts +2 -2
- package/dist/rpc/EndpointList.d.ts +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +1 -1
- package/dist/rpc/OperationCatalog.d.ts +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts +1 -1
- package/dist/rpc/OperationEntityPage.d.ts +1 -1
- package/dist/rpc/OperationResultView.d.ts +1 -1
- package/dist/rpc/RouterProvider.d.ts +1 -1
- package/dist/rpc/SchemaActionForm.d.ts +1 -1
- package/dist/rpc/formMetadata.d.ts +1 -1
- package/dist/rpc/router.d.ts +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +1 -1
- package/dist/styles.css +1 -1
- package/package.json +21 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover.js","sources":["../../../src/expressions/lang/hover.ts"],"sourcesContent":["import type { GomplateSpec, Monaco, SpecFunction, SpecMacro } from \"./types\";\n\n/**\n * Indexes are built per registration, not once per module.\n *\n * A host's catalogue arrives from its `/api/spec` after the editor has already\n * mounted, so anything computed at module scope is frozen before the host can\n * speak. `setSpec` re-registers with a fresh index instead.\n */\nexport function registerCelHover(monaco: Monaco, languageId: string, spec: GomplateSpec) {\n return monaco.languages.registerHoverProvider(languageId, celHoverProvider(spec));\n}\n\nexport function registerGoTemplateHover(monaco: Monaco, languageId: string, spec: GomplateSpec) {\n return monaco.languages.registerHoverProvider(languageId, goTemplateHoverProvider(spec));\n}\n\n/**\n * The providers the register functions install, exposed so a test can drive\n * them over a real model rather than through Monaco's registry, which offers no\n * way to enumerate what is registered.\n */\nexport function celHoverProvider(spec: GomplateSpec) {\n const functions = new Map<string, SpecFunction>(spec.cel.functions.map((f) => [f.name, f]));\n const macrosByName = new Map<string, SpecMacro[]>();\n for (const macro of spec.cel.macros) {\n macrosByName.set(macro.name, [...(macrosByName.get(macro.name) ?? []), macro]);\n }\n\n return {\n provideHover(model: Model, position: Position) {\n const word = dottedWordAt(model, position);\n if (!word) return null;\n\n const fn = functions.get(word.text) ?? functions.get(word.leaf);\n if (fn) return { range: word.range, contents: [{ value: functionDocumentation(fn) }] };\n\n const macros = macrosByName.get(word.leaf);\n if (macros) {\n return {\n range: word.range,\n contents: macros.map((macro) => ({ value: macroDocumentation(macro) })),\n };\n }\n return null;\n },\n };\n}\n\nexport function goTemplateHoverProvider(spec: GomplateSpec) {\n const functions = new Map<string, SpecFunction>(\n spec.gotemplate.functions.map((f) => [f.name, f]),\n );\n\n return {\n provideHover(model: Model, position: Position) {\n const word = dottedWordAt(model, position);\n const fn = word && functions.get(word.text);\n if (!fn || !word) return null;\n return { range: word.range, contents: [{ value: functionDocumentation(fn) }] };\n },\n };\n}\n\n/** Renders a function as markdown: signature, overloads, docs, examples. */\nexport function functionDocumentation(fn: SpecFunction): string {\n const lines: string[] = [];\n lines.push(\"```\", fn.signature ? `${fn.name}${fn.signature}` : fn.name, \"```\");\n\n if (fn.memberOnly) {\n lines.push(\"\", \"_Callable only in member position: `value.\" + leafOf(fn.name) + \"(...)`._\");\n }\n if (fn.doc) lines.push(\"\", fn.doc);\n\n if (fn.overloads?.length) {\n lines.push(\"\", \"**Overloads**\", \"\");\n for (const overload of fn.overloads) {\n const receiver = overload.member && overload.args.length > 0 ? `${overload.args[0]}.` : \"\";\n const args = overload.member ? overload.args.slice(1) : overload.args;\n lines.push(`- \\`${receiver}${leafOf(fn.name)}(${args.join(\", \")}) -> ${overload.result}\\``);\n }\n }\n if (fn.examples?.length) {\n lines.push(\"\", \"**Examples**\", \"\", \"```cel\", ...fn.examples, \"```\");\n }\n return lines.join(\"\\n\");\n}\n\n/** Renders a macro as markdown. */\nexport function macroDocumentation(macro: SpecMacro): string {\n const shape = macro.receiverStyle ? `value.${macro.name}(...)` : `${macro.name}(...)`;\n const arity = macro.argCount === 0 ? \"variadic\" : `${macro.argCount} arguments`;\n const lines = [\"```\", shape, \"```\", \"\", `_Macro, ${arity}. Expanded at parse time._`];\n if (macro.doc) lines.push(\"\", macro.doc);\n if (macro.examples?.length) lines.push(\"\", \"```cel\", ...macro.examples, \"```\");\n return lines.join(\"\\n\");\n}\n\nfunction leafOf(name: string) {\n const dot = name.lastIndexOf(\".\");\n return dot < 0 ? name : name.slice(dot + 1);\n}\n\ninterface Model {\n getLineContent(line: number): string;\n}\n\ninterface Position {\n lineNumber: number;\n column: number;\n}\n\n/**\n * Monaco's own word lookup stops at a dot, so `k8s.isHealthy` would be read as\n * `isHealthy`. The dotted name is what the spec is keyed by, so widen it here.\n */\nfunction dottedWordAt(model: Model, position: Position) {\n const line = model.getLineContent(position.lineNumber);\n const isWord = (c: string) => /[A-Za-z0-9_.]/.test(c);\n\n let start = position.column - 1;\n while (start > 0 && isWord(line[start - 1]!)) start--;\n let end = position.column - 1;\n while (end < line.length && isWord(line[end]!)) end++;\n if (start === end) return null;\n\n const text = line.slice(start, end).replace(/^\\.+|\\.+$/g, \"\");\n if (!text) return null;\n\n return {\n text,\n leaf: leafOf(text),\n range: {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: start + 1,\n endColumn: end + 1,\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const index = require("./generated/index.cjs");
|
|
4
|
+
const completion = require("./completion.cjs");
|
|
5
|
+
const hover = require("./hover.cjs");
|
|
6
|
+
const environment = require("./environment.cjs");
|
|
7
|
+
const attributes = require("./attributes.cjs");
|
|
8
|
+
const merge = require("./merge.cjs");
|
|
9
|
+
const theme = require("./theme.cjs");
|
|
10
|
+
function registerGomplateLanguages(monaco, options = {}) {
|
|
11
|
+
const { languages = index.LANGUAGE_IDS, completions = true, hovers = true, themes = true } = options;
|
|
12
|
+
if (themes) theme.defineThemes(monaco);
|
|
13
|
+
const known = new Set(monaco.languages.getLanguages().map((l) => l.id));
|
|
14
|
+
const selected = [];
|
|
15
|
+
for (const id of languages) {
|
|
16
|
+
const definition = index.definitions[id];
|
|
17
|
+
if (!definition) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
`unknown gomplate language "${id}"; expected one of ${index.LANGUAGE_IDS.join(", ")}`
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
selected.push(id);
|
|
23
|
+
if (known.has(id)) continue;
|
|
24
|
+
monaco.languages.register({ id });
|
|
25
|
+
monaco.languages.setLanguageConfiguration(id, definition.configuration);
|
|
26
|
+
}
|
|
27
|
+
const applySpec = (merged) => {
|
|
28
|
+
for (const id of selected) {
|
|
29
|
+
const definition = index.definitions[id];
|
|
30
|
+
const attributes$1 = attributes.attributesFor(id, merged);
|
|
31
|
+
monaco.languages.setMonarchTokensProvider(
|
|
32
|
+
id,
|
|
33
|
+
attributes$1 ? { ...definition.monarch, ...attributes$1 } : definition.monarch
|
|
34
|
+
);
|
|
35
|
+
const flavour = environment.pathFlavour(id);
|
|
36
|
+
const installed = [];
|
|
37
|
+
if (completions) {
|
|
38
|
+
installed.push(
|
|
39
|
+
completion.registerCompletion(monaco, id, { spec: merged, environment: options.environment })
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
if (hovers && flavour === "cel") installed.push(hover.registerCelHover(monaco, id, merged));
|
|
43
|
+
if (hovers && flavour === "gotemplate") {
|
|
44
|
+
installed.push(hover.registerGoTemplateHover(monaco, id, merged));
|
|
45
|
+
}
|
|
46
|
+
replaceProviders(monaco, id, installed);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
applySpec(merge.mergeSpec(index.spec, options.spec));
|
|
50
|
+
return {
|
|
51
|
+
setSpec(next) {
|
|
52
|
+
applySpec(merge.mergeSpec(index.spec, next));
|
|
53
|
+
},
|
|
54
|
+
dispose() {
|
|
55
|
+
for (const id of selected) replaceProviders(monaco, id, []);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const providersByLanguage = /* @__PURE__ */ new WeakMap();
|
|
60
|
+
function replaceProviders(monaco, id, installed) {
|
|
61
|
+
let byLanguage = providersByLanguage.get(monaco);
|
|
62
|
+
if (!byLanguage) {
|
|
63
|
+
byLanguage = /* @__PURE__ */ new Map();
|
|
64
|
+
providersByLanguage.set(monaco, byLanguage);
|
|
65
|
+
}
|
|
66
|
+
for (const disposable of byLanguage.get(id) ?? []) disposable.dispose();
|
|
67
|
+
if (installed.length === 0) byLanguage.delete(id);
|
|
68
|
+
else byLanguage.set(id, installed);
|
|
69
|
+
}
|
|
70
|
+
exports.LANGUAGE_IDS = index.LANGUAGE_IDS;
|
|
71
|
+
exports.definitions = index.definitions;
|
|
72
|
+
exports.spec = index.spec;
|
|
73
|
+
exports.childEntries = environment.childEntries;
|
|
74
|
+
exports.isIdentifier = environment.isIdentifier;
|
|
75
|
+
exports.kindOf = environment.kindOf;
|
|
76
|
+
exports.pathExpression = environment.pathExpression;
|
|
77
|
+
exports.pathFlavour = environment.pathFlavour;
|
|
78
|
+
exports.resolvePath = environment.resolvePath;
|
|
79
|
+
exports.summarize = environment.summarize;
|
|
80
|
+
exports.attributesFor = attributes.attributesFor;
|
|
81
|
+
exports.celAttributes = attributes.celAttributes;
|
|
82
|
+
exports.goTemplateAttributes = attributes.goTemplateAttributes;
|
|
83
|
+
exports.mergeSpec = merge.mergeSpec;
|
|
84
|
+
exports.GOMPLATE_DARK_THEME = theme.GOMPLATE_DARK_THEME;
|
|
85
|
+
exports.GOMPLATE_LIGHT_THEME = theme.GOMPLATE_LIGHT_THEME;
|
|
86
|
+
exports.registerGomplateLanguages = registerGomplateLanguages;
|
|
87
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/expressions/lang/index.ts"],"sourcesContent":["import { LANGUAGE_IDS, definitions, spec } from \"./generated\";\nimport type { LanguageId } from \"./generated\";\nimport { registerCompletion } from \"./completion\";\nimport type { EnvironmentSource } from \"./completion\";\nimport { registerCelHover, registerGoTemplateHover } from \"./hover\";\nimport { pathFlavour } from \"./environment\";\nimport { attributesFor } from \"./attributes\";\nimport { mergeSpec } from \"./merge\";\nimport { defineThemes } from \"./theme\";\nimport type { GomplateSpec, LanguageDefinition, Monaco } from \"./types\";\n\nexport { spec, LANGUAGE_IDS, definitions };\nexport type { LanguageId };\nexport * from \"./types\";\nexport { GOMPLATE_DARK_THEME, GOMPLATE_LIGHT_THEME } from \"./theme\";\nexport {\n childEntries,\n isIdentifier,\n kindOf,\n pathExpression,\n pathFlavour,\n resolvePath,\n summarize,\n} from \"./environment\";\nexport type { EnvironmentEntry, PathSegment, ValueKind } from \"./environment\";\nexport { environmentPrefixAt } from \"./prefix\";\nexport type { EnvironmentPrefix } from \"./prefix\";\nexport type { EnvironmentSource } from \"./completion\";\nexport { mergeSpec } from \"./merge\";\nexport { attributesFor, celAttributes, goTemplateAttributes } from \"./attributes\";\nexport type { Attributes } from \"./attributes\";\n\nexport interface RegisterOptions {\n /** Which languages to register. Defaults to all of them. */\n languages?: readonly LanguageId[];\n /** Register completion providers. Defaults to true. */\n completions?: boolean;\n /** Register hover providers. Defaults to true. */\n hovers?: boolean;\n /** Define the gomplate colour themes. Defaults to true. */\n themes?: boolean;\n /**\n * The document expressions are evaluated against, so completion can offer the\n * key paths it actually contains.\n *\n * A getter rather than a value: registration happens once, before the first\n * editor mounts, while the document keeps being edited afterwards. It is\n * called on every completion request.\n */\n environment?: EnvironmentSource;\n /**\n * A host's own catalogue, merged over gomplate's.\n *\n * Usually left unset here and supplied later through `setSpec`, because it\n * arrives from the host's `GET /api/spec` after the editor has mounted.\n */\n spec?: GomplateSpec;\n}\n\n/** What `registerGomplateLanguages` hands back. */\nexport interface RegisteredLanguages {\n /**\n * Replaces the catalogue and re-applies it.\n *\n * Registration has to happen in `beforeMount`, before the first model exists,\n * while a host's spec arrives over the network afterwards — so gating\n * registration on the fetch would stall the editor. Register with the baked\n * catalogue instead and call this when the response lands: the tokenizers are\n * re-applied with the merged word lists, and completion and hover are\n * re-registered against the merged functions.\n */\n setSpec(spec: GomplateSpec | undefined): void;\n dispose(): void;\n}\n\n/**\n * Registers gomplate's languages with a Monaco instance.\n *\n * Safe to call more than once: a language already registered is left alone, so\n * a component tree with several editors does not need to coordinate. The\n * returned handle removes only the providers this call added.\n */\nexport function registerGomplateLanguages(\n monaco: Monaco,\n options: RegisterOptions = {},\n): RegisteredLanguages {\n const { languages = LANGUAGE_IDS, completions = true, hovers = true, themes = true } = options;\n\n if (themes) defineThemes(monaco);\n\n const known = new Set(monaco.languages.getLanguages().map((l) => l.id));\n const selected: LanguageId[] = [];\n\n for (const id of languages) {\n const definition: LanguageDefinition | undefined = definitions[id];\n if (!definition) {\n throw new Error(\n `unknown gomplate language \"${id}\"; expected one of ${LANGUAGE_IDS.join(\", \")}`,\n );\n }\n selected.push(id);\n\n // Only the registration itself is once-only. The tokenizer and the\n // providers are re-applied below for every selected language, whether or\n // not this call is the one that introduced it -- otherwise a second editor\n // would get a handle whose setSpec silently does nothing.\n if (known.has(id)) continue;\n monaco.languages.register({ id });\n monaco.languages.setLanguageConfiguration(id, definition.configuration);\n }\n\n const applySpec = (merged: GomplateSpec) => {\n for (const id of selected) {\n const definition = definitions[id]!;\n const attributes = attributesFor(id, merged);\n // Spread over the generated definition rather than replacing it: the\n // tokenizer rules and the grammar-derived lists (CEL's `operators`) are\n // not the spec's to change.\n monaco.languages.setMonarchTokensProvider(\n id,\n attributes ? { ...definition.monarch, ...attributes } : definition.monarch,\n );\n\n const flavour = pathFlavour(id);\n const installed: { dispose(): void }[] = [];\n if (completions) {\n installed.push(\n registerCompletion(monaco, id, { spec: merged, environment: options.environment }),\n );\n }\n if (hovers && flavour === \"cel\") installed.push(registerCelHover(monaco, id, merged));\n if (hovers && flavour === \"gotemplate\") {\n installed.push(registerGoTemplateHover(monaco, id, merged));\n }\n replaceProviders(monaco, id, installed);\n }\n };\n\n applySpec(mergeSpec(spec, options.spec));\n\n return {\n setSpec(next) {\n applySpec(mergeSpec(spec, next));\n },\n dispose() {\n for (const id of selected) replaceProviders(monaco, id, []);\n },\n };\n}\n\n/**\n * One set of completion and hover providers per language, per Monaco.\n *\n * Monaco stacks providers rather than replacing them, so registering twice for\n * a language shows every suggestion twice. Tracking them here means the latest\n * registration wins instead, and a component tree with several editors does not\n * have to coordinate.\n */\nconst providersByLanguage = new WeakMap<Monaco, Map<string, { dispose(): void }[]>>();\n\nfunction replaceProviders(monaco: Monaco, id: string, installed: { dispose(): void }[]) {\n let byLanguage = providersByLanguage.get(monaco);\n if (!byLanguage) {\n byLanguage = new Map();\n providersByLanguage.set(monaco, byLanguage);\n }\n for (const disposable of byLanguage.get(id) ?? []) disposable.dispose();\n if (installed.length === 0) byLanguage.delete(id);\n else byLanguage.set(id, installed);\n}\n"],"names":["LANGUAGE_IDS","definitions","attributes","attributesFor","pathFlavour","registerCompletion","registerCelHover","registerGoTemplateHover","mergeSpec","spec"],"mappings":";;;;;;;;;AAkFO,SAAS,0BACd,QACA,UAA2B,IACN;AACrB,QAAM,EAAE,YAAYA,MAAAA,cAAc,cAAc,MAAM,SAAS,MAAM,SAAS,KAAA,IAAS;AAEvF,MAAI,2BAAqB,MAAM;AAE/B,QAAM,QAAQ,IAAI,IAAI,OAAO,UAAU,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACtE,QAAM,WAAyB,CAAA;AAE/B,aAAW,MAAM,WAAW;AAC1B,UAAM,aAA6CC,MAAAA,YAAY,EAAE;AACjE,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,8BAA8B,EAAE,sBAAsBD,MAAAA,aAAa,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAEjF;AACA,aAAS,KAAK,EAAE;AAMhB,QAAI,MAAM,IAAI,EAAE,EAAG;AACnB,WAAO,UAAU,SAAS,EAAE,GAAA,CAAI;AAChC,WAAO,UAAU,yBAAyB,IAAI,WAAW,aAAa;AAAA,EACxE;AAEA,QAAM,YAAY,CAAC,WAAyB;AAC1C,eAAW,MAAM,UAAU;AACzB,YAAM,aAAaC,MAAAA,YAAY,EAAE;AACjC,YAAMC,eAAaC,WAAAA,cAAc,IAAI,MAAM;AAI3C,aAAO,UAAU;AAAA,QACf;AAAA,QACAD,eAAa,EAAE,GAAG,WAAW,SAAS,GAAGA,aAAA,IAAe,WAAW;AAAA,MAAA;AAGrE,YAAM,UAAUE,YAAAA,YAAY,EAAE;AAC9B,YAAM,YAAmC,CAAA;AACzC,UAAI,aAAa;AACf,kBAAU;AAAA,UACRC,8BAAmB,QAAQ,IAAI,EAAE,MAAM,QAAQ,aAAa,QAAQ,YAAA,CAAa;AAAA,QAAA;AAAA,MAErF;AACA,UAAI,UAAU,YAAY,MAAO,WAAU,KAAKC,MAAAA,iBAAiB,QAAQ,IAAI,MAAM,CAAC;AACpF,UAAI,UAAU,YAAY,cAAc;AACtC,kBAAU,KAAKC,MAAAA,wBAAwB,QAAQ,IAAI,MAAM,CAAC;AAAA,MAC5D;AACA,uBAAiB,QAAQ,IAAI,SAAS;AAAA,IACxC;AAAA,EACF;AAEA,YAAUC,MAAAA,UAAUC,MAAAA,MAAM,QAAQ,IAAI,CAAC;AAEvC,SAAO;AAAA,IACL,QAAQ,MAAM;AACZ,gBAAUD,MAAAA,UAAUC,YAAM,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,UAAU;AACR,iBAAW,MAAM,SAAU,kBAAiB,QAAQ,IAAI,EAAE;AAAA,IAC5D;AAAA,EAAA;AAEJ;AAUA,MAAM,0CAA0B,QAAA;AAEhC,SAAS,iBAAiB,QAAgB,IAAY,WAAkC;AACtF,MAAI,aAAa,oBAAoB,IAAI,MAAM;AAC/C,MAAI,CAAC,YAAY;AACf,qCAAiB,IAAA;AACjB,wBAAoB,IAAI,QAAQ,UAAU;AAAA,EAC5C;AACA,aAAW,cAAc,WAAW,IAAI,EAAE,KAAK,CAAA,cAAe,QAAA;AAC9D,MAAI,UAAU,WAAW,EAAG,YAAW,OAAO,EAAE;AAAA,MAC3C,YAAW,IAAI,IAAI,SAAS;AACnC;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LANGUAGE_IDS, definitions, spec, LanguageId } from './generated';
|
|
2
|
+
import { EnvironmentSource } from './completion';
|
|
3
|
+
import { GomplateSpec, Monaco } from './types';
|
|
4
|
+
export { spec, LANGUAGE_IDS, definitions };
|
|
5
|
+
export type { LanguageId };
|
|
6
|
+
export * from './types';
|
|
7
|
+
export { GOMPLATE_DARK_THEME, GOMPLATE_LIGHT_THEME } from './theme';
|
|
8
|
+
export { childEntries, isIdentifier, kindOf, pathExpression, pathFlavour, resolvePath, summarize, } from './environment';
|
|
9
|
+
export type { EnvironmentEntry, PathSegment, ValueKind } from './environment';
|
|
10
|
+
export { environmentPrefixAt } from './prefix';
|
|
11
|
+
export type { EnvironmentPrefix } from './prefix';
|
|
12
|
+
export type { EnvironmentSource } from './completion';
|
|
13
|
+
export { mergeSpec } from './merge';
|
|
14
|
+
export { attributesFor, celAttributes, goTemplateAttributes } from './attributes';
|
|
15
|
+
export type { Attributes } from './attributes';
|
|
16
|
+
export interface RegisterOptions {
|
|
17
|
+
/** Which languages to register. Defaults to all of them. */
|
|
18
|
+
languages?: readonly LanguageId[];
|
|
19
|
+
/** Register completion providers. Defaults to true. */
|
|
20
|
+
completions?: boolean;
|
|
21
|
+
/** Register hover providers. Defaults to true. */
|
|
22
|
+
hovers?: boolean;
|
|
23
|
+
/** Define the gomplate colour themes. Defaults to true. */
|
|
24
|
+
themes?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* The document expressions are evaluated against, so completion can offer the
|
|
27
|
+
* key paths it actually contains.
|
|
28
|
+
*
|
|
29
|
+
* A getter rather than a value: registration happens once, before the first
|
|
30
|
+
* editor mounts, while the document keeps being edited afterwards. It is
|
|
31
|
+
* called on every completion request.
|
|
32
|
+
*/
|
|
33
|
+
environment?: EnvironmentSource;
|
|
34
|
+
/**
|
|
35
|
+
* A host's own catalogue, merged over gomplate's.
|
|
36
|
+
*
|
|
37
|
+
* Usually left unset here and supplied later through `setSpec`, because it
|
|
38
|
+
* arrives from the host's `GET /api/spec` after the editor has mounted.
|
|
39
|
+
*/
|
|
40
|
+
spec?: GomplateSpec;
|
|
41
|
+
}
|
|
42
|
+
/** What `registerGomplateLanguages` hands back. */
|
|
43
|
+
export interface RegisteredLanguages {
|
|
44
|
+
/**
|
|
45
|
+
* Replaces the catalogue and re-applies it.
|
|
46
|
+
*
|
|
47
|
+
* Registration has to happen in `beforeMount`, before the first model exists,
|
|
48
|
+
* while a host's spec arrives over the network afterwards — so gating
|
|
49
|
+
* registration on the fetch would stall the editor. Register with the baked
|
|
50
|
+
* catalogue instead and call this when the response lands: the tokenizers are
|
|
51
|
+
* re-applied with the merged word lists, and completion and hover are
|
|
52
|
+
* re-registered against the merged functions.
|
|
53
|
+
*/
|
|
54
|
+
setSpec(spec: GomplateSpec | undefined): void;
|
|
55
|
+
dispose(): void;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Registers gomplate's languages with a Monaco instance.
|
|
59
|
+
*
|
|
60
|
+
* Safe to call more than once: a language already registered is left alone, so
|
|
61
|
+
* a component tree with several editors does not need to coordinate. The
|
|
62
|
+
* returned handle removes only the providers this call added.
|
|
63
|
+
*/
|
|
64
|
+
export declare function registerGomplateLanguages(monaco: Monaco, options?: RegisterOptions): RegisteredLanguages;
|
|
65
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/expressions/lang/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMtD,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,EAAE,MAAM,SAAS,CAAC;AAExE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,cAAc,EACd,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAClF,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAClC,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;OASG;IACH,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,mBAAmB,CA+DrB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { LANGUAGE_IDS, definitions, spec } from "./generated/index.js";
|
|
2
|
+
import { registerCompletion } from "./completion.js";
|
|
3
|
+
import { registerCelHover, registerGoTemplateHover } from "./hover.js";
|
|
4
|
+
import { pathFlavour } from "./environment.js";
|
|
5
|
+
import { childEntries, isIdentifier, kindOf, pathExpression, resolvePath, summarize } from "./environment.js";
|
|
6
|
+
import { attributesFor } from "./attributes.js";
|
|
7
|
+
import { celAttributes, goTemplateAttributes } from "./attributes.js";
|
|
8
|
+
import { mergeSpec } from "./merge.js";
|
|
9
|
+
import { defineThemes } from "./theme.js";
|
|
10
|
+
import { GOMPLATE_DARK_THEME, GOMPLATE_LIGHT_THEME } from "./theme.js";
|
|
11
|
+
function registerGomplateLanguages(monaco, options = {}) {
|
|
12
|
+
const { languages = LANGUAGE_IDS, completions = true, hovers = true, themes = true } = options;
|
|
13
|
+
if (themes) defineThemes(monaco);
|
|
14
|
+
const known = new Set(monaco.languages.getLanguages().map((l) => l.id));
|
|
15
|
+
const selected = [];
|
|
16
|
+
for (const id of languages) {
|
|
17
|
+
const definition = definitions[id];
|
|
18
|
+
if (!definition) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
`unknown gomplate language "${id}"; expected one of ${LANGUAGE_IDS.join(", ")}`
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
selected.push(id);
|
|
24
|
+
if (known.has(id)) continue;
|
|
25
|
+
monaco.languages.register({ id });
|
|
26
|
+
monaco.languages.setLanguageConfiguration(id, definition.configuration);
|
|
27
|
+
}
|
|
28
|
+
const applySpec = (merged) => {
|
|
29
|
+
for (const id of selected) {
|
|
30
|
+
const definition = definitions[id];
|
|
31
|
+
const attributes = attributesFor(id, merged);
|
|
32
|
+
monaco.languages.setMonarchTokensProvider(
|
|
33
|
+
id,
|
|
34
|
+
attributes ? { ...definition.monarch, ...attributes } : definition.monarch
|
|
35
|
+
);
|
|
36
|
+
const flavour = pathFlavour(id);
|
|
37
|
+
const installed = [];
|
|
38
|
+
if (completions) {
|
|
39
|
+
installed.push(
|
|
40
|
+
registerCompletion(monaco, id, { spec: merged, environment: options.environment })
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
if (hovers && flavour === "cel") installed.push(registerCelHover(monaco, id, merged));
|
|
44
|
+
if (hovers && flavour === "gotemplate") {
|
|
45
|
+
installed.push(registerGoTemplateHover(monaco, id, merged));
|
|
46
|
+
}
|
|
47
|
+
replaceProviders(monaco, id, installed);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
applySpec(mergeSpec(spec, options.spec));
|
|
51
|
+
return {
|
|
52
|
+
setSpec(next) {
|
|
53
|
+
applySpec(mergeSpec(spec, next));
|
|
54
|
+
},
|
|
55
|
+
dispose() {
|
|
56
|
+
for (const id of selected) replaceProviders(monaco, id, []);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const providersByLanguage = /* @__PURE__ */ new WeakMap();
|
|
61
|
+
function replaceProviders(monaco, id, installed) {
|
|
62
|
+
let byLanguage = providersByLanguage.get(monaco);
|
|
63
|
+
if (!byLanguage) {
|
|
64
|
+
byLanguage = /* @__PURE__ */ new Map();
|
|
65
|
+
providersByLanguage.set(monaco, byLanguage);
|
|
66
|
+
}
|
|
67
|
+
for (const disposable of byLanguage.get(id) ?? []) disposable.dispose();
|
|
68
|
+
if (installed.length === 0) byLanguage.delete(id);
|
|
69
|
+
else byLanguage.set(id, installed);
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
GOMPLATE_DARK_THEME,
|
|
73
|
+
GOMPLATE_LIGHT_THEME,
|
|
74
|
+
LANGUAGE_IDS,
|
|
75
|
+
attributesFor,
|
|
76
|
+
celAttributes,
|
|
77
|
+
childEntries,
|
|
78
|
+
definitions,
|
|
79
|
+
goTemplateAttributes,
|
|
80
|
+
isIdentifier,
|
|
81
|
+
kindOf,
|
|
82
|
+
mergeSpec,
|
|
83
|
+
pathExpression,
|
|
84
|
+
pathFlavour,
|
|
85
|
+
registerGomplateLanguages,
|
|
86
|
+
resolvePath,
|
|
87
|
+
spec,
|
|
88
|
+
summarize
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/expressions/lang/index.ts"],"sourcesContent":["import { LANGUAGE_IDS, definitions, spec } from \"./generated\";\nimport type { LanguageId } from \"./generated\";\nimport { registerCompletion } from \"./completion\";\nimport type { EnvironmentSource } from \"./completion\";\nimport { registerCelHover, registerGoTemplateHover } from \"./hover\";\nimport { pathFlavour } from \"./environment\";\nimport { attributesFor } from \"./attributes\";\nimport { mergeSpec } from \"./merge\";\nimport { defineThemes } from \"./theme\";\nimport type { GomplateSpec, LanguageDefinition, Monaco } from \"./types\";\n\nexport { spec, LANGUAGE_IDS, definitions };\nexport type { LanguageId };\nexport * from \"./types\";\nexport { GOMPLATE_DARK_THEME, GOMPLATE_LIGHT_THEME } from \"./theme\";\nexport {\n childEntries,\n isIdentifier,\n kindOf,\n pathExpression,\n pathFlavour,\n resolvePath,\n summarize,\n} from \"./environment\";\nexport type { EnvironmentEntry, PathSegment, ValueKind } from \"./environment\";\nexport { environmentPrefixAt } from \"./prefix\";\nexport type { EnvironmentPrefix } from \"./prefix\";\nexport type { EnvironmentSource } from \"./completion\";\nexport { mergeSpec } from \"./merge\";\nexport { attributesFor, celAttributes, goTemplateAttributes } from \"./attributes\";\nexport type { Attributes } from \"./attributes\";\n\nexport interface RegisterOptions {\n /** Which languages to register. Defaults to all of them. */\n languages?: readonly LanguageId[];\n /** Register completion providers. Defaults to true. */\n completions?: boolean;\n /** Register hover providers. Defaults to true. */\n hovers?: boolean;\n /** Define the gomplate colour themes. Defaults to true. */\n themes?: boolean;\n /**\n * The document expressions are evaluated against, so completion can offer the\n * key paths it actually contains.\n *\n * A getter rather than a value: registration happens once, before the first\n * editor mounts, while the document keeps being edited afterwards. It is\n * called on every completion request.\n */\n environment?: EnvironmentSource;\n /**\n * A host's own catalogue, merged over gomplate's.\n *\n * Usually left unset here and supplied later through `setSpec`, because it\n * arrives from the host's `GET /api/spec` after the editor has mounted.\n */\n spec?: GomplateSpec;\n}\n\n/** What `registerGomplateLanguages` hands back. */\nexport interface RegisteredLanguages {\n /**\n * Replaces the catalogue and re-applies it.\n *\n * Registration has to happen in `beforeMount`, before the first model exists,\n * while a host's spec arrives over the network afterwards — so gating\n * registration on the fetch would stall the editor. Register with the baked\n * catalogue instead and call this when the response lands: the tokenizers are\n * re-applied with the merged word lists, and completion and hover are\n * re-registered against the merged functions.\n */\n setSpec(spec: GomplateSpec | undefined): void;\n dispose(): void;\n}\n\n/**\n * Registers gomplate's languages with a Monaco instance.\n *\n * Safe to call more than once: a language already registered is left alone, so\n * a component tree with several editors does not need to coordinate. The\n * returned handle removes only the providers this call added.\n */\nexport function registerGomplateLanguages(\n monaco: Monaco,\n options: RegisterOptions = {},\n): RegisteredLanguages {\n const { languages = LANGUAGE_IDS, completions = true, hovers = true, themes = true } = options;\n\n if (themes) defineThemes(monaco);\n\n const known = new Set(monaco.languages.getLanguages().map((l) => l.id));\n const selected: LanguageId[] = [];\n\n for (const id of languages) {\n const definition: LanguageDefinition | undefined = definitions[id];\n if (!definition) {\n throw new Error(\n `unknown gomplate language \"${id}\"; expected one of ${LANGUAGE_IDS.join(\", \")}`,\n );\n }\n selected.push(id);\n\n // Only the registration itself is once-only. The tokenizer and the\n // providers are re-applied below for every selected language, whether or\n // not this call is the one that introduced it -- otherwise a second editor\n // would get a handle whose setSpec silently does nothing.\n if (known.has(id)) continue;\n monaco.languages.register({ id });\n monaco.languages.setLanguageConfiguration(id, definition.configuration);\n }\n\n const applySpec = (merged: GomplateSpec) => {\n for (const id of selected) {\n const definition = definitions[id]!;\n const attributes = attributesFor(id, merged);\n // Spread over the generated definition rather than replacing it: the\n // tokenizer rules and the grammar-derived lists (CEL's `operators`) are\n // not the spec's to change.\n monaco.languages.setMonarchTokensProvider(\n id,\n attributes ? { ...definition.monarch, ...attributes } : definition.monarch,\n );\n\n const flavour = pathFlavour(id);\n const installed: { dispose(): void }[] = [];\n if (completions) {\n installed.push(\n registerCompletion(monaco, id, { spec: merged, environment: options.environment }),\n );\n }\n if (hovers && flavour === \"cel\") installed.push(registerCelHover(monaco, id, merged));\n if (hovers && flavour === \"gotemplate\") {\n installed.push(registerGoTemplateHover(monaco, id, merged));\n }\n replaceProviders(monaco, id, installed);\n }\n };\n\n applySpec(mergeSpec(spec, options.spec));\n\n return {\n setSpec(next) {\n applySpec(mergeSpec(spec, next));\n },\n dispose() {\n for (const id of selected) replaceProviders(monaco, id, []);\n },\n };\n}\n\n/**\n * One set of completion and hover providers per language, per Monaco.\n *\n * Monaco stacks providers rather than replacing them, so registering twice for\n * a language shows every suggestion twice. Tracking them here means the latest\n * registration wins instead, and a component tree with several editors does not\n * have to coordinate.\n */\nconst providersByLanguage = new WeakMap<Monaco, Map<string, { dispose(): void }[]>>();\n\nfunction replaceProviders(monaco: Monaco, id: string, installed: { dispose(): void }[]) {\n let byLanguage = providersByLanguage.get(monaco);\n if (!byLanguage) {\n byLanguage = new Map();\n providersByLanguage.set(monaco, byLanguage);\n }\n for (const disposable of byLanguage.get(id) ?? []) disposable.dispose();\n if (installed.length === 0) byLanguage.delete(id);\n else byLanguage.set(id, installed);\n}\n"],"names":[],"mappings":";;;;;;;;;;AAkFO,SAAS,0BACd,QACA,UAA2B,IACN;AACrB,QAAM,EAAE,YAAY,cAAc,cAAc,MAAM,SAAS,MAAM,SAAS,KAAA,IAAS;AAEvF,MAAI,qBAAqB,MAAM;AAE/B,QAAM,QAAQ,IAAI,IAAI,OAAO,UAAU,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACtE,QAAM,WAAyB,CAAA;AAE/B,aAAW,MAAM,WAAW;AAC1B,UAAM,aAA6C,YAAY,EAAE;AACjE,QAAI,CAAC,YAAY;AACf,YAAM,IAAI;AAAA,QACR,8BAA8B,EAAE,sBAAsB,aAAa,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAEjF;AACA,aAAS,KAAK,EAAE;AAMhB,QAAI,MAAM,IAAI,EAAE,EAAG;AACnB,WAAO,UAAU,SAAS,EAAE,GAAA,CAAI;AAChC,WAAO,UAAU,yBAAyB,IAAI,WAAW,aAAa;AAAA,EACxE;AAEA,QAAM,YAAY,CAAC,WAAyB;AAC1C,eAAW,MAAM,UAAU;AACzB,YAAM,aAAa,YAAY,EAAE;AACjC,YAAM,aAAa,cAAc,IAAI,MAAM;AAI3C,aAAO,UAAU;AAAA,QACf;AAAA,QACA,aAAa,EAAE,GAAG,WAAW,SAAS,GAAG,WAAA,IAAe,WAAW;AAAA,MAAA;AAGrE,YAAM,UAAU,YAAY,EAAE;AAC9B,YAAM,YAAmC,CAAA;AACzC,UAAI,aAAa;AACf,kBAAU;AAAA,UACR,mBAAmB,QAAQ,IAAI,EAAE,MAAM,QAAQ,aAAa,QAAQ,YAAA,CAAa;AAAA,QAAA;AAAA,MAErF;AACA,UAAI,UAAU,YAAY,MAAO,WAAU,KAAK,iBAAiB,QAAQ,IAAI,MAAM,CAAC;AACpF,UAAI,UAAU,YAAY,cAAc;AACtC,kBAAU,KAAK,wBAAwB,QAAQ,IAAI,MAAM,CAAC;AAAA,MAC5D;AACA,uBAAiB,QAAQ,IAAI,SAAS;AAAA,IACxC;AAAA,EACF;AAEA,YAAU,UAAU,MAAM,QAAQ,IAAI,CAAC;AAEvC,SAAO;AAAA,IACL,QAAQ,MAAM;AACZ,gBAAU,UAAU,MAAM,IAAI,CAAC;AAAA,IACjC;AAAA,IACA,UAAU;AACR,iBAAW,MAAM,SAAU,kBAAiB,QAAQ,IAAI,EAAE;AAAA,IAC5D;AAAA,EAAA;AAEJ;AAUA,MAAM,0CAA0B,QAAA;AAEhC,SAAS,iBAAiB,QAAgB,IAAY,WAAkC;AACtF,MAAI,aAAa,oBAAoB,IAAI,MAAM;AAC/C,MAAI,CAAC,YAAY;AACf,qCAAiB,IAAA;AACjB,wBAAoB,IAAI,QAAQ,UAAU;AAAA,EAC5C;AACA,aAAW,cAAc,WAAW,IAAI,EAAE,KAAK,CAAA,cAAe,QAAA;AAC9D,MAAI,UAAU,WAAW,EAAG,YAAW,OAAO,EAAE;AAAA,MAC3C,YAAW,IAAI,IAAI,SAAS;AACnC;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
function mergeSpec(base, incoming) {
|
|
4
|
+
if (!incoming) return base;
|
|
5
|
+
return {
|
|
6
|
+
cel: mergeCel(base.cel, incoming.cel),
|
|
7
|
+
gotemplate: mergeGoTemplate(base.gotemplate, incoming.gotemplate)
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function mergeCel(base, incoming) {
|
|
11
|
+
return {
|
|
12
|
+
namespaces: union(base.namespaces, incoming.namespaces),
|
|
13
|
+
keywords: union(base.keywords, incoming.keywords),
|
|
14
|
+
types: union(base.types, incoming.types),
|
|
15
|
+
variables: union(base.variables ?? [], incoming.variables ?? []),
|
|
16
|
+
// Keyed by arity as well as name: `map` is registered twice, at 2 and 3
|
|
17
|
+
// arguments, and folding those together would drop an overload the hover
|
|
18
|
+
// list already renders separately.
|
|
19
|
+
macros: keyed(
|
|
20
|
+
base.macros,
|
|
21
|
+
incoming.macros,
|
|
22
|
+
(macro) => `${macro.name}/${macro.argCount}/${macro.receiverStyle}`
|
|
23
|
+
),
|
|
24
|
+
functions: byName(base.functions, incoming.functions)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function mergeGoTemplate(base, incoming) {
|
|
28
|
+
return {
|
|
29
|
+
namespaces: union(base.namespaces, incoming.namespaces),
|
|
30
|
+
keywords: union(base.keywords, incoming.keywords),
|
|
31
|
+
builtins: union(base.builtins, incoming.builtins),
|
|
32
|
+
// Delimiters are a property of the binary's parser, not a list to merge:
|
|
33
|
+
// a host that has changed them means it, and half of a pair would be worse
|
|
34
|
+
// than either.
|
|
35
|
+
delimiters: incoming.delimiters ?? base.delimiters,
|
|
36
|
+
functions: byName(base.functions, incoming.functions)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function union(base, incoming) {
|
|
40
|
+
return [.../* @__PURE__ */ new Set([...base, ...incoming])].sort();
|
|
41
|
+
}
|
|
42
|
+
function byName(base, incoming) {
|
|
43
|
+
return keyed(base, incoming, (item) => item.name);
|
|
44
|
+
}
|
|
45
|
+
function keyed(base, incoming, key) {
|
|
46
|
+
const merged = /* @__PURE__ */ new Map();
|
|
47
|
+
for (const item of base) merged.set(key(item), item);
|
|
48
|
+
for (const item of incoming) merged.set(key(item), item);
|
|
49
|
+
return [...merged.values()].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
50
|
+
}
|
|
51
|
+
exports.mergeSpec = mergeSpec;
|
|
52
|
+
//# sourceMappingURL=merge.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.cjs","sources":["../../../src/expressions/lang/merge.ts"],"sourcesContent":["import type { CelSpec, GoTemplateSpec, GomplateSpec, SpecFunction, SpecMacro } from \"./types\";\n\n/**\n * Folds a host's catalogue into the one this package ships.\n *\n * A host binary registers functions on top of gomplate's — mission-control's\n * `catalog.query`, `gitops.source` — and serves the result from `/api/spec`.\n * That response already *contains* gomplate's own functions, so merging is\n * mostly a union; the interesting case is a host that overrides a name, where\n * the host wins because its binary is what will actually evaluate.\n */\nexport function mergeSpec(base: GomplateSpec, incoming: GomplateSpec | undefined): GomplateSpec {\n if (!incoming) return base;\n return {\n cel: mergeCel(base.cel, incoming.cel),\n gotemplate: mergeGoTemplate(base.gotemplate, incoming.gotemplate),\n };\n}\n\nfunction mergeCel(base: CelSpec, incoming: CelSpec): CelSpec {\n return {\n namespaces: union(base.namespaces, incoming.namespaces),\n keywords: union(base.keywords, incoming.keywords),\n types: union(base.types, incoming.types),\n variables: union(base.variables ?? [], incoming.variables ?? []),\n // Keyed by arity as well as name: `map` is registered twice, at 2 and 3\n // arguments, and folding those together would drop an overload the hover\n // list already renders separately.\n macros: keyed<SpecMacro>(\n base.macros,\n incoming.macros,\n (macro) => `${macro.name}/${macro.argCount}/${macro.receiverStyle}`,\n ),\n functions: byName<SpecFunction>(base.functions, incoming.functions),\n };\n}\n\nfunction mergeGoTemplate(base: GoTemplateSpec, incoming: GoTemplateSpec): GoTemplateSpec {\n return {\n namespaces: union(base.namespaces, incoming.namespaces),\n keywords: union(base.keywords, incoming.keywords),\n builtins: union(base.builtins, incoming.builtins),\n // Delimiters are a property of the binary's parser, not a list to merge:\n // a host that has changed them means it, and half of a pair would be worse\n // than either.\n delimiters: incoming.delimiters ?? base.delimiters,\n functions: byName<SpecFunction>(base.functions, incoming.functions),\n };\n}\n\nfunction union(base: readonly string[], incoming: readonly string[]): string[] {\n return [...new Set([...base, ...incoming])].sort();\n}\n\n/** Keyed by name, incoming wins, order stable and alphabetical. */\nfunction byName<T extends { name: string }>(base: readonly T[], incoming: readonly T[]): T[] {\n return keyed(base, incoming, (item) => item.name);\n}\n\nfunction keyed<T extends { name: string }>(\n base: readonly T[],\n incoming: readonly T[],\n key: (item: T) => string,\n): T[] {\n const merged = new Map<string, T>();\n for (const item of base) merged.set(key(item), item);\n for (const item of incoming) merged.set(key(item), item);\n return [...merged.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n"],"names":[],"mappings":";;AAWO,SAAS,UAAU,MAAoB,UAAkD;AAC9F,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AAAA,IACpC,YAAY,gBAAgB,KAAK,YAAY,SAAS,UAAU;AAAA,EAAA;AAEpE;AAEA,SAAS,SAAS,MAAe,UAA4B;AAC3D,SAAO;AAAA,IACL,YAAY,MAAM,KAAK,YAAY,SAAS,UAAU;AAAA,IACtD,UAAU,MAAM,KAAK,UAAU,SAAS,QAAQ;AAAA,IAChD,OAAO,MAAM,KAAK,OAAO,SAAS,KAAK;AAAA,IACvC,WAAW,MAAM,KAAK,aAAa,CAAA,GAAI,SAAS,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA,IAI/D,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,MACT,CAAC,UAAU,GAAG,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI,MAAM,aAAa;AAAA,IAAA;AAAA,IAEnE,WAAW,OAAqB,KAAK,WAAW,SAAS,SAAS;AAAA,EAAA;AAEtE;AAEA,SAAS,gBAAgB,MAAsB,UAA0C;AACvF,SAAO;AAAA,IACL,YAAY,MAAM,KAAK,YAAY,SAAS,UAAU;AAAA,IACtD,UAAU,MAAM,KAAK,UAAU,SAAS,QAAQ;AAAA,IAChD,UAAU,MAAM,KAAK,UAAU,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIhD,YAAY,SAAS,cAAc,KAAK;AAAA,IACxC,WAAW,OAAqB,KAAK,WAAW,SAAS,SAAS;AAAA,EAAA;AAEtE;AAEA,SAAS,MAAM,MAAyB,UAAuC;AAC7E,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAA;AAC9C;AAGA,SAAS,OAAmC,MAAoB,UAA6B;AAC3F,SAAO,MAAM,MAAM,UAAU,CAAC,SAAS,KAAK,IAAI;AAClD;AAEA,SAAS,MACP,MACA,UACA,KACK;AACL,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQ,KAAM,QAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AACnD,aAAW,QAAQ,SAAU,QAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AACvD,SAAO,CAAC,GAAG,OAAO,OAAA,CAAQ,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,CAAE;AAC7F;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { GomplateSpec } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Folds a host's catalogue into the one this package ships.
|
|
4
|
+
*
|
|
5
|
+
* A host binary registers functions on top of gomplate's — mission-control's
|
|
6
|
+
* `catalog.query`, `gitops.source` — and serves the result from `/api/spec`.
|
|
7
|
+
* That response already *contains* gomplate's own functions, so merging is
|
|
8
|
+
* mostly a union; the interesting case is a host that overrides a name, where
|
|
9
|
+
* the host wins because its binary is what will actually evaluate.
|
|
10
|
+
*/
|
|
11
|
+
export declare function mergeSpec(base: GomplateSpec, incoming: GomplateSpec | undefined): GomplateSpec;
|
|
12
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/expressions/lang/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,YAAY,EAA2B,MAAM,SAAS,CAAC;AAE9F;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,YAAY,CAM9F"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function mergeSpec(base, incoming) {
|
|
2
|
+
if (!incoming) return base;
|
|
3
|
+
return {
|
|
4
|
+
cel: mergeCel(base.cel, incoming.cel),
|
|
5
|
+
gotemplate: mergeGoTemplate(base.gotemplate, incoming.gotemplate)
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function mergeCel(base, incoming) {
|
|
9
|
+
return {
|
|
10
|
+
namespaces: union(base.namespaces, incoming.namespaces),
|
|
11
|
+
keywords: union(base.keywords, incoming.keywords),
|
|
12
|
+
types: union(base.types, incoming.types),
|
|
13
|
+
variables: union(base.variables ?? [], incoming.variables ?? []),
|
|
14
|
+
// Keyed by arity as well as name: `map` is registered twice, at 2 and 3
|
|
15
|
+
// arguments, and folding those together would drop an overload the hover
|
|
16
|
+
// list already renders separately.
|
|
17
|
+
macros: keyed(
|
|
18
|
+
base.macros,
|
|
19
|
+
incoming.macros,
|
|
20
|
+
(macro) => `${macro.name}/${macro.argCount}/${macro.receiverStyle}`
|
|
21
|
+
),
|
|
22
|
+
functions: byName(base.functions, incoming.functions)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function mergeGoTemplate(base, incoming) {
|
|
26
|
+
return {
|
|
27
|
+
namespaces: union(base.namespaces, incoming.namespaces),
|
|
28
|
+
keywords: union(base.keywords, incoming.keywords),
|
|
29
|
+
builtins: union(base.builtins, incoming.builtins),
|
|
30
|
+
// Delimiters are a property of the binary's parser, not a list to merge:
|
|
31
|
+
// a host that has changed them means it, and half of a pair would be worse
|
|
32
|
+
// than either.
|
|
33
|
+
delimiters: incoming.delimiters ?? base.delimiters,
|
|
34
|
+
functions: byName(base.functions, incoming.functions)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function union(base, incoming) {
|
|
38
|
+
return [.../* @__PURE__ */ new Set([...base, ...incoming])].sort();
|
|
39
|
+
}
|
|
40
|
+
function byName(base, incoming) {
|
|
41
|
+
return keyed(base, incoming, (item) => item.name);
|
|
42
|
+
}
|
|
43
|
+
function keyed(base, incoming, key) {
|
|
44
|
+
const merged = /* @__PURE__ */ new Map();
|
|
45
|
+
for (const item of base) merged.set(key(item), item);
|
|
46
|
+
for (const item of incoming) merged.set(key(item), item);
|
|
47
|
+
return [...merged.values()].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
mergeSpec
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sources":["../../../src/expressions/lang/merge.ts"],"sourcesContent":["import type { CelSpec, GoTemplateSpec, GomplateSpec, SpecFunction, SpecMacro } from \"./types\";\n\n/**\n * Folds a host's catalogue into the one this package ships.\n *\n * A host binary registers functions on top of gomplate's — mission-control's\n * `catalog.query`, `gitops.source` — and serves the result from `/api/spec`.\n * That response already *contains* gomplate's own functions, so merging is\n * mostly a union; the interesting case is a host that overrides a name, where\n * the host wins because its binary is what will actually evaluate.\n */\nexport function mergeSpec(base: GomplateSpec, incoming: GomplateSpec | undefined): GomplateSpec {\n if (!incoming) return base;\n return {\n cel: mergeCel(base.cel, incoming.cel),\n gotemplate: mergeGoTemplate(base.gotemplate, incoming.gotemplate),\n };\n}\n\nfunction mergeCel(base: CelSpec, incoming: CelSpec): CelSpec {\n return {\n namespaces: union(base.namespaces, incoming.namespaces),\n keywords: union(base.keywords, incoming.keywords),\n types: union(base.types, incoming.types),\n variables: union(base.variables ?? [], incoming.variables ?? []),\n // Keyed by arity as well as name: `map` is registered twice, at 2 and 3\n // arguments, and folding those together would drop an overload the hover\n // list already renders separately.\n macros: keyed<SpecMacro>(\n base.macros,\n incoming.macros,\n (macro) => `${macro.name}/${macro.argCount}/${macro.receiverStyle}`,\n ),\n functions: byName<SpecFunction>(base.functions, incoming.functions),\n };\n}\n\nfunction mergeGoTemplate(base: GoTemplateSpec, incoming: GoTemplateSpec): GoTemplateSpec {\n return {\n namespaces: union(base.namespaces, incoming.namespaces),\n keywords: union(base.keywords, incoming.keywords),\n builtins: union(base.builtins, incoming.builtins),\n // Delimiters are a property of the binary's parser, not a list to merge:\n // a host that has changed them means it, and half of a pair would be worse\n // than either.\n delimiters: incoming.delimiters ?? base.delimiters,\n functions: byName<SpecFunction>(base.functions, incoming.functions),\n };\n}\n\nfunction union(base: readonly string[], incoming: readonly string[]): string[] {\n return [...new Set([...base, ...incoming])].sort();\n}\n\n/** Keyed by name, incoming wins, order stable and alphabetical. */\nfunction byName<T extends { name: string }>(base: readonly T[], incoming: readonly T[]): T[] {\n return keyed(base, incoming, (item) => item.name);\n}\n\nfunction keyed<T extends { name: string }>(\n base: readonly T[],\n incoming: readonly T[],\n key: (item: T) => string,\n): T[] {\n const merged = new Map<string, T>();\n for (const item of base) merged.set(key(item), item);\n for (const item of incoming) merged.set(key(item), item);\n return [...merged.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n"],"names":[],"mappings":"AAWO,SAAS,UAAU,MAAoB,UAAkD;AAC9F,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO;AAAA,IACL,KAAK,SAAS,KAAK,KAAK,SAAS,GAAG;AAAA,IACpC,YAAY,gBAAgB,KAAK,YAAY,SAAS,UAAU;AAAA,EAAA;AAEpE;AAEA,SAAS,SAAS,MAAe,UAA4B;AAC3D,SAAO;AAAA,IACL,YAAY,MAAM,KAAK,YAAY,SAAS,UAAU;AAAA,IACtD,UAAU,MAAM,KAAK,UAAU,SAAS,QAAQ;AAAA,IAChD,OAAO,MAAM,KAAK,OAAO,SAAS,KAAK;AAAA,IACvC,WAAW,MAAM,KAAK,aAAa,CAAA,GAAI,SAAS,aAAa,EAAE;AAAA;AAAA;AAAA;AAAA,IAI/D,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,MACT,CAAC,UAAU,GAAG,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI,MAAM,aAAa;AAAA,IAAA;AAAA,IAEnE,WAAW,OAAqB,KAAK,WAAW,SAAS,SAAS;AAAA,EAAA;AAEtE;AAEA,SAAS,gBAAgB,MAAsB,UAA0C;AACvF,SAAO;AAAA,IACL,YAAY,MAAM,KAAK,YAAY,SAAS,UAAU;AAAA,IACtD,UAAU,MAAM,KAAK,UAAU,SAAS,QAAQ;AAAA,IAChD,UAAU,MAAM,KAAK,UAAU,SAAS,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIhD,YAAY,SAAS,cAAc,KAAK;AAAA,IACxC,WAAW,OAAqB,KAAK,WAAW,SAAS,SAAS;AAAA,EAAA;AAEtE;AAEA,SAAS,MAAM,MAAyB,UAAuC;AAC7E,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAA;AAC9C;AAGA,SAAS,OAAmC,MAAoB,UAA6B;AAC3F,SAAO,MAAM,MAAM,UAAU,CAAC,SAAS,KAAK,IAAI;AAClD;AAEA,SAAS,MACP,MACA,UACA,KACK;AACL,QAAM,6BAAa,IAAA;AACnB,aAAW,QAAQ,KAAM,QAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AACnD,aAAW,QAAQ,SAAU,QAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AACvD,SAAO,CAAC,GAAG,OAAO,OAAA,CAAQ,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,CAAE;AAC7F;"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const index = require("./generated/index.cjs");
|
|
4
|
+
const environment = require("./environment.cjs");
|
|
5
|
+
const IDENT = /[A-Za-z0-9_]/;
|
|
6
|
+
const SUBSCRIPT = /^(?:(\d+)|"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)')$/;
|
|
7
|
+
function environmentPrefixAt(model, position, languageId) {
|
|
8
|
+
const flavour = environment.pathFlavour(languageId);
|
|
9
|
+
if (!flavour) return null;
|
|
10
|
+
const line = model.getLineContent(position.lineNumber);
|
|
11
|
+
const before = line.slice(0, position.column - 1);
|
|
12
|
+
if (flavour === "gotemplate" && !insideAction(before)) return null;
|
|
13
|
+
let leafStart = before.length;
|
|
14
|
+
while (leafStart > 0 && IDENT.test(before[leafStart - 1])) leafStart--;
|
|
15
|
+
const leaf = before.slice(leafStart);
|
|
16
|
+
const head = before.slice(0, leafStart);
|
|
17
|
+
const chain = parseChain(head);
|
|
18
|
+
if (!chain) return null;
|
|
19
|
+
if (leaf !== "" && !chain.dotted && chain.segments.length > 0) return null;
|
|
20
|
+
let start = chain.start;
|
|
21
|
+
if (flavour === "gotemplate" && !chain.rooted) return null;
|
|
22
|
+
if (flavour === "jsonpath") {
|
|
23
|
+
const marker = head[chain.start - 1];
|
|
24
|
+
if (marker !== "$" && marker !== "@") return null;
|
|
25
|
+
start -= 1;
|
|
26
|
+
}
|
|
27
|
+
if (flavour === "cel" && chain.rooted) return null;
|
|
28
|
+
return {
|
|
29
|
+
segments: chain.segments,
|
|
30
|
+
leaf,
|
|
31
|
+
startColumn: start + 1,
|
|
32
|
+
endColumn: position.column,
|
|
33
|
+
typed: before.slice(start)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function parseChain(head) {
|
|
37
|
+
let pos = head.length;
|
|
38
|
+
const dotted = pos > 0 && head[pos - 1] === ".";
|
|
39
|
+
if (dotted) pos--;
|
|
40
|
+
const reversed = [];
|
|
41
|
+
let rooted = false;
|
|
42
|
+
for (; ; ) {
|
|
43
|
+
if (pos > 0 && head[pos - 1] === "]") {
|
|
44
|
+
const open = head.lastIndexOf("[", pos - 2);
|
|
45
|
+
if (open < 0) return null;
|
|
46
|
+
const segment = parseSubscript(head.slice(open + 1, pos - 1));
|
|
47
|
+
if (segment === null) return null;
|
|
48
|
+
reversed.push(segment);
|
|
49
|
+
pos = open;
|
|
50
|
+
rooted = false;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (pos > 0 && IDENT.test(head[pos - 1])) {
|
|
54
|
+
let start = pos;
|
|
55
|
+
while (start > 0 && IDENT.test(head[start - 1])) start--;
|
|
56
|
+
reversed.push(head.slice(start, pos));
|
|
57
|
+
pos = start;
|
|
58
|
+
rooted = pos > 0 && head[pos - 1] === ".";
|
|
59
|
+
if (rooted) {
|
|
60
|
+
pos--;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
if (reversed.length === 0 && dotted) rooted = true;
|
|
68
|
+
return { segments: reversed.reverse(), start: pos, dotted, rooted };
|
|
69
|
+
}
|
|
70
|
+
function parseSubscript(inner) {
|
|
71
|
+
const match = SUBSCRIPT.exec(inner.trim());
|
|
72
|
+
if (!match) return null;
|
|
73
|
+
if (match[1] !== void 0) return Number(match[1]);
|
|
74
|
+
const quoted = match[2] ?? match[3];
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(`"${quoted.replace(/\\'/g, "'")}"`);
|
|
77
|
+
} catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function insideAction(before) {
|
|
82
|
+
const { left, right, leftComment, rightComment } = index.spec.gotemplate.delimiters;
|
|
83
|
+
const open = before.lastIndexOf(left);
|
|
84
|
+
if (open < 0) return false;
|
|
85
|
+
if (before.lastIndexOf(right) > open) return false;
|
|
86
|
+
const comment = before.lastIndexOf(leftComment);
|
|
87
|
+
if (comment >= open && before.lastIndexOf(rightComment) < comment) return false;
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
exports.environmentPrefixAt = environmentPrefixAt;
|
|
91
|
+
//# sourceMappingURL=prefix.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix.cjs","sources":["../../../src/expressions/lang/prefix.ts"],"sourcesContent":["import { spec } from \"./generated\";\nimport { pathFlavour } from \"./environment\";\nimport type { PathSegment } from \"./environment\";\n\n/** The subset of a Monaco model this module reads. */\nexport interface PrefixModel {\n getLineContent(line: number): string;\n}\n\nexport interface PrefixPosition {\n lineNumber: number;\n column: number;\n}\n\n/** A path expression under construction at the cursor. */\nexport interface EnvironmentPrefix {\n /** The segments already committed, left of the trailing dot. */\n segments: PathSegment[];\n /** The partially typed leaf, empty right after a dot. */\n leaf: string;\n /**\n * 1-based columns spanning the whole expression typed so far, root marker\n * included. A completion replaces this range with a freshly rendered path, so\n * the inserted text is always well formed rather than glued onto what is\n * already there.\n */\n startColumn: number;\n endColumn: number;\n /** The text in that range, which Monaco filters candidates against. */\n typed: string;\n}\n\nconst IDENT = /[A-Za-z0-9_]/;\nconst SUBSCRIPT = /^(?:(\\d+)|\"((?:[^\"\\\\]|\\\\.)*)\"|'((?:[^'\\\\]|\\\\.)*)')$/;\n\n/**\n * Reads the path expression the cursor sits in, or null when it sits somewhere\n * the document's keys have no meaning.\n *\n * `dottedWordAt` in `hover.ts` cannot serve here: it scans past the cursor and\n * strips the trailing dot, and the trailing dot is precisely the signal that a\n * child is being completed.\n */\nexport function environmentPrefixAt(\n model: PrefixModel,\n position: PrefixPosition,\n languageId: string,\n): EnvironmentPrefix | null {\n const flavour = pathFlavour(languageId);\n if (!flavour) return null;\n\n const line = model.getLineContent(position.lineNumber);\n const before = line.slice(0, position.column - 1);\n\n if (flavour === \"gotemplate\" && !insideAction(before)) return null;\n\n let leafStart = before.length;\n while (leafStart > 0 && IDENT.test(before[leafStart - 1]!)) leafStart--;\n const leaf = before.slice(leafStart);\n const head = before.slice(0, leafStart);\n\n const chain = parseChain(head);\n if (!chain) return null;\n // Without a dot the leaf can only be a root name, so anything that looks like\n // the tail of a path before it (`items[0]name`) is malformed, not a prefix.\n if (leaf !== \"\" && !chain.dotted && chain.segments.length > 0) return null;\n\n // `chain.start` already sits on the leading `.` when there is one, so a go\n // template needs no adjustment; JSONPath's `$` sits one place further left.\n let start = chain.start;\n if (flavour === \"gotemplate\" && !chain.rooted) return null;\n if (flavour === \"jsonpath\") {\n const marker = head[chain.start - 1];\n if (marker !== \"$\" && marker !== \"@\") return null;\n start -= 1;\n }\n if (flavour === \"cel\" && chain.rooted) return null; // a leading `.` is not CEL\n\n return {\n segments: chain.segments,\n leaf,\n startColumn: start + 1,\n endColumn: position.column,\n typed: before.slice(start),\n };\n}\n\ninterface Chain {\n segments: PathSegment[];\n /** Index in `head` where the segment list starts, root marker excluded. */\n start: number;\n /** Whether `head` ends with the dot that opens a new segment. */\n dotted: boolean;\n /** Whether the outermost segment is preceded by a `.`, as go templates need. */\n rooted: boolean;\n}\n\n/**\n * Parses the trailing path of `head` backwards.\n *\n * Backwards because a path has no left boundary of its own: it ends where the\n * expression around it begins, and that is only knowable by walking off it.\n */\nfunction parseChain(head: string): Chain | null {\n let pos = head.length;\n const dotted = pos > 0 && head[pos - 1] === \".\";\n if (dotted) pos--;\n\n const reversed: PathSegment[] = [];\n let rooted = false;\n\n for (;;) {\n if (pos > 0 && head[pos - 1] === \"]\") {\n const open = head.lastIndexOf(\"[\", pos - 2);\n if (open < 0) return null;\n const segment = parseSubscript(head.slice(open + 1, pos - 1));\n if (segment === null) return null;\n reversed.push(segment);\n pos = open;\n rooted = false;\n continue;\n }\n if (pos > 0 && IDENT.test(head[pos - 1]!)) {\n let start = pos;\n while (start > 0 && IDENT.test(head[start - 1]!)) start--;\n reversed.push(head.slice(start, pos));\n pos = start;\n rooted = pos > 0 && head[pos - 1] === \".\";\n if (rooted) {\n pos--;\n continue;\n }\n break;\n }\n break;\n }\n\n // Only the trailing dot was consumed, so that dot is itself the root marker.\n if (reversed.length === 0 && dotted) rooted = true;\n\n return { segments: reversed.reverse(), start: pos, dotted, rooted };\n}\n\nfunction parseSubscript(inner: string): PathSegment | null {\n const match = SUBSCRIPT.exec(inner.trim());\n if (!match) return null;\n if (match[1] !== undefined) return Number(match[1]);\n const quoted = match[2] ?? match[3]!;\n try {\n return JSON.parse(`\"${quoted.replace(/\\\\'/g, \"'\")}\"`) as string;\n } catch {\n return null;\n }\n}\n\n/**\n * Whether the cursor sits between template delimiters. Outside them the text is\n * literal output, where a key path means nothing.\n */\nfunction insideAction(before: string): boolean {\n const { left, right, leftComment, rightComment } = spec.gotemplate.delimiters;\n\n const open = before.lastIndexOf(left);\n if (open < 0) return false;\n if (before.lastIndexOf(right) > open) return false;\n\n // `{{/*` opens with the ordinary left delimiter, so an unterminated comment\n // reads as an open action unless it is checked for separately.\n const comment = before.lastIndexOf(leftComment);\n if (comment >= open && before.lastIndexOf(rightComment) < comment) return false;\n\n return true;\n}\n"],"names":["pathFlavour","spec"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { PathSegment } from './environment';
|
|
2
|
+
/** The subset of a Monaco model this module reads. */
|
|
3
|
+
export interface PrefixModel {
|
|
4
|
+
getLineContent(line: number): string;
|
|
5
|
+
}
|
|
6
|
+
export interface PrefixPosition {
|
|
7
|
+
lineNumber: number;
|
|
8
|
+
column: number;
|
|
9
|
+
}
|
|
10
|
+
/** A path expression under construction at the cursor. */
|
|
11
|
+
export interface EnvironmentPrefix {
|
|
12
|
+
/** The segments already committed, left of the trailing dot. */
|
|
13
|
+
segments: PathSegment[];
|
|
14
|
+
/** The partially typed leaf, empty right after a dot. */
|
|
15
|
+
leaf: string;
|
|
16
|
+
/**
|
|
17
|
+
* 1-based columns spanning the whole expression typed so far, root marker
|
|
18
|
+
* included. A completion replaces this range with a freshly rendered path, so
|
|
19
|
+
* the inserted text is always well formed rather than glued onto what is
|
|
20
|
+
* already there.
|
|
21
|
+
*/
|
|
22
|
+
startColumn: number;
|
|
23
|
+
endColumn: number;
|
|
24
|
+
/** The text in that range, which Monaco filters candidates against. */
|
|
25
|
+
typed: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reads the path expression the cursor sits in, or null when it sits somewhere
|
|
29
|
+
* the document's keys have no meaning.
|
|
30
|
+
*
|
|
31
|
+
* `dottedWordAt` in `hover.ts` cannot serve here: it scans past the cursor and
|
|
32
|
+
* strips the trailing dot, and the trailing dot is precisely the signal that a
|
|
33
|
+
* child is being completed.
|
|
34
|
+
*/
|
|
35
|
+
export declare function environmentPrefixAt(model: PrefixModel, position: PrefixPosition, languageId: string): EnvironmentPrefix | null;
|
|
36
|
+
//# sourceMappingURL=prefix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix.d.ts","sourceRoot":"","sources":["../../../src/expressions/lang/prefix.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;CACf;AAKD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,MAAM,GACjB,iBAAiB,GAAG,IAAI,CAsC1B"}
|