@forzalabs/remora 1.2.11 → 1.3.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.
@@ -91,28 +91,6 @@
91
91
  "type": "string",
92
92
  "description": "If the key is ambiguous, set a 'from' with the name of the producer/consumer to get the key from"
93
93
  },
94
- "grouping": {
95
- "type": "object",
96
- "description": "If set, group resulting items that have the same value for the 'groupingKey'",
97
- "properties": {
98
- "groupingKey": {
99
- "type": "string",
100
- "description": "Used to create hierarchical data structure (parent -> children)"
101
- },
102
- "subFields": {
103
- "type": "array",
104
- "description": "Recursive structure defining fields that should be pulled inside this grouped field",
105
- "items": {
106
- "$ref": "#/definitions/consumerField"
107
- }
108
- }
109
- },
110
- "required": [
111
- "groupingKey",
112
- "subFields"
113
- ],
114
- "additionalProperties": false
115
- },
116
94
  "transform": {
117
95
  "description": "Optional list of transformations to apply to the dataset before returning the data",
118
96
  "oneOf": [
@@ -139,43 +117,126 @@
139
117
  "description": "The validation rule to check",
140
118
  "oneOf": [
141
119
  {
142
- "properties": { "min": { "type": "number", "description": "Minimum value for numeric fields" } },
143
- "required": ["min"],
120
+ "properties": {
121
+ "min": {
122
+ "type": "number",
123
+ "description": "Minimum value for numeric fields"
124
+ }
125
+ },
126
+ "required": [
127
+ "min"
128
+ ],
144
129
  "additionalProperties": false
145
130
  },
146
131
  {
147
- "properties": { "max": { "type": "number", "description": "Maximum value for numeric fields" } },
148
- "required": ["max"],
132
+ "properties": {
133
+ "max": {
134
+ "type": "number",
135
+ "description": "Maximum value for numeric fields"
136
+ }
137
+ },
138
+ "required": [
139
+ "max"
140
+ ],
149
141
  "additionalProperties": false
150
142
  },
151
143
  {
152
- "properties": { "regex": { "type": "string", "description": "Regular expression pattern to validate string fields" } },
153
- "required": ["regex"],
144
+ "properties": {
145
+ "regex": {
146
+ "type": "string",
147
+ "description": "Regular expression pattern to validate string fields"
148
+ }
149
+ },
150
+ "required": [
151
+ "regex"
152
+ ],
154
153
  "additionalProperties": false
155
154
  },
156
155
  {
157
- "properties": { "required": { "type": "boolean", "const": true, "description": "Whether the field value must be present" } },
158
- "required": ["required"],
156
+ "properties": {
157
+ "required": {
158
+ "type": "boolean",
159
+ "const": true,
160
+ "description": "Whether the field value must be present"
161
+ }
162
+ },
163
+ "required": [
164
+ "required"
165
+ ],
159
166
  "additionalProperties": false
160
167
  },
161
168
  {
162
- "properties": { "min_length": { "type": "number", "description": "Minimum string length" } },
163
- "required": ["min_length"],
169
+ "properties": {
170
+ "min_length": {
171
+ "type": "number",
172
+ "description": "Minimum string length"
173
+ }
174
+ },
175
+ "required": [
176
+ "min_length"
177
+ ],
164
178
  "additionalProperties": false
165
179
  },
166
180
  {
167
- "properties": { "max_length": { "type": "number", "description": "Maximum string length" } },
168
- "required": ["max_length"],
181
+ "properties": {
182
+ "max_length": {
183
+ "type": "number",
184
+ "description": "Maximum string length"
185
+ }
186
+ },
187
+ "required": [
188
+ "max_length"
189
+ ],
169
190
  "additionalProperties": false
170
191
  },
171
192
  {
172
- "properties": { "in": { "type": "array", "items": { "oneOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }] }, "description": "Allowed values" } },
173
- "required": ["in"],
193
+ "properties": {
194
+ "in": {
195
+ "type": "array",
196
+ "items": {
197
+ "oneOf": [
198
+ {
199
+ "type": "string"
200
+ },
201
+ {
202
+ "type": "number"
203
+ },
204
+ {
205
+ "type": "boolean"
206
+ }
207
+ ]
208
+ },
209
+ "description": "Allowed values"
210
+ }
211
+ },
212
+ "required": [
213
+ "in"
214
+ ],
174
215
  "additionalProperties": false
175
216
  },
176
217
  {
177
- "properties": { "not_in": { "type": "array", "items": { "oneOf": [{ "type": "string" }, { "type": "number" }, { "type": "boolean" }] }, "description": "Disallowed values" } },
178
- "required": ["not_in"],
218
+ "properties": {
219
+ "not_in": {
220
+ "type": "array",
221
+ "items": {
222
+ "oneOf": [
223
+ {
224
+ "type": "string"
225
+ },
226
+ {
227
+ "type": "number"
228
+ },
229
+ {
230
+ "type": "boolean"
231
+ }
232
+ ]
233
+ },
234
+ "description": "Disallowed values"
235
+ }
236
+ },
237
+ "required": [
238
+ "not_in"
239
+ ],
179
240
  "additionalProperties": false
180
241
  }
181
242
  ]
@@ -183,17 +244,29 @@
183
244
  "onFail": {
184
245
  "type": "string",
185
246
  "description": "Action to take when validation fails",
186
- "enum": ["fail", "skip", "warn", "set_default"]
247
+ "enum": [
248
+ "fail",
249
+ "skip",
250
+ "warn",
251
+ "set_default"
252
+ ]
187
253
  }
188
254
  },
189
- "required": ["rule", "onFail"],
255
+ "required": [
256
+ "rule",
257
+ "onFail"
258
+ ],
190
259
  "additionalProperties": false
191
260
  }
192
261
  },
193
262
  "onError": {
194
263
  "type": "string",
195
264
  "description": "Action to take if an error occurs during transformations",
196
- "enum": ["set_default", "skip", "fail"]
265
+ "enum": [
266
+ "set_default",
267
+ "skip",
268
+ "fail"
269
+ ]
197
270
  },
198
271
  "default": {
199
272
  "description": "Default value of the field if it is missing (or on error if specified)"
@@ -231,21 +304,12 @@
231
304
  "format": {
232
305
  "type": "string",
233
306
  "enum": [
234
- "SQL",
235
307
  "API",
236
308
  "CSV",
237
- "PARQUET",
238
- "JSON"
309
+ "JSON",
310
+ "TXT"
239
311
  ],
240
- "description": "The output format of the consumer"
241
- },
242
- "accelerated": {
243
- "type": "boolean",
244
- "description": "If true and supported, the consumer will be materialized to improve query performance"
245
- },
246
- "direct": {
247
- "type": "boolean",
248
- "description": "If true, no view is created on the consumer side due to permission limitations"
312
+ "description": "The output format of the consumer. JSON/CSV/TXT export to a file destination; API exposes the result over the API."
249
313
  },
250
314
  "exportDestination": {
251
315
  "type": "string",
@@ -255,6 +319,10 @@
255
319
  "type": "string",
256
320
  "description": "If the format is a file, forces the same name in the export file (extension is auto-added)"
257
321
  },
322
+ "delimiter": {
323
+ "type": "string",
324
+ "description": "Only used when the format is 'TXT'. The single-character delimiter used between fields in the exported file. Defaults to a tab if not set."
325
+ },
258
326
  "trigger": {
259
327
  "type": "object",
260
328
  "description": "Triggers to perform the export (not just the usual 'Deploy')",
@@ -299,6 +367,28 @@
299
367
  "sessionToken": {
300
368
  "type": "string",
301
369
  "description": "AWS session token for temporary credentials (for QUEUE triggers)"
370
+ },
371
+ "method": {
372
+ "type": "string",
373
+ "enum": [
374
+ "access-secret-key",
375
+ "arn",
376
+ "implicit",
377
+ "iam"
378
+ ],
379
+ "description": "Credential method for the queue (QUEUE triggers). 'arn' assumes an IAM role via STS; 'implicit'/'iam' use the AWS SDK default chain (instance/task role); omit or 'access-secret-key' to use static keys."
380
+ },
381
+ "roleArn": {
382
+ "type": "string",
383
+ "description": "ARN of the IAM role to assume via STS when method is 'arn' (for QUEUE triggers)."
384
+ },
385
+ "roleSessionName": {
386
+ "type": "string",
387
+ "description": "Session name for the assumed-role credentials when method is 'arn' (for QUEUE triggers). Defaults to 'remora'."
388
+ },
389
+ "externalId": {
390
+ "type": "string",
391
+ "description": "Optional STS ExternalId for third-party / cross-account trust when method is 'arn' (for QUEUE triggers)."
302
392
  }
303
393
  },
304
394
  "additionalProperties": {
@@ -435,7 +525,12 @@
435
525
  "properties": {
436
526
  "strategy": {
437
527
  "type": "string",
438
- "enum": ["first", "last", "min", "max"],
528
+ "enum": [
529
+ "first",
530
+ "last",
531
+ "min",
532
+ "max"
533
+ ],
439
534
  "description": "Strategy for resolving which record to keep. 'first': Keep the first record based on orderBy field. 'last': Keep the last record based on orderBy field. 'min': Keep the record with the minimum value in orderBy field. 'max': Keep the record with the maximum value in orderBy field."
440
535
  },
441
536
  "orderBy": {
@@ -444,16 +539,24 @@
444
539
  },
445
540
  "direction": {
446
541
  "type": "string",
447
- "enum": ["asc", "desc"],
542
+ "enum": [
543
+ "asc",
544
+ "desc"
545
+ ],
448
546
  "default": "asc",
449
547
  "description": "For 'first' and 'last' strategies, the sort direction."
450
548
  }
451
549
  },
452
- "required": ["strategy"],
550
+ "required": [
551
+ "strategy"
552
+ ],
453
553
  "additionalProperties": false
454
554
  }
455
555
  },
456
- "required": ["keys", "resolution"],
556
+ "required": [
557
+ "keys",
558
+ "resolution"
559
+ ],
457
560
  "additionalProperties": false
458
561
  },
459
562
  "pivot": {
@@ -478,7 +581,13 @@
478
581
  },
479
582
  "aggregation": {
480
583
  "type": "string",
481
- "enum": ["sum", "count", "avg", "min", "max"],
584
+ "enum": [
585
+ "sum",
586
+ "count",
587
+ "avg",
588
+ "min",
589
+ "max"
590
+ ],
482
591
  "description": "The aggregation function to apply when combining values."
483
592
  },
484
593
  "pivotValues": {
@@ -493,7 +602,12 @@
493
602
  "description": "Optional prefix for the generated pivot column names (e.g. 'revenue_' produces 'revenue_East', 'revenue_West')."
494
603
  }
495
604
  },
496
- "required": ["rowKeys", "pivotColumn", "valueColumn", "aggregation"],
605
+ "required": [
606
+ "rowKeys",
607
+ "pivotColumn",
608
+ "valueColumn",
609
+ "aggregation"
610
+ ],
497
611
  "additionalProperties": false
498
612
  }
499
613
  },
@@ -503,6 +617,10 @@
503
617
  "type": "string",
504
618
  "description": "The name of the JSON schema in this project that this consumer needs to adhere to"
505
619
  },
620
+ "maximumFileSize": {
621
+ "type": "number",
622
+ "description": "The maximum size of each output file, expressed in Gb. When the current output file exceeds this size it is rotated and a new file is started."
623
+ },
506
624
  "_version": {
507
625
  "type": "number",
508
626
  "description": "Version number of the consumer configuration"
@@ -518,28 +636,69 @@
518
636
  "description": "The dataset validation rule to check",
519
637
  "oneOf": [
520
638
  {
521
- "properties": { "unique_fields": { "type": "array", "items": { "type": "string" }, "minItems": 1, "description": "Field(s) that must have unique values across the dataset" } },
522
- "required": ["unique_fields"],
639
+ "properties": {
640
+ "unique_fields": {
641
+ "type": "array",
642
+ "items": {
643
+ "type": "string"
644
+ },
645
+ "minItems": 1,
646
+ "description": "Field(s) that must have unique values across the dataset"
647
+ }
648
+ },
649
+ "required": [
650
+ "unique_fields"
651
+ ],
523
652
  "additionalProperties": false
524
653
  },
525
654
  {
526
- "properties": { "min_rows": { "type": "number", "description": "Minimum number of rows expected in the dataset" } },
527
- "required": ["min_rows"],
655
+ "properties": {
656
+ "min_rows": {
657
+ "type": "number",
658
+ "description": "Minimum number of rows expected in the dataset"
659
+ }
660
+ },
661
+ "required": [
662
+ "min_rows"
663
+ ],
528
664
  "additionalProperties": false
529
665
  },
530
666
  {
531
- "properties": { "max_rows": { "type": "number", "description": "Maximum number of rows allowed in the dataset" } },
532
- "required": ["max_rows"],
667
+ "properties": {
668
+ "max_rows": {
669
+ "type": "number",
670
+ "description": "Maximum number of rows allowed in the dataset"
671
+ }
672
+ },
673
+ "required": [
674
+ "max_rows"
675
+ ],
533
676
  "additionalProperties": false
534
677
  },
535
678
  {
536
- "properties": { "no_duplicates": { "type": "boolean", "const": true, "description": "No fully duplicate rows allowed" } },
537
- "required": ["no_duplicates"],
679
+ "properties": {
680
+ "no_duplicates": {
681
+ "type": "boolean",
682
+ "const": true,
683
+ "description": "No fully duplicate rows allowed"
684
+ }
685
+ },
686
+ "required": [
687
+ "no_duplicates"
688
+ ],
538
689
  "additionalProperties": false
539
690
  },
540
691
  {
541
- "properties": { "not_empty": { "type": "boolean", "const": true, "description": "Dataset must contain at least one row" } },
542
- "required": ["not_empty"],
692
+ "properties": {
693
+ "not_empty": {
694
+ "type": "boolean",
695
+ "const": true,
696
+ "description": "Dataset must contain at least one row"
697
+ }
698
+ },
699
+ "required": [
700
+ "not_empty"
701
+ ],
543
702
  "additionalProperties": false
544
703
  }
545
704
  ]
@@ -547,10 +706,16 @@
547
706
  "onFail": {
548
707
  "type": "string",
549
708
  "description": "Action to take when dataset validation fails",
550
- "enum": ["fail", "warn"]
709
+ "enum": [
710
+ "fail",
711
+ "warn"
712
+ ]
551
713
  }
552
714
  },
553
- "required": ["rule", "onFail"],
715
+ "required": [
716
+ "rule",
717
+ "onFail"
718
+ ],
554
719
  "additionalProperties": false
555
720
  }
556
721
  }
@@ -563,145 +728,121 @@
563
728
  ],
564
729
  "additionalProperties": false,
565
730
  "definitions": {
566
- "consumerField": {
567
- "type": "object",
568
- "properties": {
569
- "key": {
570
- "type": "string",
571
- "description": "The dimension/measure of the producer OR '*'. If '*' then return all dimensions"
572
- },
573
- "alias": {
574
- "type": "string",
575
- "description": "If set, changes the key returned by the consumer to this alias"
576
- },
577
- "from": {
578
- "type": "string",
579
- "description": "If the key is ambiguous, set a 'from' with the name of the producer/consumer to get the key from"
580
- },
581
- "grouping": {
731
+ "singleTransformation": {
732
+ "oneOf": [
733
+ {
582
734
  "type": "object",
583
- "description": "If set, group resulting items that have the same value for the 'groupingKey'",
584
735
  "properties": {
585
- "groupingKey": {
736
+ "cast": {
586
737
  "type": "string",
587
- "description": "Used to create hierarchical data structure (parent -> children)"
738
+ "description": "Cast the value to a specific type",
739
+ "enum": [
740
+ "string",
741
+ "number",
742
+ "datetime",
743
+ "boolean"
744
+ ]
588
745
  },
589
- "subFields": {
590
- "type": "array",
591
- "description": "Recursive structure defining fields that should be pulled inside this grouped field",
592
- "items": {
593
- "$ref": "#/definitions/consumerField"
594
- }
746
+ "format": {
747
+ "type": "string",
748
+ "description": "Optional format for date parsing or string formatting (e.g. YYYY-MM-DD, DD/MM/YY)"
595
749
  }
596
750
  },
597
751
  "required": [
598
- "groupingKey",
599
- "subFields"
752
+ "cast"
600
753
  ],
601
754
  "additionalProperties": false
602
755
  },
603
- "transform": {
604
- "description": "Optional list of transformations to apply to the dataset before returning the data",
605
- "oneOf": [
606
- {
607
- "$ref": "#/definitions/singleTransformation"
608
- },
609
- {
610
- "type": "array",
611
- "items": {
612
- "$ref": "#/definitions/singleTransformation"
613
- },
614
- "description": "A list of transformations to be applied in sequence"
615
- }
616
- ]
617
- },
618
- "validate": {
756
+ {
619
757
  "type": "object",
620
- "description": "Rules to check field value compliance and data quality",
621
758
  "properties": {
622
- "min": {
623
- "type": "number",
624
- "description": "Minimum value for numeric fields"
625
- },
626
- "max": {
627
- "type": "number",
628
- "description": "Maximum value for numeric fields"
629
- },
630
- "regex": {
631
- "type": "string",
632
- "description": "Regular expression pattern to validate string fields"
633
- },
634
- "required": {
635
- "type": "boolean",
636
- "description": "Whether the field is required"
759
+ "multiply": {
760
+ "oneOf": [
761
+ {
762
+ "type": "number"
763
+ },
764
+ {
765
+ "type": "string",
766
+ "pattern": "^\\$"
767
+ }
768
+ ],
769
+ "description": "Multiply the numeric value by this factor. Use \"$fieldName\" to multiply by another field's value."
637
770
  }
638
771
  },
772
+ "required": [
773
+ "multiply"
774
+ ],
639
775
  "additionalProperties": false
640
776
  },
641
- "onError": {
642
- "type": "string",
643
- "description": "Action to take if an error occurs during transformations or validation",
644
- "enum": ["set_default", "skip", "fail"]
645
- },
646
- "default": {
647
- "description": "Default value of the field if it is missing (or on error if specified)"
648
- },
649
- "hidden": {
650
- "type": "boolean",
651
- "description": "If set, the field is kept and used during processing, but omitted when exporting the data"
652
- },
653
- "fixed": {
654
- "type": "boolean",
655
- "description": "If set, \"default\" must have a value. This field is not searched in the underlying dataset, but is a fixed value set by the \"default\" prop."
656
- },
657
- "copyFrom": {
658
- "type": "string",
659
- "description": "If set, this field will be added as new to the consumer dataset and will be a copy of the specified field. Use the alias if set, otherwise the key. The source field should come before this field in the fields list."
660
- }
661
- },
662
- "required": [
663
- "key"
664
- ],
665
- "additionalProperties": false
666
- },
667
- "singleTransformation": {
668
- "oneOf": [
669
777
  {
670
778
  "type": "object",
671
779
  "properties": {
672
- "cast": {
673
- "type": "string",
674
- "description": "Cast the value to a specific type",
675
- "enum": ["string", "number", "datetime", "boolean"]
676
- },
677
- "format": {
678
- "type": "string",
679
- "description": "Optional format for date parsing or string formatting (e.g. YYYY-MM-DD, DD/MM/YY)"
780
+ "multiplyBy": {
781
+ "type": "object",
782
+ "properties": {
783
+ "fields": {
784
+ "type": "array",
785
+ "items": {
786
+ "type": "string"
787
+ },
788
+ "description": "Field names whose values are multiplied together."
789
+ }
790
+ },
791
+ "required": [
792
+ "fields"
793
+ ],
794
+ "additionalProperties": false
680
795
  }
681
796
  },
682
- "required": ["cast"],
797
+ "required": [
798
+ "multiplyBy"
799
+ ],
683
800
  "additionalProperties": false
684
801
  },
685
802
  {
686
803
  "type": "object",
687
804
  "properties": {
688
- "multiply": {
689
- "type": "number",
690
- "description": "Multiply the numeric value by this factor"
805
+ "add": {
806
+ "oneOf": [
807
+ {
808
+ "type": "number"
809
+ },
810
+ {
811
+ "type": "string",
812
+ "pattern": "^\\$"
813
+ }
814
+ ],
815
+ "description": "Add this number to the numeric value. Use \"$fieldName\" to add another field's value."
691
816
  }
692
817
  },
693
- "required": ["multiply"],
818
+ "required": [
819
+ "add"
820
+ ],
694
821
  "additionalProperties": false
695
822
  },
696
823
  {
697
824
  "type": "object",
698
825
  "properties": {
699
- "add": {
700
- "type": "number",
701
- "description": "Add this number to the numeric value"
826
+ "addBy": {
827
+ "type": "object",
828
+ "properties": {
829
+ "fields": {
830
+ "type": "array",
831
+ "items": {
832
+ "type": "string"
833
+ },
834
+ "description": "Field names whose values are added together."
835
+ }
836
+ },
837
+ "required": [
838
+ "fields"
839
+ ],
840
+ "additionalProperties": false
702
841
  }
703
842
  },
704
- "required": ["add"],
843
+ "required": [
844
+ "addBy"
845
+ ],
705
846
  "additionalProperties": false
706
847
  },
707
848
  {
@@ -709,11 +850,19 @@
709
850
  "properties": {
710
851
  "extract": {
711
852
  "type": "string",
712
- "enum": ["year", "month", "day", "hour", "minute"],
853
+ "enum": [
854
+ "year",
855
+ "month",
856
+ "day",
857
+ "hour",
858
+ "minute"
859
+ ],
713
860
  "description": "Extract a component from a date value"
714
861
  }
715
862
  },
716
- "required": ["extract"],
863
+ "required": [
864
+ "extract"
865
+ ],
717
866
  "additionalProperties": false
718
867
  },
719
868
  {
@@ -727,11 +876,15 @@
727
876
  "description": "The separator to use when joining array elements"
728
877
  }
729
878
  },
730
- "required": ["separator"],
879
+ "required": [
880
+ "separator"
881
+ ],
731
882
  "additionalProperties": false
732
883
  }
733
884
  },
734
- "required": ["concat"],
885
+ "required": [
886
+ "concat"
887
+ ],
735
888
  "additionalProperties": false
736
889
  },
737
890
  {
@@ -749,11 +902,16 @@
749
902
  "description": "The index of the split part to keep"
750
903
  }
751
904
  },
752
- "required": ["separator", "index"],
905
+ "required": [
906
+ "separator",
907
+ "index"
908
+ ],
753
909
  "additionalProperties": false
754
910
  }
755
911
  },
756
- "required": ["split"],
912
+ "required": [
913
+ "split"
914
+ ],
757
915
  "additionalProperties": false
758
916
  },
759
917
  {
@@ -771,11 +929,15 @@
771
929
  "description": "Regex flags (e.g., 'i' for case-insensitive)"
772
930
  }
773
931
  },
774
- "required": ["pattern"],
932
+ "required": [
933
+ "pattern"
934
+ ],
775
935
  "additionalProperties": false
776
936
  }
777
937
  },
778
- "required": ["regex_match"],
938
+ "required": [
939
+ "regex_match"
940
+ ],
779
941
  "additionalProperties": false
780
942
  },
781
943
  {
@@ -797,11 +959,16 @@
797
959
  "description": "Regex flags (e.g., 'g' for global)"
798
960
  }
799
961
  },
800
- "required": ["pattern", "replacement"],
962
+ "required": [
963
+ "pattern",
964
+ "replacement"
965
+ ],
801
966
  "additionalProperties": false
802
967
  }
803
968
  },
804
- "required": ["regex_replace"],
969
+ "required": [
970
+ "regex_replace"
971
+ ],
805
972
  "additionalProperties": false
806
973
  },
807
974
  {
@@ -823,11 +990,16 @@
823
990
  "description": "Regex flags (e.g., 'i' for case-insensitive)"
824
991
  }
825
992
  },
826
- "required": ["pattern", "group"],
993
+ "required": [
994
+ "pattern",
995
+ "group"
996
+ ],
827
997
  "additionalProperties": false
828
998
  }
829
999
  },
830
- "required": ["regex_extract"],
1000
+ "required": [
1001
+ "regex_extract"
1002
+ ],
831
1003
  "additionalProperties": false
832
1004
  },
833
1005
  {
@@ -838,7 +1010,9 @@
838
1010
  "description": "Trim whitespace from both ends of the string"
839
1011
  }
840
1012
  },
841
- "required": ["trim"],
1013
+ "required": [
1014
+ "trim"
1015
+ ],
842
1016
  "additionalProperties": false
843
1017
  },
844
1018
  {
@@ -849,7 +1023,9 @@
849
1023
  "description": "Convert string to lowercase"
850
1024
  }
851
1025
  },
852
- "required": ["to_lowercase"],
1026
+ "required": [
1027
+ "to_lowercase"
1028
+ ],
853
1029
  "additionalProperties": false
854
1030
  },
855
1031
  {
@@ -860,7 +1036,9 @@
860
1036
  "description": "Convert string to uppercase"
861
1037
  }
862
1038
  },
863
- "required": ["to_uppercase"],
1039
+ "required": [
1040
+ "to_uppercase"
1041
+ ],
864
1042
  "additionalProperties": false
865
1043
  },
866
1044
  {
@@ -871,7 +1049,9 @@
871
1049
  "description": "Capitalize the first letter of the string"
872
1050
  }
873
1051
  },
874
- "required": ["capitalize"],
1052
+ "required": [
1053
+ "capitalize"
1054
+ ],
875
1055
  "additionalProperties": false
876
1056
  },
877
1057
  {
@@ -889,11 +1069,15 @@
889
1069
  "description": "Optional ending position of substring"
890
1070
  }
891
1071
  },
892
- "required": ["start"],
1072
+ "required": [
1073
+ "start"
1074
+ ],
893
1075
  "additionalProperties": false
894
1076
  }
895
1077
  },
896
- "required": ["substring"],
1078
+ "required": [
1079
+ "substring"
1080
+ ],
897
1081
  "additionalProperties": false
898
1082
  },
899
1083
  {
@@ -913,11 +1097,16 @@
913
1097
  "maxLength": 1
914
1098
  }
915
1099
  },
916
- "required": ["length", "char"],
1100
+ "required": [
1101
+ "length",
1102
+ "char"
1103
+ ],
917
1104
  "additionalProperties": false
918
1105
  }
919
1106
  },
920
- "required": ["pad_start"],
1107
+ "required": [
1108
+ "pad_start"
1109
+ ],
921
1110
  "additionalProperties": false
922
1111
  },
923
1112
  {
@@ -937,11 +1126,16 @@
937
1126
  "maxLength": 1
938
1127
  }
939
1128
  },
940
- "required": ["length", "char"],
1129
+ "required": [
1130
+ "length",
1131
+ "char"
1132
+ ],
941
1133
  "additionalProperties": false
942
1134
  }
943
1135
  },
944
- "required": ["pad_end"],
1136
+ "required": [
1137
+ "pad_end"
1138
+ ],
945
1139
  "additionalProperties": false
946
1140
  },
947
1141
  {
@@ -949,10 +1143,12 @@
949
1143
  "properties": {
950
1144
  "prepend": {
951
1145
  "type": "string",
952
- "description": "String to add at the beginning"
1146
+ "description": "String to add at the beginning. Use \"$fieldName\" to prepend another field's value (\"$$\" escapes a literal leading $)."
953
1147
  }
954
1148
  },
955
- "required": ["prepend"],
1149
+ "required": [
1150
+ "prepend"
1151
+ ],
956
1152
  "additionalProperties": false
957
1153
  },
958
1154
  {
@@ -960,10 +1156,12 @@
960
1156
  "properties": {
961
1157
  "append": {
962
1158
  "type": "string",
963
- "description": "String to add at the end"
1159
+ "description": "String to add at the end. Use \"$fieldName\" to append another field's value (\"$$\" escapes a literal leading $)."
964
1160
  }
965
1161
  },
966
- "required": ["append"],
1162
+ "required": [
1163
+ "append"
1164
+ ],
967
1165
  "additionalProperties": false
968
1166
  },
969
1167
  {
@@ -989,11 +1187,15 @@
989
1187
  "description": "Optional template string with placeholders like '{field1} - {field2}'"
990
1188
  }
991
1189
  },
992
- "required": ["fields"],
1190
+ "required": [
1191
+ "fields"
1192
+ ],
993
1193
  "additionalProperties": false
994
1194
  }
995
1195
  },
996
- "required": ["combine_fields"],
1196
+ "required": [
1197
+ "combine_fields"
1198
+ ],
997
1199
  "additionalProperties": false
998
1200
  },
999
1201
  {
@@ -1013,34 +1215,55 @@
1013
1215
  "$ref": "#/definitions/comparisonCondition"
1014
1216
  },
1015
1217
  "then": {
1016
- "description": "The value to return if the condition matches",
1218
+ "description": "The value to return if the condition matches. Use \"$fieldName\" to return another field's value.",
1017
1219
  "oneOf": [
1018
- { "type": "string" },
1019
- { "type": "number" },
1020
- { "type": "boolean" }
1220
+ {
1221
+ "type": "string"
1222
+ },
1223
+ {
1224
+ "type": "number"
1225
+ },
1226
+ {
1227
+ "type": "boolean"
1228
+ }
1021
1229
  ]
1022
1230
  }
1023
1231
  },
1024
- "required": ["if", "then"],
1232
+ "required": [
1233
+ "if",
1234
+ "then"
1235
+ ],
1025
1236
  "additionalProperties": false
1026
1237
  },
1027
1238
  "minItems": 1
1028
1239
  },
1029
1240
  "else": {
1030
- "description": "Default value if no clause matches. If not specified, the original value is kept.",
1241
+ "description": "Default value if no clause matches. If not specified, the original value is kept. Use \"$fieldName\" to return another field's value.",
1031
1242
  "oneOf": [
1032
- { "type": "string" },
1033
- { "type": "number" },
1034
- { "type": "boolean" },
1035
- { "type": "null" }
1243
+ {
1244
+ "type": "string"
1245
+ },
1246
+ {
1247
+ "type": "number"
1248
+ },
1249
+ {
1250
+ "type": "boolean"
1251
+ },
1252
+ {
1253
+ "type": "null"
1254
+ }
1036
1255
  ]
1037
1256
  }
1038
1257
  },
1039
- "required": ["clauses"],
1258
+ "required": [
1259
+ "clauses"
1260
+ ],
1040
1261
  "additionalProperties": false
1041
1262
  }
1042
1263
  },
1043
- "required": ["conditional"],
1264
+ "required": [
1265
+ "conditional"
1266
+ ],
1044
1267
  "additionalProperties": false
1045
1268
  },
1046
1269
  {
@@ -1059,40 +1282,67 @@
1059
1282
  "when": {
1060
1283
  "description": "The value to match against (strict equality)",
1061
1284
  "oneOf": [
1062
- { "type": "string" },
1063
- { "type": "number" },
1064
- { "type": "boolean" }
1285
+ {
1286
+ "type": "string"
1287
+ },
1288
+ {
1289
+ "type": "number"
1290
+ },
1291
+ {
1292
+ "type": "boolean"
1293
+ }
1065
1294
  ]
1066
1295
  },
1067
1296
  "then": {
1068
- "description": "The value to return if the case matches",
1297
+ "description": "The value to return if the case matches. Use \"$fieldName\" to return another field's value.",
1069
1298
  "oneOf": [
1070
- { "type": "string" },
1071
- { "type": "number" },
1072
- { "type": "boolean" }
1299
+ {
1300
+ "type": "string"
1301
+ },
1302
+ {
1303
+ "type": "number"
1304
+ },
1305
+ {
1306
+ "type": "boolean"
1307
+ }
1073
1308
  ]
1074
1309
  }
1075
1310
  },
1076
- "required": ["when", "then"],
1311
+ "required": [
1312
+ "when",
1313
+ "then"
1314
+ ],
1077
1315
  "additionalProperties": false
1078
1316
  },
1079
1317
  "minItems": 1
1080
1318
  },
1081
1319
  "default": {
1082
- "description": "Default value if no case matches. If not specified, the original value is kept.",
1320
+ "description": "Default value if no case matches. If not specified, the original value is kept. Use \"$fieldName\" to return another field's value.",
1083
1321
  "oneOf": [
1084
- { "type": "string" },
1085
- { "type": "number" },
1086
- { "type": "boolean" },
1087
- { "type": "null" }
1322
+ {
1323
+ "type": "string"
1324
+ },
1325
+ {
1326
+ "type": "number"
1327
+ },
1328
+ {
1329
+ "type": "boolean"
1330
+ },
1331
+ {
1332
+ "type": "null"
1333
+ }
1088
1334
  ]
1089
1335
  }
1090
1336
  },
1091
- "required": ["cases"],
1337
+ "required": [
1338
+ "cases"
1339
+ ],
1092
1340
  "additionalProperties": false
1093
1341
  }
1094
1342
  },
1095
- "required": ["switch_case"],
1343
+ "required": [
1344
+ "switch_case"
1345
+ ],
1096
1346
  "additionalProperties": false
1097
1347
  },
1098
1348
  {
@@ -1100,11 +1350,129 @@
1100
1350
  "properties": {
1101
1351
  "mask": {
1102
1352
  "type": "string",
1103
- "enum": ["hash", "mask", "crypt", "random", "seeded-random", "none"],
1353
+ "enum": [
1354
+ "hash",
1355
+ "mask",
1356
+ "crypt",
1357
+ "random",
1358
+ "seeded-random",
1359
+ "none"
1360
+ ],
1104
1361
  "description": "Apply masking to the field value for data privacy. Options: 'hash' (one-way hash), 'mask' (replace with asterisks), 'crypt' (reversible encryption), 'random' (random value), 'seeded-random' (consistent random value per input), 'none' (no masking)"
1105
1362
  }
1106
1363
  },
1107
- "required": ["mask"],
1364
+ "required": [
1365
+ "mask"
1366
+ ],
1367
+ "additionalProperties": false
1368
+ },
1369
+ {
1370
+ "type": "object",
1371
+ "properties": {
1372
+ "bit_extract": {
1373
+ "type": "object",
1374
+ "properties": {
1375
+ "position": {
1376
+ "type": "integer",
1377
+ "minimum": 0,
1378
+ "maximum": 52,
1379
+ "description": "0-based bit index to extract from the integer bitmask (least-significant bit = 0)"
1380
+ },
1381
+ "as_boolean": {
1382
+ "type": "boolean",
1383
+ "description": "Return true/false instead of 1/0"
1384
+ }
1385
+ },
1386
+ "required": [
1387
+ "position"
1388
+ ],
1389
+ "additionalProperties": false
1390
+ }
1391
+ },
1392
+ "required": [
1393
+ "bit_extract"
1394
+ ],
1395
+ "additionalProperties": false
1396
+ },
1397
+ {
1398
+ "type": "object",
1399
+ "properties": {
1400
+ "date_format": {
1401
+ "type": "object",
1402
+ "properties": {
1403
+ "input_fmt": {
1404
+ "type": "string",
1405
+ "description": "dayjs tokens describing the source date string, e.g. DDMMYYYY"
1406
+ },
1407
+ "output_fmt": {
1408
+ "type": "string",
1409
+ "description": "dayjs tokens for the output date string, e.g. YYYY-MM-DD"
1410
+ },
1411
+ "strict": {
1412
+ "type": "boolean",
1413
+ "description": "Strict parsing of the input format (default true)"
1414
+ }
1415
+ },
1416
+ "required": [
1417
+ "input_fmt",
1418
+ "output_fmt"
1419
+ ],
1420
+ "additionalProperties": false
1421
+ }
1422
+ },
1423
+ "required": [
1424
+ "date_format"
1425
+ ],
1426
+ "additionalProperties": false
1427
+ },
1428
+ {
1429
+ "type": "object",
1430
+ "description": "Map a code to a value using the output of another consumer as the lookup table. The referenced consumer is executed to build a code->value table; keep it small and cheap.",
1431
+ "properties": {
1432
+ "code_lookup": {
1433
+ "type": "object",
1434
+ "properties": {
1435
+ "consumer": {
1436
+ "type": "string",
1437
+ "description": "Name of the consumer whose output is the lookup table"
1438
+ },
1439
+ "key": {
1440
+ "type": "string",
1441
+ "description": "Field in that consumer's output used as the map key (the code)"
1442
+ },
1443
+ "value": {
1444
+ "type": "string",
1445
+ "description": "Field in that consumer's output returned as the mapped value"
1446
+ },
1447
+ "default": {
1448
+ "description": "Value returned when the code is not found. If omitted, the field's onError policy applies.",
1449
+ "oneOf": [
1450
+ {
1451
+ "type": "string"
1452
+ },
1453
+ {
1454
+ "type": "number"
1455
+ },
1456
+ {
1457
+ "type": "boolean"
1458
+ },
1459
+ {
1460
+ "type": "null"
1461
+ }
1462
+ ]
1463
+ }
1464
+ },
1465
+ "required": [
1466
+ "consumer",
1467
+ "key",
1468
+ "value"
1469
+ ],
1470
+ "additionalProperties": false
1471
+ }
1472
+ },
1473
+ "required": [
1474
+ "code_lookup"
1475
+ ],
1108
1476
  "additionalProperties": false
1109
1477
  }
1110
1478
  ]
@@ -1117,11 +1485,21 @@
1117
1485
  "description": "Check if the numeric value is greater than the specified number",
1118
1486
  "properties": {
1119
1487
  "greater_than": {
1120
- "type": "number",
1121
- "description": "The value must be greater than this number"
1488
+ "oneOf": [
1489
+ {
1490
+ "type": "number"
1491
+ },
1492
+ {
1493
+ "type": "string",
1494
+ "pattern": "^\\$"
1495
+ }
1496
+ ],
1497
+ "description": "The value must be greater than this number. Use \"$fieldName\" to compare against another field's value."
1122
1498
  }
1123
1499
  },
1124
- "required": ["greater_than"],
1500
+ "required": [
1501
+ "greater_than"
1502
+ ],
1125
1503
  "additionalProperties": false
1126
1504
  },
1127
1505
  {
@@ -1129,11 +1507,21 @@
1129
1507
  "description": "Check if the numeric value is greater than or equal to the specified number",
1130
1508
  "properties": {
1131
1509
  "greater_than_or_equal": {
1132
- "type": "number",
1133
- "description": "The value must be greater than or equal to this number"
1510
+ "oneOf": [
1511
+ {
1512
+ "type": "number"
1513
+ },
1514
+ {
1515
+ "type": "string",
1516
+ "pattern": "^\\$"
1517
+ }
1518
+ ],
1519
+ "description": "The value must be greater than or equal to this number. Use \"$fieldName\" to compare against another field's value."
1134
1520
  }
1135
1521
  },
1136
- "required": ["greater_than_or_equal"],
1522
+ "required": [
1523
+ "greater_than_or_equal"
1524
+ ],
1137
1525
  "additionalProperties": false
1138
1526
  },
1139
1527
  {
@@ -1141,11 +1529,21 @@
1141
1529
  "description": "Check if the numeric value is less than the specified number",
1142
1530
  "properties": {
1143
1531
  "less_than": {
1144
- "type": "number",
1145
- "description": "The value must be less than this number"
1532
+ "oneOf": [
1533
+ {
1534
+ "type": "number"
1535
+ },
1536
+ {
1537
+ "type": "string",
1538
+ "pattern": "^\\$"
1539
+ }
1540
+ ],
1541
+ "description": "The value must be less than this number. Use \"$fieldName\" to compare against another field's value."
1146
1542
  }
1147
1543
  },
1148
- "required": ["less_than"],
1544
+ "required": [
1545
+ "less_than"
1546
+ ],
1149
1547
  "additionalProperties": false
1150
1548
  },
1151
1549
  {
@@ -1153,11 +1551,21 @@
1153
1551
  "description": "Check if the numeric value is less than or equal to the specified number",
1154
1552
  "properties": {
1155
1553
  "less_than_or_equal": {
1156
- "type": "number",
1157
- "description": "The value must be less than or equal to this number"
1554
+ "oneOf": [
1555
+ {
1556
+ "type": "number"
1557
+ },
1558
+ {
1559
+ "type": "string",
1560
+ "pattern": "^\\$"
1561
+ }
1562
+ ],
1563
+ "description": "The value must be less than or equal to this number. Use \"$fieldName\" to compare against another field's value."
1158
1564
  }
1159
1565
  },
1160
- "required": ["less_than_or_equal"],
1566
+ "required": [
1567
+ "less_than_or_equal"
1568
+ ],
1161
1569
  "additionalProperties": false
1162
1570
  },
1163
1571
  {
@@ -1165,15 +1573,23 @@
1165
1573
  "description": "Check if the value equals the specified value (strict equality)",
1166
1574
  "properties": {
1167
1575
  "equals": {
1168
- "description": "The value must equal this exactly",
1576
+ "description": "The value must equal this exactly. Use \"$fieldName\" to compare against another field's value.",
1169
1577
  "oneOf": [
1170
- { "type": "string" },
1171
- { "type": "number" },
1172
- { "type": "boolean" }
1578
+ {
1579
+ "type": "string"
1580
+ },
1581
+ {
1582
+ "type": "number"
1583
+ },
1584
+ {
1585
+ "type": "boolean"
1586
+ }
1173
1587
  ]
1174
1588
  }
1175
1589
  },
1176
- "required": ["equals"],
1590
+ "required": [
1591
+ "equals"
1592
+ ],
1177
1593
  "additionalProperties": false
1178
1594
  },
1179
1595
  {
@@ -1181,15 +1597,23 @@
1181
1597
  "description": "Check if the value does not equal the specified value",
1182
1598
  "properties": {
1183
1599
  "not_equals": {
1184
- "description": "The value must not equal this",
1600
+ "description": "The value must not equal this. Use \"$fieldName\" to compare against another field's value.",
1185
1601
  "oneOf": [
1186
- { "type": "string" },
1187
- { "type": "number" },
1188
- { "type": "boolean" }
1602
+ {
1603
+ "type": "string"
1604
+ },
1605
+ {
1606
+ "type": "number"
1607
+ },
1608
+ {
1609
+ "type": "boolean"
1610
+ }
1189
1611
  ]
1190
1612
  }
1191
1613
  },
1192
- "required": ["not_equals"],
1614
+ "required": [
1615
+ "not_equals"
1616
+ ],
1193
1617
  "additionalProperties": false
1194
1618
  },
1195
1619
  {
@@ -1198,18 +1622,26 @@
1198
1622
  "properties": {
1199
1623
  "in": {
1200
1624
  "type": "array",
1201
- "description": "The value must be one of these values",
1625
+ "description": "The value must be one of these values. A \"$fieldName\" entry compares against another field's value.",
1202
1626
  "items": {
1203
1627
  "oneOf": [
1204
- { "type": "string" },
1205
- { "type": "number" },
1206
- { "type": "boolean" }
1628
+ {
1629
+ "type": "string"
1630
+ },
1631
+ {
1632
+ "type": "number"
1633
+ },
1634
+ {
1635
+ "type": "boolean"
1636
+ }
1207
1637
  ]
1208
1638
  },
1209
1639
  "minItems": 1
1210
1640
  }
1211
1641
  },
1212
- "required": ["in"],
1642
+ "required": [
1643
+ "in"
1644
+ ],
1213
1645
  "additionalProperties": false
1214
1646
  },
1215
1647
  {
@@ -1218,18 +1650,26 @@
1218
1650
  "properties": {
1219
1651
  "not_in": {
1220
1652
  "type": "array",
1221
- "description": "The value must not be any of these values",
1653
+ "description": "The value must not be any of these values. A \"$fieldName\" entry compares against another field's value.",
1222
1654
  "items": {
1223
1655
  "oneOf": [
1224
- { "type": "string" },
1225
- { "type": "number" },
1226
- { "type": "boolean" }
1656
+ {
1657
+ "type": "string"
1658
+ },
1659
+ {
1660
+ "type": "number"
1661
+ },
1662
+ {
1663
+ "type": "boolean"
1664
+ }
1227
1665
  ]
1228
1666
  },
1229
1667
  "minItems": 1
1230
1668
  }
1231
1669
  },
1232
- "required": ["not_in"],
1670
+ "required": [
1671
+ "not_in"
1672
+ ],
1233
1673
  "additionalProperties": false
1234
1674
  },
1235
1675
  {
@@ -1238,10 +1678,12 @@
1238
1678
  "properties": {
1239
1679
  "starts_with": {
1240
1680
  "type": "string",
1241
- "description": "The string value must start with this prefix"
1681
+ "description": "The string value must start with this prefix. Use \"$fieldName\" to compare against another field's value."
1242
1682
  }
1243
1683
  },
1244
- "required": ["starts_with"],
1684
+ "required": [
1685
+ "starts_with"
1686
+ ],
1245
1687
  "additionalProperties": false
1246
1688
  },
1247
1689
  {
@@ -1250,10 +1692,12 @@
1250
1692
  "properties": {
1251
1693
  "ends_with": {
1252
1694
  "type": "string",
1253
- "description": "The string value must end with this suffix"
1695
+ "description": "The string value must end with this suffix. Use \"$fieldName\" to compare against another field's value."
1254
1696
  }
1255
1697
  },
1256
- "required": ["ends_with"],
1698
+ "required": [
1699
+ "ends_with"
1700
+ ],
1257
1701
  "additionalProperties": false
1258
1702
  },
1259
1703
  {
@@ -1262,10 +1706,12 @@
1262
1706
  "properties": {
1263
1707
  "contains": {
1264
1708
  "type": "string",
1265
- "description": "The string value must contain this substring"
1709
+ "description": "The string value must contain this substring. Use \"$fieldName\" to compare against another field's value."
1266
1710
  }
1267
1711
  },
1268
- "required": ["contains"],
1712
+ "required": [
1713
+ "contains"
1714
+ ],
1269
1715
  "additionalProperties": false
1270
1716
  },
1271
1717
  {
@@ -1274,10 +1720,12 @@
1274
1720
  "properties": {
1275
1721
  "not_contains": {
1276
1722
  "type": "string",
1277
- "description": "The string value must not contain this substring"
1723
+ "description": "The string value must not contain this substring. Use \"$fieldName\" to compare against another field's value."
1278
1724
  }
1279
1725
  },
1280
- "required": ["not_contains"],
1726
+ "required": [
1727
+ "not_contains"
1728
+ ],
1281
1729
  "additionalProperties": false
1282
1730
  },
1283
1731
  {
@@ -1290,7 +1738,9 @@
1290
1738
  "description": "Returns true if the value is null, undefined, or an empty/whitespace-only string"
1291
1739
  }
1292
1740
  },
1293
- "required": ["is_empty"],
1741
+ "required": [
1742
+ "is_empty"
1743
+ ],
1294
1744
  "additionalProperties": false
1295
1745
  },
1296
1746
  {
@@ -1303,7 +1753,9 @@
1303
1753
  "description": "Returns true if the value is not null, not undefined, and not an empty/whitespace-only string"
1304
1754
  }
1305
1755
  },
1306
- "required": ["is_not_empty"],
1756
+ "required": [
1757
+ "is_not_empty"
1758
+ ],
1307
1759
  "additionalProperties": false
1308
1760
  }
1309
1761
  ]
@@ -1314,7 +1766,9 @@
1314
1766
  "properties": {
1315
1767
  "action": {
1316
1768
  "type": "string",
1317
- "enum": ["move-file"],
1769
+ "enum": [
1770
+ "move-file"
1771
+ ],
1318
1772
  "description": "The action to perform"
1319
1773
  },
1320
1774
  "moveToDestination": {
@@ -1322,7 +1776,9 @@
1322
1776
  "description": "If the action is 'move-file', this specifies the source destination in remora where the source file should be moved"
1323
1777
  }
1324
1778
  },
1325
- "required": ["action"],
1779
+ "required": [
1780
+ "action"
1781
+ ],
1326
1782
  "additionalProperties": false
1327
1783
  }
1328
1784
  },
@@ -1360,25 +1816,17 @@
1360
1816
  "from": "UserData"
1361
1817
  },
1362
1818
  {
1363
- "key": "orders",
1364
- "grouping": {
1365
- "groupingKey": "order_items",
1366
- "subFields": [
1367
- {
1368
- "key": "id",
1369
- "from": "OrderData",
1370
- "alias": "order_id"
1371
- },
1372
- {
1373
- "key": "created_at",
1374
- "from": "OrderData"
1375
- },
1376
- {
1377
- "key": "total_amount",
1378
- "from": "OrderData"
1379
- }
1380
- ]
1381
- }
1819
+ "key": "id",
1820
+ "from": "OrderData",
1821
+ "alias": "order_id"
1822
+ },
1823
+ {
1824
+ "key": "created_at",
1825
+ "from": "OrderData"
1826
+ },
1827
+ {
1828
+ "key": "total_amount",
1829
+ "from": "OrderData"
1382
1830
  }
1383
1831
  ],
1384
1832
  "outputs": [
@@ -1413,4 +1861,4 @@
1413
1861
  "_version": 1
1414
1862
  }
1415
1863
  ]
1416
- }
1864
+ }