@cratis/scene.components 3.5.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +56 -5
  2. package/bindings/bindingRegistry.ts +52 -4
  3. package/bindings/for_bindingRegistry/when_registering_query_identities.ts +81 -0
  4. package/bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx +4 -2
  5. package/cratisComponents.ts +2 -0
  6. package/cratisComponentsPackage.ts +2 -1
  7. package/data/SingleResultRuntime.tsx +17 -3
  8. package/data/for_SceneDataTable/when_forwarding_query_arguments.tsx +19 -0
  9. package/dist/cjs/bindings/bindingRegistry.js +52 -4
  10. package/dist/cjs/bindings/bindingRegistry.js.map +1 -1
  11. package/dist/cjs/cratisComponents.js +2 -0
  12. package/dist/cjs/cratisComponents.js.map +1 -1
  13. package/dist/cjs/cratisComponentsPackage.js +2 -1
  14. package/dist/cjs/cratisComponentsPackage.js.map +1 -1
  15. package/dist/cjs/data/SingleResultRuntime.js +16 -1
  16. package/dist/cjs/data/SingleResultRuntime.js.map +1 -1
  17. package/dist/cjs/forms/CommandFormRuntime.js +81 -0
  18. package/dist/cjs/forms/CommandFormRuntime.js.map +1 -0
  19. package/dist/cjs/forms/CommandFormSubmit.js +19 -0
  20. package/dist/cjs/forms/CommandFormSubmit.js.map +1 -0
  21. package/dist/cjs/forms/ExplicitCommandField.js +109 -0
  22. package/dist/cjs/forms/ExplicitCommandField.js.map +1 -0
  23. package/dist/cjs/forms/SceneCommandForm.js +26 -21
  24. package/dist/cjs/forms/SceneCommandForm.js.map +1 -1
  25. package/dist/cjs/forms/SceneQueryInputForm.js +141 -0
  26. package/dist/cjs/forms/SceneQueryInputForm.js.map +1 -0
  27. package/dist/cjs/forms/commandInputs.js +35 -0
  28. package/dist/cjs/forms/commandInputs.js.map +1 -0
  29. package/dist/cjs/forms/queryInputs.js +50 -0
  30. package/dist/cjs/forms/queryInputs.js.map +1 -0
  31. package/dist/cjs/index.js +6 -0
  32. package/dist/cjs/index.js.map +1 -1
  33. package/dist/esm/bindings/bindingRegistry.d.ts +4 -0
  34. package/dist/esm/bindings/bindingRegistry.d.ts.map +1 -1
  35. package/dist/esm/bindings/bindingRegistry.js +49 -5
  36. package/dist/esm/bindings/bindingRegistry.js.map +1 -1
  37. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts +2 -0
  38. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts.map +1 -0
  39. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js +73 -0
  40. package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js.map +1 -0
  41. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js +2 -2
  42. package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js.map +1 -1
  43. package/dist/esm/cratisComponents.d.ts.map +1 -1
  44. package/dist/esm/cratisComponents.js +2 -0
  45. package/dist/esm/cratisComponents.js.map +1 -1
  46. package/dist/esm/cratisComponentsPackage.d.ts.map +1 -1
  47. package/dist/esm/cratisComponentsPackage.js +2 -1
  48. package/dist/esm/cratisComponentsPackage.js.map +1 -1
  49. package/dist/esm/data/SingleResultRuntime.d.ts +2 -1
  50. package/dist/esm/data/SingleResultRuntime.d.ts.map +1 -1
  51. package/dist/esm/data/SingleResultRuntime.js +16 -1
  52. package/dist/esm/data/SingleResultRuntime.js.map +1 -1
  53. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js +17 -0
  54. package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js.map +1 -1
  55. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.d.ts +2 -0
  56. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.d.ts.map +1 -0
  57. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.js +16 -0
  58. package/dist/esm/for_cratisComponentsPackage/when_declaring_command_form_peers.js.map +1 -0
  59. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts +2 -0
  60. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts.map +1 -0
  61. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js +14 -0
  62. package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js.map +1 -0
  63. package/dist/esm/forms/CommandFormRuntime.d.ts +11 -0
  64. package/dist/esm/forms/CommandFormRuntime.d.ts.map +1 -0
  65. package/dist/esm/forms/CommandFormRuntime.js +77 -0
  66. package/dist/esm/forms/CommandFormRuntime.js.map +1 -0
  67. package/dist/esm/forms/CommandFormSubmit.d.ts +6 -0
  68. package/dist/esm/forms/CommandFormSubmit.d.ts.map +1 -0
  69. package/dist/esm/forms/CommandFormSubmit.js +17 -0
  70. package/dist/esm/forms/CommandFormSubmit.js.map +1 -0
  71. package/dist/esm/forms/ExplicitCommandField.d.ts +5 -0
  72. package/dist/esm/forms/ExplicitCommandField.d.ts.map +1 -0
  73. package/dist/esm/forms/ExplicitCommandField.js +107 -0
  74. package/dist/esm/forms/ExplicitCommandField.js.map +1 -0
  75. package/dist/esm/forms/SceneCommandForm.d.ts.map +1 -1
  76. package/dist/esm/forms/SceneCommandForm.js +27 -22
  77. package/dist/esm/forms/SceneCommandForm.js.map +1 -1
  78. package/dist/esm/forms/SceneQueryInputForm.d.ts +3 -0
  79. package/dist/esm/forms/SceneQueryInputForm.d.ts.map +1 -0
  80. package/dist/esm/forms/SceneQueryInputForm.js +139 -0
  81. package/dist/esm/forms/SceneQueryInputForm.js.map +1 -0
  82. package/dist/esm/forms/commandInputs.d.ts +7 -0
  83. package/dist/esm/forms/commandInputs.d.ts.map +1 -0
  84. package/dist/esm/forms/commandInputs.js +33 -0
  85. package/dist/esm/forms/commandInputs.js.map +1 -0
  86. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.d.ts +22 -0
  87. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.d.ts.map +1 -0
  88. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.js +30 -0
  89. package/dist/esm/forms/for_SceneCommandForm/given/RecordNote.js.map +1 -0
  90. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.d.ts +32 -0
  91. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.d.ts.map +1 -0
  92. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.js +32 -0
  93. package/dist/esm/forms/for_SceneCommandForm/given/StartProject.js.map +1 -0
  94. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.d.ts +2 -0
  95. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.d.ts.map +1 -0
  96. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.js +66 -0
  97. package/dist/esm/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.js.map +1 -0
  98. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.d.ts +2 -0
  99. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.d.ts.map +1 -0
  100. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js +26 -0
  101. package/dist/esm/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.js.map +1 -0
  102. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.d.ts +2 -0
  103. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.d.ts.map +1 -0
  104. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.js +44 -0
  105. package/dist/esm/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.js.map +1 -0
  106. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.d.ts +2 -0
  107. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.d.ts.map +1 -0
  108. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.js +49 -0
  109. package/dist/esm/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.js.map +1 -0
  110. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.d.ts +2 -0
  111. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.d.ts.map +1 -0
  112. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.js +176 -0
  113. package/dist/esm/forms/for_SceneCommandForm/when_submitting_explicit_inputs.js.map +1 -0
  114. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.d.ts +2 -0
  115. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.d.ts.map +1 -0
  116. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.js +110 -0
  117. package/dist/esm/forms/for_SceneCommandForm/when_submitting_the_native_form.js.map +1 -0
  118. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts +26 -0
  119. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts.map +1 -0
  120. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js +44 -0
  121. package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js.map +1 -0
  122. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts +2 -0
  123. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts.map +1 -0
  124. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js +175 -0
  125. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js.map +1 -0
  126. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts +2 -0
  127. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts.map +1 -0
  128. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js +413 -0
  129. package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js.map +1 -0
  130. package/dist/esm/forms/index.d.ts +2 -0
  131. package/dist/esm/forms/index.d.ts.map +1 -1
  132. package/dist/esm/forms/index.js +1 -0
  133. package/dist/esm/forms/index.js.map +1 -1
  134. package/dist/esm/forms/queryInputs.d.ts +10 -0
  135. package/dist/esm/forms/queryInputs.d.ts.map +1 -0
  136. package/dist/esm/forms/queryInputs.js +47 -0
  137. package/dist/esm/forms/queryInputs.js.map +1 -0
  138. package/dist/esm/index.js +2 -1
  139. package/dist/esm/index.js.map +1 -1
  140. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  141. package/for_cratisComponentsPackage/when_declaring_command_form_peers.ts +26 -0
  142. package/for_cratisComponentsPackage/when_describing_query_input_form.ts +17 -0
  143. package/forms/CommandFormRuntime.tsx +71 -0
  144. package/forms/CommandFormSubmit.tsx +16 -0
  145. package/forms/ExplicitCommandField.tsx +86 -0
  146. package/forms/SceneCommandForm.tsx +30 -27
  147. package/forms/SceneQueryInputForm.tsx +79 -0
  148. package/forms/commandInputs.ts +29 -0
  149. package/forms/for_SceneCommandForm/given/RecordNote.ts +37 -0
  150. package/forms/for_SceneCommandForm/given/StartProject.ts +41 -0
  151. package/forms/for_SceneCommandForm/when_forwarding_to_the_lazy_runtime.tsx +69 -0
  152. package/forms/for_SceneCommandForm/when_native_custom_field_errors_block_submission.tsx +33 -0
  153. package/forms/for_SceneCommandForm/when_preserving_guid_error_ownership.tsx +50 -0
  154. package/forms/for_SceneCommandForm/when_rendering_submit_in_native_context.tsx +56 -0
  155. package/forms/for_SceneCommandForm/when_submitting_explicit_inputs.tsx +189 -0
  156. package/forms/for_SceneCommandForm/when_submitting_the_native_form.tsx +120 -0
  157. package/forms/for_SceneQueryInputForm/ProjectLookup.ts +54 -0
  158. package/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.tsx +188 -0
  159. package/forms/for_SceneQueryInputForm/when_submitting_native_queries.tsx +423 -0
  160. package/forms/index.ts +2 -0
  161. package/forms/queryInputs.ts +50 -0
  162. package/package.json +17 -13
@@ -0,0 +1,141 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var BindingKind = require('../bindings/BindingKind.js');
6
+ var bindingRegistry = require('../bindings/bindingRegistry.js');
7
+ require('../bindings/resolveElementBinding.js');
8
+ var MissingBinding = require('../bindings/MissingBinding.js');
9
+ var ArcRuntimeBoundary = require('../bindings/ArcRuntimeBoundary.js');
10
+ var properties = require('../properties.js');
11
+ var SingleResultStatus = require('../data/SingleResultStatus.js');
12
+ var queryInputs = require('./queryInputs.js');
13
+
14
+ const SingleResultRuntime = /*#__PURE__*/ react.lazy(()=>Promise.resolve().then(function () { return require('../data/SingleResultRuntime.js'); }));
15
+ /** Opt-in, form-local string drafts around the existing optional-single execution owner. */ function SceneQueryInputForm({ element }) {
16
+ const name = properties.stringProperty(element.properties, 'query');
17
+ const target = react.useSyncExternalStore(bindingRegistry.subscribeQueryBindings, ()=>name ? bindingRegistry.resolveExactQuery(name) : undefined);
18
+ if (target === 'ambiguous') return /*#__PURE__*/ jsxRuntime.jsxs("div", {
19
+ role: "alert",
20
+ children: [
21
+ "Ambiguous query binding '",
22
+ name,
23
+ "' on ",
24
+ element.componentName
25
+ ]
26
+ });
27
+ if (!target) return /*#__PURE__*/ jsxRuntime.jsx(MissingBinding.MissingBinding, {
28
+ element: element,
29
+ kind: BindingKind.BindingKind.Query,
30
+ name: name
31
+ });
32
+ const inputs = queryInputs.queryInputs(element.properties);
33
+ const resultField = properties.stringProperty(element.properties, 'resultField');
34
+ if (!inputs || !resultField) return /*#__PURE__*/ jsxRuntime.jsx("div", {
35
+ role: "alert",
36
+ children: "Invalid query input form configuration"
37
+ });
38
+ if (!element.isEnabled) return /*#__PURE__*/ jsxRuntime.jsx(SingleResultStatus.SingleResultStatus, {
39
+ state: "idle"
40
+ });
41
+ // A different form declaration starts a new session; ordinary host rerenders retain drafts.
42
+ return /*#__PURE__*/ jsxRuntime.jsx(QueryInputForm, {
43
+ query: target,
44
+ inputs: inputs,
45
+ resultField: resultField,
46
+ label: properties.stringProperty(element.properties, 'label') ?? 'Query input',
47
+ submitLabel: properties.stringProperty(element.properties, 'submitLabel') ?? 'Search'
48
+ }, JSON.stringify([
49
+ name,
50
+ inputs,
51
+ resultField
52
+ ]));
53
+ }
54
+ function QueryInputForm({ query, inputs, resultField, label, submitLabel }) {
55
+ const id = react.useId();
56
+ const [drafts, setDrafts] = react.useState(()=>Object.fromEntries(inputs.map((input)=>[
57
+ input.parameter,
58
+ ''
59
+ ])));
60
+ const [errors, setErrors] = react.useState({});
61
+ const [committed, setCommitted] = react.useState();
62
+ return /*#__PURE__*/ jsxRuntime.jsxs("form", {
63
+ "aria-label": label,
64
+ noValidate: true,
65
+ onSubmit: (event)=>{
66
+ event.preventDefault();
67
+ const validation = Object.fromEntries(inputs.map((input)=>[
68
+ input.parameter,
69
+ queryInputs.queryInputError(input, drafts[input.parameter])
70
+ ]));
71
+ setErrors(validation);
72
+ if (Object.values(validation).some(Boolean)) {
73
+ setCommitted(undefined);
74
+ return;
75
+ }
76
+ // New identity even for unchanged values: repeat submit is an explicit retry. No trimming,
77
+ // coercion, generated identifier, property-path evaluation or query while typing.
78
+ setCommitted(Object.freeze(Object.fromEntries(inputs.map((input)=>[
79
+ input.parameter,
80
+ drafts[input.parameter]
81
+ ]))));
82
+ },
83
+ children: [
84
+ inputs.map((input, index)=>{
85
+ const controlId = `${id}-${index}`;
86
+ const error = Object.hasOwn(errors, input.parameter) ? errors[input.parameter] : undefined;
87
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
88
+ children: [
89
+ /*#__PURE__*/ jsxRuntime.jsx("label", {
90
+ htmlFor: controlId,
91
+ children: input.label
92
+ }),
93
+ /*#__PURE__*/ jsxRuntime.jsx("input", {
94
+ id: controlId,
95
+ name: input.parameter,
96
+ type: "text",
97
+ required: input.required,
98
+ value: drafts[input.parameter],
99
+ "aria-invalid": !!error,
100
+ "aria-describedby": error ? `${controlId}-error` : undefined,
101
+ onChange: (event)=>{
102
+ setDrafts({
103
+ ...drafts,
104
+ [input.parameter]: event.currentTarget.value
105
+ });
106
+ setErrors({
107
+ ...errors,
108
+ [input.parameter]: undefined
109
+ });
110
+ // Unmount synchronously on edit: runtime cleanup aborts and masks late replies.
111
+ setCommitted(undefined);
112
+ }
113
+ }),
114
+ error && /*#__PURE__*/ jsxRuntime.jsx("div", {
115
+ id: `${controlId}-error`,
116
+ role: "alert",
117
+ children: error
118
+ })
119
+ ]
120
+ }, input.parameter);
121
+ }),
122
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
123
+ type: "submit",
124
+ children: submitLabel
125
+ }),
126
+ committed ? /*#__PURE__*/ jsxRuntime.jsx(ArcRuntimeBoundary.ArcRuntimeBoundary, {
127
+ children: /*#__PURE__*/ jsxRuntime.jsx(SingleResultRuntime, {
128
+ query: query,
129
+ queryArguments: committed,
130
+ resultField: resultField,
131
+ stringInputs: true
132
+ })
133
+ }) : /*#__PURE__*/ jsxRuntime.jsx(SingleResultStatus.SingleResultStatus, {
134
+ state: "idle"
135
+ })
136
+ ]
137
+ });
138
+ }
139
+
140
+ exports.SceneQueryInputForm = SceneQueryInputForm;
141
+ //# sourceMappingURL=SceneQueryInputForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneQueryInputForm.js","sources":["../../../forms/SceneQueryInputForm.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { lazy, useId, useState, useSyncExternalStore } from 'react';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { ArcRuntimeBoundary, BindingKind, BoundConstructor, MissingBinding, resolveExactQuery, subscribeQueryBindings } from '../bindings';\nimport { stringProperty } from '../properties';\nimport { SingleResultStatus } from '../data/SingleResultStatus';\nimport { QueryInput, queryInputError, queryInputs } from './queryInputs';\n\nconst SingleResultRuntime = lazy(() => import('../data/SingleResultRuntime'));\n\n/** Opt-in, form-local string drafts around the existing optional-single execution owner. */\nexport function SceneQueryInputForm({ element }: RegisteredComponentProps) {\n const name = stringProperty(element.properties, 'query');\n const target = useSyncExternalStore(subscribeQueryBindings, () => name ? resolveExactQuery(name) : undefined);\n if (target === 'ambiguous') return <div role='alert'>Ambiguous query binding '{name}' on {element.componentName}</div>;\n if (!target) return <MissingBinding element={element} kind={BindingKind.Query} name={name} />;\n\n const inputs = queryInputs(element.properties);\n const resultField = stringProperty(element.properties, 'resultField');\n if (!inputs || !resultField) return <div role='alert'>Invalid query input form configuration</div>;\n if (!element.isEnabled) return <SingleResultStatus state='idle' />;\n\n // A different form declaration starts a new session; ordinary host rerenders retain drafts.\n return <QueryInputForm key={JSON.stringify([name, inputs, resultField])}\n query={target} inputs={inputs} resultField={resultField}\n label={stringProperty(element.properties, 'label') ?? 'Query input'}\n submitLabel={stringProperty(element.properties, 'submitLabel') ?? 'Search'} />;\n}\n\ninterface Props {\n query: BoundConstructor;\n inputs: QueryInput[];\n resultField: string;\n label: string;\n submitLabel: string;\n}\n\nfunction QueryInputForm({ query, inputs, resultField, label, submitLabel }: Props) {\n const id = useId();\n const [drafts, setDrafts] = useState<Record<string, string>>(() => Object.fromEntries(inputs.map(input => [input.parameter, ''])));\n const [errors, setErrors] = useState<Record<string, string | undefined>>({});\n const [committed, setCommitted] = useState<Record<string, string>>();\n\n return <form aria-label={label} noValidate onSubmit={event => {\n event.preventDefault();\n const validation = Object.fromEntries(inputs.map(input => [input.parameter, queryInputError(input, drafts[input.parameter])]));\n setErrors(validation);\n if (Object.values(validation).some(Boolean)) {\n setCommitted(undefined);\n return;\n }\n // New identity even for unchanged values: repeat submit is an explicit retry. No trimming,\n // coercion, generated identifier, property-path evaluation or query while typing.\n setCommitted(Object.freeze(Object.fromEntries(inputs.map(input => [input.parameter, drafts[input.parameter]]))));\n }}>\n {inputs.map((input, index) => {\n const controlId = `${id}-${index}`;\n const error = Object.hasOwn(errors, input.parameter) ? errors[input.parameter] : undefined;\n return <div key={input.parameter}>\n <label htmlFor={controlId}>{input.label}</label>\n <input id={controlId} name={input.parameter} type='text' required={input.required}\n value={drafts[input.parameter]} aria-invalid={!!error} aria-describedby={error ? `${controlId}-error` : undefined}\n onChange={event => {\n setDrafts({ ...drafts, [input.parameter]: event.currentTarget.value });\n setErrors({ ...errors, [input.parameter]: undefined });\n // Unmount synchronously on edit: runtime cleanup aborts and masks late replies.\n setCommitted(undefined);\n }} />\n {error && <div id={`${controlId}-error`} role='alert'>{error}</div>}\n </div>;\n })}\n <button type='submit'>{submitLabel}</button>\n {committed ? <ArcRuntimeBoundary>\n <SingleResultRuntime query={query} queryArguments={committed} resultField={resultField} stringInputs />\n </ArcRuntimeBoundary> : <SingleResultStatus state='idle' />}\n </form>;\n}\n"],"names":["SingleResultRuntime","lazy","SceneQueryInputForm","element","name","stringProperty","properties","target","useSyncExternalStore","subscribeQueryBindings","resolveExactQuery","undefined","_jsxs","div","role","componentName","_jsx","MissingBinding","kind","BindingKind","Query","inputs","queryInputs","resultField","isEnabled","SingleResultStatus","state","QueryInputForm","query","label","submitLabel","JSON","stringify","id","useId","drafts","setDrafts","useState","Object","fromEntries","map","input","parameter","errors","setErrors","committed","setCommitted","form","aria-label","noValidate","onSubmit","event","preventDefault","validation","queryInputError","values","some","Boolean","freeze","index","controlId","error","hasOwn","htmlFor","type","required","value","aria-invalid","aria-describedby","onChange","currentTarget","button","ArcRuntimeBoundary","queryArguments","stringInputs"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ var properties = require('../properties.js');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /** An absent declaration selects legacy auto mode; a present but invalid declaration never does. */ function commandInputs(properties$1) {
8
+ const values = properties.arrayProperty(properties$1, 'inputs');
9
+ if (!values?.length) return undefined;
10
+ const inputs = [];
11
+ const seen = new Set();
12
+ for (const value of values){
13
+ const input = properties.objectProperty({
14
+ value
15
+ }, 'value');
16
+ if (!input || Object.keys(input).some((key)=>![
17
+ 'property',
18
+ 'type',
19
+ 'label'
20
+ ].includes(key))) return undefined;
21
+ const property = properties.stringProperty(input, 'property');
22
+ const label = properties.stringProperty(input, 'label');
23
+ if (!property?.trim() || !label?.trim() || input.type !== 'string' && input.type !== 'guid' || seen.has(property)) return undefined;
24
+ seen.add(property);
25
+ inputs.push({
26
+ property,
27
+ type: input.type,
28
+ label
29
+ });
30
+ }
31
+ return inputs;
32
+ }
33
+
34
+ exports.commandInputs = commandInputs;
35
+ //# sourceMappingURL=commandInputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandInputs.js","sources":["../../../forms/commandInputs.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { arrayProperty, objectProperty, stringProperty } from '../properties';\n\n/** Exact, case-sensitive names from a generated command's propertyDescriptors. */\nexport interface CommandInput {\n property: string;\n type: 'string' | 'guid';\n label: string;\n}\n\n/** An absent declaration selects legacy auto mode; a present but invalid declaration never does. */\nexport function commandInputs(properties: Record<string, unknown>): CommandInput[] | undefined {\n const values = arrayProperty(properties, 'inputs');\n if (!values?.length) return undefined;\n const inputs: CommandInput[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const input = objectProperty({ value }, 'value');\n if (!input || Object.keys(input).some(key => !['property', 'type', 'label'].includes(key))) return undefined;\n const property = stringProperty(input, 'property');\n const label = stringProperty(input, 'label');\n if (!property?.trim() || !label?.trim() || (input.type !== 'string' && input.type !== 'guid') || seen.has(property)) return undefined;\n seen.add(property);\n inputs.push({ property, type: input.type, label });\n }\n return inputs;\n}\n"],"names":["commandInputs","properties","values","arrayProperty","length","undefined","inputs","seen","Set","value","input","objectProperty","Object","keys","some","key","includes","property","stringProperty","label","trim","type","has","add","push"],"mappings":";;;;AAAA;AACA;AAWA,qGACO,SAASA,aAAAA,CAAcC,YAAmC,EAAA;IAC7D,MAAMC,MAAAA,GAASC,yBAAcF,YAAAA,EAAY,QAAA,CAAA;IACzC,IAAI,CAACC,MAAAA,EAAQE,MAAAA,EAAQ,OAAOC,SAAAA;AAC5B,IAAA,MAAMC,SAAyB,EAAE;AACjC,IAAA,MAAMC,OAAO,IAAIC,GAAAA,EAAAA;IACjB,KAAK,MAAMC,SAASP,MAAAA,CAAQ;AACxB,QAAA,MAAMQ,QAAQC,yBAAAA,CAAe;AAAEF,YAAAA;SAAM,EAAG,OAAA,CAAA;QACxC,IAAI,CAACC,KAAAA,IAASE,MAAAA,CAAOC,IAAI,CAACH,OAAOI,IAAI,CAACC,CAAAA,GAAAA,GAAO,CAAC;AAAC,gBAAA,UAAA;AAAY,gBAAA,MAAA;AAAQ,gBAAA;aAAQ,CAACC,QAAQ,CAACD,GAAAA,CAAAA,CAAAA,EAAO,OAAOV,SAAAA;QACnG,MAAMY,QAAAA,GAAWC,0BAAeR,KAAAA,EAAO,UAAA,CAAA;QACvC,MAAMS,KAAAA,GAAQD,0BAAeR,KAAAA,EAAO,OAAA,CAAA;AACpC,QAAA,IAAI,CAACO,QAAAA,EAAUG,IAAAA,EAAAA,IAAU,CAACD,KAAAA,EAAOC,IAAAA,EAAAA,IAAWV,MAAMW,IAAI,KAAK,QAAA,IAAYX,KAAAA,CAAMW,IAAI,KAAK,MAAA,IAAWd,KAAKe,GAAG,CAACL,WAAW,OAAOZ,SAAAA;AAC5HE,QAAAA,IAAAA,CAAKgB,GAAG,CAACN,QAAAA,CAAAA;AACTX,QAAAA,MAAAA,CAAOkB,IAAI,CAAC;AAAEP,YAAAA,QAAAA;AAAUI,YAAAA,IAAAA,EAAMX,MAAMW,IAAI;AAAEF,YAAAA;AAAM,SAAA,CAAA;AACpD,IAAA;IACA,OAAOb,MAAAA;AACX;;"}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var properties = require('../properties.js');
4
+
5
+ // Copyright (c) Cratis. All rights reserved.
6
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
7
+ /** Reject the entire declaration rather than silently dropping malformed inputs. */ function queryInputs(properties$1) {
8
+ const values = properties.arrayProperty(properties$1, 'inputs');
9
+ if (!values?.length) return undefined;
10
+ const inputs = [];
11
+ const parameters = new Set();
12
+ for (const value of values){
13
+ const input = properties.objectProperty({
14
+ value
15
+ }, 'value');
16
+ if (!input) return undefined;
17
+ const parameter = properties.stringProperty(input, 'parameter');
18
+ const label = properties.stringProperty(input, 'label');
19
+ const required = properties.booleanProperty(input, 'required');
20
+ const pattern = properties.stringProperty(input, 'pattern');
21
+ if (!parameter || !label || input.type !== 'string' || parameters.has(parameter) || input.required !== undefined && required === undefined || input.pattern !== undefined && pattern === undefined) return undefined;
22
+ if (pattern !== undefined) {
23
+ try {
24
+ new RegExp(`^(?:${pattern})$`, 'u');
25
+ } catch {
26
+ return undefined;
27
+ }
28
+ }
29
+ parameters.add(parameter);
30
+ inputs.push({
31
+ parameter,
32
+ type: 'string',
33
+ label,
34
+ required: required ?? true,
35
+ pattern
36
+ });
37
+ }
38
+ return inputs;
39
+ }
40
+ /** Validation never transforms the submitted string; proxy validators remain authoritative. */ function queryInputError(input, value) {
41
+ if (input.required && !/\S/u.test(value)) return `${input.label} is required`;
42
+ if (input.pattern !== undefined && !new RegExp(`^(?:${input.pattern})$`, 'u').test(value)) {
43
+ return `${input.label} has an invalid format`;
44
+ }
45
+ return undefined;
46
+ }
47
+
48
+ exports.queryInputError = queryInputError;
49
+ exports.queryInputs = queryInputs;
50
+ //# sourceMappingURL=queryInputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryInputs.js","sources":["../../../forms/queryInputs.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { arrayProperty, booleanProperty, objectProperty, stringProperty } from '../properties';\n\n/** Package-local web input declaration, not a Scene.Model form or binding expression. */\nexport interface QueryInput {\n /** Exact generated query argument name. */\n parameter: string;\n type: 'string';\n label: string;\n /** Defaults to true. Required strings must contain a non-whitespace character. */\n required?: boolean;\n /** Optional whole-value JavaScript Unicode regular expression (without delimiters). */\n pattern?: string;\n}\n\n/** Reject the entire declaration rather than silently dropping malformed inputs. */\nexport function queryInputs(properties: Record<string, unknown>): QueryInput[] | undefined {\n const values = arrayProperty(properties, 'inputs');\n if (!values?.length) return undefined;\n const inputs: QueryInput[] = [];\n const parameters = new Set<string>();\n for (const value of values) {\n const input = objectProperty({ value }, 'value');\n if (!input) return undefined;\n const parameter = stringProperty(input, 'parameter');\n const label = stringProperty(input, 'label');\n const required = booleanProperty(input, 'required');\n const pattern = stringProperty(input, 'pattern');\n if (!parameter || !label || input.type !== 'string' || parameters.has(parameter)\n || (input.required !== undefined && required === undefined)\n || (input.pattern !== undefined && pattern === undefined)) return undefined;\n if (pattern !== undefined) {\n try { new RegExp(`^(?:${pattern})$`, 'u'); } catch { return undefined; }\n }\n parameters.add(parameter);\n inputs.push({ parameter, type: 'string', label, required: required ?? true, pattern });\n }\n return inputs;\n}\n\n/** Validation never transforms the submitted string; proxy validators remain authoritative. */\nexport function queryInputError(input: QueryInput, value: string): string | undefined {\n if (input.required && !/\\S/u.test(value)) return `${input.label} is required`;\n if (input.pattern !== undefined && !new RegExp(`^(?:${input.pattern})$`, 'u').test(value)) {\n return `${input.label} has an invalid format`;\n }\n return undefined;\n}\n"],"names":["queryInputs","properties","values","arrayProperty","length","undefined","inputs","parameters","Set","value","input","objectProperty","parameter","stringProperty","label","required","booleanProperty","pattern","type","has","RegExp","add","push","queryInputError","test"],"mappings":";;;;AAAA;AACA;AAgBA,qFACO,SAASA,WAAAA,CAAYC,YAAmC,EAAA;IAC3D,MAAMC,MAAAA,GAASC,yBAAcF,YAAAA,EAAY,QAAA,CAAA;IACzC,IAAI,CAACC,MAAAA,EAAQE,MAAAA,EAAQ,OAAOC,SAAAA;AAC5B,IAAA,MAAMC,SAAuB,EAAE;AAC/B,IAAA,MAAMC,aAAa,IAAIC,GAAAA,EAAAA;IACvB,KAAK,MAAMC,SAASP,MAAAA,CAAQ;AACxB,QAAA,MAAMQ,QAAQC,yBAAAA,CAAe;AAAEF,YAAAA;SAAM,EAAG,OAAA,CAAA;QACxC,IAAI,CAACC,OAAO,OAAOL,SAAAA;QACnB,MAAMO,SAAAA,GAAYC,0BAAeH,KAAAA,EAAO,WAAA,CAAA;QACxC,MAAMI,KAAAA,GAAQD,0BAAeH,KAAAA,EAAO,OAAA,CAAA;QACpC,MAAMK,QAAAA,GAAWC,2BAAgBN,KAAAA,EAAO,UAAA,CAAA;QACxC,MAAMO,OAAAA,GAAUJ,0BAAeH,KAAAA,EAAO,SAAA,CAAA;QACtC,IAAI,CAACE,SAAAA,IAAa,CAACE,KAAAA,IAASJ,KAAAA,CAAMQ,IAAI,KAAK,QAAA,IAAYX,UAAAA,CAAWY,GAAG,CAACP,SAAAA,CAAAA,IAC9DF,MAAMK,QAAQ,KAAKV,SAAAA,IAAaU,QAAAA,KAAaV,SAAAA,IAC7CK,KAAAA,CAAMO,OAAO,KAAKZ,SAAAA,IAAaY,OAAAA,KAAYZ,SAAAA,EAAY,OAAOA,SAAAA;AACtE,QAAA,IAAIY,YAAYZ,SAAAA,EAAW;YACvB,IAAI;AAAE,gBAAA,IAAIe,OAAO,CAAC,IAAI,EAAEH,OAAAA,CAAQ,EAAE,CAAC,EAAE,GAAA,CAAA;AAAM,YAAA,CAAA,CAAE,OAAM;gBAAE,OAAOZ,SAAAA;AAAW,YAAA;AAC3E,QAAA;AACAE,QAAAA,UAAAA,CAAWc,GAAG,CAACT,SAAAA,CAAAA;AACfN,QAAAA,MAAAA,CAAOgB,IAAI,CAAC;AAAEV,YAAAA,SAAAA;YAAWM,IAAAA,EAAM,QAAA;AAAUJ,YAAAA,KAAAA;AAAOC,YAAAA,QAAAA,EAAUA,QAAAA,IAAY,IAAA;AAAME,YAAAA;AAAQ,SAAA,CAAA;AACxF,IAAA;IACA,OAAOX,MAAAA;AACX;AAEA,gGACO,SAASiB,eAAAA,CAAgBb,KAAiB,EAAED,KAAa,EAAA;AAC5D,IAAA,IAAIC,KAAAA,CAAMK,QAAQ,IAAI,CAAC,MAAMS,IAAI,CAACf,KAAAA,CAAAA,EAAQ,OAAO,CAAA,EAAGC,KAAAA,CAAMI,KAAK,CAAC,YAAY,CAAC;AAC7E,IAAA,IAAIJ,MAAMO,OAAO,KAAKZ,aAAa,CAAC,IAAIe,OAAO,CAAC,IAAI,EAAEV,KAAAA,CAAMO,OAAO,CAAC,EAAE,CAAC,EAAE,GAAA,CAAA,CAAKO,IAAI,CAACf,KAAAA,CAAAA,EAAQ;AACvF,QAAA,OAAO,CAAA,EAAGC,KAAAA,CAAMI,KAAK,CAAC,sBAAsB,CAAC;AACjD,IAAA;IACA,OAAOT,SAAAA;AACX;;;"}
package/dist/cjs/index.js CHANGED
@@ -14,6 +14,7 @@ var SceneSingleResult = require('./data/SceneSingleResult.js');
14
14
  var SceneDataTable = require('./data/SceneDataTable.js');
15
15
  var SceneObservableDataTable = require('./data/SceneObservableDataTable.js');
16
16
  var SceneCommandForm = require('./forms/SceneCommandForm.js');
17
+ var SceneQueryInputForm = require('./forms/SceneQueryInputForm.js');
17
18
  var resolveFieldBinding = require('./forms/fields/resolveFieldBinding.js');
18
19
  var CommandFormField = require('./forms/fields/CommandFormField.js');
19
20
  var SceneInputTextField = require('./forms/fields/SceneInputTextField.js');
@@ -68,10 +69,14 @@ exports.registerCommand = bindingRegistry.registerCommand;
68
69
  exports.registerCommands = bindingRegistry.registerCommands;
69
70
  exports.registerQueries = bindingRegistry.registerQueries;
70
71
  exports.registerQuery = bindingRegistry.registerQuery;
72
+ exports.registerQueryIdentity = bindingRegistry.registerQueryIdentity;
71
73
  exports.registeredCommandNames = bindingRegistry.registeredCommandNames;
72
74
  exports.registeredQueryNames = bindingRegistry.registeredQueryNames;
73
75
  exports.resolveCommand = bindingRegistry.resolveCommand;
76
+ exports.resolveExactQuery = bindingRegistry.resolveExactQuery;
74
77
  exports.resolveQuery = bindingRegistry.resolveQuery;
78
+ exports.subscribeQueryBindings = bindingRegistry.subscribeQueryBindings;
79
+ exports.unregisterQueryIdentity = bindingRegistry.unregisterQueryIdentity;
75
80
  exports.resolveElementBinding = resolveElementBinding.resolveElementBinding;
76
81
  exports.Placeholder = Placeholder.Placeholder;
77
82
  exports.MissingBinding = MissingBinding.MissingBinding;
@@ -83,6 +88,7 @@ exports.SceneSingleResult = SceneSingleResult.SceneSingleResult;
83
88
  exports.SceneDataTable = SceneDataTable.SceneDataTable;
84
89
  exports.SceneObservableDataTable = SceneObservableDataTable.SceneObservableDataTable;
85
90
  exports.SceneCommandForm = SceneCommandForm.SceneCommandForm;
91
+ exports.SceneQueryInputForm = SceneQueryInputForm.SceneQueryInputForm;
86
92
  exports.resolveFieldBinding = resolveFieldBinding.resolveFieldBinding;
87
93
  exports.CommandFormField = CommandFormField.CommandFormField;
88
94
  exports.SceneInputTextField = SceneInputTextField.SceneInputTextField;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,8 @@
1
1
  import { BoundConstructor } from './BoundConstructor';
2
+ export declare function subscribeQueryBindings(listener: () => void): () => void;
3
+ export declare function registerQueryIdentity(name: string, identity: string, queryClass: BoundConstructor): void;
4
+ export declare function unregisterQueryIdentity(name: string, identity: string): void;
5
+ export declare function resolveExactQuery(name: string): BoundConstructor | 'ambiguous' | undefined;
2
6
  export declare function registerQuery(name: string, queryClass: BoundConstructor): void;
3
7
  export declare function registerQueries(bindings: Record<string, BoundConstructor>): void;
4
8
  export declare function resolveQuery(name: string): BoundConstructor | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"bindingRegistry.d.ts","sourceRoot":"","sources":["../../../bindings/bindingRegistry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAqBtD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAE9E;AASD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAIhF;AASD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEvE;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAElF;AAKD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAIjF;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEzE;AASD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAKD,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AASD,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
1
+ {"version":3,"file":"bindingRegistry.d.ts","sourceRoot":"","sources":["../../../bindings/bindingRegistry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAatD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGvE;AAOD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAKxG;AAGD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAK5E;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,WAAW,GAAG,SAAS,CAK1F;AAkBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAG9E;AASD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAIhF;AAUD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAKvE;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAElF;AAKD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAIjF;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEzE;AASD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAKD,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD;AASD,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
@@ -2,6 +2,40 @@
2
2
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
  const queries = new Map();
4
4
  const commands = new Map();
5
+ // Opt-in identities are separate from the legacy last-registration-wins namespace.
6
+ const queryIdentities = new Map();
7
+ const queryBindingListeners = new Set();
8
+ function notifyQueryBindings() {
9
+ for (const listener of queryBindingListeners)listener();
10
+ }
11
+ /** Subscribe to exact-binding changes. Existing adapters retain their render-time lookup contract. */ function subscribeQueryBindings(listener) {
12
+ queryBindingListeners.add(listener);
13
+ return ()=>{
14
+ queryBindingListeners.delete(listener);
15
+ };
16
+ }
17
+ /**
18
+ * Registers one source identity for an exact query name. The same identity replaces on hot reload;
19
+ * different identities remain distinct candidates, even when their constructors happen to match.
20
+ * Legacy resolution also accepts a unique identity when no legacy registration exists.
21
+ */ function registerQueryIdentity(name, identity, queryClass) {
22
+ const candidates = queryIdentities.get(name) ?? new Map();
23
+ candidates.set(identity, queryClass);
24
+ queryIdentities.set(name, candidates);
25
+ notifyQueryBindings();
26
+ }
27
+ /** Removes a source identity when a generated module is removed or renamed. */ function unregisterQueryIdentity(name, identity) {
28
+ const candidates = queryIdentities.get(name);
29
+ candidates?.delete(identity);
30
+ if (candidates?.size === 0) queryIdentities.delete(name);
31
+ notifyQueryBindings();
32
+ }
33
+ /** Exact binding: a legacy registration counts as one candidate alongside opt-in identities. */ function resolveExactQuery(name) {
34
+ const legacy = queries.get(name);
35
+ const candidates = queryIdentities.get(name);
36
+ if ((legacy ? 1 : 0) + (candidates?.size ?? 0) > 1) return 'ambiguous';
37
+ return legacy ?? candidates?.values().next().value;
38
+ }
5
39
  /**
6
40
  * Registers an Arc query proxy under the name screens refer to it by.
7
41
  *
@@ -19,6 +53,7 @@ const commands = new Map();
19
53
  * the previous run.
20
54
  */ function registerQuery(name, queryClass) {
21
55
  queries.set(name, queryClass);
56
+ notifyQueryBindings();
22
57
  }
23
58
  /**
24
59
  * Registers several query proxies at once, keyed by the name screens refer to each by.
@@ -32,13 +67,17 @@ const commands = new Map();
32
67
  }
33
68
  }
34
69
  /**
35
- * The query proxy registered under a name, or `undefined` when nothing is registered under it.
70
+ * Legacy registrations are authoritative. Otherwise resolve a unique source identity, or `undefined`
71
+ * when absent or ambiguous (existing adapters display their unresolved-binding placeholder).
36
72
  *
37
73
  * `undefined` rather than a throw: design-time preview in Studio normally has nothing registered at all,
38
74
  * and a screen still has to render so its layout can be worked on. Every adapter turns `undefined` into
39
75
  * a visible placeholder naming the binding it wanted.
40
76
  */ function resolveQuery(name) {
41
- return queries.get(name);
77
+ const legacy = queries.get(name);
78
+ if (legacy) return legacy;
79
+ const candidates = queryIdentities.get(name);
80
+ return candidates?.size === 1 ? candidates.values().next().value : undefined;
42
81
  }
43
82
  /**
44
83
  * Registers an Arc command proxy under the name screens refer to it by. The command half of
@@ -59,14 +98,17 @@ const commands = new Map();
59
98
  return commands.get(name);
60
99
  }
61
100
  /**
62
- * Every registered query name, sorted.
101
+ * The sorted union of legacy and identity query names, including ambiguous names.
63
102
  *
64
103
  * A design-time tool uses this to offer the names a screen can actually bind to, and a diagnostics
65
104
  * surface uses it to explain a placeholder - "this screen wants `AllInvoices`, and here is what is
66
105
  * registered" is a far more useful message than the placeholder alone.
67
106
  */ function registeredQueryNames() {
68
107
  return [
69
- ...queries.keys()
108
+ ...new Set([
109
+ ...queries.keys(),
110
+ ...queryIdentities.keys()
111
+ ])
70
112
  ].sort();
71
113
  }
72
114
  /**
@@ -85,7 +127,9 @@ const commands = new Map();
85
127
  */ function clearBindings() {
86
128
  queries.clear();
87
129
  commands.clear();
130
+ queryIdentities.clear();
131
+ notifyQueryBindings();
88
132
  }
89
133
 
90
- export { clearBindings, registerCommand, registerCommands, registerQueries, registerQuery, registeredCommandNames, registeredQueryNames, resolveCommand, resolveQuery };
134
+ export { clearBindings, registerCommand, registerCommands, registerQueries, registerQuery, registerQueryIdentity, registeredCommandNames, registeredQueryNames, resolveCommand, resolveExactQuery, resolveQuery, subscribeQueryBindings, unregisterQueryIdentity };
91
135
  //# sourceMappingURL=bindingRegistry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bindingRegistry.js","sources":["../../../bindings/bindingRegistry.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { BoundConstructor } from './BoundConstructor';\n\nconst queries = new Map<string, BoundConstructor>();\nconst commands = new Map<string, BoundConstructor>();\n\n/**\n * Registers an Arc query proxy under the name screens refer to it by.\n *\n * This is the seam that makes the Arc-bound half of `@cratis/components` usable from Scene at all. A\n * screen says `data Invoices via query AllInvoices`, and by the time that reaches a renderer it is an\n * `ExternalComponent` whose `properties` bag holds the *string* `'AllInvoices'` - a property bag carries\n * plain values and named slots, and there is no way to put a TypeScript class into one. `DataTableForQuery`\n * needs the class. The name is the only thing that survives the trip, so the name is what the lookup has\n * to be keyed on, and a host that owns the generated proxies is the only party that can supply the class\n * behind it.\n *\n * A host - Stage's generated application, or Studio's preview when it is wired to a real backend -\n * registers every proxy a screen can name, once, during startup. Registering the same name twice\n * replaces the earlier registration, so a host can re-register on hot reload without having to unwind\n * the previous run.\n */\nexport function registerQuery(name: string, queryClass: BoundConstructor): void {\n queries.set(name, queryClass);\n}\n\n/**\n * Registers several query proxies at once, keyed by the name screens refer to each by.\n *\n * Stage generates a module that exports every proxy it produced; handing that module's exports straight\n * to this is the whole of a generated host's registration step, and it stays correct as proxies are\n * added and removed without anyone editing a list.\n */\nexport function registerQueries(bindings: Record<string, BoundConstructor>): void {\n for (const [name, queryClass] of Object.entries(bindings)) {\n registerQuery(name, queryClass);\n }\n}\n\n/**\n * The query proxy registered under a name, or `undefined` when nothing is registered under it.\n *\n * `undefined` rather than a throw: design-time preview in Studio normally has nothing registered at all,\n * and a screen still has to render so its layout can be worked on. Every adapter turns `undefined` into\n * a visible placeholder naming the binding it wanted.\n */\nexport function resolveQuery(name: string): BoundConstructor | undefined {\n return queries.get(name);\n}\n\n/**\n * Registers an Arc command proxy under the name screens refer to it by. The command half of\n * {@link registerQuery}, with the same contract.\n */\nexport function registerCommand(name: string, commandClass: BoundConstructor): void {\n commands.set(name, commandClass);\n}\n\n/**\n * Registers several command proxies at once, keyed by the name screens refer to each by.\n */\nexport function registerCommands(bindings: Record<string, BoundConstructor>): void {\n for (const [name, commandClass] of Object.entries(bindings)) {\n registerCommand(name, commandClass);\n }\n}\n\n/**\n * The command proxy registered under a name, or `undefined` when nothing is registered under it.\n */\nexport function resolveCommand(name: string): BoundConstructor | undefined {\n return commands.get(name);\n}\n\n/**\n * Every registered query name, sorted.\n *\n * A design-time tool uses this to offer the names a screen can actually bind to, and a diagnostics\n * surface uses it to explain a placeholder - \"this screen wants `AllInvoices`, and here is what is\n * registered\" is a far more useful message than the placeholder alone.\n */\nexport function registeredQueryNames(): string[] {\n return [...queries.keys()].sort();\n}\n\n/**\n * Every registered command name, sorted.\n */\nexport function registeredCommandNames(): string[] {\n return [...commands.keys()].sort();\n}\n\n/**\n * Forgets every registered query and command.\n *\n * The registry is module-level state, which is right for a host that registers once at startup but wrong\n * for anything that switches between applications - Studio previewing a different project, or a spec\n * that must not inherit what the previous one registered. Both need a way back to empty.\n */\nexport function clearBindings(): void {\n queries.clear();\n commands.clear();\n}\n"],"names":["queries","Map","commands","registerQuery","name","queryClass","set","registerQueries","bindings","Object","entries","resolveQuery","get","registerCommand","commandClass","registerCommands","resolveCommand","registeredQueryNames","keys","sort","registeredCommandNames","clearBindings","clear"],"mappings":"AAAA;AACA;AAIA,MAAMA,UAAU,IAAIC,GAAAA,EAAAA;AACpB,MAAMC,WAAW,IAAID,GAAAA,EAAAA;AAErB;;;;;;;;;;;;;;;AAeC,IACM,SAASE,aAAAA,CAAcC,IAAY,EAAEC,UAA4B,EAAA;IACpEL,OAAAA,CAAQM,GAAG,CAACF,IAAAA,EAAMC,UAAAA,CAAAA;AACtB;AAEA;;;;;;IAOO,SAASE,eAAAA,CAAgBC,QAA0C,EAAA;IACtE,KAAK,MAAM,CAACJ,IAAAA,EAAMC,UAAAA,CAAW,IAAII,MAAAA,CAAOC,OAAO,CAACF,QAAAA,CAAAA,CAAW;AACvDL,QAAAA,aAAAA,CAAcC,IAAAA,EAAMC,UAAAA,CAAAA;AACxB,IAAA;AACJ;AAEA;;;;;;IAOO,SAASM,YAAAA,CAAaP,IAAY,EAAA;IACrC,OAAOJ,OAAAA,CAAQY,GAAG,CAACR,IAAAA,CAAAA;AACvB;AAEA;;;AAGC,IACM,SAASS,eAAAA,CAAgBT,IAAY,EAAEU,YAA8B,EAAA;IACxEZ,QAAAA,CAASI,GAAG,CAACF,IAAAA,EAAMU,YAAAA,CAAAA;AACvB;AAEA;;IAGO,SAASC,gBAAAA,CAAiBP,QAA0C,EAAA;IACvE,KAAK,MAAM,CAACJ,IAAAA,EAAMU,YAAAA,CAAa,IAAIL,MAAAA,CAAOC,OAAO,CAACF,QAAAA,CAAAA,CAAW;AACzDK,QAAAA,eAAAA,CAAgBT,IAAAA,EAAMU,YAAAA,CAAAA;AAC1B,IAAA;AACJ;AAEA;;IAGO,SAASE,cAAAA,CAAeZ,IAAY,EAAA;IACvC,OAAOF,QAAAA,CAASU,GAAG,CAACR,IAAAA,CAAAA;AACxB;AAEA;;;;;;AAMC,IACM,SAASa,oBAAAA,GAAAA;IACZ,OAAO;AAAIjB,QAAAA,GAAAA,OAAAA,CAAQkB,IAAI;AAAG,KAAA,CAACC,IAAI,EAAA;AACnC;AAEA;;AAEC,IACM,SAASC,sBAAAA,GAAAA;IACZ,OAAO;AAAIlB,QAAAA,GAAAA,QAAAA,CAASgB,IAAI;AAAG,KAAA,CAACC,IAAI,EAAA;AACpC;AAEA;;;;;;AAMC,IACM,SAASE,aAAAA,GAAAA;AACZrB,IAAAA,OAAAA,CAAQsB,KAAK,EAAA;AACbpB,IAAAA,QAAAA,CAASoB,KAAK,EAAA;AAClB;;"}
1
+ {"version":3,"file":"bindingRegistry.js","sources":["../../../bindings/bindingRegistry.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { BoundConstructor } from './BoundConstructor';\n\nconst queries = new Map<string, BoundConstructor>();\nconst commands = new Map<string, BoundConstructor>();\n// Opt-in identities are separate from the legacy last-registration-wins namespace.\nconst queryIdentities = new Map<string, Map<string, BoundConstructor>>();\nconst queryBindingListeners = new Set<() => void>();\n\nfunction notifyQueryBindings(): void {\n for (const listener of queryBindingListeners) listener();\n}\n\n/** Subscribe to exact-binding changes. Existing adapters retain their render-time lookup contract. */\nexport function subscribeQueryBindings(listener: () => void): () => void {\n queryBindingListeners.add(listener);\n return () => { queryBindingListeners.delete(listener); };\n}\n\n/**\n * Registers one source identity for an exact query name. The same identity replaces on hot reload;\n * different identities remain distinct candidates, even when their constructors happen to match.\n * Legacy resolution also accepts a unique identity when no legacy registration exists.\n */\nexport function registerQueryIdentity(name: string, identity: string, queryClass: BoundConstructor): void {\n const candidates = queryIdentities.get(name) ?? new Map<string, BoundConstructor>();\n candidates.set(identity, queryClass);\n queryIdentities.set(name, candidates);\n notifyQueryBindings();\n}\n\n/** Removes a source identity when a generated module is removed or renamed. */\nexport function unregisterQueryIdentity(name: string, identity: string): void {\n const candidates = queryIdentities.get(name);\n candidates?.delete(identity);\n if (candidates?.size === 0) queryIdentities.delete(name);\n notifyQueryBindings();\n}\n\n/** Exact binding: a legacy registration counts as one candidate alongside opt-in identities. */\nexport function resolveExactQuery(name: string): BoundConstructor | 'ambiguous' | undefined {\n const legacy = queries.get(name);\n const candidates = queryIdentities.get(name);\n if ((legacy ? 1 : 0) + (candidates?.size ?? 0) > 1) return 'ambiguous';\n return legacy ?? candidates?.values().next().value;\n}\n\n/**\n * Registers an Arc query proxy under the name screens refer to it by.\n *\n * This is the seam that makes the Arc-bound half of `@cratis/components` usable from Scene at all. A\n * screen says `data Invoices via query AllInvoices`, and by the time that reaches a renderer it is an\n * `ExternalComponent` whose `properties` bag holds the *string* `'AllInvoices'` - a property bag carries\n * plain values and named slots, and there is no way to put a TypeScript class into one. `DataTableForQuery`\n * needs the class. The name is the only thing that survives the trip, so the name is what the lookup has\n * to be keyed on, and a host that owns the generated proxies is the only party that can supply the class\n * behind it.\n *\n * A host - Stage's generated application, or Studio's preview when it is wired to a real backend -\n * registers every proxy a screen can name, once, during startup. Registering the same name twice\n * replaces the earlier registration, so a host can re-register on hot reload without having to unwind\n * the previous run.\n */\nexport function registerQuery(name: string, queryClass: BoundConstructor): void {\n queries.set(name, queryClass);\n notifyQueryBindings();\n}\n\n/**\n * Registers several query proxies at once, keyed by the name screens refer to each by.\n *\n * Stage generates a module that exports every proxy it produced; handing that module's exports straight\n * to this is the whole of a generated host's registration step, and it stays correct as proxies are\n * added and removed without anyone editing a list.\n */\nexport function registerQueries(bindings: Record<string, BoundConstructor>): void {\n for (const [name, queryClass] of Object.entries(bindings)) {\n registerQuery(name, queryClass);\n }\n}\n\n/**\n * Legacy registrations are authoritative. Otherwise resolve a unique source identity, or `undefined`\n * when absent or ambiguous (existing adapters display their unresolved-binding placeholder).\n *\n * `undefined` rather than a throw: design-time preview in Studio normally has nothing registered at all,\n * and a screen still has to render so its layout can be worked on. Every adapter turns `undefined` into\n * a visible placeholder naming the binding it wanted.\n */\nexport function resolveQuery(name: string): BoundConstructor | undefined {\n const legacy = queries.get(name);\n if (legacy) return legacy;\n const candidates = queryIdentities.get(name);\n return candidates?.size === 1 ? candidates.values().next().value : undefined;\n}\n\n/**\n * Registers an Arc command proxy under the name screens refer to it by. The command half of\n * {@link registerQuery}, with the same contract.\n */\nexport function registerCommand(name: string, commandClass: BoundConstructor): void {\n commands.set(name, commandClass);\n}\n\n/**\n * Registers several command proxies at once, keyed by the name screens refer to each by.\n */\nexport function registerCommands(bindings: Record<string, BoundConstructor>): void {\n for (const [name, commandClass] of Object.entries(bindings)) {\n registerCommand(name, commandClass);\n }\n}\n\n/**\n * The command proxy registered under a name, or `undefined` when nothing is registered under it.\n */\nexport function resolveCommand(name: string): BoundConstructor | undefined {\n return commands.get(name);\n}\n\n/**\n * The sorted union of legacy and identity query names, including ambiguous names.\n *\n * A design-time tool uses this to offer the names a screen can actually bind to, and a diagnostics\n * surface uses it to explain a placeholder - \"this screen wants `AllInvoices`, and here is what is\n * registered\" is a far more useful message than the placeholder alone.\n */\nexport function registeredQueryNames(): string[] {\n return [...new Set([...queries.keys(), ...queryIdentities.keys()])].sort();\n}\n\n/**\n * Every registered command name, sorted.\n */\nexport function registeredCommandNames(): string[] {\n return [...commands.keys()].sort();\n}\n\n/**\n * Forgets every registered query and command.\n *\n * The registry is module-level state, which is right for a host that registers once at startup but wrong\n * for anything that switches between applications - Studio previewing a different project, or a spec\n * that must not inherit what the previous one registered. Both need a way back to empty.\n */\nexport function clearBindings(): void {\n queries.clear();\n commands.clear();\n queryIdentities.clear();\n notifyQueryBindings();\n}\n"],"names":["queries","Map","commands","queryIdentities","queryBindingListeners","Set","notifyQueryBindings","listener","subscribeQueryBindings","add","delete","registerQueryIdentity","name","identity","queryClass","candidates","get","set","unregisterQueryIdentity","size","resolveExactQuery","legacy","values","next","value","registerQuery","registerQueries","bindings","Object","entries","resolveQuery","undefined","registerCommand","commandClass","registerCommands","resolveCommand","registeredQueryNames","keys","sort","registeredCommandNames","clearBindings","clear"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=when_registering_query_identities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_registering_query_identities.d.ts","sourceRoot":"","sources":["../../../../bindings/for_bindingRegistry/when_registering_query_identities.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { expect } from 'vitest';
2
+ import { clearBindings, registerQuery, registerQueryIdentity, registeredQueryNames, resolveExactQuery, resolveQuery, unregisterQueryIdentity } from '../bindingRegistry';
3
+ class First {
4
+ }
5
+ class Replacement {
6
+ }
7
+ describe('when opting into collision-aware query identities', () => {
8
+ beforeEach(() => clearBindings());
9
+ afterEach(() => clearBindings());
10
+ it('replaces the same source identity on hot reload', () => {
11
+ registerQueryIdentity('Lookup', 'source/Lookup', First);
12
+ registerQueryIdentity('Lookup', 'source/Lookup', Replacement);
13
+ expect(resolveExactQuery('Lookup')).toBe(Replacement);
14
+ expect(resolveQuery('Lookup')).toBe(Replacement);
15
+ expect(registeredQueryNames()).toEqual(['Lookup']);
16
+ });
17
+ it('counts different source identities even for the same constructor', () => {
18
+ registerQueryIdentity('Lookup', 'one/Lookup', First);
19
+ registerQueryIdentity('Lookup', 'two/Lookup', First);
20
+ expect(resolveExactQuery('Lookup')).toBe('ambiguous');
21
+ expect(resolveQuery('Lookup')).toBeUndefined();
22
+ expect(registeredQueryNames()).toEqual(['Lookup']);
23
+ unregisterQueryIdentity('Lookup', 'one/Lookup');
24
+ expect(resolveExactQuery('Lookup')).toBe(First);
25
+ expect(resolveQuery('Lookup')).toBe(First);
26
+ unregisterQueryIdentity('Lookup', 'two/Lookup');
27
+ expect(resolveExactQuery('Lookup')).toBeUndefined();
28
+ expect(resolveQuery('Lookup')).toBeUndefined();
29
+ expect(registeredQueryNames()).toEqual([]);
30
+ });
31
+ it('keeps legacy replacement authoritative while exact resolution counts mixed candidates', () => {
32
+ registerQuery('Lookup', First);
33
+ registerQuery('Lookup', Replacement);
34
+ expect(resolveQuery('Lookup')).toBe(Replacement);
35
+ expect(resolveExactQuery('Lookup')).toBe(Replacement);
36
+ registerQueryIdentity('Lookup', 'source/Lookup', First);
37
+ expect(resolveQuery('Lookup')).toBe(Replacement);
38
+ expect(resolveExactQuery('Lookup')).toBe('ambiguous');
39
+ });
40
+ it('bridges a unique identity to legacy consumers with exact case-sensitive names and clears both maps', () => {
41
+ registerQueryIdentity('Lookup', 'source/Lookup', First);
42
+ expect(resolveQuery('Lookup')).toBe(First);
43
+ expect(resolveQuery('lookup')).toBeUndefined();
44
+ expect(resolveExactQuery('lookup')).toBeUndefined();
45
+ clearBindings();
46
+ expect(resolveQuery('Lookup')).toBeUndefined();
47
+ expect(resolveExactQuery('Lookup')).toBeUndefined();
48
+ expect(registeredQueryNames()).toEqual([]);
49
+ });
50
+ it('lists the sorted union without duplicates, retaining legacy names after identity removal', () => {
51
+ registerQueryIdentity('Zed', 'source/Zed', First);
52
+ registerQueryIdentity('Lookup', 'source/Lookup', First);
53
+ registerQuery('Lookup', Replacement);
54
+ registerQuery('Alpha', First);
55
+ expect(registeredQueryNames()).toEqual(['Alpha', 'Lookup', 'Zed']);
56
+ unregisterQueryIdentity('Lookup', 'source/Lookup');
57
+ unregisterQueryIdentity('Zed', 'source/Zed');
58
+ unregisterQueryIdentity('Missing', 'source/Missing');
59
+ expect(registeredQueryNames()).toEqual(['Alpha', 'Lookup']);
60
+ expect(resolveQuery('Lookup')).toBe(Replacement);
61
+ expect(resolveExactQuery('Lookup')).toBe(Replacement);
62
+ });
63
+ it('gives an existing legacy registration precedence even over multiple identities and later replacements', () => {
64
+ registerQueryIdentity('Lookup', 'one/Lookup', First);
65
+ registerQueryIdentity('Lookup', 'two/Lookup', First);
66
+ registerQuery('Lookup', First);
67
+ registerQuery('Lookup', Replacement);
68
+ registerQueryIdentity('Lookup', 'one/Lookup', Replacement);
69
+ expect(resolveQuery('Lookup')).toBe(Replacement);
70
+ expect(resolveExactQuery('Lookup')).toBe('ambiguous');
71
+ });
72
+ });
73
+ //# sourceMappingURL=when_registering_query_identities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"when_registering_query_identities.js","sourceRoot":"","sources":["../../../../bindings/for_bindingRegistry/when_registering_query_identities.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEzK,MAAM,KAAK;CAAG;AACd,MAAM,WAAW;CAAG;AAEpB,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC/D,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAEjC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QACxE,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC7F,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oGAAoG,EAAE,GAAG,EAAE;QAC1G,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,aAAa,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAChG,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QAClD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACnE,uBAAuB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACnD,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC7C,uBAAuB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uGAAuG,EAAE,GAAG,EAAE;QAC7G,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -43,13 +43,13 @@ describe('when mounting bound adapters', () => {
43
43
  await act(async () => {
44
44
  render(_jsx(SceneDataTable, { element: externalComponent('Cratis.Components:dataTable', { query: 'wrong' }), slots: {} }));
45
45
  });
46
- expect(screen.getByText("Invalid query binding 'Save': expected a zero-argument Arc query proxy")).toBeTruthy();
46
+ expect(screen.getByRole('alert')).toBeTruthy();
47
47
  expect(received).not.toHaveBeenCalled();
48
48
  });
49
49
  it('should visibly reject snapshot bindings in observable tables and query bindings in dialogs', () => {
50
50
  const { BoundObservableDataTable, BoundCommandDialog, BoundStepperCommandDialog, BoundDataPage } = adapters;
51
51
  render(_jsxs(_Fragment, { children: [_jsx(Boundary, { children: _jsx(BoundObservableDataTable, { query: proxies.Snapshot, emptyMessage: '' }) }), _jsx(Boundary, { children: _jsx(BoundCommandDialog, { command: proxies.Snapshot, title: '', visible: true }) }), _jsx(Boundary, { children: _jsx(BoundStepperCommandDialog, { command: proxies.Live, title: '', visible: true }) }), _jsx(Boundary, { children: _jsx(BoundDataPage, { query: proxies.Save, title: '', emptyMessage: '', children: undefined }) })] }));
52
- expect(screen.getAllByText('Error')).toHaveLength(4);
52
+ expect(screen.getAllByRole('alert')).toHaveLength(4);
53
53
  expect(received).not.toHaveBeenCalled();
54
54
  });
55
55
  });
@@ -1 +1 @@
1
- {"version":3,"file":"when_mounting_bound_adapters.js","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"when_mounting_bound_adapters.js","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cratisComponents.d.ts","sourceRoot":"","sources":["../../cratisComponents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;AA2B9E,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAgB/D,eAAO,MAAM,gBAAgB,EAAE,iBA6C9B,CAAC"}
1
+ {"version":3,"file":"cratisComponents.d.ts","sourceRoot":"","sources":["../../cratisComponents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;AA4B9E,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAgB/D,eAAO,MAAM,gBAAgB,EAAE,iBA8C9B,CAAC"}
@@ -6,6 +6,7 @@ import { SceneSingleResult } from './data/SceneSingleResult.js';
6
6
  import { SceneDataTable } from './data/SceneDataTable.js';
7
7
  import { SceneObservableDataTable } from './data/SceneObservableDataTable.js';
8
8
  import { SceneCommandForm } from './forms/SceneCommandForm.js';
9
+ import { SceneQueryInputForm } from './forms/SceneQueryInputForm.js';
9
10
  import 'react/jsx-runtime';
10
11
  import './bindings/resolveElementBinding.js';
11
12
  import 'react';
@@ -68,6 +69,7 @@ import { SceneToolbarSeparator } from './toolbar/SceneToolbarSeparator.js';
68
69
  [componentRegistryKey(cratisComponentsPackageName, 'dataTable')]: SceneDataTable,
69
70
  [componentRegistryKey(cratisComponentsPackageName, 'table')]: SceneDataTable,
70
71
  [componentRegistryKey(cratisComponentsPackageName, 'observableDataTable')]: SceneObservableDataTable,
72
+ [componentRegistryKey(cratisComponentsPackageName, 'queryInputForm')]: SceneQueryInputForm,
71
73
  [componentRegistryKey(cratisComponentsPackageName, 'commandForm')]: SceneCommandForm,
72
74
  [componentRegistryKey(cratisComponentsPackageName, 'inputTextField')]: SceneInputTextField,
73
75
  [componentRegistryKey(cratisComponentsPackageName, 'numberField')]: SceneNumberField,