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