@elaraai/e3-ui 1.0.84 → 1.0.85

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 (65) hide show
  1. package/dist/src/bind/data.d.ts +4 -3
  2. package/dist/src/bind/data.d.ts.map +1 -1
  3. package/dist/src/bind/data.js +4 -3
  4. package/dist/src/bind/data.js.map +1 -1
  5. package/dist/src/bind/record.d.ts +5 -2
  6. package/dist/src/bind/record.d.ts.map +1 -1
  7. package/dist/src/bind/record.js +5 -2
  8. package/dist/src/bind/record.js.map +1 -1
  9. package/dist/src/bind/sources.d.ts +148 -0
  10. package/dist/src/bind/sources.d.ts.map +1 -0
  11. package/dist/src/bind/sources.js +116 -0
  12. package/dist/src/bind/sources.js.map +1 -0
  13. package/dist/src/index.d.ts +2 -0
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +5 -0
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/internal.d.ts +2 -0
  18. package/dist/src/internal.d.ts.map +1 -1
  19. package/dist/src/internal.js +6 -0
  20. package/dist/src/internal.js.map +1 -1
  21. package/dist/src/query/builder.d.ts +3257 -0
  22. package/dist/src/query/builder.d.ts.map +1 -0
  23. package/dist/src/query/builder.js +126 -0
  24. package/dist/src/query/builder.js.map +1 -0
  25. package/dist/src/query/index.d.ts +108 -0
  26. package/dist/src/query/index.d.ts.map +1 -0
  27. package/dist/src/query/index.js +76 -0
  28. package/dist/src/query/index.js.map +1 -0
  29. package/dist/src/query/library.d.ts +3241 -0
  30. package/dist/src/query/library.d.ts.map +1 -0
  31. package/dist/src/query/library.js +114 -0
  32. package/dist/src/query/library.js.map +1 -0
  33. package/dist/src/query/queries.d.ts +4696 -0
  34. package/dist/src/query/queries.d.ts.map +1 -0
  35. package/dist/src/query/queries.js +129 -0
  36. package/dist/src/query/queries.js.map +1 -0
  37. package/dist/src/query/saved.d.ts +72 -0
  38. package/dist/src/query/saved.d.ts.map +1 -0
  39. package/dist/src/query/saved.js +84 -0
  40. package/dist/src/query/saved.js.map +1 -0
  41. package/dist/src/query/steps.d.ts +613 -0
  42. package/dist/src/query/steps.d.ts.map +1 -0
  43. package/dist/src/query/steps.js +316 -0
  44. package/dist/src/query/steps.js.map +1 -0
  45. package/dist/src/query/types.d.ts +444 -0
  46. package/dist/src/query/types.d.ts.map +1 -0
  47. package/dist/src/query/types.js +113 -0
  48. package/dist/src/query/types.js.map +1 -0
  49. package/dist/src/ui.d.ts +16 -3
  50. package/dist/src/ui.d.ts.map +1 -1
  51. package/dist/src/ui.js +21 -1
  52. package/dist/src/ui.js.map +1 -1
  53. package/dist/test/bind/data/data.examples.d.ts +76 -1
  54. package/dist/test/bind/data/data.examples.d.ts.map +1 -1
  55. package/dist/test/bind/data/data.examples.js +176 -3
  56. package/dist/test/bind/data/data.examples.js.map +1 -1
  57. package/dist/test/bind/func/func.examples.d.ts +8 -0
  58. package/dist/test/bind/func/func.examples.d.ts.map +1 -1
  59. package/dist/test/bind/func/func.examples.js +4 -3
  60. package/dist/test/bind/func/func.examples.js.map +1 -1
  61. package/dist/test/query/query.examples.d.ts +5022 -0
  62. package/dist/test/query/query.examples.d.ts.map +1 -0
  63. package/dist/test/query/query.examples.js +467 -0
  64. package/dist/test/query/query.examples.js.map +1 -0
  65. package/package.json +9 -9
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The query builder's steps (#933) — a query as the builder edits it: a data
7
+ * source and the steps that read it, in plain words.
8
+ *
9
+ * Steps are a projection of a query's jq program: each step prints as a
10
+ * canonical form of jq (`Query Editor Spec.md` §4.7), and a program made of
11
+ * canonical forms parses back into its steps. They are East values, because
12
+ * the builder's edits are drafts of the shared editing session, which holds,
13
+ * compares and diffs its entries as East values. The functions over them —
14
+ * printing, parsing, checking, editing and counting — are e3-ui-components'.
15
+ *
16
+ * A field is named by a string: `"total"`, `"status"` (a variant's case) or
17
+ * `"status.shipped.date"` (a field of a case's payload).
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+ import { ArrayType, BooleanType, DictType, FloatType, NullType, OptionType, RecursiveType, StringType, StructType, VariantType, } from "@elaraai/east";
22
+ // ============================================================================
23
+ // Values
24
+ // ============================================================================
25
+ /**
26
+ * A value a step compares with or fills in.
27
+ *
28
+ * @property text - Text, a case's name, or a date written as ISO text ("2026-03-01")
29
+ * @property number - A number; a whole one prints as an Integer
30
+ * @property boolean - Yes or no
31
+ * @property null - Nothing
32
+ */
33
+ export const QueryStepValueType = VariantType({
34
+ text: StringType,
35
+ number: FloatType,
36
+ boolean: BooleanType,
37
+ null: NullType,
38
+ });
39
+ /**
40
+ * A count or a bound a step takes: a number, or the text typed when it is not
41
+ * one, which the check reports.
42
+ *
43
+ * @property number - The number
44
+ * @property text - The text as typed
45
+ */
46
+ export const QueryStepInputType = VariantType({
47
+ number: FloatType,
48
+ text: StringType,
49
+ });
50
+ // ============================================================================
51
+ // Conditions
52
+ // ============================================================================
53
+ /**
54
+ * How a step's or a group's conditions combine.
55
+ *
56
+ * @property all - Every condition holds
57
+ * @property any - At least one holds
58
+ */
59
+ export const QueryMatchType = VariantType({
60
+ all: NullType,
61
+ any: NullType,
62
+ });
63
+ /**
64
+ * How a condition compares a field. The builder gives each its words ("is at
65
+ * least"); the field's kind decides which apply.
66
+ *
67
+ * @property eq - Is
68
+ * @property ne - Is not
69
+ * @property ge - Is at least
70
+ * @property le - Is at most
71
+ * @property gt - Is more than
72
+ * @property lt - Is less than
73
+ * @property contains - Contains, for text
74
+ * @property startsWith - Starts with, for text
75
+ * @property missing - Is missing, for an optional field
76
+ * @property present - Has a value, for an optional field
77
+ * @property yes - Is yes
78
+ * @property no - Is no
79
+ * @property inYear - Is in a year, for a date
80
+ * @property inMonth - Is in a month ("2026-03"), for a date
81
+ * @property onOrAfter - Is on or after a day, for a date
82
+ * @property before - Is before a day, for a date
83
+ * @property lengthAtLeast - Has at least a number of items, for a list
84
+ * @property anyWhere - Has an item where an inner condition holds, for a list
85
+ */
86
+ export const QueryComparisonType = VariantType({
87
+ eq: NullType,
88
+ ne: NullType,
89
+ ge: NullType,
90
+ le: NullType,
91
+ gt: NullType,
92
+ lt: NullType,
93
+ contains: NullType,
94
+ startsWith: NullType,
95
+ missing: NullType,
96
+ present: NullType,
97
+ yes: NullType,
98
+ no: NullType,
99
+ inYear: NullType,
100
+ inMonth: NullType,
101
+ onOrAfter: NullType,
102
+ before: NullType,
103
+ lengthAtLeast: NullType,
104
+ anyWhere: NullType,
105
+ });
106
+ /**
107
+ * A condition of a Keep rows where step: one test of a field, or a group of
108
+ * conditions with its own match.
109
+ *
110
+ * @property test - A field compared: `id` names it for the editing session;
111
+ * `field`, `cmp` and `value` are its slots, empty until chosen; `inner` is
112
+ * the condition on each item of a list (`anyWhere`); `whole` compares a
113
+ * variant as a whole value rather than its case, which the check refuses
114
+ * @property group - Conditions with their own match: `id` names it, `match`
115
+ * combines `conds`
116
+ */
117
+ export const QueryConditionType = RecursiveType(condition => VariantType({
118
+ test: StructType({
119
+ id: StringType,
120
+ field: OptionType(StringType),
121
+ cmp: OptionType(QueryComparisonType),
122
+ value: OptionType(QueryStepValueType),
123
+ inner: OptionType(condition),
124
+ whole: BooleanType,
125
+ }),
126
+ group: StructType({
127
+ id: StringType,
128
+ match: QueryMatchType,
129
+ conds: ArrayType(condition),
130
+ }),
131
+ }));
132
+ // ============================================================================
133
+ // The parts of steps
134
+ // ============================================================================
135
+ /**
136
+ * What a Group and total step totals with.
137
+ *
138
+ * @property count - How many rows
139
+ * @property sum - Adds up a number
140
+ * @property mean - Averages a number
141
+ * @property min - The lowest
142
+ * @property max - The highest
143
+ * @property distinct - How many different values
144
+ */
145
+ export const QueryAggregateFunctionType = VariantType({
146
+ count: NullType,
147
+ sum: NullType,
148
+ mean: NullType,
149
+ min: NullType,
150
+ max: NullType,
151
+ distinct: NullType,
152
+ });
153
+ /**
154
+ * One total of a Group and total step.
155
+ *
156
+ * @property id - Names it for the editing session
157
+ * @property fn - What it totals with
158
+ * @property field - The field it totals; `none` for a count, and until chosen
159
+ * @property as - The name of the field it makes. While it is the name the
160
+ * builder gives the total (`count`, the field's, `max_cost`), it follows the
161
+ * total and its field; the jq holds no more than the name, so that is all a
162
+ * total keeps.
163
+ */
164
+ export const QueryAggregateType = StructType({
165
+ id: StringType,
166
+ fn: QueryAggregateFunctionType,
167
+ field: OptionType(StringType),
168
+ as: StringType,
169
+ });
170
+ /**
171
+ * What a Group and total step groups by.
172
+ *
173
+ * @property field - One group per value of a field
174
+ * @property all - All rows together, as one group
175
+ */
176
+ export const QueryGroupByType = VariantType({
177
+ field: StringType,
178
+ all: NullType,
179
+ });
180
+ /**
181
+ * Which way a Sort step orders.
182
+ *
183
+ * @property asc - Lowest, earliest or A first
184
+ * @property desc - Highest, latest or Z first
185
+ */
186
+ export const QuerySortDirectionType = VariantType({
187
+ asc: NullType,
188
+ desc: NullType,
189
+ });
190
+ /**
191
+ * The part a Take part of a date step takes.
192
+ *
193
+ * @property year - The year, a whole number
194
+ * @property month - The month, as text ("2026-03")
195
+ * @property weekday - The day of the week, as text ("Monday")
196
+ */
197
+ export const QueryDatePartType = VariantType({
198
+ year: NullType,
199
+ month: NullType,
200
+ weekday: NullType,
201
+ });
202
+ /**
203
+ * One field a Show only fields step shows.
204
+ *
205
+ * @property id - Names it for the editing session
206
+ * @property field - The field shown; `none` until chosen
207
+ * @property as - The name it is shown under
208
+ */
209
+ export const QueryPickFieldType = StructType({
210
+ id: StringType,
211
+ field: OptionType(StringType),
212
+ as: StringType,
213
+ });
214
+ // ============================================================================
215
+ // Steps
216
+ // ============================================================================
217
+ /**
218
+ * One step of a query. Each has an `id`, which names it for the editing
219
+ * session; a slot that is `none` is not chosen yet, and a step with an empty
220
+ * slot it needs is unfinished, and left out of the program.
221
+ *
222
+ * @property filter - Keep rows where: `conds`, combined by `match`
223
+ * @property lookup - Look up from another dataset: the bound `dataset` keyed
224
+ * by `key`, a field of the rows; `fields` are its values' fields brought in
225
+ * @property group - Group and total: `by` a field or all rows together, with
226
+ * `aggs` its totals
227
+ * @property sort - Sort by a `field` in a direction
228
+ * @property limit - Keep the first `n` rows
229
+ * @property count - Count the rows
230
+ * @property pick - Show only these `fields`, each under its name
231
+ * @property fill - Fill in missing values: where `field` is missing, use `value`
232
+ * @property drill - Open each list: one row per item of the list `field`
233
+ * @property datepart - Take part of a date `field`, as a field named `as`
234
+ * @property walk - List every part in the tree, through its list of parts `via`
235
+ * @property tabulate - Try the model over a range: the input `over` from
236
+ * `from` to `to` every `step`, the other inputs `fixed`, the result named `as`
237
+ * @property jq - A jq step: its `text`, checked but not shown as words
238
+ */
239
+ export const QueryStepType = VariantType({
240
+ filter: StructType({
241
+ id: StringType,
242
+ match: QueryMatchType,
243
+ conds: ArrayType(QueryConditionType),
244
+ }),
245
+ lookup: StructType({
246
+ id: StringType,
247
+ dataset: OptionType(StringType),
248
+ key: OptionType(StringType),
249
+ fields: ArrayType(StringType),
250
+ }),
251
+ group: StructType({
252
+ id: StringType,
253
+ by: OptionType(QueryGroupByType),
254
+ aggs: ArrayType(QueryAggregateType),
255
+ }),
256
+ sort: StructType({
257
+ id: StringType,
258
+ field: OptionType(StringType),
259
+ dir: QuerySortDirectionType,
260
+ }),
261
+ limit: StructType({
262
+ id: StringType,
263
+ n: QueryStepInputType,
264
+ }),
265
+ count: StructType({
266
+ id: StringType,
267
+ }),
268
+ pick: StructType({
269
+ id: StringType,
270
+ fields: ArrayType(QueryPickFieldType),
271
+ }),
272
+ fill: StructType({
273
+ id: StringType,
274
+ field: OptionType(StringType),
275
+ value: OptionType(QueryStepValueType),
276
+ }),
277
+ drill: StructType({
278
+ id: StringType,
279
+ field: OptionType(StringType),
280
+ }),
281
+ datepart: StructType({
282
+ id: StringType,
283
+ field: OptionType(StringType),
284
+ part: QueryDatePartType,
285
+ as: StringType,
286
+ }),
287
+ walk: StructType({
288
+ id: StringType,
289
+ via: OptionType(StringType),
290
+ }),
291
+ tabulate: StructType({
292
+ id: StringType,
293
+ over: StringType,
294
+ from: QueryStepInputType,
295
+ to: QueryStepInputType,
296
+ step: QueryStepInputType,
297
+ fixed: DictType(StringType, QueryStepValueType),
298
+ as: StringType,
299
+ }),
300
+ jq: StructType({
301
+ id: StringType,
302
+ text: StringType,
303
+ }),
304
+ });
305
+ /**
306
+ * A query as steps: the data source it starts from — a field of the root,
307
+ * `orders` for `.orders` — and its steps, in order.
308
+ *
309
+ * @property source - The data source it starts from
310
+ * @property steps - Its steps
311
+ */
312
+ export const QueryStepsType = StructType({
313
+ source: StringType,
314
+ steps: ArrayType(QueryStepType),
315
+ });
316
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../../src/query/steps.ts"],"names":[],"mappings":"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"}