@qoretechnologies/reqraft 0.10.39-pr.99.gdbafa34 → 0.10.39

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 (110) hide show
  1. package/.claude/CLAUDE.md +12 -0
  2. package/dist/components/codeSize/index.d.ts +37 -0
  3. package/dist/components/codeSize/index.d.ts.map +1 -0
  4. package/dist/components/codeSize/index.js +87 -0
  5. package/dist/components/codeSize/index.js.map +1 -0
  6. package/dist/components/form/engine/CompactRow.d.ts +20 -1
  7. package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
  8. package/dist/components/form/engine/CompactRow.js +365 -30
  9. package/dist/components/form/engine/CompactRow.js.map +1 -1
  10. package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
  11. package/dist/components/form/engine/CompactToolbar.js +6 -8
  12. package/dist/components/form/engine/CompactToolbar.js.map +1 -1
  13. package/dist/components/form/engine/FormEngine.d.ts +24 -45
  14. package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
  15. package/dist/components/form/engine/FormEngine.js +211 -84
  16. package/dist/components/form/engine/FormEngine.js.map +1 -1
  17. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts +37 -0
  18. package/dist/components/form/engine/_structuredData/SchemaDataView.d.ts.map +1 -0
  19. package/dist/components/form/engine/_structuredData/SchemaDataView.js +335 -0
  20. package/dist/components/form/engine/_structuredData/SchemaDataView.js.map +1 -0
  21. package/dist/components/form/engine/compactRowStyles.d.ts +13 -0
  22. package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
  23. package/dist/components/form/engine/compactRowStyles.js +30 -5
  24. package/dist/components/form/engine/compactRowStyles.js.map +1 -1
  25. package/dist/components/form/engine/compactToolbarContext.d.ts +0 -8
  26. package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
  27. package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
  28. package/dist/components/form/engine/readFirst.d.ts +73 -1
  29. package/dist/components/form/engine/readFirst.d.ts.map +1 -1
  30. package/dist/components/form/engine/readFirst.js +175 -5
  31. package/dist/components/form/engine/readFirst.js.map +1 -1
  32. package/dist/components/form/fields/Field.d.ts.map +1 -1
  33. package/dist/components/form/fields/Field.js +1 -1
  34. package/dist/components/form/fields/Field.js.map +1 -1
  35. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts +12 -2
  36. package/dist/components/form/fields/allowed-values/AllowedValues.d.ts.map +1 -1
  37. package/dist/components/form/fields/allowed-values/AllowedValues.js +16 -6
  38. package/dist/components/form/fields/allowed-values/AllowedValues.js.map +1 -1
  39. package/dist/components/form/fields/array/ArrayAuto.d.ts.map +1 -1
  40. package/dist/components/form/fields/array/ArrayAuto.js +51 -21
  41. package/dist/components/form/fields/array/ArrayAuto.js.map +1 -1
  42. package/dist/components/form/fields/array/ArrayAutoField.d.ts.map +1 -1
  43. package/dist/components/form/fields/array/ArrayAutoField.js +42 -25
  44. package/dist/components/form/fields/array/ArrayAutoField.js.map +1 -1
  45. package/dist/components/form/fields/auto/AutoFormField.d.ts +4 -0
  46. package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
  47. package/dist/components/form/fields/auto/AutoFormField.js +29 -4
  48. package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
  49. package/dist/components/form/fields/long-string/LongString.d.ts +9 -1
  50. package/dist/components/form/fields/long-string/LongString.d.ts.map +1 -1
  51. package/dist/components/form/fields/long-string/LongString.js +25 -4
  52. package/dist/components/form/fields/long-string/LongString.js.map +1 -1
  53. package/dist/components/form/fields/template/TemplateField.d.ts.map +1 -1
  54. package/dist/components/form/fields/template/TemplateField.js +12 -2
  55. package/dist/components/form/fields/template/TemplateField.js.map +1 -1
  56. package/dist/helpers/common.d.ts +8 -1
  57. package/dist/helpers/common.d.ts.map +1 -1
  58. package/dist/helpers/common.js +9 -1
  59. package/dist/helpers/common.js.map +1 -1
  60. package/dist/helpers/optionUiTypes.d.ts +30 -0
  61. package/dist/helpers/optionUiTypes.d.ts.map +1 -0
  62. package/dist/helpers/optionUiTypes.js +148 -0
  63. package/dist/helpers/optionUiTypes.js.map +1 -0
  64. package/dist/helpers/options.d.ts +19 -0
  65. package/dist/helpers/options.d.ts.map +1 -1
  66. package/dist/helpers/options.js +25 -1
  67. package/dist/helpers/options.js.map +1 -1
  68. package/dist/helpers/providerValue.d.ts +68 -0
  69. package/dist/helpers/providerValue.d.ts.map +1 -0
  70. package/dist/helpers/providerValue.js +50 -0
  71. package/dist/helpers/providerValue.js.map +1 -0
  72. package/dist/helpers/singleLineString.d.ts +37 -0
  73. package/dist/helpers/singleLineString.d.ts.map +1 -0
  74. package/dist/helpers/singleLineString.js +66 -0
  75. package/dist/helpers/singleLineString.js.map +1 -0
  76. package/dist/helpers/validations.d.ts +85 -2
  77. package/dist/helpers/validations.d.ts.map +1 -1
  78. package/dist/helpers/validations.js +802 -76
  79. package/dist/helpers/validations.js.map +1 -1
  80. package/dist/index.d.ts +1 -0
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +1 -0
  83. package/dist/index.js.map +1 -1
  84. package/package.json +1 -1
  85. package/src/components/codeSize/index.tsx +79 -0
  86. package/src/components/form/engine/CompactRow.tsx +450 -31
  87. package/src/components/form/engine/CompactToolbar.tsx +16 -21
  88. package/src/components/form/engine/FormEngine.stories.tsx +804 -17
  89. package/src/components/form/engine/FormEngine.tsx +207 -105
  90. package/src/components/form/engine/_structuredData/SchemaDataView.stories.tsx +233 -0
  91. package/src/components/form/engine/_structuredData/SchemaDataView.tsx +630 -0
  92. package/src/components/form/engine/compactRowStyles.ts +44 -2
  93. package/src/components/form/engine/compactToolbarContext.ts +0 -8
  94. package/src/components/form/engine/readFirst.ts +201 -5
  95. package/src/components/form/fields/Field.tsx +3 -1
  96. package/src/components/form/fields/allowed-values/AllowedValues.tsx +24 -2
  97. package/src/components/form/fields/array/ArrayAuto.tsx +35 -4
  98. package/src/components/form/fields/array/ArrayAutoField.stories.tsx +134 -0
  99. package/src/components/form/fields/array/ArrayAutoField.tsx +22 -4
  100. package/src/components/form/fields/auto/AutoFormField.tsx +30 -1
  101. package/src/components/form/fields/long-string/LongString.tsx +46 -5
  102. package/src/components/form/fields/template/TemplateField.tsx +16 -1
  103. package/src/helpers/common.ts +11 -1
  104. package/src/helpers/optionUiTypes.ts +153 -0
  105. package/src/helpers/options.ts +23 -0
  106. package/src/helpers/providerValue.ts +125 -0
  107. package/src/helpers/singleLineString.ts +61 -0
  108. package/src/helpers/validations.ts +1105 -80
  109. package/src/hooks/useWebSocket/useWebsocket.stories.tsx +23 -2
  110. package/src/index.tsx +1 -0
@@ -0,0 +1,233 @@
1
+ import { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { expect } from 'storybook/test';
3
+ import { SchemaDataView } from './SchemaDataView';
4
+
5
+ /**
6
+ * The read-only rendering of a value described by an `arg_schema`.
7
+ *
8
+ * Rendered directly here rather than through a whole FormEngine: these stories
9
+ * are about what the VIEW does with a described value, and mounting a form
10
+ * around it only adds chrome that the form's own stories already cover.
11
+ */
12
+ const meta: Meta<typeof SchemaDataView> = {
13
+ title: 'Form/Engine/SchemaDataView',
14
+ component: SchemaDataView,
15
+ };
16
+
17
+ export default meta;
18
+ type Story = StoryObj<typeof meta>;
19
+
20
+ /** Auth-profile schemes: the first field is a CHOICE, so its heading is prose. */
21
+ const SchemeSchema = {
22
+ type: {
23
+ type: 'string',
24
+ display_name: 'Scheme Type',
25
+ allowed_values: [
26
+ { value: 'default', display_name: 'Default RBAC' },
27
+ { value: 'cookie', display_name: 'Cookie' },
28
+ ],
29
+ },
30
+ cookie_name: { type: 'string', display_name: 'Session Cookie Name' },
31
+ redirect_url: { type: 'string', display_name: 'Redirect URL' },
32
+ } as never;
33
+
34
+ const schemeValue = [
35
+ { type: 'hash', value: { type: 'default' } },
36
+ {
37
+ type: 'hash',
38
+ value: {
39
+ type: 'cookie',
40
+ cookie_name: 'qorus-session',
41
+ redirect_url: 'https://example.com/login',
42
+ },
43
+ },
44
+ ];
45
+
46
+ /** Service methods: the first field is a LITERAL, so its heading is mono. */
47
+ const MethodSchema = {
48
+ name: { type: 'string', display_name: 'Method Name' },
49
+ desc: { type: 'string', display_name: 'Description' },
50
+ } as never;
51
+
52
+ const methodValue = [
53
+ { type: 'hash', value: { name: 'init', desc: 'init method' } },
54
+ { type: 'hash', value: { name: 'onOrderStatus', desc: 'returns the status of a single order' } },
55
+ { type: 'hash', value: { name: 'onConnect', desc: 'connection lifecycle hook' } },
56
+ ];
57
+
58
+ /**
59
+ * A schema whose hash values hold hash values of their own — three levels, not
60
+ * one.
61
+ *
62
+ * Every other fixture here is a flat record, and a flat record cannot show what
63
+ * this view does with depth: whether a nested level is legible, whether the
64
+ * rules stack sensibly, whether a heading two levels down still reads as a
65
+ * heading. Judging the treatment on a single `key: value` pair is what the
66
+ * review said was impossible, and it was right.
67
+ */
68
+ const NestedSchema = {
69
+ name: { type: 'string', display_name: 'Endpoint' },
70
+ auth: {
71
+ type: 'hash',
72
+ display_name: 'Authentication',
73
+ arg_schema: {
74
+ scheme: {
75
+ type: 'string',
76
+ display_name: 'Scheme',
77
+ allowed_values: [
78
+ { value: 'oauth2', display_name: 'OAuth2' },
79
+ { value: 'basic', display_name: 'Basic' },
80
+ ],
81
+ },
82
+ token: {
83
+ type: 'hash',
84
+ display_name: 'Token',
85
+ arg_schema: {
86
+ url: { type: 'string', display_name: 'Token URL' },
87
+ ttl: { type: 'int', display_name: 'Lifetime (s)' },
88
+ rotate: { type: 'bool', display_name: 'Rotate Automatically' },
89
+ },
90
+ },
91
+ },
92
+ },
93
+ retry: {
94
+ type: 'hash',
95
+ display_name: 'Retry Policy',
96
+ arg_schema: {
97
+ attempts: { type: 'int', display_name: 'Attempts' },
98
+ backoff: { type: 'string', display_name: 'Backoff' },
99
+ },
100
+ },
101
+ } as never;
102
+
103
+ const nestedValue = [
104
+ {
105
+ type: 'hash',
106
+ value: {
107
+ name: 'POST /orders',
108
+ auth: {
109
+ scheme: 'oauth2',
110
+ token: {
111
+ url: 'https://auth.example.com/oauth2/token',
112
+ ttl: 3600,
113
+ rotate: true,
114
+ },
115
+ },
116
+ retry: { attempts: 3, backoff: 'exponential' },
117
+ },
118
+ },
119
+ {
120
+ // A second record that fills only part of the tree: the nested level is
121
+ // present but shallow, which is where "no data under the label" shows up.
122
+ type: 'hash',
123
+ value: {
124
+ name: 'GET /orders/{id}',
125
+ auth: { scheme: 'basic' },
126
+ },
127
+ },
128
+ ];
129
+
130
+ const colors = { key: '#f1f0ee', muted: '#a0a0a0', border: '#a0a0a066', accent: '#3b8eea' };
131
+
132
+ export const Schemes: Story = {
133
+ parameters: {
134
+ docs: {
135
+ description: {
136
+ story:
137
+ 'A described list whose identifying field is a choice — each item is headed by the display name of that choice, in prose.',
138
+ },
139
+ },
140
+ },
141
+ args: { value: schemeValue, schema: SchemeSchema, colors },
142
+ play: async ({ canvasElement }) => {
143
+ const titles = [...canvasElement.querySelectorAll('.schema-view-item-title')].map((element) =>
144
+ (element.textContent ?? '').trim()
145
+ );
146
+ await expect(titles).toEqual(['Default RBAC', 'Cookie']);
147
+ },
148
+ };
149
+
150
+ export const ServiceMethods: Story = {
151
+ parameters: {
152
+ docs: {
153
+ description: {
154
+ story:
155
+ "A described list whose identifying field is a literal — each item is headed by the method's name, which keeps the mono face it has as a value.",
156
+ },
157
+ },
158
+ },
159
+ args: { value: methodValue, schema: MethodSchema, colors },
160
+ play: async ({ canvasElement }) => {
161
+ await expect(canvasElement.querySelectorAll('.schema-view-item-title')).toHaveLength(3);
162
+ },
163
+ };
164
+
165
+ export const Undescribed: Story = {
166
+ parameters: {
167
+ docs: {
168
+ description: {
169
+ story:
170
+ 'Keys the schema does not describe are still shown, under their raw name, after the described ones — a preview that dropped data would be worse than a raw tree.',
171
+ },
172
+ },
173
+ },
174
+ args: {
175
+ value: [{ type: 'hash', value: { type: 'cookie', legacy_flag: 'kept' } }],
176
+ schema: SchemeSchema,
177
+ colors,
178
+ },
179
+ play: async ({ canvasElement }) => {
180
+ await expect(canvasElement.textContent).toContain('legacy_flag');
181
+
182
+ // A field name renders on ONE line. The label column is measured from the
183
+ // longest name, and the label carries `overflow-wrap: anywhere` — so an
184
+ // under-measured column does not ellipsise, it breaks the name in half.
185
+ // That is exactly what happened when the labels became uppercase and the
186
+ // measurement was still in `ch`, which knows nothing about the tracking:
187
+ // `LEGACY_FLAG` came out over two lines.
188
+ //
189
+ // Asserted as geometry rather than as a width, because the width is the
190
+ // thing that keeps being wrong — the invariant is that the name fits.
191
+ const label = [...canvasElement.querySelectorAll<HTMLElement>('.schema-view-fields > *')].find(
192
+ (element) => (element.textContent ?? '').trim().toLowerCase() === 'legacy_flag'
193
+ );
194
+
195
+ await expect(label).toBeTruthy();
196
+
197
+ const lineHeight = parseFloat(getComputedStyle(label!).lineHeight) || 16;
198
+
199
+ await expect(label!.offsetHeight).toBeLessThan(lineHeight * 1.6);
200
+ },
201
+ };
202
+
203
+ /**
204
+ * The deeper case: hash values holding hash values.
205
+ *
206
+ * Asked for in review because the flat fixtures could not answer whether the
207
+ * treatment survives nesting — three levels here (endpoint → authentication →
208
+ * token), plus a second record that stops after one, so a nested level with
209
+ * nothing under it renders beside one that is full.
210
+ */
211
+ export const NestedSchemas: Story = {
212
+ parameters: {
213
+ docs: {
214
+ description: {
215
+ story:
216
+ 'A described list whose records nest two levels deeper: an endpoint carrying an Authentication hash, which itself carries a Token hash of URL, lifetime and a bool. The second record fills only the first nested level, so a shallow branch sits next to a full one.',
217
+ },
218
+ },
219
+ },
220
+ args: { value: nestedValue, schema: NestedSchema, colors },
221
+ play: async ({ canvasElement }) => {
222
+ const titles = [...canvasElement.querySelectorAll('.schema-view-item-title')].map((element) =>
223
+ (element.textContent ?? '').trim()
224
+ );
225
+
226
+ await expect(titles).toEqual(['POST /orders', 'GET /orders/{id}']);
227
+ // The deepest level actually rendered: a label from the third tier, and the
228
+ // bool beneath it resolved to a word rather than printed as `true`.
229
+ await expect(canvasElement.textContent).toContain('Token URL');
230
+ await expect(canvasElement.textContent).toContain('Lifetime (s)');
231
+ await expect(canvasElement.textContent).not.toContain('[object Object]');
232
+ },
233
+ };