flowquery 1.0.14 → 1.0.16

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 (59) hide show
  1. package/.editorconfig +21 -0
  2. package/.husky/pre-commit +1 -0
  3. package/.prettierrc +22 -0
  4. package/dist/flowquery.min.js +1 -1
  5. package/dist/parsing/expressions/expression_map.d.ts +9 -0
  6. package/dist/parsing/expressions/expression_map.d.ts.map +1 -0
  7. package/dist/parsing/expressions/expression_map.js +24 -0
  8. package/dist/parsing/expressions/expression_map.js.map +1 -0
  9. package/dist/parsing/operations/call.d.ts +17 -0
  10. package/dist/parsing/operations/call.d.ts.map +1 -0
  11. package/dist/parsing/operations/call.js +105 -0
  12. package/dist/parsing/operations/call.js.map +1 -0
  13. package/dist/parsing/operations/load.d.ts +6 -6
  14. package/dist/parsing/operations/load.d.ts.map +1 -1
  15. package/dist/parsing/operations/load.js +8 -6
  16. package/dist/parsing/operations/load.js.map +1 -1
  17. package/dist/parsing/operations/operation.d.ts +1 -0
  18. package/dist/parsing/operations/operation.d.ts.map +1 -1
  19. package/dist/parsing/operations/operation.js +6 -5
  20. package/dist/parsing/operations/operation.js.map +1 -1
  21. package/dist/parsing/operations/projection.d.ts +1 -1
  22. package/dist/parsing/operations/projection.d.ts.map +1 -1
  23. package/dist/parsing/operations/projection.js.map +1 -1
  24. package/dist/parsing/parser.d.ts +1 -0
  25. package/dist/parsing/parser.d.ts.map +1 -1
  26. package/dist/parsing/parser.js +148 -99
  27. package/dist/parsing/parser.js.map +1 -1
  28. package/dist/parsing/token_to_node.d.ts +2 -2
  29. package/dist/parsing/token_to_node.d.ts.map +1 -1
  30. package/dist/parsing/token_to_node.js +12 -12
  31. package/dist/parsing/token_to_node.js.map +1 -1
  32. package/dist/tokenization/token.d.ts +5 -1
  33. package/dist/tokenization/token.d.ts.map +1 -1
  34. package/dist/tokenization/token.js +17 -5
  35. package/dist/tokenization/token.js.map +1 -1
  36. package/docs/flowquery.min.js +1 -1
  37. package/flowquery-vscode/flowQueryEngine/flowquery.min.js +1 -1
  38. package/misc/apps/RAG/package.json +1 -1
  39. package/misc/apps/RAG/src/plugins/loaders/CatFacts.ts +21 -26
  40. package/misc/apps/RAG/src/plugins/loaders/FetchJson.ts +65 -0
  41. package/misc/apps/RAG/src/plugins/loaders/Form.ts +163 -147
  42. package/misc/apps/RAG/src/plugins/loaders/Llm.ts +106 -92
  43. package/misc/apps/RAG/src/plugins/loaders/MockData.ts +80 -58
  44. package/misc/apps/RAG/src/plugins/loaders/Table.ts +106 -103
  45. package/misc/apps/RAG/src/plugins/loaders/Weather.ts +50 -38
  46. package/misc/apps/RAG/src/prompts/FlowQuerySystemPrompt.ts +77 -78
  47. package/package.json +12 -2
  48. package/src/parsing/expressions/expression_map.ts +22 -0
  49. package/src/parsing/operations/call.ts +69 -0
  50. package/src/parsing/operations/load.ts +123 -120
  51. package/src/parsing/operations/operation.ts +14 -13
  52. package/src/parsing/operations/projection.ts +3 -3
  53. package/src/parsing/parser.ts +303 -239
  54. package/src/parsing/token_to_node.ts +67 -50
  55. package/src/tokenization/token.ts +29 -14
  56. package/tests/compute/runner.test.ts +277 -165
  57. package/tests/parsing/parser.test.ts +352 -303
  58. package/tests/tokenization/tokenizer.test.ts +17 -17
  59. package/vscode-settings.json.recommended +16 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Example plugin: Fetch JSON data from a URL.
3
+ *
4
+ * Usage in FlowQuery:
5
+ * CALL fetchJson('https://api.example.com/data') YIELD name, value
6
+ */
7
+ import { AsyncFunction, FunctionDef } from "flowquery/extensibility";
8
+
9
+ /**
10
+ * FetchJson class - fetches JSON data from a URL and yields items.
11
+ */
12
+ @FunctionDef({
13
+ description:
14
+ "Fetches JSON data from a URL. If the response is an array, yields each item individually.",
15
+ category: "async",
16
+ parameters: [
17
+ {
18
+ name: "url",
19
+ description: "The URL to fetch JSON from",
20
+ type: "string",
21
+ required: true,
22
+ },
23
+ {
24
+ name: "options",
25
+ description: "Optional fetch options (headers, method, etc.)",
26
+ type: "object",
27
+ required: false,
28
+ },
29
+ ],
30
+ output: {
31
+ description: "JSON data items",
32
+ type: "object",
33
+ },
34
+ examples: [
35
+ "CALL fetchJson('https://api.example.com/users') YIELD name",
36
+ "CALL fetchJson('https://api.example.com/data') YIELD name, active WHERE active = true",
37
+ ],
38
+ })
39
+ export class FetchJson extends AsyncFunction {
40
+ /**
41
+ * Fetches JSON data from a URL and yields each item if array, or the object itself.
42
+ *
43
+ * @param url - The URL to fetch JSON from
44
+ * @param options - Optional fetch options
45
+ */
46
+ async *generate(url: string, options?: RequestInit): AsyncGenerator<any, void, unknown> {
47
+ const response = await fetch(url, options);
48
+
49
+ if (!response.ok) {
50
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
51
+ }
52
+
53
+ const data = await response.json();
54
+
55
+ if (Array.isArray(data)) {
56
+ for (const item of data) {
57
+ yield item;
58
+ }
59
+ } else {
60
+ yield data;
61
+ }
62
+ }
63
+ }
64
+
65
+ export default FetchJson;
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Form plugin - transforms configuration into Adaptive Card form format.
3
- *
3
+ *
4
4
  * Adaptive Cards are platform-agnostic UI snippets that can be rendered in
5
5
  * Microsoft Teams, Outlook, Windows, and other applications.
6
- *
6
+ *
7
7
  * This plugin creates customizable forms with various input types including:
8
8
  * - Text inputs (single and multi-line)
9
9
  * - Number inputs
@@ -11,24 +11,22 @@
11
11
  * - Dropdown/choice sets
12
12
  * - Toggle switches
13
13
  * - Choice sets (radio buttons, checkboxes)
14
- *
14
+ *
15
15
  * Usage in FlowQuery:
16
16
  * // Create a simple contact form:
17
- * LOAD JSON FROM form('Contact Us', [
17
+ * CALL form('Contact Us', [
18
18
  * { id: 'name', type: 'text', label: 'Your Name', required: true },
19
19
  * { id: 'email', type: 'text', label: 'Email', placeholder: 'you@example.com' },
20
20
  * { id: 'message', type: 'textarea', label: 'Message' }
21
- * ]) AS form
22
- * RETURN form
21
+ * ]) YIELD type, body, actions
23
22
  */
24
-
25
- import { FunctionDef, AsyncFunction } from 'flowquery/extensibility';
23
+ import { AsyncFunction, FunctionDef } from "flowquery/extensibility";
26
24
 
27
25
  /**
28
26
  * Interface for Adaptive Card structure
29
27
  */
30
28
  interface AdaptiveCard {
31
- type: 'AdaptiveCard';
29
+ type: "AdaptiveCard";
32
30
  $schema: string;
33
31
  version: string;
34
32
  body: AdaptiveCardElement[];
@@ -53,7 +51,17 @@ interface FormFieldConfig {
53
51
  /** Unique identifier for the field */
54
52
  id: string;
55
53
  /** Input type: text, textarea, number, date, time, datetime, toggle, dropdown, radio, checkbox */
56
- type: 'text' | 'textarea' | 'number' | 'date' | 'time' | 'datetime' | 'toggle' | 'dropdown' | 'radio' | 'checkbox';
54
+ type:
55
+ | "text"
56
+ | "textarea"
57
+ | "number"
58
+ | "date"
59
+ | "time"
60
+ | "datetime"
61
+ | "toggle"
62
+ | "dropdown"
63
+ | "radio"
64
+ | "checkbox";
57
65
  /** Display label for the field */
58
66
  label: string;
59
67
  /** Placeholder text for input fields */
@@ -79,9 +87,9 @@ interface FormFieldConfig {
79
87
  /** Separator before this field */
80
88
  separator?: boolean;
81
89
  /** Field width: auto, stretch, or weighted value */
82
- width?: 'auto' | 'stretch' | number;
90
+ width?: "auto" | "stretch" | number;
83
91
  /** Custom style for the label */
84
- labelStyle?: 'default' | 'heading';
92
+ labelStyle?: "default" | "heading";
85
93
  }
86
94
 
87
95
  /**
@@ -95,22 +103,22 @@ interface FormConfig {
95
103
  /** Submit button configuration */
96
104
  submitButton?: {
97
105
  title?: string;
98
- style?: 'default' | 'positive' | 'destructive';
106
+ style?: "default" | "positive" | "destructive";
99
107
  /** Action URL for form submission */
100
108
  url?: string;
101
109
  /** Action type: submit, openUrl, or custom */
102
- actionType?: 'submit' | 'openUrl' | 'showCard';
110
+ actionType?: "submit" | "openUrl" | "showCard";
103
111
  };
104
112
  /** Additional action buttons */
105
113
  additionalActions?: Array<{
106
114
  title: string;
107
- type: 'submit' | 'openUrl' | 'showCard';
115
+ type: "submit" | "openUrl" | "showCard";
108
116
  url?: string;
109
- style?: 'default' | 'positive' | 'destructive';
117
+ style?: "default" | "positive" | "destructive";
110
118
  data?: any;
111
119
  }>;
112
120
  /** Card background style */
113
- style?: 'default' | 'emphasis' | 'good' | 'attention' | 'warning' | 'accent';
121
+ style?: "default" | "emphasis" | "good" | "attention" | "warning" | "accent";
114
122
  /** Whether to show a reset/clear button */
115
123
  showResetButton?: boolean;
116
124
  /** Card schema version */
@@ -121,48 +129,48 @@ interface FormConfig {
121
129
  * Form class - creates customizable Adaptive Card forms.
122
130
  */
123
131
  @FunctionDef({
124
- description: 'Creates a customizable Adaptive Card form with various input types',
125
- category: 'async',
132
+ description: "Creates a customizable Adaptive Card form with various input types",
133
+ category: "async",
126
134
  parameters: [
127
135
  {
128
- name: 'title',
129
- description: 'Form title displayed at the top',
130
- type: 'string',
131
- required: true
136
+ name: "title",
137
+ description: "Form title displayed at the top",
138
+ type: "string",
139
+ required: true,
132
140
  },
133
141
  {
134
- name: 'fields',
135
- description: 'Array of field configurations defining the form inputs',
136
- type: 'array',
137
- required: true
142
+ name: "fields",
143
+ description: "Array of field configurations defining the form inputs",
144
+ type: "array",
145
+ required: true,
138
146
  },
139
147
  {
140
- name: 'config',
141
- description: 'Optional form configuration (submit button, additional actions, styling)',
142
- type: 'object',
143
- required: false
144
- }
148
+ name: "config",
149
+ description: "Optional form configuration (submit button, additional actions, styling)",
150
+ type: "object",
151
+ required: false,
152
+ },
145
153
  ],
146
154
  output: {
147
- description: 'Adaptive Card JSON object with form elements',
148
- type: 'object',
155
+ description: "Adaptive Card JSON object with form elements",
156
+ type: "object",
149
157
  properties: {
150
- type: { description: 'Always "AdaptiveCard"', type: 'string' },
151
- $schema: { description: 'Adaptive Card schema URL', type: 'string' },
152
- version: { description: 'Adaptive Card version', type: 'string' },
153
- body: { description: 'Card body elements including form inputs', type: 'array' },
154
- actions: { description: 'Card actions (submit, cancel, etc.)', type: 'array' }
155
- }
158
+ type: { description: 'Always "AdaptiveCard"', type: "string" },
159
+ $schema: { description: "Adaptive Card schema URL", type: "string" },
160
+ version: { description: "Adaptive Card version", type: "string" },
161
+ body: { description: "Card body elements including form inputs", type: "array" },
162
+ actions: { description: "Card actions (submit, cancel, etc.)", type: "array" },
163
+ },
156
164
  },
157
165
  examples: [
158
- "LOAD JSON FROM form('Contact Form', [{ id: 'name', type: 'text', label: 'Name', required: true }, { id: 'email', type: 'text', label: 'Email' }]) AS form RETURN form",
159
- "LOAD JSON FROM form('Survey', [{ id: 'rating', type: 'dropdown', label: 'Rating', choices: ['1', '2', '3', '4', '5'] }, { id: 'subscribe', type: 'toggle', label: 'Subscribe', toggleTitle: 'Yes, send me updates' }], { submitButton: { title: 'Submit Survey', style: 'positive' } }) AS form RETURN form"
160
- ]
166
+ "CALL form('Contact Form', [{ id: 'name', type: 'text', label: 'Name', required: true }, { id: 'email', type: 'text', label: 'Email' }]) YIELD type, body, actions",
167
+ "CALL form('Survey', [{ id: 'rating', type: 'dropdown', label: 'Rating', choices: ['1', '2', '3', '4', '5'] }, { id: 'subscribe', type: 'toggle', label: 'Subscribe', toggleTitle: 'Yes, send me updates' }], { submitButton: { title: 'Submit Survey', style: 'positive' } }) YIELD type, body, actions",
168
+ ],
161
169
  })
162
170
  export class Form extends AsyncFunction {
163
171
  /**
164
172
  * Creates an Adaptive Card form with the specified fields and configuration.
165
- *
173
+ *
166
174
  * @param title - Form title
167
175
  * @param fields - Array of field configurations
168
176
  * @param config - Optional form configuration
@@ -185,46 +193,46 @@ export class Form extends AsyncFunction {
185
193
  config: FormConfig
186
194
  ): AdaptiveCard {
187
195
  const card: AdaptiveCard = {
188
- type: 'AdaptiveCard',
189
- $schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
190
- version: config.version || '1.5',
196
+ type: "AdaptiveCard",
197
+ $schema: "http://adaptivecards.io/schemas/adaptive-card.json",
198
+ version: config.version || "1.5",
191
199
  body: [],
192
- actions: []
200
+ actions: [],
193
201
  };
194
202
 
195
203
  // Add container with optional background style
196
204
  const container: AdaptiveCardElement = {
197
- type: 'Container',
198
- style: config.style || 'default',
199
- items: []
205
+ type: "Container",
206
+ style: config.style || "default",
207
+ items: [],
200
208
  };
201
209
 
202
210
  // Add title
203
211
  container.items.push({
204
- type: 'TextBlock',
212
+ type: "TextBlock",
205
213
  text: title,
206
- weight: 'Bolder',
207
- size: 'Large',
208
- wrap: true
214
+ weight: "Bolder",
215
+ size: "Large",
216
+ wrap: true,
209
217
  });
210
218
 
211
219
  // Add description if provided
212
220
  if (config.description) {
213
221
  container.items.push({
214
- type: 'TextBlock',
222
+ type: "TextBlock",
215
223
  text: config.description,
216
224
  isSubtle: true,
217
225
  wrap: true,
218
- spacing: 'Small'
226
+ spacing: "Small",
219
227
  });
220
228
  }
221
229
 
222
230
  // Add separator after header
223
231
  container.items.push({
224
- type: 'TextBlock',
225
- text: ' ',
232
+ type: "TextBlock",
233
+ text: " ",
226
234
  separator: true,
227
- spacing: 'Medium'
235
+ spacing: "Medium",
228
236
  });
229
237
 
230
238
  // Add form fields
@@ -250,12 +258,12 @@ export class Form extends AsyncFunction {
250
258
  // Add label
251
259
  const labelText = field.required ? `${field.label} *` : field.label;
252
260
  elements.push({
253
- type: 'TextBlock',
261
+ type: "TextBlock",
254
262
  text: labelText,
255
- weight: field.labelStyle === 'heading' ? 'Bolder' : 'Default',
263
+ weight: field.labelStyle === "heading" ? "Bolder" : "Default",
256
264
  wrap: true,
257
265
  separator: field.separator || false,
258
- spacing: field.separator ? 'Large' : 'Default'
266
+ spacing: field.separator ? "Large" : "Default",
259
267
  });
260
268
 
261
269
  // Add input based on type
@@ -270,36 +278,36 @@ export class Form extends AsyncFunction {
270
278
  */
271
279
  private createInputElement(field: FormFieldConfig): AdaptiveCardElement {
272
280
  switch (field.type) {
273
- case 'text':
281
+ case "text":
274
282
  return this.createTextInput(field, false);
275
-
276
- case 'textarea':
283
+
284
+ case "textarea":
277
285
  return this.createTextInput(field, true);
278
-
279
- case 'number':
286
+
287
+ case "number":
280
288
  return this.createNumberInput(field);
281
-
282
- case 'date':
289
+
290
+ case "date":
283
291
  return this.createDateInput(field);
284
-
285
- case 'time':
292
+
293
+ case "time":
286
294
  return this.createTimeInput(field);
287
-
288
- case 'datetime':
295
+
296
+ case "datetime":
289
297
  return this.createDateTimeInputs(field);
290
-
291
- case 'toggle':
298
+
299
+ case "toggle":
292
300
  return this.createToggleInput(field);
293
-
294
- case 'dropdown':
295
- return this.createChoiceSet(field, 'compact');
296
-
297
- case 'radio':
298
- return this.createChoiceSet(field, 'expanded');
299
-
300
- case 'checkbox':
301
- return this.createChoiceSet(field, 'expanded', true);
302
-
301
+
302
+ case "dropdown":
303
+ return this.createChoiceSet(field, "compact");
304
+
305
+ case "radio":
306
+ return this.createChoiceSet(field, "expanded");
307
+
308
+ case "checkbox":
309
+ return this.createChoiceSet(field, "expanded", true);
310
+
303
311
  default:
304
312
  return this.createTextInput(field, false);
305
313
  }
@@ -310,11 +318,11 @@ export class Form extends AsyncFunction {
310
318
  */
311
319
  private createTextInput(field: FormFieldConfig, isMultiLine: boolean): AdaptiveCardElement {
312
320
  const input: AdaptiveCardElement = {
313
- type: 'Input.Text',
321
+ type: "Input.Text",
314
322
  id: field.id,
315
- placeholder: field.placeholder || '',
323
+ placeholder: field.placeholder || "",
316
324
  isMultiline: isMultiLine,
317
- isRequired: field.required || false
325
+ isRequired: field.required || false,
318
326
  };
319
327
 
320
328
  if (field.defaultValue !== undefined) {
@@ -330,7 +338,7 @@ export class Form extends AsyncFunction {
330
338
  }
331
339
 
332
340
  if (isMultiLine) {
333
- input.style = 'text';
341
+ input.style = "text";
334
342
  }
335
343
 
336
344
  return input;
@@ -341,10 +349,10 @@ export class Form extends AsyncFunction {
341
349
  */
342
350
  private createNumberInput(field: FormFieldConfig): AdaptiveCardElement {
343
351
  const input: AdaptiveCardElement = {
344
- type: 'Input.Number',
352
+ type: "Input.Number",
345
353
  id: field.id,
346
- placeholder: field.placeholder || '',
347
- isRequired: field.required || false
354
+ placeholder: field.placeholder || "",
355
+ isRequired: field.required || false,
348
356
  };
349
357
 
350
358
  if (field.defaultValue !== undefined) {
@@ -371,9 +379,9 @@ export class Form extends AsyncFunction {
371
379
  */
372
380
  private createDateInput(field: FormFieldConfig): AdaptiveCardElement {
373
381
  const input: AdaptiveCardElement = {
374
- type: 'Input.Date',
382
+ type: "Input.Date",
375
383
  id: field.id,
376
- isRequired: field.required || false
384
+ isRequired: field.required || false,
377
385
  };
378
386
 
379
387
  if (field.defaultValue !== undefined) {
@@ -392,9 +400,9 @@ export class Form extends AsyncFunction {
392
400
  */
393
401
  private createTimeInput(field: FormFieldConfig): AdaptiveCardElement {
394
402
  const input: AdaptiveCardElement = {
395
- type: 'Input.Time',
403
+ type: "Input.Time",
396
404
  id: field.id,
397
- isRequired: field.required || false
405
+ isRequired: field.required || false,
398
406
  };
399
407
 
400
408
  if (field.defaultValue !== undefined) {
@@ -412,33 +420,39 @@ export class Form extends AsyncFunction {
412
420
  * Creates date and time inputs in a column set for datetime fields.
413
421
  */
414
422
  private createDateTimeInputs(field: FormFieldConfig): AdaptiveCardElement {
415
- const dateValue = field.defaultValue ? String(field.defaultValue).split('T')[0] : undefined;
416
- const timeValue = field.defaultValue ? String(field.defaultValue).split('T')[1]?.substring(0, 5) : undefined;
423
+ const dateValue = field.defaultValue ? String(field.defaultValue).split("T")[0] : undefined;
424
+ const timeValue = field.defaultValue
425
+ ? String(field.defaultValue).split("T")[1]?.substring(0, 5)
426
+ : undefined;
417
427
 
418
428
  return {
419
- type: 'ColumnSet',
429
+ type: "ColumnSet",
420
430
  columns: [
421
431
  {
422
- type: 'Column',
423
- width: 'stretch',
424
- items: [{
425
- type: 'Input.Date',
426
- id: `${field.id}_date`,
427
- isRequired: field.required || false,
428
- value: dateValue
429
- }]
432
+ type: "Column",
433
+ width: "stretch",
434
+ items: [
435
+ {
436
+ type: "Input.Date",
437
+ id: `${field.id}_date`,
438
+ isRequired: field.required || false,
439
+ value: dateValue,
440
+ },
441
+ ],
430
442
  },
431
443
  {
432
- type: 'Column',
433
- width: 'stretch',
434
- items: [{
435
- type: 'Input.Time',
436
- id: `${field.id}_time`,
437
- isRequired: field.required || false,
438
- value: timeValue
439
- }]
440
- }
441
- ]
444
+ type: "Column",
445
+ width: "stretch",
446
+ items: [
447
+ {
448
+ type: "Input.Time",
449
+ id: `${field.id}_time`,
450
+ isRequired: field.required || false,
451
+ value: timeValue,
452
+ },
453
+ ],
454
+ },
455
+ ],
442
456
  };
443
457
  }
444
458
 
@@ -447,16 +461,16 @@ export class Form extends AsyncFunction {
447
461
  */
448
462
  private createToggleInput(field: FormFieldConfig): AdaptiveCardElement {
449
463
  const input: AdaptiveCardElement = {
450
- type: 'Input.Toggle',
464
+ type: "Input.Toggle",
451
465
  id: field.id,
452
466
  title: field.toggleTitle || field.label,
453
- valueOn: 'true',
454
- valueOff: 'false',
455
- isRequired: field.required || false
467
+ valueOn: "true",
468
+ valueOff: "false",
469
+ isRequired: field.required || false,
456
470
  };
457
471
 
458
472
  if (field.defaultValue !== undefined) {
459
- input.value = field.defaultValue ? 'true' : 'false';
473
+ input.value = field.defaultValue ? "true" : "false";
460
474
  }
461
475
 
462
476
  return input;
@@ -467,25 +481,25 @@ export class Form extends AsyncFunction {
467
481
  */
468
482
  private createChoiceSet(
469
483
  field: FormFieldConfig,
470
- style: 'compact' | 'expanded',
484
+ style: "compact" | "expanded",
471
485
  isMultiSelect: boolean = false
472
486
  ): AdaptiveCardElement {
473
487
  const choices = this.normalizeChoices(field.choices || []);
474
488
 
475
489
  const input: AdaptiveCardElement = {
476
- type: 'Input.ChoiceSet',
490
+ type: "Input.ChoiceSet",
477
491
  id: field.id,
478
492
  style: style,
479
493
  isMultiSelect: isMultiSelect,
480
494
  isRequired: field.required || false,
481
- choices: choices
495
+ choices: choices,
482
496
  };
483
497
 
484
498
  if (field.defaultValue !== undefined) {
485
499
  input.value = String(field.defaultValue);
486
500
  }
487
501
 
488
- if (field.placeholder && style === 'compact') {
502
+ if (field.placeholder && style === "compact") {
489
503
  input.placeholder = field.placeholder;
490
504
  }
491
505
 
@@ -495,9 +509,11 @@ export class Form extends AsyncFunction {
495
509
  /**
496
510
  * Normalizes choices to the expected format.
497
511
  */
498
- private normalizeChoices(choices: Array<{ title: string; value: string }> | string[]): Array<{ title: string; value: string }> {
499
- return choices.map(choice => {
500
- if (typeof choice === 'string') {
512
+ private normalizeChoices(
513
+ choices: Array<{ title: string; value: string }> | string[]
514
+ ): Array<{ title: string; value: string }> {
515
+ return choices.map((choice) => {
516
+ if (typeof choice === "string") {
501
517
  return { title: choice, value: choice };
502
518
  }
503
519
  return choice;
@@ -513,12 +529,12 @@ export class Form extends AsyncFunction {
513
529
  // Add submit button
514
530
  const submitConfig = config.submitButton || {};
515
531
  const submitAction: AdaptiveCardAction = {
516
- type: this.getActionType(submitConfig.actionType || 'submit'),
517
- title: submitConfig.title || 'Submit',
518
- style: submitConfig.style || 'positive'
532
+ type: this.getActionType(submitConfig.actionType || "submit"),
533
+ title: submitConfig.title || "Submit",
534
+ style: submitConfig.style || "positive",
519
535
  };
520
536
 
521
- if (submitConfig.actionType === 'openUrl' && submitConfig.url) {
537
+ if (submitConfig.actionType === "openUrl" && submitConfig.url) {
522
538
  submitAction.url = submitConfig.url;
523
539
  }
524
540
 
@@ -527,10 +543,10 @@ export class Form extends AsyncFunction {
527
543
  // Add reset button if requested
528
544
  if (config.showResetButton) {
529
545
  actions.push({
530
- type: 'Action.Submit',
531
- title: 'Reset',
532
- style: 'default',
533
- data: { action: 'reset' }
546
+ type: "Action.Submit",
547
+ title: "Reset",
548
+ style: "default",
549
+ data: { action: "reset" },
534
550
  });
535
551
  }
536
552
 
@@ -540,10 +556,10 @@ export class Form extends AsyncFunction {
540
556
  const action: AdaptiveCardAction = {
541
557
  type: this.getActionType(actionConfig.type),
542
558
  title: actionConfig.title,
543
- style: actionConfig.style || 'default'
559
+ style: actionConfig.style || "default",
544
560
  };
545
561
 
546
- if (actionConfig.type === 'openUrl' && actionConfig.url) {
562
+ if (actionConfig.type === "openUrl" && actionConfig.url) {
547
563
  action.url = actionConfig.url;
548
564
  }
549
565
 
@@ -563,14 +579,14 @@ export class Form extends AsyncFunction {
563
579
  */
564
580
  private getActionType(type: string): string {
565
581
  switch (type) {
566
- case 'submit':
567
- return 'Action.Submit';
568
- case 'openUrl':
569
- return 'Action.OpenUrl';
570
- case 'showCard':
571
- return 'Action.ShowCard';
582
+ case "submit":
583
+ return "Action.Submit";
584
+ case "openUrl":
585
+ return "Action.OpenUrl";
586
+ case "showCard":
587
+ return "Action.ShowCard";
572
588
  default:
573
- return 'Action.Submit';
589
+ return "Action.Submit";
574
590
  }
575
591
  }
576
592
  }