@qoretechnologies/reqraft 0.10.53 → 0.10.54-pr.115.gaf0d7a7

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.
Files changed (291) hide show
  1. package/.claude/CLAUDE.md +25 -0
  2. package/.tasks/INDEX.md +1 -0
  3. package/.tasks/STORY_NETWORK_ISOLATION.md +98 -0
  4. package/README.md +1 -1
  5. package/design/FORM_ENGINE_EXPRESSIONS.md +110 -0
  6. package/design/FORM_ENGINE_FIELD_MIGRATION.md +155 -1
  7. package/design/RENDER_EXPRESSION_TRANSPORT.md +76 -10
  8. package/design/SMART_EDITOR_UX.md +21 -0
  9. package/dist/components/dpqlEditor/DpqlEditor.d.ts.map +1 -1
  10. package/dist/components/dpqlEditor/DpqlEditor.js +3 -3
  11. package/dist/components/dpqlEditor/DpqlEditor.js.map +1 -1
  12. package/dist/components/dpqlEditor/dpqlHelpers.d.ts +6 -0
  13. package/dist/components/dpqlEditor/dpqlHelpers.d.ts.map +1 -1
  14. package/dist/components/dpqlEditor/dpqlHelpers.js +21 -2
  15. package/dist/components/dpqlEditor/dpqlHelpers.js.map +1 -1
  16. package/dist/components/dpqlEditor/dpqlProbe.d.ts +37 -0
  17. package/dist/components/dpqlEditor/dpqlProbe.d.ts.map +1 -0
  18. package/dist/components/dpqlEditor/dpqlProbe.js +203 -0
  19. package/dist/components/dpqlEditor/dpqlProbe.js.map +1 -0
  20. package/dist/components/dpqlEditor/dpqlTags.d.ts +8 -0
  21. package/dist/components/dpqlEditor/dpqlTags.d.ts.map +1 -1
  22. package/dist/components/dpqlEditor/dpqlTags.js +5 -1
  23. package/dist/components/dpqlEditor/dpqlTags.js.map +1 -1
  24. package/dist/components/dpqlEditor/index.d.ts +4 -0
  25. package/dist/components/dpqlEditor/index.d.ts.map +1 -1
  26. package/dist/components/dpqlEditor/index.js +5 -1
  27. package/dist/components/dpqlEditor/index.js.map +1 -1
  28. package/dist/components/dpqlEditor/types.d.ts +42 -2
  29. package/dist/components/dpqlEditor/types.d.ts.map +1 -1
  30. package/dist/components/dpqlEditor/types.js +0 -4
  31. package/dist/components/dpqlEditor/types.js.map +1 -1
  32. package/dist/components/dpqlEditor/useDpqlProbe.d.ts +4 -0
  33. package/dist/components/dpqlEditor/useDpqlProbe.d.ts.map +1 -0
  34. package/dist/components/dpqlEditor/useDpqlProbe.js +29 -0
  35. package/dist/components/dpqlEditor/useDpqlProbe.js.map +1 -0
  36. package/dist/components/dpqlEditor/useDpqlSession.d.ts +5 -2
  37. package/dist/components/dpqlEditor/useDpqlSession.d.ts.map +1 -1
  38. package/dist/components/dpqlEditor/useDpqlSession.js +8 -2
  39. package/dist/components/dpqlEditor/useDpqlSession.js.map +1 -1
  40. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  41. package/dist/components/form/engine/CompactRow.js +192 -45
  42. package/dist/components/form/engine/CompactRow.js.map +1 -1
  43. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  44. package/dist/components/form/engine/CompactToolbar.js +5 -2
  45. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  46. package/dist/components/form/engine/FormEngine.d.ts +160 -12
  47. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  48. package/dist/components/form/engine/FormEngine.js +380 -78
  49. package/dist/components/form/engine/FormEngine.js.map +1 -1
  50. package/dist/components/form/engine/FormFieldsSkeleton.d.ts +48 -0
  51. package/dist/components/form/engine/FormFieldsSkeleton.d.ts.map +1 -0
  52. package/dist/components/form/engine/FormFieldsSkeleton.js +38 -0
  53. package/dist/components/form/engine/FormFieldsSkeleton.js.map +1 -0
  54. package/dist/components/form/engine/OptionFieldMessages.d.ts +17 -2
  55. package/dist/components/form/engine/OptionFieldMessages.d.ts.map +1 -1
  56. package/dist/components/form/engine/OptionFieldMessages.js +73 -12
  57. package/dist/components/form/engine/OptionFieldMessages.js.map +1 -1
  58. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -1
  59. package/dist/components/form/engine/_structuredData/SchemaDataView.js +7 -1
  60. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -1
  61. package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
  62. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  63. package/dist/components/form/engine/readFirst.d.ts +42 -1
  64. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  65. package/dist/components/form/engine/readFirst.js +74 -7
  66. package/dist/components/form/engine/readFirst.js.map +1 -1
  67. package/dist/components/form/engine/rendererTypes.d.ts +13 -0
  68. package/dist/components/form/engine/rendererTypes.d.ts.map +1 -1
  69. package/dist/components/form/engine/rendererTypes.js.map +1 -1
  70. package/dist/components/form/engine/rowMenuContext.d.ts +78 -0
  71. package/dist/components/form/engine/rowMenuContext.d.ts.map +1 -0
  72. package/dist/components/form/engine/rowMenuContext.js +103 -0
  73. package/dist/components/form/engine/rowMenuContext.js.map +1 -0
  74. package/dist/components/form/engine/typeChoices.d.ts +42 -0
  75. package/dist/components/form/engine/typeChoices.d.ts.map +1 -0
  76. package/dist/components/form/engine/typeChoices.js +31 -0
  77. package/dist/components/form/engine/typeChoices.js.map +1 -0
  78. package/dist/components/form/expressions/DpqlRendering.d.ts +26 -0
  79. package/dist/components/form/expressions/DpqlRendering.d.ts.map +1 -0
  80. package/dist/components/form/expressions/DpqlRendering.js +53 -0
  81. package/dist/components/form/expressions/DpqlRendering.js.map +1 -0
  82. package/dist/components/form/expressions/ExpressionField.d.ts +7 -1
  83. package/dist/components/form/expressions/ExpressionField.d.ts.map +1 -1
  84. package/dist/components/form/expressions/ExpressionField.js +203 -45
  85. package/dist/components/form/expressions/ExpressionField.js.map +1 -1
  86. package/dist/components/form/expressions/argumentPresence.d.ts +97 -0
  87. package/dist/components/form/expressions/argumentPresence.d.ts.map +1 -0
  88. package/dist/components/form/expressions/argumentPresence.js +203 -0
  89. package/dist/components/form/expressions/argumentPresence.js.map +1 -0
  90. package/dist/components/form/expressions/builder/argumentLabel.d.ts.map +1 -1
  91. package/dist/components/form/expressions/builder/argumentLabel.js +9 -4
  92. package/dist/components/form/expressions/builder/argumentLabel.js.map +1 -1
  93. package/dist/components/form/expressions/builder/index.d.ts +15 -2
  94. package/dist/components/form/expressions/builder/index.d.ts.map +1 -1
  95. package/dist/components/form/expressions/builder/index.js +20 -58
  96. package/dist/components/form/expressions/builder/index.js.map +1 -1
  97. package/dist/components/form/expressions/builder/renderTemplate.d.ts +4 -1
  98. package/dist/components/form/expressions/builder/renderTemplate.d.ts.map +1 -1
  99. package/dist/components/form/expressions/builder/renderTemplate.js +10 -67
  100. package/dist/components/form/expressions/builder/renderTemplate.js.map +1 -1
  101. package/dist/components/form/expressions/dpqlMockLanguage.d.ts +76 -0
  102. package/dist/components/form/expressions/dpqlMockLanguage.d.ts.map +1 -0
  103. package/dist/components/form/expressions/dpqlMockLanguage.js +525 -0
  104. package/dist/components/form/expressions/dpqlMockLanguage.js.map +1 -0
  105. package/dist/components/form/expressions/dpqlMockLsp.d.ts +31 -2
  106. package/dist/components/form/expressions/dpqlMockLsp.d.ts.map +1 -1
  107. package/dist/components/form/expressions/dpqlMockLsp.js +86 -80
  108. package/dist/components/form/expressions/dpqlMockLsp.js.map +1 -1
  109. package/dist/components/form/expressions/mockExpressions.d.ts.map +1 -1
  110. package/dist/components/form/expressions/mockExpressions.js +8 -4
  111. package/dist/components/form/expressions/mockExpressions.js.map +1 -1
  112. package/dist/components/form/expressions/renderExpressionToText.d.ts +1 -1
  113. package/dist/components/form/expressions/renderExpressionToText.d.ts.map +1 -1
  114. package/dist/components/form/expressions/renderExpressionToText.js +95 -19
  115. package/dist/components/form/expressions/renderExpressionToText.js.map +1 -1
  116. package/dist/components/form/expressions/types.d.ts +7 -0
  117. package/dist/components/form/expressions/types.d.ts.map +1 -1
  118. package/dist/components/form/expressions/useRenderExpression.d.ts +7 -16
  119. package/dist/components/form/expressions/useRenderExpression.d.ts.map +1 -1
  120. package/dist/components/form/expressions/useRenderExpression.js +50 -126
  121. package/dist/components/form/expressions/useRenderExpression.js.map +1 -1
  122. package/dist/components/form/fields/Field.d.ts.map +1 -1
  123. package/dist/components/form/fields/Field.js +3 -1
  124. package/dist/components/form/fields/Field.js.map +1 -1
  125. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +11 -1
  126. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  127. package/dist/components/form/fields/allowed-values/AllowedValues.js +14 -2
  128. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  129. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  130. package/dist/components/form/fields/auto/AutoFormField.js +91 -28
  131. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  132. package/dist/components/form/fields/date/Date.d.ts +1 -1
  133. package/dist/components/form/fields/date/Date.d.ts.map +1 -1
  134. package/dist/components/form/fields/date/Date.js +16 -2
  135. package/dist/components/form/fields/date/Date.js.map +1 -1
  136. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  137. package/dist/components/form/fields/long-string/LongString.js +14 -2
  138. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  139. package/dist/components/form/fields/rich-text/RichText.d.ts +35 -2
  140. package/dist/components/form/fields/rich-text/RichText.d.ts.map +1 -1
  141. package/dist/components/form/fields/rich-text/RichText.js +153 -12
  142. package/dist/components/form/fields/rich-text/RichText.js.map +1 -1
  143. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts +2 -1
  144. package/dist/components/form/fields/template/ReadOnlyTemplateTag.d.ts.map +1 -1
  145. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js +3 -2
  146. package/dist/components/form/fields/template/ReadOnlyTemplateTag.js.map +1 -1
  147. package/dist/components/form/fields/template/TemplateField.d.ts +34 -2
  148. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  149. package/dist/components/form/fields/template/TemplateField.js +604 -58
  150. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  151. package/dist/components/form/index.d.ts +1 -0
  152. package/dist/components/form/index.d.ts.map +1 -1
  153. package/dist/components/form/index.js +1 -0
  154. package/dist/components/form/index.js.map +1 -1
  155. package/dist/components/smartEditor/SmartEditor.d.ts.map +1 -1
  156. package/dist/components/smartEditor/SmartEditor.js +29 -8
  157. package/dist/components/smartEditor/SmartEditor.js.map +1 -1
  158. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts +8 -0
  159. package/dist/components/smartEditor/__fixtures__/mockLspServer.d.ts.map +1 -1
  160. package/dist/components/smartEditor/__fixtures__/mockLspServer.js +53 -10
  161. package/dist/components/smartEditor/__fixtures__/mockLspServer.js.map +1 -1
  162. package/dist/components/smartEditor/useLspSession.d.ts +5 -1
  163. package/dist/components/smartEditor/useLspSession.d.ts.map +1 -1
  164. package/dist/components/smartEditor/useLspSession.js +16 -2
  165. package/dist/components/smartEditor/useLspSession.js.map +1 -1
  166. package/dist/helpers/dpqlDetection.d.ts +58 -0
  167. package/dist/helpers/dpqlDetection.d.ts.map +1 -0
  168. package/dist/helpers/dpqlDetection.js +164 -0
  169. package/dist/helpers/dpqlDetection.js.map +1 -0
  170. package/dist/helpers/optionUiTypes.d.ts +19 -3
  171. package/dist/helpers/optionUiTypes.d.ts.map +1 -1
  172. package/dist/helpers/optionUiTypes.js +20 -1
  173. package/dist/helpers/optionUiTypes.js.map +1 -1
  174. package/dist/helpers/options.d.ts +37 -0
  175. package/dist/helpers/options.d.ts.map +1 -1
  176. package/dist/helpers/options.js +78 -1
  177. package/dist/helpers/options.js.map +1 -1
  178. package/dist/helpers/templateItems.d.ts +47 -0
  179. package/dist/helpers/templateItems.d.ts.map +1 -0
  180. package/dist/helpers/templateItems.js +88 -0
  181. package/dist/helpers/templateItems.js.map +1 -0
  182. package/dist/helpers/templateText.d.ts +37 -0
  183. package/dist/helpers/templateText.d.ts.map +1 -0
  184. package/dist/helpers/templateText.js +64 -0
  185. package/dist/helpers/templateText.js.map +1 -0
  186. package/dist/helpers/templates.d.ts +19 -11
  187. package/dist/helpers/templates.d.ts.map +1 -1
  188. package/dist/helpers/templates.js +46 -29
  189. package/dist/helpers/templates.js.map +1 -1
  190. package/dist/helpers/validations.d.ts.map +1 -1
  191. package/dist/helpers/validations.js +56 -9
  192. package/dist/helpers/validations.js.map +1 -1
  193. package/dist/hooks/useArgSchema.d.ts +2 -1
  194. package/dist/hooks/useArgSchema.d.ts.map +1 -1
  195. package/dist/hooks/useFetch/useFetch.d.ts +3 -1
  196. package/dist/hooks/useFetch/useFetch.d.ts.map +1 -1
  197. package/dist/hooks/useFetch/useFetch.js +47 -9
  198. package/dist/hooks/useFetch/useFetch.js.map +1 -1
  199. package/dist/hooks/useTemplates.d.ts +20 -0
  200. package/dist/hooks/useTemplates.d.ts.map +1 -1
  201. package/dist/hooks/useTemplates.js +34 -2
  202. package/dist/hooks/useTemplates.js.map +1 -1
  203. package/dist/index.d.ts +2 -1
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +5 -1
  206. package/dist/index.js.map +1 -1
  207. package/dist/stories/storyNetwork.d.ts +36 -0
  208. package/dist/stories/storyNetwork.d.ts.map +1 -0
  209. package/dist/stories/storyNetwork.js +82 -0
  210. package/dist/stories/storyNetwork.js.map +1 -0
  211. package/dist/utils/fetch.d.ts +151 -1
  212. package/dist/utils/fetch.d.ts.map +1 -1
  213. package/dist/utils/fetch.js +256 -44
  214. package/dist/utils/fetch.js.map +1 -1
  215. package/dist/utils/lspClient.d.ts +6 -0
  216. package/dist/utils/lspClient.d.ts.map +1 -1
  217. package/dist/utils/lspClient.js +62 -11
  218. package/dist/utils/lspClient.js.map +1 -1
  219. package/dist/utils/websocket.d.ts +6 -0
  220. package/dist/utils/websocket.d.ts.map +1 -1
  221. package/dist/utils/websocket.js +15 -7
  222. package/dist/utils/websocket.js.map +1 -1
  223. package/package.json +2 -2
  224. package/src/components/dpqlEditor/DpqlEditor.stories.tsx +3 -119
  225. package/src/components/dpqlEditor/DpqlEditor.tsx +5 -2
  226. package/src/components/dpqlEditor/dpqlHelpers.ts +20 -1
  227. package/src/components/dpqlEditor/dpqlProbe.ts +165 -0
  228. package/src/components/dpqlEditor/dpqlTags.ts +13 -0
  229. package/src/components/dpqlEditor/index.ts +4 -0
  230. package/src/components/dpqlEditor/types.ts +38 -2
  231. package/src/components/dpqlEditor/useDpqlProbe.ts +33 -0
  232. package/src/components/dpqlEditor/useDpqlSession.ts +20 -4
  233. package/src/components/form/engine/CompactRow.tsx +240 -51
  234. package/src/components/form/engine/CompactToolbar.tsx +10 -3
  235. package/src/components/form/engine/FormEngine.stories.tsx +431 -124
  236. package/src/components/form/engine/FormEngine.tsx +508 -90
  237. package/src/components/form/engine/FormFieldsSkeleton.tsx +76 -0
  238. package/src/components/form/engine/OptionFieldMessages.tsx +103 -12
  239. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +11 -0
  240. package/src/components/form/engine/compactToolbarContext.ts +1 -1
  241. package/src/components/form/engine/readFirst.ts +86 -7
  242. package/src/components/form/engine/rendererTypes.ts +12 -0
  243. package/src/components/form/engine/rowMenuContext.ts +159 -0
  244. package/src/components/form/engine/typeChoices.ts +61 -0
  245. package/src/components/form/expressions/DpqlRendering.tsx +85 -0
  246. package/src/components/form/expressions/ExpressionField.stories.tsx +826 -48
  247. package/src/components/form/expressions/ExpressionField.tsx +266 -54
  248. package/src/components/form/expressions/argumentPresence.ts +200 -0
  249. package/src/components/form/expressions/builder/ExpressionBuilder.stories.tsx +31 -14
  250. package/src/components/form/expressions/builder/argumentLabel.tsx +10 -4
  251. package/src/components/form/expressions/builder/index.tsx +39 -77
  252. package/src/components/form/expressions/builder/renderTemplate.tsx +23 -56
  253. package/src/components/form/expressions/dpqlMockLanguage.ts +565 -0
  254. package/src/components/form/expressions/dpqlMockLsp.ts +109 -83
  255. package/src/components/form/expressions/mockExpressions.ts +8 -4
  256. package/src/components/form/expressions/renderExpressionToText.ts +112 -22
  257. package/src/components/form/expressions/types.ts +7 -0
  258. package/src/components/form/expressions/useRenderExpression.ts +43 -127
  259. package/src/components/form/fields/Field.tsx +3 -2
  260. package/src/components/form/fields/allowed-values/AllowedValues.tsx +13 -2
  261. package/src/components/form/fields/auto/AutoFormField.stories.tsx +85 -18
  262. package/src/components/form/fields/auto/AutoFormField.tsx +90 -20
  263. package/src/components/form/fields/date/Date.tsx +17 -1
  264. package/src/components/form/fields/long-string/LongString.tsx +15 -3
  265. package/src/components/form/fields/rich-text/RichText.tsx +235 -30
  266. package/src/components/form/fields/template/ReadOnlyTemplateTag.tsx +4 -2
  267. package/src/components/form/fields/template/TemplateField.stories.tsx +93 -14
  268. package/src/components/form/fields/template/TemplateField.tsx +823 -129
  269. package/src/components/form/index.tsx +1 -0
  270. package/src/components/log/Log.stories.tsx +2 -1
  271. package/src/components/smartEditor/SmartEditor.tsx +41 -9
  272. package/src/components/smartEditor/__fixtures__/mockLspServer.ts +52 -3
  273. package/src/components/smartEditor/useLspSession.ts +21 -3
  274. package/src/helpers/dpqlDetection.ts +209 -0
  275. package/src/helpers/optionUiTypes.ts +22 -0
  276. package/src/helpers/options.ts +70 -0
  277. package/src/helpers/templateItems.ts +81 -0
  278. package/src/helpers/templateText.ts +92 -0
  279. package/src/helpers/templates.ts +47 -37
  280. package/src/helpers/validations.ts +59 -9
  281. package/src/hooks/useFetch/useFetch.stories.tsx +6 -5
  282. package/src/hooks/useFetch/useFetch.tsx +53 -7
  283. package/src/hooks/useStorage/useStorage.stories.tsx +2 -1
  284. package/src/hooks/useTemplates.ts +41 -0
  285. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +2 -1
  286. package/src/index.tsx +14 -1
  287. package/src/stores/currentUser/currentUser.stories.tsx +2 -1
  288. package/src/stories/storyNetwork.ts +92 -0
  289. package/src/utils/fetch.ts +311 -21
  290. package/src/utils/lspClient.ts +68 -11
  291. package/src/utils/websocket.ts +20 -9
@@ -43,94 +43,244 @@ var jsx_runtime_1 = require("react/jsx-runtime");
43
43
  // Owns the `IExpression` value and offers two views of the same AST —
44
44
  // Visual (the builder, Phase 3) and Text (DPQL, this phase). The DPQL text
45
45
  // editor bridges to the AST via the LSP `dpql/parse` (text → AST on edit)
46
- // and `dpql/serialize` (AST → text on entering Text mode); a live "Parsed"
47
- // line renders the current AST (`dpql/renderExpression`).
46
+ // and `dpql/serialize` (AST → text on entering Text mode); a debounced
47
+ // "Preview" box renders the current AST (`dpql/renderExpression`) when that
48
+ // rendering differs from the text the author typed.
48
49
  var reqore_1 = require("@qoretechnologies/reqore");
49
50
  var react_1 = require("react");
50
51
  var dpqlEditor_1 = require("../../dpqlEditor");
52
+ var dpqlHelpers_1 = require("../../dpqlEditor/dpqlHelpers");
51
53
  var builder_1 = require("./builder");
54
+ var DpqlRendering_1 = require("./DpqlRendering");
52
55
  var useExpressions_1 = require("./useExpressions");
53
56
  var useRenderExpression_1 = require("./useRenderExpression");
57
+ var optionUiTypes_1 = require("../../../helpers/optionUiTypes");
54
58
  var PARSE_DEBOUNCE_MS = 300;
59
+ /**
60
+ * How long the Preview waits before catching up with the editor.
61
+ *
62
+ * It mirrors the AST, so without this it re-renders on every keystroke — a box
63
+ * appearing, changing and vanishing under the line being typed. Slightly
64
+ * SLOWER than the parse it follows, so the preview settles once after the text
65
+ * has stopped moving rather than twitching on the way there.
66
+ */
67
+ var PREVIEW_DEBOUNCE_MS = 400;
55
68
  /** Retry cadence for seeding the Text editor while its LSP session opens. */
56
69
  var SEED_RETRY_MS = 400;
57
70
  var SEED_MAX_TRIES = 20;
58
- var noop = function () { return undefined; };
59
71
  exports.ExpressionField = (0, react_1.memo)(function (_a) {
60
72
  var _b;
61
- var value = _a.value, onChange = _a.onChange, type = _a.type, returnType = _a.returnType, readOnly = _a.readOnly, expressionsOverride = _a.expressions, expressionsUrl = _a.expressionsUrl, localTemplates = _a.localTemplates, serverHandled = _a.serverHandled, extraActions = _a.extraActions, provider = _a.provider, recordType = _a.recordType, _c = _a.defaultMode, defaultMode = _c === void 0 ? 'visual' : _c, size = _a.size, reorder = _a.reorder;
73
+ var value = _a.value, onChange = _a.onChange, type = _a.type, returnType = _a.returnType, readOnly = _a.readOnly, expressionsOverride = _a.expressions, expressionsUrl = _a.expressionsUrl, localTemplates = _a.localTemplates, serverHandled = _a.serverHandled, extraActions = _a.extraActions, provider = _a.provider, recordType = _a.recordType, _c = _a.defaultMode, defaultMode = _c === void 0 ? 'visual' : _c, size = _a.size, componentOverrides = _a.componentOverrides, reorder = _a.reorder;
62
74
  var expressions = (0, useExpressions_1.useExpressions)({
63
75
  override: expressionsOverride,
64
76
  expressionsUrl: expressionsUrl,
65
77
  }).expressions;
66
78
  var renderRich = (0, useRenderExpression_1.useRenderExpression)().renderRich;
67
79
  var _d = (0, react_1.useState)(defaultMode), mode = _d[0], setMode = _d[1];
68
- var _e = (0, react_1.useState)({
69
- text: '',
70
- server: false,
71
- }), preview = _e[0], setPreview = _e[1];
80
+ /* The server's rendering of the current AST; empty until it has one. There is
81
+ no client-side stand-in — see `useRenderExpression`. */
82
+ var _e = (0, react_1.useState)(''), preview = _e[0], setPreview = _e[1];
72
83
  // Text mode state. `text` is the DPQL string the editor shows; the AST
73
84
  // (`value`) stays the source of truth, kept in sync via parse-on-edit.
74
85
  var _f = (0, react_1.useState)(''), text = _f[0], setText = _f[1];
86
+ /* The text the current AST was parsed FROM.
87
+ *
88
+ * The preview renders the AST, and the AST only moves on a SUCCESSFUL
89
+ * parse — so while an edit is mid-flight or simply invalid, the AST still
90
+ * describes the last thing that parsed. Showing it then states something
91
+ * the editor does not contain: deleting the `2` from `1 + 2` left
92
+ * "Unexpected end of input" sitting directly above a Preview confidently
93
+ * reading `1 + 2`. */
94
+ var _g = (0, react_1.useState)(''), astText = _g[0], setAstText = _g[1];
95
+ /**
96
+ * The server's answer to "can this expression's result satisfy the type
97
+ * this field declares?". `null` when nothing has been asked, or when the
98
+ * field declares no type worth asking about.
99
+ */
100
+ var _h = (0, react_1.useState)(null), typeCheck = _h[0], setTypeCheck = _h[1];
75
101
  var dpqlRef = (0, react_1.useRef)(null);
76
102
  var parseTimer = (0, react_1.useRef)(null);
77
103
  var ast = (0, react_1.useMemo)(function () { return value === null || value === void 0 ? void 0 : value.value; }, [value]);
104
+ /**
105
+ * The type the expression's result has to satisfy, sent with every parse.
106
+ *
107
+ * `auto` and `any` are left out deliberately: they accept anything, so the
108
+ * server would answer "compatible" for everything and the round trip would
109
+ * buy nothing. A field offering a CHOICE of return types has no single
110
+ * answer either, so it asks nothing rather than asking about the wrong one.
111
+ */
112
+ var targetType = (0, react_1.useMemo)(function () {
113
+ var declared = Array.isArray(returnType) ? undefined : (returnType !== null && returnType !== void 0 ? returnType : type);
114
+ return declared && !(0, optionUiTypes_1.isUntypedOptionType)(declared) ? declared : undefined;
115
+ }, [returnType, type]);
116
+ /**
117
+ * Read the type analysis off a parse result, or clear it.
118
+ *
119
+ * "Fits" is read from the whole answer, not `type_compatible` alone. A
120
+ * conversion that exists and cannot fail — a number used as text — is a
121
+ * fit as far as the author is concerned, and reporting it is exactly the
122
+ * noise the message below is written to avoid.
123
+ */
124
+ var readTypeCheck = (0, react_1.useCallback)(function (result) {
125
+ var _a;
126
+ if (!result || result.type_compatible === undefined) {
127
+ setTypeCheck(null);
128
+ return;
129
+ }
130
+ var convertsSafely = !!result.auto_coercible && !result.coercion_may_fail;
131
+ setTypeCheck({
132
+ compatible: !!result.type_compatible || convertsSafely,
133
+ mayFail: !!result.coercion_may_fail,
134
+ inferred: result.inferred_type,
135
+ target: result.target_type,
136
+ fix: (_a = result.suggested_fix) === null || _a === void 0 ? void 0 : _a.text,
137
+ });
138
+ }, []);
78
139
  // Keep a readable rendering of the current expression in sync — the
79
- // single live mirror of the AST (server `dpql/renderExpression` when
80
- // reachable, the client-side approximation otherwise).
140
+ // single live mirror of the AST (the server's `dpql/renderExpression`).
141
+ //
142
+ // Debounced: it follows the AST, which follows the text, so rendering it
143
+ // eagerly put a box under the cursor that appeared, changed and vanished
144
+ // while the author was still typing.
81
145
  (0, react_1.useEffect)(function () {
82
146
  var live = true;
83
- renderRich(ast !== null && ast !== void 0 ? ast : {}, expressions).then(function (r) {
84
- if (live)
85
- setPreview({ text: r.text, server: r.server });
86
- });
147
+ var timer = setTimeout(function () {
148
+ renderRich(ast !== null && ast !== void 0 ? ast : {}).then(function (r) {
149
+ var _a;
150
+ if (live)
151
+ setPreview((_a = r === null || r === void 0 ? void 0 : r.text) !== null && _a !== void 0 ? _a : '');
152
+ });
153
+ }, PREVIEW_DEBOUNCE_MS);
87
154
  return function () {
88
155
  live = false;
156
+ clearTimeout(timer);
89
157
  };
90
- }, [renderRich, ast, expressions]);
158
+ }, [renderRich, ast]);
91
159
  // Tracks whether the user has typed since entering Text mode, so a
92
160
  // slow seed response can't clobber their input.
93
161
  var userTypedRef = (0, react_1.useRef)(false);
94
- var astRef = (0, react_1.useRef)(ast);
162
+ /* A cleared value must clear the editor with it.
163
+ *
164
+ * "Clear value" empties the option (`handleValueChange(name, undefined)`),
165
+ * but the DPQL text is local state seeded once on entering Text mode, and
166
+ * the seeding effect returns early for an empty AST — it exists to fill the
167
+ * editor, not to empty it. So the value went and the text stayed: the row
168
+ * reported "This field is required" while still showing `1 + 2`, which
169
+ * reads as the clear having silently failed.
170
+ *
171
+ * Only an AST that HAD content and lost it clears the box. A field that
172
+ * simply starts empty is left alone, so this cannot wipe what an author is
173
+ * part-way through typing before their first parse lands.
174
+ */
175
+ var hadExpression = (0, react_1.useRef)(false);
95
176
  (0, react_1.useEffect)(function () {
96
- astRef.current = ast;
177
+ /* GONE, not merely incomplete.
178
+ *
179
+ * The first cut asked whether the AST still had an `exp`, and that is a
180
+ * state the value passes THROUGH while the author types: a half-written
181
+ * expression parses to something without one. So typing `1 + 2` cleared
182
+ * the editor mid-keystroke and the text vanished under the cursor.
183
+ *
184
+ * A clear removes the value itself, so that is what to watch: `value`
185
+ * empty, not an AST that is between shapes. Typing never produces that —
186
+ * `handleDpqlChange` only emits on a SUCCESSFUL parse, so an incomplete
187
+ * expression leaves the previous value in place. */
188
+ if (ast) {
189
+ hadExpression.current = true;
190
+ return;
191
+ }
192
+ if (hadExpression.current) {
193
+ hadExpression.current = false;
194
+ userTypedRef.current = false;
195
+ setText('');
196
+ }
97
197
  }, [ast]);
98
198
  // Text mode: parse the DPQL into the AST (debounced).
199
+ /* The session may not be attached when the debounce fires — the editor
200
+ mounts on the render that flips the mode, and its LSP session comes up
201
+ after that. `dpqlRef.current?.parse?.()` is optional all the way down, so
202
+ an early call resolves `undefined`, `readTypeCheck` CLEARS the analysis,
203
+ and nothing asks again: the author types once into a fresh Text field and
204
+ is told nothing about the type until they happen to type another
205
+ character.
206
+
207
+ The seeding effect below already retries for this exact reason
208
+ ("`serialize` resolves '' until the editor's LSP session is ready"); the
209
+ parse path needed the same care and did not have it. Same budget as
210
+ seeding, so a session that never arrives gives up rather than spinning.
211
+
212
+ Found by CI, not locally: the session is up before the debounce on a
213
+ fast machine, so the story asserting the type message passed here every
214
+ time and failed on the runner. */
99
215
  var handleDpqlChange = (0, react_1.useCallback)(function (next) {
100
216
  userTypedRef.current = true;
101
217
  setText(next);
102
218
  if (parseTimer.current)
103
219
  clearTimeout(parseTimer.current);
104
- parseTimer.current = setTimeout(function () { return __awaiter(void 0, void 0, void 0, function () {
105
- var result;
106
- var _a, _b;
107
- return __generator(this, function (_c) {
108
- switch (_c.label) {
109
- case 0: return [4 /*yield*/, ((_b = (_a = dpqlRef.current) === null || _a === void 0 ? void 0 : _a.parse) === null || _b === void 0 ? void 0 : _b.call(_a, next))];
220
+ var tries = 0;
221
+ var runParse = function () { return __awaiter(void 0, void 0, void 0, function () {
222
+ var parse, result;
223
+ var _a;
224
+ return __generator(this, function (_b) {
225
+ switch (_b.label) {
226
+ case 0:
227
+ parse = (_a = dpqlRef.current) === null || _a === void 0 ? void 0 : _a.parse;
228
+ if (!parse) {
229
+ if (++tries < SEED_MAX_TRIES) {
230
+ parseTimer.current = setTimeout(runParse, SEED_RETRY_MS);
231
+ }
232
+ return [2 /*return*/];
233
+ }
234
+ return [4 /*yield*/, parse(next, targetType)];
110
235
  case 1:
111
- result = _c.sent();
236
+ result = _b.sent();
237
+ readTypeCheck(result);
112
238
  if ((result === null || result === void 0 ? void 0 : result.success) && result.expression) {
239
+ setAstText(next);
113
240
  // `dpql/parse` returns the field-ready `{ is_expression, value }`.
114
241
  onChange(result.expression);
115
242
  }
116
243
  return [2 /*return*/];
117
244
  }
118
245
  });
119
- }); }, PARSE_DEBOUNCE_MS);
120
- }, [onChange]);
121
- // Seed the Text editor from the AST whenever Text mode becomes active
122
- // (including a `defaultMode='text'` mount). This must run as an
123
- // effect: the editor only mounts on the same render that flips the
124
- // mode (so `dpqlRef` is null inside the click handler), and
125
- // `serialize` resolves '' until the editor's LSP session is ready —
126
- // hence the brief retry loop.
246
+ }); };
247
+ parseTimer.current = setTimeout(runParse, PARSE_DEBOUNCE_MS);
248
+ }, [onChange, targetType, readTypeCheck]);
249
+ /** Whether this visit to Text mode has already put the AST in the editor. */
250
+ var seededRef = (0, react_1.useRef)(false);
251
+ /* Seed the Text editor from the AST whenever Text mode becomes active
252
+ * (including a `defaultMode='text'` mount). This must run as an effect: the
253
+ * editor only mounts on the same render that flips the mode (so `dpqlRef`
254
+ * is null inside the click handler), and `serialize` resolves '' until the
255
+ * editor's LSP session is ready — hence the brief retry loop.
256
+ *
257
+ * It waits for an AST, because the AST can arrive AFTER the mode does. A
258
+ * host flips this shell into Text mode on the very render that accepts an
259
+ * expression, and the value it passes on that render is still the TEXT the
260
+ * author typed — the parsed AST only comes back through the form one render
261
+ * later. Keyed on the mode alone, the effect had already had its only turn
262
+ * by then: it found nothing to serialize, returned, and nothing asked
263
+ * again. The author landed in an empty editor with a Preview of their own
264
+ * expression sitting beside it, which reads as the text having been thrown
265
+ * away.
266
+ *
267
+ * Seeding happens at most ONCE per visit, and that is what makes watching
268
+ * the AST safe: `userTypedRef` guards what is being typed, but the AST
269
+ * MOVES as the author types — every successful parse replaces it — so an
270
+ * effect that re-seeded on each new AST would fight them for the editor. */
127
271
  (0, react_1.useEffect)(function () {
128
- if (mode !== 'text')
272
+ if (mode !== 'text') {
273
+ // Leaving Text asks the question again on the next visit; the typing
274
+ // flag goes with it, or a stale one would suppress that visit's seed.
275
+ seededRef.current = false;
276
+ userTypedRef.current = false;
277
+ return undefined;
278
+ }
279
+ if (seededRef.current || userTypedRef.current)
129
280
  return undefined;
130
- var seedAst = astRef.current;
131
- if (!(seedAst === null || seedAst === void 0 ? void 0 : seedAst.exp))
281
+ if (!(ast === null || ast === void 0 ? void 0 : ast.exp))
132
282
  return undefined;
133
- userTypedRef.current = false;
283
+ var seedAst = ast;
134
284
  var cancelled = false;
135
285
  var timer = null;
136
286
  var tries = 0;
@@ -145,7 +295,9 @@ exports.ExpressionField = (0, react_1.memo)(function (_a) {
145
295
  if (cancelled || userTypedRef.current)
146
296
  return [2 /*return*/];
147
297
  if (t) {
298
+ seededRef.current = true;
148
299
  setText(t);
300
+ setAstText(t);
149
301
  }
150
302
  else if (++tries < SEED_MAX_TRIES) {
151
303
  timer = setTimeout(seed, SEED_RETRY_MS);
@@ -160,7 +312,7 @@ exports.ExpressionField = (0, react_1.memo)(function (_a) {
160
312
  if (timer)
161
313
  clearTimeout(timer);
162
314
  };
163
- }, [mode]);
315
+ }, [mode, ast]);
164
316
  // Switch to Text: the seeding effect above serializes the AST once
165
317
  // the editor's session is up.
166
318
  var enterTextMode = (0, react_1.useCallback)(function () {
@@ -176,9 +328,10 @@ exports.ExpressionField = (0, react_1.memo)(function (_a) {
176
328
  if (parseTimer.current)
177
329
  clearTimeout(parseTimer.current);
178
330
  if (!(mode === 'text' && text)) return [3 /*break*/, 2];
179
- return [4 /*yield*/, ((_b = (_a = dpqlRef.current) === null || _a === void 0 ? void 0 : _a.parse) === null || _b === void 0 ? void 0 : _b.call(_a, text))];
331
+ return [4 /*yield*/, ((_b = (_a = dpqlRef.current) === null || _a === void 0 ? void 0 : _a.parse) === null || _b === void 0 ? void 0 : _b.call(_a, text, targetType))];
180
332
  case 1:
181
333
  result = _c.sent();
334
+ readTypeCheck(result);
182
335
  if ((result === null || result === void 0 ? void 0 : result.success) && result.expression) {
183
336
  onChange(result.expression);
184
337
  }
@@ -188,20 +341,25 @@ exports.ExpressionField = (0, react_1.memo)(function (_a) {
188
341
  return [2 /*return*/];
189
342
  }
190
343
  });
191
- }); }, [mode, text, onChange]);
344
+ }); }, [mode, text, onChange, targetType, readTypeCheck]);
192
345
  (0, react_1.useEffect)(function () { return function () {
193
346
  if (parseTimer.current)
194
347
  clearTimeout(parseTimer.current);
195
348
  }; }, []);
196
- return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, gapSize: 'small', className: 'expression-field', children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { gapSize: 'small', fluid: true, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: 'NodeTree', active: mode === 'visual', onClick: enterVisualMode, disabled: readOnly, size: size, children: "Visual" }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: 'CodeLine', active: mode === 'text', onClick: enterTextMode, disabled: readOnly, size: size, children: "Text" })] }), mode === 'text' ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(dpqlEditor_1.DpqlEditor, { ref: dpqlRef, value: text, onChange: handleDpqlChange, provider: provider, recordType: recordType, readOnly: readOnly, height: '48px' }), preview.text ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { intent: 'info', size: 'small', title: 'Parsed', flat: true, opaque: false, children: preview.server ? (
197
- // Server rendering shown through a read-only DpqlEditor:
198
- // template-ref chips + LSP token colours; diagnostics off
199
- // (the rendering is readable text, not parseable DPQL).
200
- (0, jsx_runtime_1.jsx)("div", { "data-testid": 'expression-preview', style: { width: '100%' }, children: (0, jsx_runtime_1.jsx)(dpqlEditor_1.DpqlEditor, { value: preview.text, onChange: noop, readOnly: true, showDiagnostics: false, enableHover: false }) })) : ((0, jsx_runtime_1.jsx)("code", { "data-testid": 'expression-preview', children: preview.text })) })) : null] })) : ((0, jsx_runtime_1.jsx)(builder_1.ExpressionBuilder, { value: value, onChange: function (v, remove) { return onChange(v, remove); }, expressions: expressions,
349
+ /* What the Preview has to add: `none` until the server's rendering of the
350
+ text now showing exists, `repeats` when it reads exactly as that text does
351
+ (so it is not drawn — see below), `shown` otherwise. Exposed on the field,
352
+ because a Preview correctly left out leaves nothing else to observe. */
353
+ var previewState = !preview || astText.trim() !== text.trim() ? 'none'
354
+ : (0, dpqlHelpers_1.dpqlDisplayedText)(preview).trim() === (0, dpqlHelpers_1.dpqlDisplayedText)(text).trim() ? 'repeats'
355
+ : 'shown';
356
+ return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, fluid: true, gapSize: 'small', className: 'expression-field', "data-preview": mode === 'text' ? previewState : undefined, children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { gapSize: 'small', fluid: true, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: 'NodeTree', active: mode === 'visual', onClick: enterVisualMode, disabled: readOnly, size: size, children: "Visual" }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { icon: 'CodeLine', active: mode === 'text', onClick: enterTextMode, disabled: readOnly, size: size, children: "Text" })] }), mode === 'text' ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(dpqlEditor_1.DpqlEditor, { ref: dpqlRef, value: text, onChange: handleDpqlChange, provider: provider, recordType: recordType, readOnly: readOnly, height: '48px' }), typeCheck && !typeCheck.compatible && ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreMessage, { intent: typeCheck.mayFail ? 'warning' : 'danger', size: 'small', flat: true, opaque: false, title: typeCheck.mayFail ? 'This may not fit' : 'This does not fit', children: ["The expression returns ".concat(typeCheck.inferred, ", and this field holds ").concat(typeCheck.target, "."), typeCheck.mayFail ?
357
+ ' That conversion is attempted rather than guaranteed, so the value itself is checked when it runs.'
358
+ : '', typeCheck.fix ? ((0, jsx_runtime_1.jsx)("div", { style: { marginTop: '6px' }, children: (0, jsx_runtime_1.jsx)(DpqlRendering_1.DpqlRendering, { text: typeCheck.fix, "data-testid": 'expression-type-fix' }) })) : null] })), previewState === 'shown' ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreMessage, { intent: 'info', size: 'small', title: 'Preview', flat: true, opaque: false, children: (0, jsx_runtime_1.jsx)(DpqlRendering_1.DpqlRendering, { text: preview, "data-testid": 'expression-preview' }) })) : null] })) : ((0, jsx_runtime_1.jsx)(builder_1.ExpressionBuilder, { value: value, onChange: function (v, remove) { return onChange(v, remove); }, expressions: expressions,
201
359
  // Default to `auto` when the field declares no return type, so a
202
360
  // valid expression renders `muted` rather than `danger` (the
203
361
  // builder's intent requires a truthy returnType).
204
- returnType: ((_b = returnType !== null && returnType !== void 0 ? returnType : type) !== null && _b !== void 0 ? _b : 'auto'), readOnly: readOnly, localTemplates: localTemplates !== null && localTemplates !== void 0 ? localTemplates : { items: [] }, serverHandled: serverHandled, extraActions: extraActions, size: size, reorder: reorder }))] }));
362
+ returnType: ((_b = returnType !== null && returnType !== void 0 ? returnType : type) !== null && _b !== void 0 ? _b : 'auto'), readOnly: readOnly, localTemplates: localTemplates !== null && localTemplates !== void 0 ? localTemplates : { items: [] }, serverHandled: serverHandled, componentOverrides: componentOverrides, extraActions: extraActions, size: size, reorder: reorder }))] }));
205
363
  });
206
364
  exports.default = exports.ExpressionField;
207
365
  //# sourceMappingURL=ExpressionField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExpressionField.js","sourceRoot":"","sources":["../../../../src/components/form/expressions/ExpressionField.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA2C;AAC3C,wEAAwE;AACxE,sEAAsE;AACtE,2EAA2E;AAC3E,0EAA0E;AAC1E,2EAA2E;AAC3E,0DAA0D;AAC1D,mDAIkC;AAElC,+BAAgF;AAChF,+CAA8D;AAC9D,qCAAuE;AAEvE,mDAAkD;AAClD,6DAA4D;AAI5D,IAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,6EAA6E;AAC7E,IAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,IAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,IAAM,IAAI,GAAG,cAAY,OAAA,SAAS,EAAT,CAAS,CAAC;AA0CtB,QAAA,eAAe,GAAG,IAAA,YAAI,EACjC,UAAC,EAgBuB;;QAftB,KAAK,WAAA,EACL,QAAQ,cAAA,EACR,IAAI,UAAA,EACJ,UAAU,gBAAA,EACV,QAAQ,cAAA,EACK,mBAAmB,iBAAA,EAChC,cAAc,oBAAA,EACd,cAAc,oBAAA,EACd,aAAa,mBAAA,EACb,YAAY,kBAAA,EACZ,QAAQ,cAAA,EACR,UAAU,gBAAA,EACV,mBAAsB,EAAtB,WAAW,mBAAG,QAAQ,KAAA,EACtB,IAAI,UAAA,EACJ,OAAO,aAAA;IAEC,IAAA,WAAW,GAAK,IAAA,+BAAc,EAAC;QACrC,QAAQ,EAAE,mBAAmB;QAC7B,cAAc,gBAAA;KACf,CAAC,YAHiB,CAGhB;IACK,IAAA,UAAU,GAAK,IAAA,yCAAmB,GAAE,WAA1B,CAA2B;IAEvC,IAAA,KAAkB,IAAA,gBAAQ,EAAkB,WAAW,CAAC,EAAvD,IAAI,QAAA,EAAE,OAAO,QAA0C,CAAC;IACzD,IAAA,KAAwB,IAAA,gBAAQ,EAAoC;QACxE,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,KAAK;KACd,CAAC,EAHK,OAAO,QAAA,EAAE,UAAU,QAGxB,CAAC;IAEH,uEAAuE;IACvE,uEAAuE;IACjE,IAAA,KAAkB,IAAA,gBAAQ,EAAC,EAAE,CAAC,EAA7B,IAAI,QAAA,EAAE,OAAO,QAAgB,CAAC;IACrC,IAAM,OAAO,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IAC7C,IAAM,UAAU,GAAG,IAAA,cAAM,EAAuC,IAAI,CAAC,CAAC;IAEtE,IAAM,GAAG,GAAG,IAAA,eAAO,EAA+B,cAAM,OAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAZ,CAAY,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/E,oEAAoE;IACpE,qEAAqE;IACrE,uDAAuD;IACvD,IAAA,iBAAS,EAAC;QACR,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,UAAU,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,UAAC,CAAC;YACxC,IAAI,IAAI;gBAAE,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,OAAO;YACL,IAAI,GAAG,KAAK,CAAC;QACf,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAEnC,mEAAmE;IACnE,gDAAgD;IAChD,IAAM,YAAY,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACnC,IAAM,MAAM,GAAG,IAAA,cAAM,EAAC,GAAG,CAAC,CAAC;IAC3B,IAAA,iBAAS,EAAC;QACR,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,sDAAsD;IACtD,IAAM,gBAAgB,GAAG,IAAA,mBAAW,EAClC,UAAC,IAAY;QACX,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,UAAU,CAAC,OAAO;YAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzD,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC;;;;;4BACf,qBAAM,CAAA,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,KAAK,mDAAG,IAAI,CAAC,CAAA,EAAA;;wBAA7C,MAAM,GAAG,SAAoC;wBACnD,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,KAAI,MAAM,CAAC,UAAU,EAAE,CAAC;4BACzC,mEAAmE;4BACnE,QAAQ,CAAC,MAAM,CAAC,UAAyB,CAAC,CAAC;wBAC7C,CAAC;;;;aACF,EAAE,iBAAiB,CAAC,CAAC;IACxB,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,sEAAsE;IACtE,gEAAgE;IAChE,mEAAmE;IACnE,4DAA4D;IAC5D,oEAAoE;IACpE,8BAA8B;IAC9B,IAAA,iBAAS,EAAC;QACR,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,SAAS,CAAC;QACtC,IAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAA;YAAE,OAAO,SAAS,CAAC;QACpC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,GAAyC,IAAI,CAAC;QACvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAM,IAAI,GAAG;;;;;4BACD,qBAAM,CAAA,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,SAAS,mDAAG,OAAO,CAAC,CAAA,EAAA;;wBAA/C,CAAC,GAAG,SAA2C;wBACrD,IAAI,SAAS,IAAI,YAAY,CAAC,OAAO;4BAAE,sBAAO;wBAC9C,IAAI,CAAC,EAAE,CAAC;4BACN,OAAO,CAAC,CAAC,CAAC,CAAC;wBACb,CAAC;6BAAM,IAAI,EAAE,KAAK,GAAG,cAAc,EAAE,CAAC;4BACpC,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;wBAC1C,CAAC;;;;aACF,CAAC;QACF,KAAK,IAAI,EAAE,CAAC;QACZ,OAAO;YACL,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,mEAAmE;IACnE,8BAA8B;IAC9B,IAAM,aAAa,GAAG,IAAA,mBAAW,EAAC;QAChC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,mEAAmE;IACnE,IAAM,eAAe,GAAG,IAAA,mBAAW,EAAC;;;;;;oBAClC,IAAI,UAAU,CAAC,OAAO;wBAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;yBACrD,CAAA,IAAI,KAAK,MAAM,IAAI,IAAI,CAAA,EAAvB,wBAAuB;oBACV,qBAAM,CAAA,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,KAAK,mDAAG,IAAI,CAAC,CAAA,EAAA;;oBAA7C,MAAM,GAAG,SAAoC;oBACnD,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,KAAI,MAAM,CAAC,UAAU,EAAE,CAAC;wBACzC,QAAQ,CAAC,MAAM,CAAC,UAAyB,CAAC,CAAC;oBAC7C,CAAC;;;oBAEH,OAAO,CAAC,QAAQ,CAAC,CAAC;;;;SACnB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE3B,IAAA,iBAAS,EACP,cAAM,OAAA;QACJ,IAAI,UAAU,CAAC,OAAO;YAAE,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC,EAFK,CAEL,EACD,EAAE,CACH,CAAC;IAEF,OAAO,CACL,wBAAC,2BAAkB,IAAC,QAAQ,QAAC,KAAK,QAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,kBAAkB,aAC7E,wBAAC,2BAAkB,IAAC,OAAO,EAAC,OAAO,EAAC,KAAK,mBACvC,uBAAC,qBAAY,IACX,IAAI,EAAC,UAAU,EACf,MAAM,EAAE,IAAI,KAAK,QAAQ,EACzB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAW,uBAGJ,EACf,uBAAC,qBAAY,IACX,IAAI,EAAC,UAAU,EACf,MAAM,EAAE,IAAI,KAAK,MAAM,EACvB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAW,qBAGJ,IACI,EAEpB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACjB,6DACE,uBAAC,uBAAU,IACT,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAC,MAAM,GACb,EAID,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CACd,uBAAC,sBAAa,IAAC,MAAM,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,QAAC,MAAM,EAAE,KAAK,YACxE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;wBAChB,yDAAyD;wBACzD,0DAA0D;wBAC1D,wDAAwD;wBACxD,+CAAiB,oBAAoB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAC5D,uBAAC,uBAAU,IACT,KAAK,EAAE,OAAO,CAAC,IAAI,EACnB,QAAQ,EAAE,IAAI,EACd,QAAQ,QACR,eAAe,EAAE,KAAK,EACtB,WAAW,EAAE,KAAK,GAClB,GACE,CACP,CAAC,CAAC,CAAC,CACF,gDAAkB,oBAAoB,YAAE,OAAO,CAAC,IAAI,GAAQ,CAC7D,GACa,CACjB,CAAC,CAAC,CAAC,IAAI,IACP,CACJ,CAAC,CAAC,CAAC,CACF,uBAAC,2BAAiB,IAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAC,CAAC,EAAE,MAAM,IAAK,OAAA,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,EAAnB,CAAmB,EAC5C,WAAW,EAAE,WAAW;gBACxB,iEAAiE;gBACjE,6DAA6D;gBAC7D,kDAAkD;gBAClD,UAAU,EAAE,CAAC,MAAA,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,mCAAI,MAAM,CAAQ,EACjD,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAC/C,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,GAChB,CACH,IACkB,CACtB,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,kBAAe,uBAAe,CAAC"}
1
+ {"version":3,"file":"ExpressionField.js","sourceRoot":"","sources":["../../../../src/components/form/expressions/ExpressionField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Is this expression argument SUPPLIED, or is it still missing?
3
+ *
4
+ * DPQL has a null literal: `null` parses to `{exp: "value", args: [null]}` and
5
+ * round-trips, and an author writing it in the text editor means *"this is the
6
+ * value — nothing"*. It is the only way to assert that a call returned no
7
+ * value, which is how it was reported.
8
+ *
9
+ * The rule, stated once here because three different places had drawn it
10
+ * differently: **an argument that is explicitly null is supplied; one that is
11
+ * absent or `undefined` is still missing.**
12
+ *
13
+ * The builder used to ask `size(arg) === 0`, and lodash answers `0` for `null`
14
+ * as readily as for `{}`. So an explicit null was read as a missing argument
15
+ * and reset from the catalogue's declaration — which is how a saved draft ended
16
+ * up holding `{"type": "any", "required": true}`, an argument DEFINITION where
17
+ * its value should be, with the author's `null` gone and `required` (a schema
18
+ * key, never a value key) left behind to give it away.
19
+ */
20
+ /**
21
+ * True when `arg` carries no value yet — `undefined`, the `{}` the builder
22
+ * writes when a type change resets an argument, or any envelope with no
23
+ * `value` in it.
24
+ *
25
+ * `null` is NOT missing: it is the null literal.
26
+ *
27
+ * The rule used to be "an object with no keys at all", which let an envelope
28
+ * holding nothing but SCHEMA keys pass as a supplied value. That is how a saved
29
+ * draft kept `{type: 'any', required: true}` — an argument DEFINITION where the
30
+ * author's value belonged — and why re-opening the expression never repaired
31
+ * it: the builder looked at those two keys, concluded the argument was already
32
+ * supplied, and left the definition in place as data. `required` is a schema
33
+ * key; nothing ever reads it back off a stored value.
34
+ *
35
+ * Asking for the `value` instead makes the question the one that was always
36
+ * meant: has the author put something here?
37
+ *
38
+ * @param arg one entry of an expression's `args`
39
+ */
40
+ export declare const isExpressionArgumentMissing: (arg: unknown) => boolean;
41
+ /**
42
+ * The shape the builder stores an argument in: `{type, value}`.
43
+ *
44
+ * A parse result carries its arguments RAW — `args: [null]`, `args: [3]` —
45
+ * because that is what the grammar produced. The builder's editors read
46
+ * `arg.value`, so a raw argument has to be widened before it is stored, and
47
+ * widening `null` is the whole point: dropped instead, the author's null
48
+ * becomes an argument with no `value` key at all, which every later reader
49
+ * treats as an empty field.
50
+ *
51
+ * An argument that is already an envelope is returned untouched.
52
+ *
53
+ * @param arg one entry of an expression's `args`
54
+ * @param uiType the type the catalogue declares for that position
55
+ */
56
+ export declare const asExpressionArgumentEnvelope: (arg: unknown, uiType?: string) => unknown;
57
+ /**
58
+ * Does this value still look like an expression AST?
59
+ *
60
+ * `{exp, args}` is the shape the builder and `dpql/parse` both produce. The
61
+ * check is structural on purpose: the flag that marks an option as holding an
62
+ * expression describes its VALUE, so the value is what should decide whether
63
+ * the flag survives a change that said nothing about it.
64
+ */
65
+ export declare const looksLikeExpressionAst: (value: unknown) => boolean;
66
+ /**
67
+ * Whether an option should still be marked as holding an expression.
68
+ *
69
+ * The form engine used to delete the flag on ANY change that did not re-assert
70
+ * it, and most changes do not: an editor re-mounting, a revert, a validation
71
+ * pass. The value stayed the AST while the flag went, so the option degraded
72
+ * into a plain hash — which is how an assertion's Expected Value came back
73
+ * from a saved draft as a two-field object showing `exp` and `args`, and why
74
+ * `encodeTestValue` then stored it with `source: "literal"`.
75
+ *
76
+ * @param isFunction what the caller said: `true` sets the flag, `false` clears
77
+ * it deliberately (choosing a concrete type does this), `undefined` is no
78
+ * opinion at all
79
+ * @param value the option's new value
80
+ * @param wasExpression whether the option was marked before this change
81
+ */
82
+ export declare const shouldMarkAsExpression: (isFunction: boolean | undefined, value: unknown, wasExpression: boolean | undefined) => boolean;
83
+ /**
84
+ * Fill in an expression's missing arguments, leaving the supplied ones alone.
85
+ *
86
+ * Extracted from the builder so the decision it makes can be tested directly:
87
+ * a component test of the same behaviour passed just as happily with the defect
88
+ * in place, because the builder normalises on an interaction the harness never
89
+ * performed. A test that cannot fail is worse than none.
90
+ *
91
+ * @param expressions the served expression catalogue
92
+ * @param expression the chosen expression's `name`
93
+ * @param args the arguments so far — raw from a parse, or envelopes from the
94
+ * builder's own editors
95
+ */
96
+ export declare const addMissingExpressionArgs: (expressions: any[] | undefined, expression: string, args?: any[]) => any[];
97
+ //# sourceMappingURL=argumentPresence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argumentPresence.d.ts","sourceRoot":"","sources":["../../../../src/components/form/expressions/argumentPresence.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,2BAA2B,QAAS,OAAO,KAAG,OAe1D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,4BAA4B,QAAS,OAAO,WAAW,MAAM,KAAG,OAM5E,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,UAAW,OAAO,KAAG,OAIF,CAAC;AAEvD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,eACrB,OAAO,GAAG,SAAS,SACxB,OAAO,iBACC,OAAO,GAAG,SAAS,KACjC,OAYF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,gBACtB,GAAG,EAAE,GAAG,SAAS,cAClB,MAAM,SACZ,GAAG,EAAE,KACV,GAAG,EAqDL,CAAC"}