@qoretechnologies/reqraft 0.10.55-pr.124.g43fa138 → 0.10.55
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/.claude/CLAUDE.md +25 -0
- package/.tasks/INDEX.md +1 -0
- package/.tasks/STORY_NETWORK_ISOLATION.md +98 -0
- package/README.md +1 -1
- package/design/FORM_ENGINE_COMPACT.md +34 -0
- package/design/FORM_ENGINE_EXPRESSIONS.md +110 -0
- package/design/FORM_ENGINE_FIELD_MIGRATION.md +155 -1
- package/design/IDE_INTEGRATION.md +13 -0
- package/design/RENDER_EXPRESSION_TRANSPORT.md +76 -10
- package/design/SELECT_DIALOG_FLOOR.md +86 -0
- package/design/SMART_EDITOR_UX.md +21 -0
- package/design/UNAVAILABLE_ALLOWED_VALUES.md +226 -0
- package/dist/components/composer/Composer.d.ts +8 -3
- package/dist/components/composer/Composer.d.ts.map +1 -1
- package/dist/components/composer/Composer.js.map +1 -1
- package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
- package/dist/components/dpqlEditor/DpqlEditor.js +3 -3
- package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts +6 -0
- package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlHelpers.js +21 -2
- package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
- package/dist/components/dpqlEditor/dpqlProbe.d.ts +37 -0
- package/dist/components/dpqlEditor/dpqlProbe.d.ts.map +1 -0
- package/dist/components/dpqlEditor/dpqlProbe.js +203 -0
- package/dist/components/dpqlEditor/dpqlProbe.js.map +1 -0
- package/dist/components/dpqlEditor/dpqlTags.d.ts +8 -0
- package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
- package/dist/components/dpqlEditor/dpqlTags.js +5 -1
- package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
- package/dist/components/dpqlEditor/index.d.ts +4 -0
- package/dist/components/dpqlEditor/index.d.ts.map +1 -1
- package/dist/components/dpqlEditor/index.js +5 -1
- package/dist/components/dpqlEditor/index.js.map +1 -1
- package/dist/components/dpqlEditor/types.d.ts +42 -2
- package/dist/components/dpqlEditor/types.d.ts.map +1 -1
- package/dist/components/dpqlEditor/types.js +0 -4
- package/dist/components/dpqlEditor/types.js.map +1 -1
- package/dist/components/dpqlEditor/useDpqlProbe.d.ts +4 -0
- package/dist/components/dpqlEditor/useDpqlProbe.d.ts.map +1 -0
- package/dist/components/dpqlEditor/useDpqlProbe.js +29 -0
- package/dist/components/dpqlEditor/useDpqlProbe.js.map +1 -0
- package/dist/components/dpqlEditor/useDpqlSession.d.ts +5 -2
- package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
- package/dist/components/dpqlEditor/useDpqlSession.js +8 -2
- package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
- package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +414 -128
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
- package/dist/components/form/engine/CompactToolbar.js +5 -2
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +273 -22
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +669 -192
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/FormFieldsSkeleton.d.ts +48 -0
- package/dist/components/form/engine/FormFieldsSkeleton.d.ts.map +1 -0
- package/dist/components/form/engine/FormFieldsSkeleton.js +41 -0
- package/dist/components/form/engine/FormFieldsSkeleton.js.map +1 -0
- package/dist/components/form/engine/OptionFieldMessages.d.ts +108 -2
- package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
- package/dist/components/form/engine/OptionFieldMessages.js +203 -13
- package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
- package/dist/components/form/engine/_structuredData/SchemaDataView.js +68 -5
- package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
- package/dist/components/form/engine/compactRowContext.d.ts +15 -1
- package/dist/components/form/engine/compactRowContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowContext.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +55 -29
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
- package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
- package/dist/components/form/engine/optionActions.d.ts +37 -1
- package/dist/components/form/engine/optionActions.d.ts.map +1 -1
- package/dist/components/form/engine/optionActions.js +71 -1
- package/dist/components/form/engine/optionActions.js.map +1 -1
- package/dist/components/form/engine/optionsContext.d.ts +22 -0
- package/dist/components/form/engine/optionsContext.d.ts.map +1 -0
- package/dist/components/form/engine/optionsContext.js +20 -0
- package/dist/components/form/engine/optionsContext.js.map +1 -0
- package/dist/components/form/engine/readFirst.d.ts +42 -1
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +76 -8
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/rendererTypes.d.ts +42 -3
- package/dist/components/form/engine/rendererTypes.d.ts.map +1 -1
- package/dist/components/form/engine/rendererTypes.js +3 -1
- package/dist/components/form/engine/rendererTypes.js.map +1 -1
- package/dist/components/form/engine/rowFocus.d.ts +30 -0
- package/dist/components/form/engine/rowFocus.d.ts.map +1 -0
- package/dist/components/form/engine/rowFocus.js +93 -0
- package/dist/components/form/engine/rowFocus.js.map +1 -0
- package/dist/components/form/engine/rowMenuContext.d.ts +78 -0
- package/dist/components/form/engine/rowMenuContext.d.ts.map +1 -0
- package/dist/components/form/engine/rowMenuContext.js +103 -0
- package/dist/components/form/engine/rowMenuContext.js.map +1 -0
- package/dist/components/form/engine/rowOpenPicker.d.ts +27 -0
- package/dist/components/form/engine/rowOpenPicker.d.ts.map +1 -0
- package/dist/components/form/engine/rowOpenPicker.js +30 -0
- package/dist/components/form/engine/rowOpenPicker.js.map +1 -0
- package/dist/components/form/engine/typeChoices.d.ts +42 -0
- package/dist/components/form/engine/typeChoices.d.ts.map +1 -0
- package/dist/components/form/engine/typeChoices.js +33 -0
- package/dist/components/form/engine/typeChoices.js.map +1 -0
- package/dist/components/form/expressions/DpqlRendering.d.ts +26 -0
- package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -0
- package/dist/components/form/expressions/DpqlRendering.js +53 -0
- package/dist/components/form/expressions/DpqlRendering.js.map +1 -0
- package/dist/components/form/expressions/ExpressionField.d.ts +7 -1
- package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
- package/dist/components/form/expressions/ExpressionField.js +203 -45
- package/dist/components/form/expressions/ExpressionField.js.map +1 -1
- package/dist/components/form/expressions/argumentPresence.d.ts +84 -0
- package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -0
- package/dist/components/form/expressions/argumentPresence.js +217 -0
- package/dist/components/form/expressions/argumentPresence.js.map +1 -0
- package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/argumentLabel.js +9 -4
- package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
- package/dist/components/form/expressions/builder/index.d.ts +15 -2
- package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/index.js +21 -65
- package/dist/components/form/expressions/builder/index.js.map +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.d.ts +4 -1
- package/dist/components/form/expressions/builder/renderTemplate.d.ts.map +1 -1
- package/dist/components/form/expressions/builder/renderTemplate.js +10 -67
- package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
- package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/mockExpressions.js +8 -4
- package/dist/components/form/expressions/mockExpressions.js.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts +1 -1
- package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
- package/dist/components/form/expressions/renderExpressionToText.js +95 -19
- package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
- package/dist/components/form/expressions/types.d.ts +17 -2
- package/dist/components/form/expressions/types.d.ts.map +1 -1
- package/dist/components/form/expressions/useExpressions.d.ts.map +1 -1
- package/dist/components/form/expressions/useExpressions.js +5 -2
- package/dist/components/form/expressions/useExpressions.js.map +1 -1
- package/dist/components/form/expressions/useRenderExpression.d.ts +7 -16
- package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
- package/dist/components/form/expressions/useRenderExpression.js +50 -126
- package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
- package/dist/components/form/fields/Field.d.ts +21 -0
- package/dist/components/form/fields/Field.d.ts.map +1 -1
- package/dist/components/form/fields/Field.js +54 -8
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +11 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
- package/dist/components/form/fields/allowed-values/AllowedValues.js +52 -8
- package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts +7 -1
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +91 -28
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/dist/components/form/fields/date/Date.d.ts +1 -1
- package/dist/components/form/fields/date/Date.d.ts.map +1 -1
- package/dist/components/form/fields/date/Date.js +16 -2
- package/dist/components/form/fields/date/Date.js.map +1 -1
- package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +14 -2
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.d.ts.map +1 -1
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js +50 -4
- package/dist/components/form/fields/multi-select/MultiSelectFormField.js.map +1 -1
- package/dist/components/form/fields/number/Number.d.ts +12 -1
- package/dist/components/form/fields/number/Number.d.ts.map +1 -1
- package/dist/components/form/fields/number/Number.js +6 -3
- package/dist/components/form/fields/number/Number.js.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.d.ts +47 -2
- package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
- package/dist/components/form/fields/rich-text/RichText.js +153 -12
- package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
- package/dist/components/form/fields/select/Select.d.ts.map +1 -1
- package/dist/components/form/fields/select/Select.js +120 -20
- package/dist/components/form/fields/select/Select.js.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.d.ts +166 -9
- package/dist/components/form/fields/select/SelectCollection.d.ts.map +1 -1
- package/dist/components/form/fields/select/SelectCollection.js +200 -7
- package/dist/components/form/fields/select/SelectCollection.js.map +1 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +2 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +3 -2
- package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
- package/dist/components/form/fields/template/TemplateField.d.ts +34 -2
- package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
- package/dist/components/form/fields/template/TemplateField.js +606 -58
- package/dist/components/form/fields/template/TemplateField.js.map +1 -1
- package/dist/components/form/fields/template/TemplateText.d.ts +36 -0
- package/dist/components/form/fields/template/TemplateText.d.ts.map +1 -0
- package/dist/components/form/fields/template/TemplateText.js +80 -0
- package/dist/components/form/fields/template/TemplateText.js.map +1 -0
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +4 -0
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
- package/dist/components/smartEditor/SmartEditor.js +29 -8
- package/dist/components/smartEditor/SmartEditor.js.map +1 -1
- package/dist/components/smartEditor/useLspSession.d.ts +5 -1
- package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
- package/dist/components/smartEditor/useLspSession.js +16 -2
- package/dist/components/smartEditor/useLspSession.js.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.d.ts +8 -4
- package/dist/components/supportTicket/TicketReplyBox.d.ts.map +1 -1
- package/dist/components/supportTicket/TicketReplyBox.js.map +1 -1
- package/dist/helpers/common.d.ts.map +1 -1
- package/dist/helpers/common.js +7 -3
- package/dist/helpers/common.js.map +1 -1
- package/dist/helpers/dpqlDetection.d.ts +58 -0
- package/dist/helpers/dpqlDetection.d.ts.map +1 -0
- package/dist/helpers/dpqlDetection.js +164 -0
- package/dist/helpers/dpqlDetection.js.map +1 -0
- package/dist/helpers/optionUiTypes.d.ts +31 -3
- package/dist/helpers/optionUiTypes.d.ts.map +1 -1
- package/dist/helpers/optionUiTypes.js +36 -1
- package/dist/helpers/optionUiTypes.js.map +1 -1
- package/dist/helpers/options.d.ts +57 -0
- package/dist/helpers/options.d.ts.map +1 -1
- package/dist/helpers/options.js +97 -1
- package/dist/helpers/options.js.map +1 -1
- package/dist/helpers/templateItems.d.ts +47 -0
- package/dist/helpers/templateItems.d.ts.map +1 -0
- package/dist/helpers/templateItems.js +88 -0
- package/dist/helpers/templateItems.js.map +1 -0
- package/dist/helpers/templateText.d.ts +80 -0
- package/dist/helpers/templateText.d.ts.map +1 -0
- package/dist/helpers/templateText.js +291 -0
- package/dist/helpers/templateText.js.map +1 -0
- package/dist/helpers/templates.d.ts +30 -12
- package/dist/helpers/templates.d.ts.map +1 -1
- package/dist/helpers/templates.js +91 -33
- package/dist/helpers/templates.js.map +1 -1
- package/dist/helpers/validations.d.ts +35 -8
- package/dist/helpers/validations.d.ts.map +1 -1
- package/dist/helpers/validations.js +162 -25
- package/dist/helpers/validations.js.map +1 -1
- package/dist/hooks/useArgSchema.d.ts +2 -1
- package/dist/hooks/useArgSchema.d.ts.map +1 -1
- package/dist/hooks/useFetch/useFetch.d.ts +3 -1
- package/dist/hooks/useFetch/useFetch.d.ts.map +1 -1
- package/dist/hooks/useFetch/useFetch.js +47 -9
- package/dist/hooks/useFetch/useFetch.js.map +1 -1
- package/dist/hooks/useTemplates.d.ts +20 -0
- package/dist/hooks/useTemplates.d.ts.map +1 -1
- package/dist/hooks/useTemplates.js +34 -2
- package/dist/hooks/useTemplates.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/fetch.d.ts +151 -1
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +256 -44
- package/dist/utils/fetch.js.map +1 -1
- package/dist/utils/lspClient.d.ts +6 -0
- package/dist/utils/lspClient.d.ts.map +1 -1
- package/dist/utils/lspClient.js +62 -11
- package/dist/utils/lspClient.js.map +1 -1
- package/dist/utils/websocket.d.ts +6 -0
- package/dist/utils/websocket.d.ts.map +1 -1
- package/dist/utils/websocket.js +15 -7
- package/dist/utils/websocket.js.map +1 -1
- package/package.json +10 -6
- package/src/components/composer/Composer.tsx +7 -2
- package/src/components/dpqlEditor/DpqlEditor.stories.tsx +3 -119
- package/src/components/dpqlEditor/DpqlEditor.tsx +5 -2
- package/src/components/dpqlEditor/dpqlHelpers.ts +20 -1
- package/src/components/dpqlEditor/dpqlProbe.ts +165 -0
- package/src/components/dpqlEditor/dpqlTags.ts +13 -0
- package/src/components/dpqlEditor/index.ts +4 -0
- package/src/components/dpqlEditor/types.ts +38 -2
- package/src/components/dpqlEditor/useDpqlProbe.ts +33 -0
- package/src/components/dpqlEditor/useDpqlSession.ts +20 -4
- package/src/components/form/engine/CompactRow.tsx +487 -160
- package/src/components/form/engine/CompactToolbar.tsx +10 -3
- package/src/components/form/engine/FormEngine.stories.tsx +1269 -201
- package/src/components/form/engine/FormEngine.tsx +922 -270
- package/src/components/form/engine/FormEngineStickyHeaders.stories.tsx +331 -0
- package/src/components/form/engine/FormFieldsSkeleton.tsx +77 -0
- package/src/components/form/engine/OptionFieldMessages.tsx +300 -14
- package/src/components/form/engine/_structuredData/SchemaDataView.tsx +94 -3
- package/src/components/form/engine/compactRowContext.ts +15 -6
- package/src/components/form/engine/compactRowStyles.ts +56 -2
- package/src/components/form/engine/compactToolbarContext.ts +1 -1
- package/src/components/form/engine/optionActions.ts +89 -1
- package/src/components/form/engine/optionsContext.ts +24 -0
- package/src/components/form/engine/readFirst.ts +88 -8
- package/src/components/form/engine/rendererTypes.ts +48 -4
- package/src/components/form/engine/rowFocus.ts +101 -0
- package/src/components/form/engine/rowMenuContext.ts +159 -0
- package/src/components/form/engine/rowOpenPicker.ts +27 -0
- package/src/components/form/engine/typeChoices.ts +63 -0
- package/src/components/form/expressions/DpqlRendering.tsx +85 -0
- package/src/components/form/expressions/ExpressionField.stories.tsx +826 -48
- package/src/components/form/expressions/ExpressionField.tsx +269 -55
- package/src/components/form/expressions/argumentPresence.ts +213 -0
- package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +38 -21
- package/src/components/form/expressions/builder/argumentLabel.tsx +10 -4
- package/src/components/form/expressions/builder/index.tsx +39 -81
- package/src/components/form/expressions/builder/renderTemplate.tsx +23 -56
- package/src/components/form/expressions/dpqlMockLanguage.ts +565 -0
- package/src/components/form/expressions/dpqlMockLsp.ts +109 -83
- package/src/components/form/expressions/mockExpressions.ts +8 -4
- package/src/components/form/expressions/renderExpressionToText.ts +112 -22
- package/src/components/form/expressions/types.ts +17 -2
- package/src/components/form/expressions/useExpressions.ts +5 -1
- package/src/components/form/expressions/useRenderExpression.ts +43 -127
- package/src/components/form/fields/Field.tsx +102 -20
- package/src/components/form/fields/allowed-values/AllowedValues.tsx +106 -44
- package/src/components/form/fields/auto/AutoFormField.stories.tsx +85 -18
- package/src/components/form/fields/auto/AutoFormField.tsx +97 -21
- package/src/components/form/fields/date/Date.tsx +17 -1
- package/src/components/form/fields/long-string/LongString.tsx +15 -3
- package/src/components/form/fields/multi-select/MultiSelectFormField.tsx +65 -6
- package/src/components/form/fields/number/Number.tsx +25 -0
- package/src/components/form/fields/rich-text/RichText.tsx +248 -30
- package/src/components/form/fields/select/Select.stories.tsx +392 -0
- package/src/components/form/fields/select/Select.tsx +164 -27
- package/src/components/form/fields/select/SelectCollection.tsx +350 -6
- package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +4 -2
- package/src/components/form/fields/template/TemplateField.stories.tsx +93 -14
- package/src/components/form/fields/template/TemplateField.tsx +825 -131
- package/src/components/form/fields/template/TemplateText.tsx +115 -0
- package/src/components/form/index.tsx +4 -0
- package/src/components/log/Log.stories.tsx +2 -1
- package/src/components/searchFilterBar/SearchFilterBar.stories.tsx +3 -3
- package/src/components/smartEditor/SmartEditor.tsx +41 -9
- package/src/components/smartEditor/__fixtures__/mockLspServer.ts +52 -3
- package/src/components/smartEditor/useLspSession.ts +21 -3
- package/src/components/supportTicket/TicketReplyBox.tsx +8 -4
- package/src/components/ticketThread/TicketThread.stories.tsx +1 -0
- package/src/helpers/common.ts +7 -3
- package/src/helpers/dpqlDetection.ts +209 -0
- package/src/helpers/optionUiTypes.ts +38 -0
- package/src/helpers/options.ts +96 -0
- package/src/helpers/templateItems.ts +81 -0
- package/src/helpers/templateText.ts +350 -0
- package/src/helpers/templates.ts +94 -41
- package/src/helpers/validations.ts +203 -51
- package/src/hooks/useFetch/useFetch.stories.tsx +6 -5
- package/src/hooks/useFetch/useFetch.tsx +53 -7
- package/src/hooks/useStorage/useStorage.stories.tsx +2 -1
- package/src/hooks/useTemplates.ts +41 -0
- package/src/hooks/useWebSocket/useWebsocket.stories.tsx +2 -1
- package/src/index.tsx +14 -1
- package/src/stores/currentUser/currentUser.stories.tsx +2 -1
- package/src/stories/storyNetwork.ts +92 -0
- package/src/utils/fetch.ts +311 -21
- package/src/utils/lspClient.ts +68 -11
- package/src/utils/websocket.ts +20 -9
- package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts +0 -73
- package/dist/components/form/engine/__fixtures__/basicFormOptions.d.ts.map +0 -1
- package/dist/components/form/engine/__fixtures__/basicFormOptions.js +0 -317
- package/dist/components/form/engine/__fixtures__/basicFormOptions.js.map +0 -1
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts +0 -41
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.d.ts.map +0 -1
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js +0 -45
- package/dist/components/form/engine/__fixtures__/fieldChromeOptions.js.map +0 -1
- package/dist/components/form/expressions/dpqlMockLsp.d.ts +0 -3
- package/dist/components/form/expressions/dpqlMockLsp.d.ts.map +0 -1
- package/dist/components/form/expressions/dpqlMockLsp.js +0 -91
- package/dist/components/form/expressions/dpqlMockLsp.js.map +0 -1
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts +0 -2
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.d.ts.map +0 -1
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.js +0 -9
- package/dist/components/form/fields/template/__fixtures__/longExampleValue.js.map +0 -1
- package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts +0 -55
- package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts.map +0 -1
- package/dist/components/smartEditor/__fixtures__/mockLspServer.js +0 -126
- package/dist/components/smartEditor/__fixtures__/mockLspServer.js.map +0 -1
- package/dist/stories/Data/fileFieldArgSchema.json +0 -86
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
2
|
+
/**
|
|
3
|
+
* One shared, lazily-opened DPQL document used to ask the server "is this
|
|
4
|
+
* text really an expression?" on behalf of plain form fields that have no
|
|
5
|
+
* editor of their own.
|
|
6
|
+
*
|
|
7
|
+
* ## Why a singleton, and why it is cheap
|
|
8
|
+
*
|
|
9
|
+
* `ReqraftLspClient` multiplexes every document over ONE socket per endpoint
|
|
10
|
+
* (`LspSharedConnection`), and `initialize` runs once for that socket. A
|
|
11
|
+
* probe is therefore not a new connection — it is one extra `didOpen`, and
|
|
12
|
+
* one `QorusDpqlActionSession` in the server's `uriToDpqlSession` map. Even
|
|
13
|
+
* so it is a single shared document rather than one per field: a form with
|
|
14
|
+
* forty expression-capable options would otherwise open forty of them to ask
|
|
15
|
+
* the same question.
|
|
16
|
+
*
|
|
17
|
+
* Nothing is opened until a field actually probes, so a form whose author
|
|
18
|
+
* never types anything expression-shaped costs nothing at all.
|
|
19
|
+
*
|
|
20
|
+
* The document is opened with NO provider context. Verified against the live
|
|
21
|
+
* server: `textDocument/didOpen` with `languageId: 'dpql'` and no metadata
|
|
22
|
+
* still builds a session, and `dpql/parse` answers on it. Record-field
|
|
23
|
+
* references (`@name`) do not resolve to a provider's fields without that
|
|
24
|
+
* context, which is fine — detection asks about the SHAPE of the expression,
|
|
25
|
+
* and the editor the author lands in binds the real context.
|
|
26
|
+
*
|
|
27
|
+
* No `target_type` is sent. Detection asks "is this an expression", not "is
|
|
28
|
+
* it the right type"; a type mismatch is a thing to show the author INSIDE
|
|
29
|
+
* the expression editor, not a reason to refuse to open it.
|
|
30
|
+
*/
|
|
31
|
+
import { ReqraftLspClient } from '../../utils/lspClient';
|
|
32
|
+
|
|
33
|
+
/** What a probe answers. Never throws — a failure is `success: false`. */
|
|
34
|
+
export interface IDpqlProbeResult {
|
|
35
|
+
success: boolean;
|
|
36
|
+
expression: Record<string, any> | null;
|
|
37
|
+
diagnostics: Array<{ severity?: number | string; message?: string; code?: string | number }>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const FAILED: IDpqlProbeResult = { success: false, expression: null, diagnostics: [] };
|
|
41
|
+
|
|
42
|
+
/** Opaque, non-secret document URI — the server keys its session by this. */
|
|
43
|
+
const PROBE_URI = 'dpql://probe/detection';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* How many parsed texts to remember. Typing walks through many prefixes of
|
|
47
|
+
* the same expression, and an author re-typing a value should not re-ask.
|
|
48
|
+
*/
|
|
49
|
+
const MAX_CACHE_ENTRIES = 200;
|
|
50
|
+
|
|
51
|
+
class DpqlProbe {
|
|
52
|
+
private client: ReqraftLspClient | null = null;
|
|
53
|
+
private opened: Promise<ReqraftLspClient> | null = null;
|
|
54
|
+
private users = 0;
|
|
55
|
+
private readonly cache = new Map<string, IDpqlProbeResult>();
|
|
56
|
+
|
|
57
|
+
/** Register a consumer; the document is still not opened until it probes. */
|
|
58
|
+
acquire(): void {
|
|
59
|
+
this.users += 1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Drop a consumer, closing the shared document when the last one goes. */
|
|
63
|
+
release(): void {
|
|
64
|
+
this.users = Math.max(0, this.users - 1);
|
|
65
|
+
|
|
66
|
+
if (this.users === 0) {
|
|
67
|
+
this.close();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Parse `text` on the shared probe document. Resolves to `FAILED` rather
|
|
73
|
+
* than rejecting, for any reason at all — a field must never break because
|
|
74
|
+
* the instance is unreachable.
|
|
75
|
+
*/
|
|
76
|
+
async parse(text: string): Promise<IDpqlProbeResult> {
|
|
77
|
+
const cached = this.cache.get(text);
|
|
78
|
+
|
|
79
|
+
if (cached) {
|
|
80
|
+
return cached;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
let result = FAILED;
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const client = await this.open();
|
|
87
|
+
const response = await client.customRequest<Partial<IDpqlProbeResult>>('dpql/parse', {
|
|
88
|
+
uri: PROBE_URI,
|
|
89
|
+
text,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
result = {
|
|
93
|
+
success: response?.success ?? false,
|
|
94
|
+
expression: response?.expression ?? null,
|
|
95
|
+
diagnostics: response?.diagnostics ?? [],
|
|
96
|
+
};
|
|
97
|
+
} catch {
|
|
98
|
+
// Unreachable instance, closed socket, request timeout: the field
|
|
99
|
+
// simply learns nothing and leaves the typed text exactly as it is.
|
|
100
|
+
result = FAILED;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.remember(text, result);
|
|
104
|
+
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Open (once) and return the shared document's client. */
|
|
109
|
+
private open(): Promise<ReqraftLspClient> {
|
|
110
|
+
if (this.opened) {
|
|
111
|
+
return this.opened;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this.opened = (async (): Promise<ReqraftLspClient> => {
|
|
115
|
+
const client = new ReqraftLspClient({ languageId: 'dpql', uri: PROBE_URI });
|
|
116
|
+
|
|
117
|
+
await client.connect();
|
|
118
|
+
// `didOpen` is a notification on the same socket as the request that
|
|
119
|
+
// follows it, so the server has the session by the time the parse
|
|
120
|
+
// arrives — no readiness poll needed.
|
|
121
|
+
client.didOpen('');
|
|
122
|
+
this.client = client;
|
|
123
|
+
|
|
124
|
+
return client;
|
|
125
|
+
})().catch((error) => {
|
|
126
|
+
// Allow a later probe to retry a connection that failed once.
|
|
127
|
+
this.opened = null;
|
|
128
|
+
throw error;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
return this.opened;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private remember(text: string, result: IDpqlProbeResult): void {
|
|
135
|
+
if (this.cache.size >= MAX_CACHE_ENTRIES) {
|
|
136
|
+
const oldest = this.cache.keys().next();
|
|
137
|
+
|
|
138
|
+
if (!oldest.done) {
|
|
139
|
+
this.cache.delete(oldest.value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
this.cache.set(text, result);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private close(): void {
|
|
147
|
+
const client = this.client;
|
|
148
|
+
|
|
149
|
+
this.client = null;
|
|
150
|
+
this.opened = null;
|
|
151
|
+
this.cache.clear();
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
client?.disconnect();
|
|
155
|
+
} catch {
|
|
156
|
+
// best-effort teardown
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The process-wide probe. Exported for tests, which reset it between cases;
|
|
163
|
+
* application code goes through `useDpqlProbe`.
|
|
164
|
+
*/
|
|
165
|
+
export const dpqlProbe = new DpqlProbe();
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
// `getTagProps` callback for ReqoreRichTextEditor.
|
|
4
4
|
|
|
5
5
|
import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
|
|
6
|
+
import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
|
|
7
|
+
import { describeTemplateReference, templateTooltip } from '../../helpers/templates';
|
|
6
8
|
import { ISlateElement } from '../smartEditor/types';
|
|
7
9
|
import { IDpqlFieldMeta } from './useDpqlSession';
|
|
8
10
|
|
|
@@ -55,6 +57,13 @@ export interface IDpqlTagRendererOptions {
|
|
|
55
57
|
* keeps the per-prefix palette for telling prefixes apart at a glance.
|
|
56
58
|
*/
|
|
57
59
|
templateTagsUseIntent?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* The template catalogue the surface offers. A reference found in it reads
|
|
62
|
+
* as the name it was chosen by — `trim(Choices[0].message.content)` rather
|
|
63
|
+
* than the `$data:{…}` path — with the entry's description as its hover; one
|
|
64
|
+
* that is not found keeps its path.
|
|
65
|
+
*/
|
|
66
|
+
templates?: IReqoreFormTemplates;
|
|
58
67
|
}
|
|
59
68
|
|
|
60
69
|
/**
|
|
@@ -88,8 +97,12 @@ export function makeDpqlTagRenderer(
|
|
|
88
97
|
}
|
|
89
98
|
|
|
90
99
|
if (tagValue.startsWith('$')) {
|
|
100
|
+
const named = options.templates && describeTemplateReference(options.templates, tagValue);
|
|
91
101
|
return {
|
|
92
102
|
icon: 'ExchangeDollarLine',
|
|
103
|
+
...(named?.item ?
|
|
104
|
+
{ label: named.label, tooltip: templateTooltip(options.templates, tagValue) }
|
|
105
|
+
: {}),
|
|
93
106
|
...(options.templateTagsUseIntent
|
|
94
107
|
? { intent: 'info' as const }
|
|
95
108
|
: { color: getTemplatePrefixColor(tagValue) as `#${string}` }),
|
|
@@ -10,6 +10,10 @@ export type {
|
|
|
10
10
|
ISlateText,
|
|
11
11
|
TSlateNode,
|
|
12
12
|
} from './types';
|
|
13
|
+
export { dpqlProbe } from './dpqlProbe';
|
|
14
|
+
export type { IDpqlProbeResult } from './dpqlProbe';
|
|
15
|
+
export { useDpqlProbe } from './useDpqlProbe';
|
|
16
|
+
export type { TDpqlProbeFn } from './useDpqlProbe';
|
|
13
17
|
export { useDpqlSession } from './useDpqlSession';
|
|
14
18
|
export type {
|
|
15
19
|
IDpqlFieldMeta,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Type definitions for the DpqlEditor component. Slate node types
|
|
3
3
|
// (`ISlateElement`, `ISlateText`, `TSlateNode`) live in the smartEditor
|
|
4
4
|
// primitive's `types.ts` — re-export them here for backward compat.
|
|
5
|
+
import { IReqoreFormTemplates } from '@qoretechnologies/reqore/dist/components/Textarea';
|
|
5
6
|
|
|
6
7
|
export type {
|
|
7
8
|
ISlateElement,
|
|
@@ -13,6 +14,24 @@ export type {
|
|
|
13
14
|
export interface IDpqlParseResult {
|
|
14
15
|
success: boolean;
|
|
15
16
|
expression: Record<string, any> | null;
|
|
17
|
+
/** The type the server inferred for the expression's result. */
|
|
18
|
+
inferred_type?: string;
|
|
19
|
+
/** Echo of the `target_type` the request asked about, when one was sent. */
|
|
20
|
+
target_type?: string;
|
|
21
|
+
/** `true` when the inferred type already satisfies the target. */
|
|
22
|
+
type_compatible?: boolean;
|
|
23
|
+
/** `true` when a conversion to the target exists at all. */
|
|
24
|
+
auto_coercible?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* `true` when that conversion is only ATTEMPTED, not guaranteed — text used
|
|
27
|
+
* as a number, whose outcome depends on what the text turns out to hold.
|
|
28
|
+
* A total conversion (a number used as text) reports `false`, and the server
|
|
29
|
+
* emits no diagnostic for it: warning about something that cannot fail
|
|
30
|
+
* teaches authors to ignore the warnings that can.
|
|
31
|
+
*/
|
|
32
|
+
coercion_may_fail?: boolean;
|
|
33
|
+
/** The conversion that would make the expression fit, when one would. */
|
|
34
|
+
suggested_fix?: { text: string; description?: string };
|
|
16
35
|
diagnostics: Array<{
|
|
17
36
|
range: {
|
|
18
37
|
start: { line: number; character: number };
|
|
@@ -72,6 +91,17 @@ export interface IDpqlEditorProps {
|
|
|
72
91
|
* palette, the editor's at-a-glance prefix coloring).
|
|
73
92
|
*/
|
|
74
93
|
templateTagsUseIntent?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* The overlay shown while the language server connects. Forwarded to
|
|
96
|
+
* `SmartEditor`; pass `null` to show the text without one — a read-only
|
|
97
|
+
* rendering already has its text, and only its colours wait for the server.
|
|
98
|
+
*/
|
|
99
|
+
loadingIndicator?: React.ReactNode;
|
|
100
|
+
/**
|
|
101
|
+
* The template catalogue the surface offers: a `$…` reference found in it
|
|
102
|
+
* is labelled by its catalogue name. See `IDpqlTagRendererOptions.templates`.
|
|
103
|
+
*/
|
|
104
|
+
templates?: IReqoreFormTemplates;
|
|
75
105
|
/** Called when the editor loses focus. */
|
|
76
106
|
onBlur?: () => void;
|
|
77
107
|
/**
|
|
@@ -150,8 +180,14 @@ export interface IDpqlEditorRef {
|
|
|
150
180
|
* when the document has no diagnostics, otherwise an array of errors.
|
|
151
181
|
*/
|
|
152
182
|
validate: () => Promise<{ valid: boolean; errors?: Array<{ message: string }> }>;
|
|
153
|
-
/**
|
|
154
|
-
|
|
183
|
+
/**
|
|
184
|
+
* Parse DPQL text into an expression AST via `dpql/parse`.
|
|
185
|
+
*
|
|
186
|
+
* `targetType` asks the server, in the same round trip, whether the
|
|
187
|
+
* expression's result can satisfy that type — see `coercion_may_fail` on
|
|
188
|
+
* the result. Omit it to ask only whether the text parses.
|
|
189
|
+
*/
|
|
190
|
+
parse: (text: string, targetType?: string) => Promise<IDpqlParseResult>;
|
|
155
191
|
/** Serialize an expression AST back to DPQL text via `dpql/serialize`. */
|
|
156
192
|
serialize: (expression: Record<string, any>) => Promise<string>;
|
|
157
193
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright 2026 Qore Technologies, s.r.o.
|
|
2
|
+
// React access to the shared DPQL detection probe (`dpqlProbe`). The hook
|
|
3
|
+
// itself opens nothing: a field becomes a consumer of the shared document
|
|
4
|
+
// only once it actually asks a question, and stops being one when it
|
|
5
|
+
// unmounts. A form full of fields that never see expression-shaped text
|
|
6
|
+
// therefore never opens the document at all.
|
|
7
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
8
|
+
import { dpqlProbe, IDpqlProbeResult } from './dpqlProbe';
|
|
9
|
+
|
|
10
|
+
export type TDpqlProbeFn = (text: string) => Promise<IDpqlProbeResult>;
|
|
11
|
+
|
|
12
|
+
export const useDpqlProbe = (): TDpqlProbeFn => {
|
|
13
|
+
const acquired = useRef(false);
|
|
14
|
+
|
|
15
|
+
useEffect(
|
|
16
|
+
() => () => {
|
|
17
|
+
if (acquired.current) {
|
|
18
|
+
acquired.current = false;
|
|
19
|
+
dpqlProbe.release();
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
[]
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
return useCallback((text: string): Promise<IDpqlProbeResult> => {
|
|
26
|
+
if (!acquired.current) {
|
|
27
|
+
acquired.current = true;
|
|
28
|
+
dpqlProbe.acquire();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return dpqlProbe.parse(text);
|
|
32
|
+
}, []);
|
|
33
|
+
};
|
|
@@ -50,8 +50,11 @@ export interface IUseDpqlSessionResult {
|
|
|
50
50
|
fieldMeta: Record<string, IDpqlFieldMeta>;
|
|
51
51
|
/** Most recent `publishDiagnostics`. */
|
|
52
52
|
diagnostics: ILspDiagnostic[];
|
|
53
|
-
/**
|
|
54
|
-
|
|
53
|
+
/**
|
|
54
|
+
* `dpql/parse` — DPQL text → expression AST, and, when `targetType` is
|
|
55
|
+
* given, whether that result can satisfy the type the field declares.
|
|
56
|
+
*/
|
|
57
|
+
parse: (text: string, targetType?: string) => Promise<IDpqlParseResult>;
|
|
55
58
|
/** `dpql/serialize` — expression AST → DPQL text. */
|
|
56
59
|
serialize: (expression: Record<string, any>) => Promise<string>;
|
|
57
60
|
/**
|
|
@@ -314,18 +317,31 @@ export function useDpqlSession(
|
|
|
314
317
|
);
|
|
315
318
|
|
|
316
319
|
const parse = useCallback(
|
|
317
|
-
async (text: string): Promise<IDpqlParseResult> => {
|
|
320
|
+
async (text: string, targetType?: string): Promise<IDpqlParseResult> => {
|
|
318
321
|
if (!session.client) {
|
|
319
322
|
return { success: false, expression: null, diagnostics: [] };
|
|
320
323
|
}
|
|
321
324
|
try {
|
|
322
325
|
const result = await session.client.customRequest<Partial<IDpqlParseResult>>(
|
|
323
326
|
'dpql/parse',
|
|
324
|
-
{
|
|
327
|
+
{
|
|
328
|
+
uri: session.uri,
|
|
329
|
+
text,
|
|
330
|
+
// Only sent when the field declares one. Without it the server
|
|
331
|
+
// does no type analysis at all, which is the right answer for a
|
|
332
|
+
// caller that only wants to know whether the text parses.
|
|
333
|
+
...(targetType ? { target_type: targetType } : {}),
|
|
334
|
+
}
|
|
325
335
|
);
|
|
326
336
|
return {
|
|
327
337
|
success: result?.success ?? false,
|
|
328
338
|
expression: result?.expression ?? null,
|
|
339
|
+
inferred_type: result?.inferred_type,
|
|
340
|
+
target_type: result?.target_type,
|
|
341
|
+
type_compatible: result?.type_compatible,
|
|
342
|
+
auto_coercible: result?.auto_coercible,
|
|
343
|
+
coercion_may_fail: result?.coercion_may_fail,
|
|
344
|
+
suggested_fix: result?.suggested_fix,
|
|
329
345
|
diagnostics: result?.diagnostics ?? [],
|
|
330
346
|
};
|
|
331
347
|
} catch {
|