doc-detective-common 3.0.2 → 3.0.4-dev.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.
@@ -4663,13 +4663,4188 @@
4663
4663
  }
4664
4664
  ]
4665
4665
  }
4666
+ },
4667
+ "contexts": {
4668
+ "array": "array",
4669
+ "readOnly": true,
4670
+ "description": "Resolved contexts to run the test in. This is a resolved version of the `runOn` property. It is not user-defined and should not be used in test specifications.",
4671
+ "items": {
4672
+ "type": "object",
4673
+ "properties": {
4674
+ "platform": {
4675
+ "type": "string",
4676
+ "description": "Platform to run the test on. This is a resolved version of the `platforms` property."
4677
+ },
4678
+ "browser": {
4679
+ "type": "object",
4680
+ "description": "Browser configuration.",
4681
+ "required": [
4682
+ "name"
4683
+ ],
4684
+ "additionalProperties": false,
4685
+ "properties": {
4686
+ "name": {
4687
+ "type": "string",
4688
+ "description": "Name of the browser.",
4689
+ "enum": [
4690
+ "chrome",
4691
+ "firefox",
4692
+ "safari",
4693
+ "webkit"
4694
+ ],
4695
+ "$comment": "`safari` is just a shortcut for `webkit`. Included for visibility and to reduce questions."
4696
+ },
4697
+ "headless": {
4698
+ "type": "boolean",
4699
+ "description": "If `true`, runs the browser in headless mode.",
4700
+ "default": true
4701
+ },
4702
+ "window": {
4703
+ "type": "object",
4704
+ "description": "Browser dimensions.",
4705
+ "additionalProperties": false,
4706
+ "properties": {
4707
+ "width": {
4708
+ "type": "integer",
4709
+ "description": "Width of the browser window in pixels."
4710
+ },
4711
+ "height": {
4712
+ "type": "integer",
4713
+ "description": "Height of the browser window in pixels."
4714
+ }
4715
+ }
4716
+ },
4717
+ "viewport": {
4718
+ "type": "object",
4719
+ "description": "Viewport dimensions.",
4720
+ "additionalProperties": false,
4721
+ "properties": {
4722
+ "width": {
4723
+ "type": "integer",
4724
+ "description": "Width of the viewport in pixels."
4725
+ },
4726
+ "height": {
4727
+ "type": "integer",
4728
+ "description": "Height of the viewport in pixels."
4729
+ }
4730
+ }
4731
+ }
4732
+ }
4733
+ },
4734
+ "steps": {
4735
+ "description": "Steps to perform as part of the test. Performed in the sequence defined. If one or more actions fail, the test fails. By default, if a step fails, the test stops and the remaining steps are not executed.",
4736
+ "type": "array",
4737
+ "minItems": 1,
4738
+ "items": {
4739
+ "$schema": "http://json-schema.org/draft-07/schema#",
4740
+ "title": "step",
4741
+ "description": "A step in a test.",
4742
+ "type": "object",
4743
+ "components": {
4744
+ "schemas": {
4745
+ "common": {
4746
+ "type": "object",
4747
+ "dynamicDefaults": {
4748
+ "stepId": "uuid"
4749
+ },
4750
+ "properties": {
4751
+ "stepId": {
4752
+ "type": "string",
4753
+ "description": "ID of the step."
4754
+ },
4755
+ "description": {
4756
+ "type": "string",
4757
+ "description": "Description of the step."
4758
+ },
4759
+ "outputs": {
4760
+ "type": "object",
4761
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
4762
+ "default": {},
4763
+ "patternProperties": {
4764
+ "^[A-Za-z0-9_]+$": {
4765
+ "type": "string",
4766
+ "description": "Runtime expression for a user-defined output value."
4767
+ }
4768
+ }
4769
+ },
4770
+ "variables": {
4771
+ "type": "object",
4772
+ "description": "Environment variables to set from user-defined expressions.",
4773
+ "default": {},
4774
+ "patternProperties": {
4775
+ "^[A-Za-z0-9_]+$": {
4776
+ "type": "string",
4777
+ "description": "Runtime expression for a user-defined output value."
4778
+ }
4779
+ }
4780
+ }
4781
+ }
4782
+ },
4783
+ "stepId": {
4784
+ "type": "string",
4785
+ "description": "ID of the step."
4786
+ },
4787
+ "description": {
4788
+ "type": "string",
4789
+ "description": "Description of the step."
4790
+ },
4791
+ "outputs": {
4792
+ "type": "object",
4793
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
4794
+ "default": {},
4795
+ "patternProperties": {
4796
+ "^[A-Za-z0-9_]+$": {
4797
+ "type": "string",
4798
+ "description": "Runtime expression for a user-defined output value."
4799
+ }
4800
+ }
4801
+ },
4802
+ "variables": {
4803
+ "type": "object",
4804
+ "description": "Environment variables to set from user-defined expressions.",
4805
+ "default": {},
4806
+ "patternProperties": {
4807
+ "^[A-Za-z0-9_]+$": {
4808
+ "type": "string",
4809
+ "description": "Runtime expression for a user-defined output value."
4810
+ }
4811
+ }
4812
+ }
4813
+ }
4814
+ },
4815
+ "anyOf": [
4816
+ {
4817
+ "allOf": [
4818
+ {
4819
+ "type": "object",
4820
+ "dynamicDefaults": {
4821
+ "stepId": "uuid"
4822
+ },
4823
+ "properties": {
4824
+ "stepId": {
4825
+ "type": "string",
4826
+ "description": "ID of the step."
4827
+ },
4828
+ "description": {
4829
+ "type": "string",
4830
+ "description": "Description of the step."
4831
+ },
4832
+ "outputs": {
4833
+ "type": "object",
4834
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
4835
+ "default": {},
4836
+ "patternProperties": {
4837
+ "^[A-Za-z0-9_]+$": {
4838
+ "type": "string",
4839
+ "description": "Runtime expression for a user-defined output value."
4840
+ }
4841
+ }
4842
+ },
4843
+ "variables": {
4844
+ "type": "object",
4845
+ "description": "Environment variables to set from user-defined expressions.",
4846
+ "default": {},
4847
+ "patternProperties": {
4848
+ "^[A-Za-z0-9_]+$": {
4849
+ "type": "string",
4850
+ "description": "Runtime expression for a user-defined output value."
4851
+ }
4852
+ }
4853
+ }
4854
+ }
4855
+ },
4856
+ {
4857
+ "type": "object",
4858
+ "required": [
4859
+ "checkLink"
4860
+ ],
4861
+ "properties": {
4862
+ "checkLink": {
4863
+ "$schema": "http://json-schema.org/draft-07/schema#",
4864
+ "title": "checkLink",
4865
+ "anyOf": [
4866
+ {
4867
+ "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.",
4868
+ "type": "string",
4869
+ "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)",
4870
+ "transform": [
4871
+ "trim"
4872
+ ]
4873
+ },
4874
+ {
4875
+ "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.",
4876
+ "type": "object",
4877
+ "additionalProperties": false,
4878
+ "required": [
4879
+ "url"
4880
+ ],
4881
+ "properties": {
4882
+ "url": {
4883
+ "type": "string",
4884
+ "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.",
4885
+ "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)",
4886
+ "transform": [
4887
+ "trim"
4888
+ ]
4889
+ },
4890
+ "origin": {
4891
+ "type": "string",
4892
+ "description": "Protocol and domain to navigate to. Prepended to `url`.",
4893
+ "transform": [
4894
+ "trim"
4895
+ ]
4896
+ },
4897
+ "statusCodes": {
4898
+ "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.",
4899
+ "anyOf": [
4900
+ {
4901
+ "type": "integer"
4902
+ },
4903
+ {
4904
+ "type": "array",
4905
+ "items": {
4906
+ "oneOf": [
4907
+ {
4908
+ "type": "integer"
4909
+ }
4910
+ ]
4911
+ }
4912
+ }
4913
+ ],
4914
+ "default": [
4915
+ 200,
4916
+ 301,
4917
+ 302,
4918
+ 307,
4919
+ 308
4920
+ ]
4921
+ }
4922
+ }
4923
+ }
4924
+ ],
4925
+ "components": {
4926
+ "schemas": {
4927
+ "string": {
4928
+ "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.",
4929
+ "type": "string",
4930
+ "pattern": "(^(http://|https://|\\/).*|\\$[A-Za-z0-9_]+$)",
4931
+ "transform": [
4932
+ "trim"
4933
+ ]
4934
+ },
4935
+ "object": {
4936
+ "description": "Check if an HTTP or HTTPS URL returns an acceptable status code from a GET request.",
4937
+ "type": "object",
4938
+ "additionalProperties": false,
4939
+ "required": [
4940
+ "url"
4941
+ ],
4942
+ "properties": {
4943
+ "url": {
4944
+ "type": "string",
4945
+ "description": "URL to check. Can be a full URL or a path. If a path is provided, `origin` must be specified.",
4946
+ "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)",
4947
+ "transform": [
4948
+ "trim"
4949
+ ]
4950
+ },
4951
+ "origin": {
4952
+ "type": "string",
4953
+ "description": "Protocol and domain to navigate to. Prepended to `url`.",
4954
+ "transform": [
4955
+ "trim"
4956
+ ]
4957
+ },
4958
+ "statusCodes": {
4959
+ "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.",
4960
+ "anyOf": [
4961
+ {
4962
+ "type": "integer"
4963
+ },
4964
+ {
4965
+ "type": "array",
4966
+ "items": {
4967
+ "oneOf": [
4968
+ {
4969
+ "type": "integer"
4970
+ }
4971
+ ]
4972
+ }
4973
+ }
4974
+ ],
4975
+ "default": [
4976
+ 200,
4977
+ 301,
4978
+ 302,
4979
+ 307,
4980
+ 308
4981
+ ]
4982
+ }
4983
+ }
4984
+ }
4985
+ }
4986
+ },
4987
+ "examples": [
4988
+ "https://www.google.com",
4989
+ "/search",
4990
+ {
4991
+ "url": "https://www.google.com",
4992
+ "statusCodes": 200
4993
+ },
4994
+ {
4995
+ "url": "/search",
4996
+ "origin": "www.google.com",
4997
+ "statusCodes": [
4998
+ 200
4999
+ ]
5000
+ }
5001
+ ]
5002
+ }
5003
+ }
5004
+ }
5005
+ ]
5006
+ },
5007
+ {
5008
+ "allOf": [
5009
+ {
5010
+ "type": "object",
5011
+ "dynamicDefaults": {
5012
+ "stepId": "uuid"
5013
+ },
5014
+ "properties": {
5015
+ "stepId": {
5016
+ "type": "string",
5017
+ "description": "ID of the step."
5018
+ },
5019
+ "description": {
5020
+ "type": "string",
5021
+ "description": "Description of the step."
5022
+ },
5023
+ "outputs": {
5024
+ "type": "object",
5025
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
5026
+ "default": {},
5027
+ "patternProperties": {
5028
+ "^[A-Za-z0-9_]+$": {
5029
+ "type": "string",
5030
+ "description": "Runtime expression for a user-defined output value."
5031
+ }
5032
+ }
5033
+ },
5034
+ "variables": {
5035
+ "type": "object",
5036
+ "description": "Environment variables to set from user-defined expressions.",
5037
+ "default": {},
5038
+ "patternProperties": {
5039
+ "^[A-Za-z0-9_]+$": {
5040
+ "type": "string",
5041
+ "description": "Runtime expression for a user-defined output value."
5042
+ }
5043
+ }
5044
+ }
5045
+ }
5046
+ },
5047
+ {
5048
+ "type": "object",
5049
+ "required": [
5050
+ "click"
5051
+ ],
5052
+ "properties": {
5053
+ "click": {
5054
+ "$schema": "http://json-schema.org/draft-07/schema#",
5055
+ "title": "click",
5056
+ "description": "Click or tap an element.",
5057
+ "anyOf": [
5058
+ {
5059
+ "title": "Find element (simple)",
5060
+ "type": "string",
5061
+ "description": "Display text or selector of the element to find."
5062
+ },
5063
+ {
5064
+ "title": "Click element (detailed)",
5065
+ "type": "object",
5066
+ "anyOf": [
5067
+ {
5068
+ "required": [
5069
+ "selector"
5070
+ ]
5071
+ },
5072
+ {
5073
+ "required": [
5074
+ "elementText"
5075
+ ]
5076
+ }
5077
+ ],
5078
+ "properties": {
5079
+ "button": {
5080
+ "description": "Kind of click to perform.",
5081
+ "type": "string",
5082
+ "enum": [
5083
+ "left",
5084
+ "right",
5085
+ "middle"
5086
+ ]
5087
+ },
5088
+ "elementText": {
5089
+ "type": "string",
5090
+ "description": "Display text of the element to click. If combined with `selector`, the element must match both the text and the selector."
5091
+ },
5092
+ "selector": {
5093
+ "type": "string",
5094
+ "description": "Selector of the element to click. If combined with `elementText`, the element must match both the text and the selector."
5095
+ }
5096
+ }
5097
+ },
5098
+ {
5099
+ "type": "boolean"
5100
+ }
5101
+ ],
5102
+ "components": {
5103
+ "schemas": {
5104
+ "string": {
5105
+ "title": "Find element (simple)",
5106
+ "type": "string",
5107
+ "description": "Display text or selector of the element to find."
5108
+ },
5109
+ "button": {
5110
+ "description": "Kind of click to perform.",
5111
+ "type": "string",
5112
+ "enum": [
5113
+ "left",
5114
+ "right",
5115
+ "middle"
5116
+ ]
5117
+ },
5118
+ "object": {
5119
+ "title": "Click element (detailed)",
5120
+ "type": "object",
5121
+ "anyOf": [
5122
+ {
5123
+ "required": [
5124
+ "selector"
5125
+ ]
5126
+ },
5127
+ {
5128
+ "required": [
5129
+ "elementText"
5130
+ ]
5131
+ }
5132
+ ],
5133
+ "properties": {
5134
+ "button": {
5135
+ "description": "Kind of click to perform.",
5136
+ "type": "string",
5137
+ "enum": [
5138
+ "left",
5139
+ "right",
5140
+ "middle"
5141
+ ]
5142
+ },
5143
+ "elementText": {
5144
+ "type": "string",
5145
+ "description": "Display text of the element to click. If combined with `selector`, the element must match both the text and the selector."
5146
+ },
5147
+ "selector": {
5148
+ "type": "string",
5149
+ "description": "Selector of the element to click. If combined with `elementText`, the element must match both the text and the selector."
5150
+ }
5151
+ }
5152
+ }
5153
+ }
5154
+ },
5155
+ "examples": [
5156
+ true,
5157
+ "right",
5158
+ {
5159
+ "button": "left",
5160
+ "elementText": "Element text"
5161
+ },
5162
+ {
5163
+ "selector": "#elementToScreenshot",
5164
+ "elementText": "Element text",
5165
+ "button": "middle"
5166
+ }
5167
+ ]
5168
+ }
5169
+ }
5170
+ }
5171
+ ]
5172
+ },
5173
+ {
5174
+ "allOf": [
5175
+ {
5176
+ "type": "object",
5177
+ "dynamicDefaults": {
5178
+ "stepId": "uuid"
5179
+ },
5180
+ "properties": {
5181
+ "stepId": {
5182
+ "type": "string",
5183
+ "description": "ID of the step."
5184
+ },
5185
+ "description": {
5186
+ "type": "string",
5187
+ "description": "Description of the step."
5188
+ },
5189
+ "outputs": {
5190
+ "type": "object",
5191
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
5192
+ "default": {},
5193
+ "patternProperties": {
5194
+ "^[A-Za-z0-9_]+$": {
5195
+ "type": "string",
5196
+ "description": "Runtime expression for a user-defined output value."
5197
+ }
5198
+ }
5199
+ },
5200
+ "variables": {
5201
+ "type": "object",
5202
+ "description": "Environment variables to set from user-defined expressions.",
5203
+ "default": {},
5204
+ "patternProperties": {
5205
+ "^[A-Za-z0-9_]+$": {
5206
+ "type": "string",
5207
+ "description": "Runtime expression for a user-defined output value."
5208
+ }
5209
+ }
5210
+ }
5211
+ }
5212
+ },
5213
+ {
5214
+ "type": "object",
5215
+ "required": [
5216
+ "find"
5217
+ ],
5218
+ "properties": {
5219
+ "find": {
5220
+ "$schema": "http://json-schema.org/draft-07/schema#",
5221
+ "title": "find",
5222
+ "description": "Find an element based on display text or a selector, then optionally interact with it.",
5223
+ "anyOf": [
5224
+ {
5225
+ "title": "Find element (simple)",
5226
+ "type": "string",
5227
+ "description": "Display text or selector of the element to find."
5228
+ },
5229
+ {
5230
+ "title": "Find element (detailed)",
5231
+ "type": "object",
5232
+ "anyOf": [
5233
+ {
5234
+ "required": [
5235
+ "selector"
5236
+ ]
5237
+ },
5238
+ {
5239
+ "required": [
5240
+ "elementText"
5241
+ ]
5242
+ }
5243
+ ],
5244
+ "additionalProperties": false,
5245
+ "properties": {
5246
+ "elementText": {
5247
+ "type": "string",
5248
+ "description": "Display text of the element to find. If combined with `selector`, the element must match both the text and the selector."
5249
+ },
5250
+ "selector": {
5251
+ "type": "string",
5252
+ "description": "Selector of the element to find. If combined with `elementText`, the element must match both the text and the selector."
5253
+ },
5254
+ "timeout": {
5255
+ "type": "integer",
5256
+ "description": "Max duration in milliseconds to wait for the element to exist.",
5257
+ "default": 5000
5258
+ },
5259
+ "moveTo": {
5260
+ "description": "Move to the element. If the element isn't visible, it's scrolled into view.",
5261
+ "type": "boolean",
5262
+ "default": true
5263
+ },
5264
+ "click": {
5265
+ "description": "Click the element.",
5266
+ "anyOf": [
5267
+ {
5268
+ "$schema": "http://json-schema.org/draft-07/schema#",
5269
+ "title": "click",
5270
+ "description": "Click or tap an element.",
5271
+ "anyOf": [
5272
+ {
5273
+ "title": "Find element (simple)",
5274
+ "type": "string",
5275
+ "description": "Display text or selector of the element to find."
5276
+ },
5277
+ {
5278
+ "title": "Click element (detailed)",
5279
+ "type": "object",
5280
+ "anyOf": [
5281
+ {
5282
+ "required": [
5283
+ "selector"
5284
+ ]
5285
+ },
5286
+ {
5287
+ "required": [
5288
+ "elementText"
5289
+ ]
5290
+ }
5291
+ ],
5292
+ "properties": {
5293
+ "button": {
5294
+ "description": "Kind of click to perform.",
5295
+ "type": "string",
5296
+ "enum": [
5297
+ "left",
5298
+ "right",
5299
+ "middle"
5300
+ ]
5301
+ },
5302
+ "elementText": {
5303
+ "type": "string",
5304
+ "description": "Display text of the element to click. If combined with `selector`, the element must match both the text and the selector."
5305
+ },
5306
+ "selector": {
5307
+ "type": "string",
5308
+ "description": "Selector of the element to click. If combined with `elementText`, the element must match both the text and the selector."
5309
+ }
5310
+ }
5311
+ },
5312
+ {
5313
+ "type": "boolean"
5314
+ }
5315
+ ],
5316
+ "components": {
5317
+ "schemas": {
5318
+ "string": {
5319
+ "title": "Find element (simple)",
5320
+ "type": "string",
5321
+ "description": "Display text or selector of the element to find."
5322
+ },
5323
+ "button": {
5324
+ "description": "Kind of click to perform.",
5325
+ "type": "string",
5326
+ "enum": [
5327
+ "left",
5328
+ "right",
5329
+ "middle"
5330
+ ]
5331
+ },
5332
+ "object": {
5333
+ "title": "Click element (detailed)",
5334
+ "type": "object",
5335
+ "anyOf": [
5336
+ {
5337
+ "required": [
5338
+ "selector"
5339
+ ]
5340
+ },
5341
+ {
5342
+ "required": [
5343
+ "elementText"
5344
+ ]
5345
+ }
5346
+ ],
5347
+ "properties": {
5348
+ "button": {
5349
+ "description": "Kind of click to perform.",
5350
+ "type": "string",
5351
+ "enum": [
5352
+ "left",
5353
+ "right",
5354
+ "middle"
5355
+ ]
5356
+ },
5357
+ "elementText": {
5358
+ "type": "string",
5359
+ "description": "Display text of the element to click. If combined with `selector`, the element must match both the text and the selector."
5360
+ },
5361
+ "selector": {
5362
+ "type": "string",
5363
+ "description": "Selector of the element to click. If combined with `elementText`, the element must match both the text and the selector."
5364
+ }
5365
+ }
5366
+ }
5367
+ }
5368
+ },
5369
+ "examples": [
5370
+ true,
5371
+ "right",
5372
+ {
5373
+ "button": "left",
5374
+ "elementText": "Element text"
5375
+ },
5376
+ {
5377
+ "selector": "#elementToScreenshot",
5378
+ "elementText": "Element text",
5379
+ "button": "middle"
5380
+ }
5381
+ ]
5382
+ },
5383
+ {
5384
+ "type": "object",
5385
+ "properties": {
5386
+ "button": {
5387
+ "description": "Kind of click to perform.",
5388
+ "type": "string",
5389
+ "enum": [
5390
+ "left",
5391
+ "right",
5392
+ "middle"
5393
+ ]
5394
+ }
5395
+ }
5396
+ }
5397
+ ]
5398
+ },
5399
+ "type": {
5400
+ "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.",
5401
+ "allOf": [
5402
+ {
5403
+ "$schema": "http://json-schema.org/draft-07/schema#",
5404
+ "title": "typeKeys",
5405
+ "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.",
5406
+ "anyOf": [
5407
+ {
5408
+ "description": "Sequence of keys to enter.",
5409
+ "anyOf": [
5410
+ {
5411
+ "type": "string"
5412
+ },
5413
+ {
5414
+ "type": "array",
5415
+ "items": {
5416
+ "oneOf": [
5417
+ {
5418
+ "type": "string"
5419
+ }
5420
+ ]
5421
+ }
5422
+ }
5423
+ ]
5424
+ },
5425
+ {
5426
+ "type": "object",
5427
+ "properties": {
5428
+ "keys": {
5429
+ "description": "Sequence of keys to enter.",
5430
+ "anyOf": [
5431
+ {
5432
+ "type": "string"
5433
+ },
5434
+ {
5435
+ "type": "array",
5436
+ "items": {
5437
+ "oneOf": [
5438
+ {
5439
+ "type": "string"
5440
+ }
5441
+ ]
5442
+ }
5443
+ }
5444
+ ]
5445
+ },
5446
+ "inputDelay": {
5447
+ "type": "number",
5448
+ "description": "Delay in milliseconds between each key press during a recording",
5449
+ "default": 100
5450
+ },
5451
+ "selector": {
5452
+ "type": "string",
5453
+ "description": "Selector for the element to type into. If not specified, the typing occurs in the active element."
5454
+ }
5455
+ },
5456
+ "required": [
5457
+ "keys"
5458
+ ],
5459
+ "additionalProperties": false
5460
+ }
5461
+ ],
5462
+ "components": {
5463
+ "schemas": {
5464
+ "keys": {
5465
+ "description": "Sequence of keys to enter.",
5466
+ "anyOf": [
5467
+ {
5468
+ "type": "string"
5469
+ },
5470
+ {
5471
+ "type": "array",
5472
+ "items": {
5473
+ "oneOf": [
5474
+ {
5475
+ "type": "string"
5476
+ }
5477
+ ]
5478
+ }
5479
+ }
5480
+ ]
5481
+ },
5482
+ "object": {
5483
+ "type": "object",
5484
+ "properties": {
5485
+ "keys": {
5486
+ "description": "Sequence of keys to enter.",
5487
+ "anyOf": [
5488
+ {
5489
+ "type": "string"
5490
+ },
5491
+ {
5492
+ "type": "array",
5493
+ "items": {
5494
+ "oneOf": [
5495
+ {
5496
+ "type": "string"
5497
+ }
5498
+ ]
5499
+ }
5500
+ }
5501
+ ]
5502
+ },
5503
+ "inputDelay": {
5504
+ "type": "number",
5505
+ "description": "Delay in milliseconds between each key press during a recording",
5506
+ "default": 100
5507
+ },
5508
+ "selector": {
5509
+ "type": "string",
5510
+ "description": "Selector for the element to type into. If not specified, the typing occurs in the active element."
5511
+ }
5512
+ },
5513
+ "required": [
5514
+ "keys"
5515
+ ],
5516
+ "additionalProperties": false
5517
+ }
5518
+ }
5519
+ },
5520
+ "examples": [
5521
+ "kittens",
5522
+ [
5523
+ "$ENTER$"
5524
+ ],
5525
+ [
5526
+ "kittens",
5527
+ "$ENTER$"
5528
+ ],
5529
+ {
5530
+ "keys": "kittens"
5531
+ },
5532
+ {
5533
+ "keys": [
5534
+ "$ENTER$"
5535
+ ]
5536
+ },
5537
+ {
5538
+ "keys": [
5539
+ "kittens",
5540
+ "$ENTER$"
5541
+ ],
5542
+ "inputDelay": 500
5543
+ }
5544
+ ]
5545
+ },
5546
+ {
5547
+ "not": {
5548
+ "type": "object",
5549
+ "required": [
5550
+ "selector",
5551
+ "elementText"
5552
+ ]
5553
+ }
5554
+ }
5555
+ ]
5556
+ }
5557
+ }
5558
+ }
5559
+ ],
5560
+ "components": {
5561
+ "schemas": {
5562
+ "string": {
5563
+ "title": "Find element (simple)",
5564
+ "type": "string",
5565
+ "description": "Display text or selector of the element to find."
5566
+ },
5567
+ "object": {
5568
+ "title": "Find element (detailed)",
5569
+ "type": "object",
5570
+ "anyOf": [
5571
+ {
5572
+ "required": [
5573
+ "selector"
5574
+ ]
5575
+ },
5576
+ {
5577
+ "required": [
5578
+ "elementText"
5579
+ ]
5580
+ }
5581
+ ],
5582
+ "additionalProperties": false,
5583
+ "properties": {
5584
+ "elementText": {
5585
+ "type": "string",
5586
+ "description": "Display text of the element to find. If combined with `selector`, the element must match both the text and the selector."
5587
+ },
5588
+ "selector": {
5589
+ "type": "string",
5590
+ "description": "Selector of the element to find. If combined with `elementText`, the element must match both the text and the selector."
5591
+ },
5592
+ "timeout": {
5593
+ "type": "integer",
5594
+ "description": "Max duration in milliseconds to wait for the element to exist.",
5595
+ "default": 5000
5596
+ },
5597
+ "moveTo": {
5598
+ "description": "Move to the element. If the element isn't visible, it's scrolled into view.",
5599
+ "type": "boolean",
5600
+ "default": true
5601
+ },
5602
+ "click": {
5603
+ "description": "Click the element.",
5604
+ "anyOf": [
5605
+ {
5606
+ "$schema": "http://json-schema.org/draft-07/schema#",
5607
+ "title": "click",
5608
+ "description": "Click or tap an element.",
5609
+ "anyOf": [
5610
+ {
5611
+ "title": "Find element (simple)",
5612
+ "type": "string",
5613
+ "description": "Display text or selector of the element to find."
5614
+ },
5615
+ {
5616
+ "title": "Click element (detailed)",
5617
+ "type": "object",
5618
+ "anyOf": [
5619
+ {
5620
+ "required": [
5621
+ "selector"
5622
+ ]
5623
+ },
5624
+ {
5625
+ "required": [
5626
+ "elementText"
5627
+ ]
5628
+ }
5629
+ ],
5630
+ "properties": {
5631
+ "button": {
5632
+ "description": "Kind of click to perform.",
5633
+ "type": "string",
5634
+ "enum": [
5635
+ "left",
5636
+ "right",
5637
+ "middle"
5638
+ ]
5639
+ },
5640
+ "elementText": {
5641
+ "type": "string",
5642
+ "description": "Display text of the element to click. If combined with `selector`, the element must match both the text and the selector."
5643
+ },
5644
+ "selector": {
5645
+ "type": "string",
5646
+ "description": "Selector of the element to click. If combined with `elementText`, the element must match both the text and the selector."
5647
+ }
5648
+ }
5649
+ },
5650
+ {
5651
+ "type": "boolean"
5652
+ }
5653
+ ],
5654
+ "components": {
5655
+ "schemas": {
5656
+ "string": {
5657
+ "title": "Find element (simple)",
5658
+ "type": "string",
5659
+ "description": "Display text or selector of the element to find."
5660
+ },
5661
+ "button": {
5662
+ "description": "Kind of click to perform.",
5663
+ "type": "string",
5664
+ "enum": [
5665
+ "left",
5666
+ "right",
5667
+ "middle"
5668
+ ]
5669
+ },
5670
+ "object": {
5671
+ "title": "Click element (detailed)",
5672
+ "type": "object",
5673
+ "anyOf": [
5674
+ {
5675
+ "required": [
5676
+ "selector"
5677
+ ]
5678
+ },
5679
+ {
5680
+ "required": [
5681
+ "elementText"
5682
+ ]
5683
+ }
5684
+ ],
5685
+ "properties": {
5686
+ "button": {
5687
+ "description": "Kind of click to perform.",
5688
+ "type": "string",
5689
+ "enum": [
5690
+ "left",
5691
+ "right",
5692
+ "middle"
5693
+ ]
5694
+ },
5695
+ "elementText": {
5696
+ "type": "string",
5697
+ "description": "Display text of the element to click. If combined with `selector`, the element must match both the text and the selector."
5698
+ },
5699
+ "selector": {
5700
+ "type": "string",
5701
+ "description": "Selector of the element to click. If combined with `elementText`, the element must match both the text and the selector."
5702
+ }
5703
+ }
5704
+ }
5705
+ }
5706
+ },
5707
+ "examples": [
5708
+ true,
5709
+ "right",
5710
+ {
5711
+ "button": "left",
5712
+ "elementText": "Element text"
5713
+ },
5714
+ {
5715
+ "selector": "#elementToScreenshot",
5716
+ "elementText": "Element text",
5717
+ "button": "middle"
5718
+ }
5719
+ ]
5720
+ },
5721
+ {
5722
+ "type": "object",
5723
+ "properties": {
5724
+ "button": {
5725
+ "description": "Kind of click to perform.",
5726
+ "type": "string",
5727
+ "enum": [
5728
+ "left",
5729
+ "right",
5730
+ "middle"
5731
+ ]
5732
+ }
5733
+ }
5734
+ }
5735
+ ]
5736
+ },
5737
+ "type": {
5738
+ "description": "Type keys after finding the element. Either a string or an object with a `keys` field as defined in [`type`](type). To type in the element, make the element active with the `click` parameter.",
5739
+ "allOf": [
5740
+ {
5741
+ "$schema": "http://json-schema.org/draft-07/schema#",
5742
+ "title": "typeKeys",
5743
+ "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.",
5744
+ "anyOf": [
5745
+ {
5746
+ "description": "Sequence of keys to enter.",
5747
+ "anyOf": [
5748
+ {
5749
+ "type": "string"
5750
+ },
5751
+ {
5752
+ "type": "array",
5753
+ "items": {
5754
+ "oneOf": [
5755
+ {
5756
+ "type": "string"
5757
+ }
5758
+ ]
5759
+ }
5760
+ }
5761
+ ]
5762
+ },
5763
+ {
5764
+ "type": "object",
5765
+ "properties": {
5766
+ "keys": {
5767
+ "description": "Sequence of keys to enter.",
5768
+ "anyOf": [
5769
+ {
5770
+ "type": "string"
5771
+ },
5772
+ {
5773
+ "type": "array",
5774
+ "items": {
5775
+ "oneOf": [
5776
+ {
5777
+ "type": "string"
5778
+ }
5779
+ ]
5780
+ }
5781
+ }
5782
+ ]
5783
+ },
5784
+ "inputDelay": {
5785
+ "type": "number",
5786
+ "description": "Delay in milliseconds between each key press during a recording",
5787
+ "default": 100
5788
+ },
5789
+ "selector": {
5790
+ "type": "string",
5791
+ "description": "Selector for the element to type into. If not specified, the typing occurs in the active element."
5792
+ }
5793
+ },
5794
+ "required": [
5795
+ "keys"
5796
+ ],
5797
+ "additionalProperties": false
5798
+ }
5799
+ ],
5800
+ "components": {
5801
+ "schemas": {
5802
+ "keys": {
5803
+ "description": "Sequence of keys to enter.",
5804
+ "anyOf": [
5805
+ {
5806
+ "type": "string"
5807
+ },
5808
+ {
5809
+ "type": "array",
5810
+ "items": {
5811
+ "oneOf": [
5812
+ {
5813
+ "type": "string"
5814
+ }
5815
+ ]
5816
+ }
5817
+ }
5818
+ ]
5819
+ },
5820
+ "object": {
5821
+ "type": "object",
5822
+ "properties": {
5823
+ "keys": {
5824
+ "description": "Sequence of keys to enter.",
5825
+ "anyOf": [
5826
+ {
5827
+ "type": "string"
5828
+ },
5829
+ {
5830
+ "type": "array",
5831
+ "items": {
5832
+ "oneOf": [
5833
+ {
5834
+ "type": "string"
5835
+ }
5836
+ ]
5837
+ }
5838
+ }
5839
+ ]
5840
+ },
5841
+ "inputDelay": {
5842
+ "type": "number",
5843
+ "description": "Delay in milliseconds between each key press during a recording",
5844
+ "default": 100
5845
+ },
5846
+ "selector": {
5847
+ "type": "string",
5848
+ "description": "Selector for the element to type into. If not specified, the typing occurs in the active element."
5849
+ }
5850
+ },
5851
+ "required": [
5852
+ "keys"
5853
+ ],
5854
+ "additionalProperties": false
5855
+ }
5856
+ }
5857
+ },
5858
+ "examples": [
5859
+ "kittens",
5860
+ [
5861
+ "$ENTER$"
5862
+ ],
5863
+ [
5864
+ "kittens",
5865
+ "$ENTER$"
5866
+ ],
5867
+ {
5868
+ "keys": "kittens"
5869
+ },
5870
+ {
5871
+ "keys": [
5872
+ "$ENTER$"
5873
+ ]
5874
+ },
5875
+ {
5876
+ "keys": [
5877
+ "kittens",
5878
+ "$ENTER$"
5879
+ ],
5880
+ "inputDelay": 500
5881
+ }
5882
+ ]
5883
+ },
5884
+ {
5885
+ "not": {
5886
+ "type": "object",
5887
+ "required": [
5888
+ "selector",
5889
+ "elementText"
5890
+ ]
5891
+ }
5892
+ }
5893
+ ]
5894
+ }
5895
+ }
5896
+ }
5897
+ }
5898
+ },
5899
+ "examples": [
5900
+ "Find me!",
5901
+ {
5902
+ "selector": "[title=Search]"
5903
+ },
5904
+ {
5905
+ "selector": "[title=Search]",
5906
+ "timeout": 10000,
5907
+ "elementText": "Search",
5908
+ "moveTo": true,
5909
+ "click": true,
5910
+ "type": "shorthair cat"
5911
+ },
5912
+ {
5913
+ "selector": "[title=Search]",
5914
+ "click": {
5915
+ "button": "right"
5916
+ }
5917
+ },
5918
+ {
5919
+ "selector": "[title=Search]",
5920
+ "timeout": 10000,
5921
+ "elementText": "Search",
5922
+ "moveTo": true,
5923
+ "click": true,
5924
+ "type": {
5925
+ "keys": [
5926
+ "shorthair cat"
5927
+ ],
5928
+ "inputDelay": 100
5929
+ }
5930
+ }
5931
+ ]
5932
+ }
5933
+ }
5934
+ }
5935
+ ]
5936
+ },
5937
+ {
5938
+ "allOf": [
5939
+ {
5940
+ "type": "object",
5941
+ "dynamicDefaults": {
5942
+ "stepId": "uuid"
5943
+ },
5944
+ "properties": {
5945
+ "stepId": {
5946
+ "type": "string",
5947
+ "description": "ID of the step."
5948
+ },
5949
+ "description": {
5950
+ "type": "string",
5951
+ "description": "Description of the step."
5952
+ },
5953
+ "outputs": {
5954
+ "type": "object",
5955
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
5956
+ "default": {},
5957
+ "patternProperties": {
5958
+ "^[A-Za-z0-9_]+$": {
5959
+ "type": "string",
5960
+ "description": "Runtime expression for a user-defined output value."
5961
+ }
5962
+ }
5963
+ },
5964
+ "variables": {
5965
+ "type": "object",
5966
+ "description": "Environment variables to set from user-defined expressions.",
5967
+ "default": {},
5968
+ "patternProperties": {
5969
+ "^[A-Za-z0-9_]+$": {
5970
+ "type": "string",
5971
+ "description": "Runtime expression for a user-defined output value."
5972
+ }
5973
+ }
5974
+ }
5975
+ }
5976
+ },
5977
+ {
5978
+ "type": "object",
5979
+ "required": [
5980
+ "goTo"
5981
+ ],
5982
+ "properties": {
5983
+ "goTo": {
5984
+ "$schema": "http://json-schema.org/draft-07/schema#",
5985
+ "title": "goTo",
5986
+ "anyOf": [
5987
+ {
5988
+ "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.",
5989
+ "type": "string",
5990
+ "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)",
5991
+ "transform": [
5992
+ "trim"
5993
+ ]
5994
+ },
5995
+ {
5996
+ "description": "Navigate to an HTTP or HTTPS URL.",
5997
+ "type": "object",
5998
+ "additionalProperties": false,
5999
+ "required": [
6000
+ "url"
6001
+ ],
6002
+ "properties": {
6003
+ "url": {
6004
+ "type": "string",
6005
+ "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.",
6006
+ "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)",
6007
+ "transform": [
6008
+ "trim"
6009
+ ]
6010
+ },
6011
+ "origin": {
6012
+ "type": "string",
6013
+ "description": "Protocol and domain to navigate to. Prepended to `url`.",
6014
+ "transform": [
6015
+ "trim"
6016
+ ]
6017
+ }
6018
+ }
6019
+ }
6020
+ ],
6021
+ "components": {
6022
+ "schemas": {
6023
+ "string": {
6024
+ "description": "Navigate to an HTTP or HTTPS URL. Can be a full URL or a path. If a path is provided, navigates relative to the current URL, if any.",
6025
+ "type": "string",
6026
+ "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)",
6027
+ "transform": [
6028
+ "trim"
6029
+ ]
6030
+ },
6031
+ "object": {
6032
+ "description": "Navigate to an HTTP or HTTPS URL.",
6033
+ "type": "object",
6034
+ "additionalProperties": false,
6035
+ "required": [
6036
+ "url"
6037
+ ],
6038
+ "properties": {
6039
+ "url": {
6040
+ "type": "string",
6041
+ "description": "URL to navigate to. Can be a full URL or a path. If a path is provided and `origin` is specified, prepends `origin` to `url`. If a path is provided but `origin` isn't specified, attempts to navigate relative to the current URL, if any.",
6042
+ "pattern": "(^(http://|https://|/).*|\\$[A-Za-z0-9_]+)",
6043
+ "transform": [
6044
+ "trim"
6045
+ ]
6046
+ },
6047
+ "origin": {
6048
+ "type": "string",
6049
+ "description": "Protocol and domain to navigate to. Prepended to `url`.",
6050
+ "transform": [
6051
+ "trim"
6052
+ ]
6053
+ }
6054
+ }
6055
+ }
6056
+ }
6057
+ },
6058
+ "examples": [
6059
+ "https://www.google.com",
6060
+ "/search",
6061
+ {
6062
+ "url": "https://www.google.com"
6063
+ },
6064
+ {
6065
+ "url": "/search",
6066
+ "origin": "www.google.com"
6067
+ }
6068
+ ]
6069
+ }
6070
+ }
6071
+ }
6072
+ ]
6073
+ },
6074
+ {
6075
+ "allOf": [
6076
+ {
6077
+ "type": "object",
6078
+ "dynamicDefaults": {
6079
+ "stepId": "uuid"
6080
+ },
6081
+ "properties": {
6082
+ "stepId": {
6083
+ "type": "string",
6084
+ "description": "ID of the step."
6085
+ },
6086
+ "description": {
6087
+ "type": "string",
6088
+ "description": "Description of the step."
6089
+ },
6090
+ "outputs": {
6091
+ "type": "object",
6092
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
6093
+ "default": {},
6094
+ "patternProperties": {
6095
+ "^[A-Za-z0-9_]+$": {
6096
+ "type": "string",
6097
+ "description": "Runtime expression for a user-defined output value."
6098
+ }
6099
+ }
6100
+ },
6101
+ "variables": {
6102
+ "type": "object",
6103
+ "description": "Environment variables to set from user-defined expressions.",
6104
+ "default": {},
6105
+ "patternProperties": {
6106
+ "^[A-Za-z0-9_]+$": {
6107
+ "type": "string",
6108
+ "description": "Runtime expression for a user-defined output value."
6109
+ }
6110
+ }
6111
+ }
6112
+ }
6113
+ },
6114
+ {
6115
+ "type": "object",
6116
+ "required": [
6117
+ "httpRequest"
6118
+ ],
6119
+ "properties": {
6120
+ "httpRequest": {
6121
+ "$schema": "http://json-schema.org/draft-07/schema#",
6122
+ "title": "httpRequest",
6123
+ "description": "Perform a generic HTTP request, for example to an API.",
6124
+ "anyOf": [
6125
+ {
6126
+ "title": "URL",
6127
+ "type": "string",
6128
+ "description": "URL for the HTTP request.",
6129
+ "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)",
6130
+ "transform": [
6131
+ "trim"
6132
+ ]
6133
+ },
6134
+ {
6135
+ "type": "object",
6136
+ "anyOf": [
6137
+ {
6138
+ "required": [
6139
+ "url"
6140
+ ]
6141
+ },
6142
+ {
6143
+ "required": [
6144
+ "openApi"
6145
+ ]
6146
+ }
6147
+ ],
6148
+ "additionalProperties": false,
6149
+ "properties": {
6150
+ "url": {
6151
+ "title": "URL",
6152
+ "type": "string",
6153
+ "description": "URL for the HTTP request.",
6154
+ "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)",
6155
+ "transform": [
6156
+ "trim"
6157
+ ]
6158
+ },
6159
+ "openApi": {
6160
+ "anyOf": [
6161
+ {
6162
+ "allOf": [
6163
+ {
6164
+ "type": "string",
6165
+ "description": "ID of the operation to use for the request."
6166
+ },
6167
+ {
6168
+ "title": "Operation ID",
6169
+ "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions."
6170
+ }
6171
+ ]
6172
+ },
6173
+ {
6174
+ "allOf": [
6175
+ {
6176
+ "version": "1.0.0",
6177
+ "$schema": "http://json-schema.org/draft-07/schema#",
6178
+ "title": "openApi",
6179
+ "type": "object",
6180
+ "description": "OpenAPI description and configuration.",
6181
+ "additionalProperties": false,
6182
+ "anyOf": [
6183
+ {
6184
+ "required": [
6185
+ "descriptionPath"
6186
+ ]
6187
+ },
6188
+ {
6189
+ "required": [
6190
+ "operationId"
6191
+ ]
6192
+ }
6193
+ ],
6194
+ "properties": {
6195
+ "name": {
6196
+ "type": "string",
6197
+ "description": "Name of the OpenAPI description, as defined in your configuration."
6198
+ },
6199
+ "descriptionPath": {
6200
+ "type": "string",
6201
+ "description": "URL or local path to the OpenAPI description."
6202
+ },
6203
+ "operationId": {
6204
+ "type": "string",
6205
+ "description": "ID of the operation to use for the request."
6206
+ },
6207
+ "server": {
6208
+ "type": "string",
6209
+ "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description."
6210
+ },
6211
+ "validateAgainstSchema": {
6212
+ "type": "string",
6213
+ "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.",
6214
+ "enum": [
6215
+ "request",
6216
+ "response",
6217
+ "both",
6218
+ "none"
6219
+ ],
6220
+ "default": "both"
6221
+ },
6222
+ "mockResponse": {
6223
+ "type": "boolean",
6224
+ "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code."
6225
+ },
6226
+ "statusCode": {
6227
+ "type": "integer",
6228
+ "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified."
6229
+ },
6230
+ "useExample": {
6231
+ "type": [
6232
+ "string"
6233
+ ],
6234
+ "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.",
6235
+ "enum": [
6236
+ "request",
6237
+ "response",
6238
+ "both",
6239
+ "none"
6240
+ ],
6241
+ "default": "none"
6242
+ },
6243
+ "exampleKey": {
6244
+ "type": "string",
6245
+ "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.",
6246
+ "default": ""
6247
+ },
6248
+ "headers": {
6249
+ "type": "object",
6250
+ "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.",
6251
+ "additionalProperties": {
6252
+ "type": "string"
6253
+ }
6254
+ }
6255
+ },
6256
+ "components": {
6257
+ "schemas": {
6258
+ "operationId": {
6259
+ "type": "string",
6260
+ "description": "ID of the operation to use for the request."
6261
+ },
6262
+ "descriptionPath": {
6263
+ "type": "string",
6264
+ "description": "URL or local path to the OpenAPI description."
6265
+ }
6266
+ }
6267
+ },
6268
+ "examples": [
6269
+ {
6270
+ "descriptionPath": "https://petstore.swagger.io/v2/swagger.json"
6271
+ },
6272
+ {
6273
+ "name": "Reqres",
6274
+ "operationId": "getUserById"
6275
+ },
6276
+ {
6277
+ "descriptionPath": "https://api.example.com/openapi.json",
6278
+ "operationId": "getUserById"
6279
+ },
6280
+ {
6281
+ "descriptionPath": "https://api.example.com/openapi.json",
6282
+ "operationId": "createUser",
6283
+ "useExample": "both"
6284
+ },
6285
+ {
6286
+ "descriptionPath": "https://api.example.com/openapi.json",
6287
+ "operationId": "createUser",
6288
+ "useExample": "both",
6289
+ "exampleKey": "example1"
6290
+ },
6291
+ {
6292
+ "descriptionPath": "https://api.example.com/openapi.json",
6293
+ "operationId": "createUser",
6294
+ "useExample": "both",
6295
+ "exampleKey": "example1",
6296
+ "statusCode": 201
6297
+ },
6298
+ {
6299
+ "descriptionPath": "https://api.example.com/openapi.json",
6300
+ "operationId": "createUser",
6301
+ "useExample": "both",
6302
+ "exampleKey": "example1",
6303
+ "statusCode": 201,
6304
+ "validateAgainstSchema": "none"
6305
+ },
6306
+ {
6307
+ "descriptionPath": "https://api.example.com/openapi.json",
6308
+ "operationId": "createUser",
6309
+ "useExample": "both",
6310
+ "exampleKey": "example1",
6311
+ "statusCode": 201,
6312
+ "validateAgainstSchema": "none",
6313
+ "mockResponse": true
6314
+ },
6315
+ {
6316
+ "descriptionPath": "https://api.example.com/openapi.json",
6317
+ "operationId": "createUser",
6318
+ "useExample": "both",
6319
+ "exampleKey": "example1",
6320
+ "statusCode": 201,
6321
+ "validateAgainstSchema": "none",
6322
+ "mockResponse": true,
6323
+ "headers": {
6324
+ "Authorization": "Bearer 12345"
6325
+ }
6326
+ }
6327
+ ]
6328
+ },
6329
+ {
6330
+ "type": "object",
6331
+ "required": [
6332
+ "operationId"
6333
+ ]
6334
+ }
6335
+ ]
6336
+ }
6337
+ ]
6338
+ },
6339
+ "statusCodes": {
6340
+ "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.",
6341
+ "type": "array",
6342
+ "items": {
6343
+ "oneOf": [
6344
+ {
6345
+ "type": "integer"
6346
+ }
6347
+ ]
6348
+ },
6349
+ "default": [
6350
+ 200,
6351
+ 201
6352
+ ]
6353
+ },
6354
+ "method": {
6355
+ "type": "string",
6356
+ "description": "Method of the HTTP request",
6357
+ "enum": [
6358
+ "get",
6359
+ "put",
6360
+ "post",
6361
+ "patch",
6362
+ "delete"
6363
+ ],
6364
+ "transform": [
6365
+ "trim",
6366
+ "toEnumCase"
6367
+ ],
6368
+ "default": "get"
6369
+ },
6370
+ "timeout": {
6371
+ "type": "integer",
6372
+ "description": "Timeout for the HTTP request, in milliseconds.",
6373
+ "default": 60000
6374
+ },
6375
+ "request": {
6376
+ "type": "object",
6377
+ "additionalProperties": false,
6378
+ "properties": {
6379
+ "headers": {
6380
+ "description": "Headers to include in the HTTP request, in key/value format.",
6381
+ "type": "object",
6382
+ "additionalProperties": true,
6383
+ "properties": {},
6384
+ "default": {}
6385
+ },
6386
+ "parameters": {
6387
+ "description": "URL parameters to include in the HTTP request, in key/value format.",
6388
+ "type": "object",
6389
+ "additionalProperties": true,
6390
+ "default": {},
6391
+ "properties": {}
6392
+ },
6393
+ "body": {
6394
+ "description": "JSON object to include as the body of the HTTP request.",
6395
+ "anyOf": [
6396
+ {
6397
+ "type": "object",
6398
+ "additionalProperties": true,
6399
+ "properties": {}
6400
+ },
6401
+ {
6402
+ "type": "array",
6403
+ "items": {}
6404
+ },
6405
+ {
6406
+ "type": "string"
6407
+ }
6408
+ ],
6409
+ "default": {}
6410
+ }
6411
+ }
6412
+ },
6413
+ "response": {
6414
+ "type": "object",
6415
+ "additionalProperties": false,
6416
+ "properties": {
6417
+ "headers": {
6418
+ "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.",
6419
+ "type": "object",
6420
+ "additionalProperties": true,
6421
+ "properties": {},
6422
+ "default": {}
6423
+ },
6424
+ "body": {
6425
+ "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.",
6426
+ "anyOf": [
6427
+ {
6428
+ "type": "object",
6429
+ "additionalProperties": true,
6430
+ "properties": {}
6431
+ },
6432
+ {
6433
+ "type": "array",
6434
+ "items": {}
6435
+ },
6436
+ {
6437
+ "type": "string"
6438
+ }
6439
+ ],
6440
+ "default": {}
6441
+ }
6442
+ }
6443
+ },
6444
+ "allowAdditionalFields": {
6445
+ "type": "boolean",
6446
+ "description": "If `false`, the step fails when the response data contains fields not specified in the response body.",
6447
+ "default": true
6448
+ },
6449
+ "path": {
6450
+ "type": "string",
6451
+ "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings."
6452
+ },
6453
+ "directory": {
6454
+ "type": "string",
6455
+ "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory."
6456
+ },
6457
+ "maxVariation": {
6458
+ "type": "number",
6459
+ "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.",
6460
+ "default": 0,
6461
+ "minimum": 0,
6462
+ "maximum": 1
6463
+ },
6464
+ "overwrite": {
6465
+ "type": "string",
6466
+ "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.",
6467
+ "enum": [
6468
+ "true",
6469
+ "false",
6470
+ "aboveVariation"
6471
+ ],
6472
+ "default": "aboveVariation"
6473
+ }
6474
+ }
6475
+ }
6476
+ ],
6477
+ "components": {
6478
+ "schemas": {
6479
+ "url": {
6480
+ "title": "URL",
6481
+ "type": "string",
6482
+ "description": "URL for the HTTP request.",
6483
+ "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)",
6484
+ "transform": [
6485
+ "trim"
6486
+ ]
6487
+ },
6488
+ "object": {
6489
+ "type": "object",
6490
+ "anyOf": [
6491
+ {
6492
+ "required": [
6493
+ "url"
6494
+ ]
6495
+ },
6496
+ {
6497
+ "required": [
6498
+ "openApi"
6499
+ ]
6500
+ }
6501
+ ],
6502
+ "additionalProperties": false,
6503
+ "properties": {
6504
+ "url": {
6505
+ "title": "URL",
6506
+ "type": "string",
6507
+ "description": "URL for the HTTP request.",
6508
+ "pattern": "(^(http://|https://).*|\\$[A-Za-z0-9_]+)",
6509
+ "transform": [
6510
+ "trim"
6511
+ ]
6512
+ },
6513
+ "openApi": {
6514
+ "anyOf": [
6515
+ {
6516
+ "allOf": [
6517
+ {
6518
+ "type": "string",
6519
+ "description": "ID of the operation to use for the request."
6520
+ },
6521
+ {
6522
+ "title": "Operation ID",
6523
+ "description": "Operation ID from the OpenAPI schema. Only valid if the OpenAPI description path is specified elsewhere and the operation ID is unique among all specified OpenAPI descriptions."
6524
+ }
6525
+ ]
6526
+ },
6527
+ {
6528
+ "allOf": [
6529
+ {
6530
+ "version": "1.0.0",
6531
+ "$schema": "http://json-schema.org/draft-07/schema#",
6532
+ "title": "openApi",
6533
+ "type": "object",
6534
+ "description": "OpenAPI description and configuration.",
6535
+ "additionalProperties": false,
6536
+ "anyOf": [
6537
+ {
6538
+ "required": [
6539
+ "descriptionPath"
6540
+ ]
6541
+ },
6542
+ {
6543
+ "required": [
6544
+ "operationId"
6545
+ ]
6546
+ }
6547
+ ],
6548
+ "properties": {
6549
+ "name": {
6550
+ "type": "string",
6551
+ "description": "Name of the OpenAPI description, as defined in your configuration."
6552
+ },
6553
+ "descriptionPath": {
6554
+ "type": "string",
6555
+ "description": "URL or local path to the OpenAPI description."
6556
+ },
6557
+ "operationId": {
6558
+ "type": "string",
6559
+ "description": "ID of the operation to use for the request."
6560
+ },
6561
+ "server": {
6562
+ "type": "string",
6563
+ "description": "Server to use for example requests. Only valid if `useExample` is `request` or `both`. If not specified but an example is used for the request, uses the first server defined in the OpenAPI description."
6564
+ },
6565
+ "validateAgainstSchema": {
6566
+ "type": "string",
6567
+ "description": "Validates the request and/or response against the schema in the OpenAPI description. If the request or response doesn't match the schema, the step fails.",
6568
+ "enum": [
6569
+ "request",
6570
+ "response",
6571
+ "both",
6572
+ "none"
6573
+ ],
6574
+ "default": "both"
6575
+ },
6576
+ "mockResponse": {
6577
+ "type": "boolean",
6578
+ "description": "If `true`, doesn't make the HTTP request, but instead uses the response example or schema from the OpenAPI description as the response data. Useful for creating tests when an API isn't fully implemented yet. If `statusCode` isn't specified, uses the first defined response code."
6579
+ },
6580
+ "statusCode": {
6581
+ "type": "integer",
6582
+ "description": "Response code to use for validation, examples, and status code checking. If the response code doesn't match, the step fails. `statusCodes` overrides this value when specified."
6583
+ },
6584
+ "useExample": {
6585
+ "type": [
6586
+ "string"
6587
+ ],
6588
+ "description": "Uses the example from the OpenAPI description as the request and response data. If the request or response has multiple examples, specify `exampleKey`. If `statusCode` isn't specified, uses the first defined response code. `requestData`, `requestParams`, and `requestHeaders` override portions of request examples when specified. `responseData` overrides portions of response examples when specified.",
6589
+ "enum": [
6590
+ "request",
6591
+ "response",
6592
+ "both",
6593
+ "none"
6594
+ ],
6595
+ "default": "none"
6596
+ },
6597
+ "exampleKey": {
6598
+ "type": "string",
6599
+ "description": "Key of the example to use from the `examples` property in the OpenAPI description. If an `examples` key isn't specified or isn't available for a given parameter or object, the `example` property value is used.",
6600
+ "default": ""
6601
+ },
6602
+ "headers": {
6603
+ "type": "object",
6604
+ "description": "Request headers to add to requests. For example, to set `Authorization` headers for all requests from the specified OpenAPI document. If specified in both a config and a step, the step value overrides the config value.",
6605
+ "additionalProperties": {
6606
+ "type": "string"
6607
+ }
6608
+ }
6609
+ },
6610
+ "components": {
6611
+ "schemas": {
6612
+ "operationId": {
6613
+ "type": "string",
6614
+ "description": "ID of the operation to use for the request."
6615
+ },
6616
+ "descriptionPath": {
6617
+ "type": "string",
6618
+ "description": "URL or local path to the OpenAPI description."
6619
+ }
6620
+ }
6621
+ },
6622
+ "examples": [
6623
+ {
6624
+ "descriptionPath": "https://petstore.swagger.io/v2/swagger.json"
6625
+ },
6626
+ {
6627
+ "name": "Reqres",
6628
+ "operationId": "getUserById"
6629
+ },
6630
+ {
6631
+ "descriptionPath": "https://api.example.com/openapi.json",
6632
+ "operationId": "getUserById"
6633
+ },
6634
+ {
6635
+ "descriptionPath": "https://api.example.com/openapi.json",
6636
+ "operationId": "createUser",
6637
+ "useExample": "both"
6638
+ },
6639
+ {
6640
+ "descriptionPath": "https://api.example.com/openapi.json",
6641
+ "operationId": "createUser",
6642
+ "useExample": "both",
6643
+ "exampleKey": "example1"
6644
+ },
6645
+ {
6646
+ "descriptionPath": "https://api.example.com/openapi.json",
6647
+ "operationId": "createUser",
6648
+ "useExample": "both",
6649
+ "exampleKey": "example1",
6650
+ "statusCode": 201
6651
+ },
6652
+ {
6653
+ "descriptionPath": "https://api.example.com/openapi.json",
6654
+ "operationId": "createUser",
6655
+ "useExample": "both",
6656
+ "exampleKey": "example1",
6657
+ "statusCode": 201,
6658
+ "validateAgainstSchema": "none"
6659
+ },
6660
+ {
6661
+ "descriptionPath": "https://api.example.com/openapi.json",
6662
+ "operationId": "createUser",
6663
+ "useExample": "both",
6664
+ "exampleKey": "example1",
6665
+ "statusCode": 201,
6666
+ "validateAgainstSchema": "none",
6667
+ "mockResponse": true
6668
+ },
6669
+ {
6670
+ "descriptionPath": "https://api.example.com/openapi.json",
6671
+ "operationId": "createUser",
6672
+ "useExample": "both",
6673
+ "exampleKey": "example1",
6674
+ "statusCode": 201,
6675
+ "validateAgainstSchema": "none",
6676
+ "mockResponse": true,
6677
+ "headers": {
6678
+ "Authorization": "Bearer 12345"
6679
+ }
6680
+ }
6681
+ ]
6682
+ },
6683
+ {
6684
+ "type": "object",
6685
+ "required": [
6686
+ "operationId"
6687
+ ]
6688
+ }
6689
+ ]
6690
+ }
6691
+ ]
6692
+ },
6693
+ "statusCodes": {
6694
+ "description": "Accepted status codes. If the specified URL returns a code other than what is specified here, the action fails.",
6695
+ "type": "array",
6696
+ "items": {
6697
+ "oneOf": [
6698
+ {
6699
+ "type": "integer"
6700
+ }
6701
+ ]
6702
+ },
6703
+ "default": [
6704
+ 200,
6705
+ 201
6706
+ ]
6707
+ },
6708
+ "method": {
6709
+ "type": "string",
6710
+ "description": "Method of the HTTP request",
6711
+ "enum": [
6712
+ "get",
6713
+ "put",
6714
+ "post",
6715
+ "patch",
6716
+ "delete"
6717
+ ],
6718
+ "transform": [
6719
+ "trim",
6720
+ "toEnumCase"
6721
+ ],
6722
+ "default": "get"
6723
+ },
6724
+ "timeout": {
6725
+ "type": "integer",
6726
+ "description": "Timeout for the HTTP request, in milliseconds.",
6727
+ "default": 60000
6728
+ },
6729
+ "request": {
6730
+ "type": "object",
6731
+ "additionalProperties": false,
6732
+ "properties": {
6733
+ "headers": {
6734
+ "description": "Headers to include in the HTTP request, in key/value format.",
6735
+ "type": "object",
6736
+ "additionalProperties": true,
6737
+ "properties": {},
6738
+ "default": {}
6739
+ },
6740
+ "parameters": {
6741
+ "description": "URL parameters to include in the HTTP request, in key/value format.",
6742
+ "type": "object",
6743
+ "additionalProperties": true,
6744
+ "default": {},
6745
+ "properties": {}
6746
+ },
6747
+ "body": {
6748
+ "description": "JSON object to include as the body of the HTTP request.",
6749
+ "anyOf": [
6750
+ {
6751
+ "type": "object",
6752
+ "additionalProperties": true,
6753
+ "properties": {}
6754
+ },
6755
+ {
6756
+ "type": "array",
6757
+ "items": {}
6758
+ },
6759
+ {
6760
+ "type": "string"
6761
+ }
6762
+ ],
6763
+ "default": {}
6764
+ }
6765
+ }
6766
+ },
6767
+ "response": {
6768
+ "type": "object",
6769
+ "additionalProperties": false,
6770
+ "properties": {
6771
+ "headers": {
6772
+ "description": "Headers expected in the response, in key/value format. If one or more `responseHeaders` entries aren't present in the response, the step fails.",
6773
+ "type": "object",
6774
+ "additionalProperties": true,
6775
+ "properties": {},
6776
+ "default": {}
6777
+ },
6778
+ "body": {
6779
+ "description": "JSON object expected in the response. If one or more key/value pairs aren't present in the response, the step fails.",
6780
+ "anyOf": [
6781
+ {
6782
+ "type": "object",
6783
+ "additionalProperties": true,
6784
+ "properties": {}
6785
+ },
6786
+ {
6787
+ "type": "array",
6788
+ "items": {}
6789
+ },
6790
+ {
6791
+ "type": "string"
6792
+ }
6793
+ ],
6794
+ "default": {}
6795
+ }
6796
+ }
6797
+ },
6798
+ "allowAdditionalFields": {
6799
+ "type": "boolean",
6800
+ "description": "If `false`, the step fails when the response data contains fields not specified in the response body.",
6801
+ "default": true
6802
+ },
6803
+ "path": {
6804
+ "type": "string",
6805
+ "description": "File path to save the command's output, relative to `directory`. Specify a file extension that matches the expected response type, such as `.json` for JSON content or `.txt` for strings."
6806
+ },
6807
+ "directory": {
6808
+ "type": "string",
6809
+ "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory."
6810
+ },
6811
+ "maxVariation": {
6812
+ "type": "number",
6813
+ "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.",
6814
+ "default": 0,
6815
+ "minimum": 0,
6816
+ "maximum": 1
6817
+ },
6818
+ "overwrite": {
6819
+ "type": "string",
6820
+ "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.",
6821
+ "enum": [
6822
+ "true",
6823
+ "false",
6824
+ "aboveVariation"
6825
+ ],
6826
+ "default": "aboveVariation"
6827
+ }
6828
+ }
6829
+ }
6830
+ }
6831
+ },
6832
+ "examples": [
6833
+ "https://reqres.in/api/users",
6834
+ {
6835
+ "url": "https://reqres.in/api/users"
6836
+ },
6837
+ {
6838
+ "url": "https://reqres.in/api/users/2",
6839
+ "method": "put",
6840
+ "request": {
6841
+ "body": {
6842
+ "name": "morpheus",
6843
+ "job": "zion resident"
6844
+ }
6845
+ }
6846
+ },
6847
+ {
6848
+ "url": "https://reqres.in/api/users",
6849
+ "method": "post",
6850
+ "request": {
6851
+ "body": {
6852
+ "name": "morpheus",
6853
+ "job": "leader"
6854
+ }
6855
+ },
6856
+ "response": {
6857
+ "body": {
6858
+ "name": "morpheus",
6859
+ "job": "leader"
6860
+ }
6861
+ },
6862
+ "statusCodes": [
6863
+ 200,
6864
+ 201
6865
+ ]
6866
+ },
6867
+ {
6868
+ "url": "https://www.api-server.com",
6869
+ "method": "post",
6870
+ "timeout": 30000,
6871
+ "request": {
6872
+ "body": {
6873
+ "field": "value"
6874
+ },
6875
+ "headers": {
6876
+ "header": "value"
6877
+ },
6878
+ "parameters": {
6879
+ "param": "value"
6880
+ }
6881
+ },
6882
+ "response": {
6883
+ "body": {
6884
+ "field": "value"
6885
+ },
6886
+ "headers": {
6887
+ "header": "value"
6888
+ }
6889
+ },
6890
+ "statusCodes": [
6891
+ 200
6892
+ ]
6893
+ },
6894
+ {
6895
+ "url": "https://reqres.in/api/users",
6896
+ "method": "post",
6897
+ "request": {
6898
+ "body": {
6899
+ "name": "morpheus",
6900
+ "job": "leader"
6901
+ }
6902
+ },
6903
+ "response": {
6904
+ "body": {
6905
+ "name": "morpheus",
6906
+ "job": "leader"
6907
+ }
6908
+ },
6909
+ "statusCodes": [
6910
+ 200,
6911
+ 201
6912
+ ],
6913
+ "path": "response.json",
6914
+ "directory": "media",
6915
+ "maxVariation": 0.05,
6916
+ "overwrite": "aboveVariation"
6917
+ },
6918
+ {
6919
+ "openApi": "getUserById"
6920
+ },
6921
+ {
6922
+ "openApi": {
6923
+ "name": "Reqres",
6924
+ "operationId": "getUserById"
6925
+ },
6926
+ "request": {
6927
+ "parameters": {
6928
+ "id": 123
6929
+ }
6930
+ }
6931
+ },
6932
+ {
6933
+ "openApi": {
6934
+ "descriptionPath": "https://api.example.com/openapi.json",
6935
+ "operationId": "getUserById"
6936
+ },
6937
+ "request": {
6938
+ "parameters": {
6939
+ "id": 123
6940
+ }
6941
+ }
6942
+ },
6943
+ {
6944
+ "openApi": {
6945
+ "descriptionPath": "https://api.example.com/openapi.json",
6946
+ "operationId": "createUser",
6947
+ "useExample": "both"
6948
+ }
6949
+ },
6950
+ {
6951
+ "openApi": {
6952
+ "descriptionPath": "https://api.example.com/openapi.json",
6953
+ "operationId": "updateUser",
6954
+ "useExample": "request",
6955
+ "exampleKey": "acme"
6956
+ }
6957
+ },
6958
+ {
6959
+ "openApi": {
6960
+ "descriptionPath": "https://api.example.com/openapi.json",
6961
+ "operationId": "updateUser",
6962
+ "useExample": "request",
6963
+ "exampleKey": "acme",
6964
+ "headers": {
6965
+ "Authorization": "Bearer $TOKEN"
6966
+ }
6967
+ }
6968
+ }
6969
+ ]
6970
+ }
6971
+ }
6972
+ }
6973
+ ]
6974
+ },
6975
+ {
6976
+ "allOf": [
6977
+ {
6978
+ "type": "object",
6979
+ "dynamicDefaults": {
6980
+ "stepId": "uuid"
6981
+ },
6982
+ "properties": {
6983
+ "stepId": {
6984
+ "type": "string",
6985
+ "description": "ID of the step."
6986
+ },
6987
+ "description": {
6988
+ "type": "string",
6989
+ "description": "Description of the step."
6990
+ },
6991
+ "outputs": {
6992
+ "type": "object",
6993
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
6994
+ "default": {},
6995
+ "patternProperties": {
6996
+ "^[A-Za-z0-9_]+$": {
6997
+ "type": "string",
6998
+ "description": "Runtime expression for a user-defined output value."
6999
+ }
7000
+ }
7001
+ },
7002
+ "variables": {
7003
+ "type": "object",
7004
+ "description": "Environment variables to set from user-defined expressions.",
7005
+ "default": {},
7006
+ "patternProperties": {
7007
+ "^[A-Za-z0-9_]+$": {
7008
+ "type": "string",
7009
+ "description": "Runtime expression for a user-defined output value."
7010
+ }
7011
+ }
7012
+ }
7013
+ }
7014
+ },
7015
+ {
7016
+ "type": "object",
7017
+ "required": [
7018
+ "runShell"
7019
+ ],
7020
+ "properties": {
7021
+ "runShell": {
7022
+ "$schema": "http://json-schema.org/draft-07/schema#",
7023
+ "title": "runShell",
7024
+ "description": "Perform a native shell command.",
7025
+ "anyOf": [
7026
+ {
7027
+ "type": "string",
7028
+ "transform": [
7029
+ "trim"
7030
+ ]
7031
+ },
7032
+ {
7033
+ "type": "object",
7034
+ "required": [
7035
+ "command"
7036
+ ],
7037
+ "additionalProperties": false,
7038
+ "properties": {
7039
+ "command": {
7040
+ "type": "string",
7041
+ "description": "Command to perform in the machine's default shell."
7042
+ },
7043
+ "args": {
7044
+ "type": "array",
7045
+ "description": "Arguments for the command.",
7046
+ "items": {
7047
+ "oneOf": [
7048
+ {
7049
+ "type": "string"
7050
+ }
7051
+ ]
7052
+ },
7053
+ "default": []
7054
+ },
7055
+ "workingDirectory": {
7056
+ "type": "string",
7057
+ "description": "Working directory for the command.",
7058
+ "default": "."
7059
+ },
7060
+ "exitCodes": {
7061
+ "type": "array",
7062
+ "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.",
7063
+ "items": {
7064
+ "oneOf": [
7065
+ {
7066
+ "type": "integer"
7067
+ }
7068
+ ]
7069
+ },
7070
+ "default": [
7071
+ 0
7072
+ ]
7073
+ },
7074
+ "stdio": {
7075
+ "type": "string",
7076
+ "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`."
7077
+ },
7078
+ "path": {
7079
+ "type": "string",
7080
+ "description": "File path to save the command's output, relative to `directory`."
7081
+ },
7082
+ "directory": {
7083
+ "type": "string",
7084
+ "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory."
7085
+ },
7086
+ "maxVariation": {
7087
+ "type": "number",
7088
+ "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.",
7089
+ "default": 0,
7090
+ "minimum": 0,
7091
+ "maximum": 1
7092
+ },
7093
+ "overwrite": {
7094
+ "type": "string",
7095
+ "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.",
7096
+ "enum": [
7097
+ "true",
7098
+ "false",
7099
+ "aboveVariation"
7100
+ ],
7101
+ "default": "aboveVariation"
7102
+ },
7103
+ "timeout": {
7104
+ "type": "integer",
7105
+ "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.",
7106
+ "default": 60000
7107
+ }
7108
+ }
7109
+ }
7110
+ ],
7111
+ "components": {
7112
+ "schemas": {
7113
+ "string": {
7114
+ "type": "string",
7115
+ "transform": [
7116
+ "trim"
7117
+ ]
7118
+ },
7119
+ "object": {
7120
+ "type": "object",
7121
+ "required": [
7122
+ "command"
7123
+ ],
7124
+ "additionalProperties": false,
7125
+ "properties": {
7126
+ "command": {
7127
+ "type": "string",
7128
+ "description": "Command to perform in the machine's default shell."
7129
+ },
7130
+ "args": {
7131
+ "type": "array",
7132
+ "description": "Arguments for the command.",
7133
+ "items": {
7134
+ "oneOf": [
7135
+ {
7136
+ "type": "string"
7137
+ }
7138
+ ]
7139
+ },
7140
+ "default": []
7141
+ },
7142
+ "workingDirectory": {
7143
+ "type": "string",
7144
+ "description": "Working directory for the command.",
7145
+ "default": "."
7146
+ },
7147
+ "exitCodes": {
7148
+ "type": "array",
7149
+ "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.",
7150
+ "items": {
7151
+ "oneOf": [
7152
+ {
7153
+ "type": "integer"
7154
+ }
7155
+ ]
7156
+ },
7157
+ "default": [
7158
+ 0
7159
+ ]
7160
+ },
7161
+ "stdio": {
7162
+ "type": "string",
7163
+ "description": "Content expected in the command's stdout or stderr. If the expected content can't be found in the command's stdout or stderr, the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`."
7164
+ },
7165
+ "path": {
7166
+ "type": "string",
7167
+ "description": "File path to save the command's output, relative to `directory`."
7168
+ },
7169
+ "directory": {
7170
+ "type": "string",
7171
+ "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory."
7172
+ },
7173
+ "maxVariation": {
7174
+ "type": "number",
7175
+ "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.",
7176
+ "default": 0,
7177
+ "minimum": 0,
7178
+ "maximum": 1
7179
+ },
7180
+ "overwrite": {
7181
+ "type": "string",
7182
+ "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.",
7183
+ "enum": [
7184
+ "true",
7185
+ "false",
7186
+ "aboveVariation"
7187
+ ],
7188
+ "default": "aboveVariation"
7189
+ },
7190
+ "timeout": {
7191
+ "type": "integer",
7192
+ "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.",
7193
+ "default": 60000
7194
+ }
7195
+ }
7196
+ }
7197
+ }
7198
+ },
7199
+ "examples": [
7200
+ "docker run hello-world",
7201
+ {
7202
+ "command": "echo",
7203
+ "args": [
7204
+ "$USER"
7205
+ ]
7206
+ },
7207
+ {
7208
+ "command": "echo",
7209
+ "args": [
7210
+ "hello-world"
7211
+ ]
7212
+ },
7213
+ {
7214
+ "command": "docker run hello-world",
7215
+ "timeout": 20000,
7216
+ "exitCodes": [
7217
+ 0
7218
+ ],
7219
+ "stdio": "Hello from Docker!"
7220
+ },
7221
+ {
7222
+ "command": "false",
7223
+ "exitCodes": [
7224
+ 1
7225
+ ]
7226
+ },
7227
+ {
7228
+ "command": "echo",
7229
+ "args": [
7230
+ "setup"
7231
+ ],
7232
+ "exitCodes": [
7233
+ 0
7234
+ ],
7235
+ "stdio": "/.*?/"
7236
+ },
7237
+ {
7238
+ "command": "docker run hello-world",
7239
+ "workingDirectory": ".",
7240
+ "exitCodes": [
7241
+ 0
7242
+ ],
7243
+ "stdio": "Hello from Docker!",
7244
+ "path": "docker-output.txt",
7245
+ "directory": "output",
7246
+ "maxVariation": 0.1,
7247
+ "overwrite": "aboveVariation"
7248
+ }
7249
+ ]
7250
+ }
7251
+ }
7252
+ }
7253
+ ]
7254
+ },
7255
+ {
7256
+ "allOf": [
7257
+ {
7258
+ "type": "object",
7259
+ "dynamicDefaults": {
7260
+ "stepId": "uuid"
7261
+ },
7262
+ "properties": {
7263
+ "stepId": {
7264
+ "type": "string",
7265
+ "description": "ID of the step."
7266
+ },
7267
+ "description": {
7268
+ "type": "string",
7269
+ "description": "Description of the step."
7270
+ },
7271
+ "outputs": {
7272
+ "type": "object",
7273
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
7274
+ "default": {},
7275
+ "patternProperties": {
7276
+ "^[A-Za-z0-9_]+$": {
7277
+ "type": "string",
7278
+ "description": "Runtime expression for a user-defined output value."
7279
+ }
7280
+ }
7281
+ },
7282
+ "variables": {
7283
+ "type": "object",
7284
+ "description": "Environment variables to set from user-defined expressions.",
7285
+ "default": {},
7286
+ "patternProperties": {
7287
+ "^[A-Za-z0-9_]+$": {
7288
+ "type": "string",
7289
+ "description": "Runtime expression for a user-defined output value."
7290
+ }
7291
+ }
7292
+ }
7293
+ }
7294
+ },
7295
+ {
7296
+ "type": "object",
7297
+ "required": [
7298
+ "runCode"
7299
+ ],
7300
+ "properties": {
7301
+ "runCode": {
7302
+ "$schema": "http://json-schema.org/draft-07/schema#",
7303
+ "title": "runCode",
7304
+ "description": "Assemble and run code.",
7305
+ "anyOf": [
7306
+ {
7307
+ "type": "object",
7308
+ "required": [
7309
+ "code",
7310
+ "language"
7311
+ ],
7312
+ "properties": {
7313
+ "language": {
7314
+ "type": "string",
7315
+ "description": "Language of the code to run.",
7316
+ "enum": [
7317
+ "python",
7318
+ "bash",
7319
+ "javascript"
7320
+ ]
7321
+ },
7322
+ "code": {
7323
+ "description": "Code to run.",
7324
+ "type": "string"
7325
+ },
7326
+ "args": {
7327
+ "type": "array",
7328
+ "description": "Arguments for the command.",
7329
+ "items": {
7330
+ "oneOf": [
7331
+ {
7332
+ "type": "string"
7333
+ }
7334
+ ]
7335
+ },
7336
+ "default": []
7337
+ },
7338
+ "workingDirectory": {
7339
+ "type": "string",
7340
+ "description": "Working directory for the command.",
7341
+ "default": "."
7342
+ },
7343
+ "exitCodes": {
7344
+ "type": "array",
7345
+ "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.",
7346
+ "items": {
7347
+ "oneOf": [
7348
+ {
7349
+ "type": "integer"
7350
+ }
7351
+ ]
7352
+ },
7353
+ "default": [
7354
+ 0
7355
+ ]
7356
+ },
7357
+ "stdio": {
7358
+ "type": "string",
7359
+ "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`."
7360
+ },
7361
+ "path": {
7362
+ "type": "string",
7363
+ "description": "File path to save the command's output, relative to `directory`."
7364
+ },
7365
+ "directory": {
7366
+ "type": "string",
7367
+ "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory."
7368
+ },
7369
+ "maxVariation": {
7370
+ "type": "number",
7371
+ "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.",
7372
+ "default": 0,
7373
+ "minimum": 0,
7374
+ "maximum": 1
7375
+ },
7376
+ "overwrite": {
7377
+ "type": "string",
7378
+ "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.",
7379
+ "enum": [
7380
+ "true",
7381
+ "false",
7382
+ "aboveVariation"
7383
+ ],
7384
+ "default": "aboveVariation"
7385
+ },
7386
+ "timeout": {
7387
+ "type": "integer",
7388
+ "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.",
7389
+ "default": 60000
7390
+ }
7391
+ }
7392
+ }
7393
+ ],
7394
+ "components": {
7395
+ "schemas": {
7396
+ "object": {
7397
+ "type": "object",
7398
+ "required": [
7399
+ "code",
7400
+ "language"
7401
+ ],
7402
+ "properties": {
7403
+ "language": {
7404
+ "type": "string",
7405
+ "description": "Language of the code to run.",
7406
+ "enum": [
7407
+ "python",
7408
+ "bash",
7409
+ "javascript"
7410
+ ]
7411
+ },
7412
+ "code": {
7413
+ "description": "Code to run.",
7414
+ "type": "string"
7415
+ },
7416
+ "args": {
7417
+ "type": "array",
7418
+ "description": "Arguments for the command.",
7419
+ "items": {
7420
+ "oneOf": [
7421
+ {
7422
+ "type": "string"
7423
+ }
7424
+ ]
7425
+ },
7426
+ "default": []
7427
+ },
7428
+ "workingDirectory": {
7429
+ "type": "string",
7430
+ "description": "Working directory for the command.",
7431
+ "default": "."
7432
+ },
7433
+ "exitCodes": {
7434
+ "type": "array",
7435
+ "description": "Expected exit codes of the command. If the command's actual exit code isn't in this list, the step fails.",
7436
+ "items": {
7437
+ "oneOf": [
7438
+ {
7439
+ "type": "integer"
7440
+ }
7441
+ ]
7442
+ },
7443
+ "default": [
7444
+ 0
7445
+ ]
7446
+ },
7447
+ "stdio": {
7448
+ "type": "string",
7449
+ "description": "Content expected in the command's output. If the expected content can't be found in the command's output (either stdout or stderr), the step fails. Supports strings and regular expressions. To use a regular expression, the string must start and end with a forward slash, like in `/^hello-world.*/`."
7450
+ },
7451
+ "path": {
7452
+ "type": "string",
7453
+ "description": "File path to save the command's output, relative to `directory`."
7454
+ },
7455
+ "directory": {
7456
+ "type": "string",
7457
+ "description": "Directory to save the command's output. If the directory doesn't exist, creates the directory. If not specified, the directory is your media directory."
7458
+ },
7459
+ "maxVariation": {
7460
+ "type": "number",
7461
+ "description": "Allowed variation in percentage of text different between the current output and previously saved output. If the difference between the current output and the previous output is greater than `maxVariation`, the step fails. If output doesn't exist at `path`, this value is ignored.",
7462
+ "default": 0,
7463
+ "minimum": 0,
7464
+ "maximum": 1
7465
+ },
7466
+ "overwrite": {
7467
+ "type": "string",
7468
+ "description": "If `true`, overwrites the existing output at `path` if it exists.\nIf `aboveVariation`, overwrites the existing output at `path` if the difference between the new output and the existing output is greater than `maxVariation`.",
7469
+ "enum": [
7470
+ "true",
7471
+ "false",
7472
+ "aboveVariation"
7473
+ ],
7474
+ "default": "aboveVariation"
7475
+ },
7476
+ "timeout": {
7477
+ "type": "integer",
7478
+ "description": "Max time in milliseconds the command is allowed to run. If the command runs longer than this, the step fails.",
7479
+ "default": 60000
7480
+ }
7481
+ }
7482
+ }
7483
+ }
7484
+ },
7485
+ "examples": [
7486
+ {
7487
+ "language": "javascript",
7488
+ "code": "console.log('Hello, ${process.env.USER}!');"
7489
+ },
7490
+ {
7491
+ "language": "bash",
7492
+ "code": "docker run hello-world",
7493
+ "timeout": 20000,
7494
+ "exitCodes": [
7495
+ 0
7496
+ ],
7497
+ "stdio": "Hello from Docker!"
7498
+ },
7499
+ {
7500
+ "language": "javascript",
7501
+ "code": "return false",
7502
+ "exitCodes": [
7503
+ 1
7504
+ ]
7505
+ },
7506
+ {
7507
+ "language": "python",
7508
+ "code": "print('Hello from Python')",
7509
+ "workingDirectory": ".",
7510
+ "exitCodes": [
7511
+ 0
7512
+ ],
7513
+ "stdio": "Hello from Python!",
7514
+ "path": "python-output.txt",
7515
+ "directory": "output",
7516
+ "maxVariation": 0.1,
7517
+ "overwrite": "aboveVariation"
7518
+ }
7519
+ ]
7520
+ }
7521
+ }
7522
+ }
7523
+ ]
7524
+ },
7525
+ {
7526
+ "allOf": [
7527
+ {
7528
+ "type": "object",
7529
+ "dynamicDefaults": {
7530
+ "stepId": "uuid"
7531
+ },
7532
+ "properties": {
7533
+ "stepId": {
7534
+ "type": "string",
7535
+ "description": "ID of the step."
7536
+ },
7537
+ "description": {
7538
+ "type": "string",
7539
+ "description": "Description of the step."
7540
+ },
7541
+ "outputs": {
7542
+ "type": "object",
7543
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
7544
+ "default": {},
7545
+ "patternProperties": {
7546
+ "^[A-Za-z0-9_]+$": {
7547
+ "type": "string",
7548
+ "description": "Runtime expression for a user-defined output value."
7549
+ }
7550
+ }
7551
+ },
7552
+ "variables": {
7553
+ "type": "object",
7554
+ "description": "Environment variables to set from user-defined expressions.",
7555
+ "default": {},
7556
+ "patternProperties": {
7557
+ "^[A-Za-z0-9_]+$": {
7558
+ "type": "string",
7559
+ "description": "Runtime expression for a user-defined output value."
7560
+ }
7561
+ }
7562
+ }
7563
+ }
7564
+ },
7565
+ {
7566
+ "type": "object",
7567
+ "required": [
7568
+ "type"
7569
+ ],
7570
+ "properties": {
7571
+ "type": {
7572
+ "$schema": "http://json-schema.org/draft-07/schema#",
7573
+ "title": "typeKeys",
7574
+ "description": "Type keys. To type special keys, begin and end the string with `$` and use the special key's keyword. For example, to type the Escape key, enter `$ESCAPE$`.",
7575
+ "anyOf": [
7576
+ {
7577
+ "description": "Sequence of keys to enter.",
7578
+ "anyOf": [
7579
+ {
7580
+ "type": "string"
7581
+ },
7582
+ {
7583
+ "type": "array",
7584
+ "items": {
7585
+ "oneOf": [
7586
+ {
7587
+ "type": "string"
7588
+ }
7589
+ ]
7590
+ }
7591
+ }
7592
+ ]
7593
+ },
7594
+ {
7595
+ "type": "object",
7596
+ "properties": {
7597
+ "keys": {
7598
+ "description": "Sequence of keys to enter.",
7599
+ "anyOf": [
7600
+ {
7601
+ "type": "string"
7602
+ },
7603
+ {
7604
+ "type": "array",
7605
+ "items": {
7606
+ "oneOf": [
7607
+ {
7608
+ "type": "string"
7609
+ }
7610
+ ]
7611
+ }
7612
+ }
7613
+ ]
7614
+ },
7615
+ "inputDelay": {
7616
+ "type": "number",
7617
+ "description": "Delay in milliseconds between each key press during a recording",
7618
+ "default": 100
7619
+ },
7620
+ "selector": {
7621
+ "type": "string",
7622
+ "description": "Selector for the element to type into. If not specified, the typing occurs in the active element."
7623
+ }
7624
+ },
7625
+ "required": [
7626
+ "keys"
7627
+ ],
7628
+ "additionalProperties": false
7629
+ }
7630
+ ],
7631
+ "components": {
7632
+ "schemas": {
7633
+ "keys": {
7634
+ "description": "Sequence of keys to enter.",
7635
+ "anyOf": [
7636
+ {
7637
+ "type": "string"
7638
+ },
7639
+ {
7640
+ "type": "array",
7641
+ "items": {
7642
+ "oneOf": [
7643
+ {
7644
+ "type": "string"
7645
+ }
7646
+ ]
7647
+ }
7648
+ }
7649
+ ]
7650
+ },
7651
+ "object": {
7652
+ "type": "object",
7653
+ "properties": {
7654
+ "keys": {
7655
+ "description": "Sequence of keys to enter.",
7656
+ "anyOf": [
7657
+ {
7658
+ "type": "string"
7659
+ },
7660
+ {
7661
+ "type": "array",
7662
+ "items": {
7663
+ "oneOf": [
7664
+ {
7665
+ "type": "string"
7666
+ }
7667
+ ]
7668
+ }
7669
+ }
7670
+ ]
7671
+ },
7672
+ "inputDelay": {
7673
+ "type": "number",
7674
+ "description": "Delay in milliseconds between each key press during a recording",
7675
+ "default": 100
7676
+ },
7677
+ "selector": {
7678
+ "type": "string",
7679
+ "description": "Selector for the element to type into. If not specified, the typing occurs in the active element."
7680
+ }
7681
+ },
7682
+ "required": [
7683
+ "keys"
7684
+ ],
7685
+ "additionalProperties": false
7686
+ }
7687
+ }
7688
+ },
7689
+ "examples": [
7690
+ "kittens",
7691
+ [
7692
+ "$ENTER$"
7693
+ ],
7694
+ [
7695
+ "kittens",
7696
+ "$ENTER$"
7697
+ ],
7698
+ {
7699
+ "keys": "kittens"
7700
+ },
7701
+ {
7702
+ "keys": [
7703
+ "$ENTER$"
7704
+ ]
7705
+ },
7706
+ {
7707
+ "keys": [
7708
+ "kittens",
7709
+ "$ENTER$"
7710
+ ],
7711
+ "inputDelay": 500
7712
+ }
7713
+ ]
7714
+ }
7715
+ }
7716
+ }
7717
+ ]
7718
+ },
7719
+ {
7720
+ "allOf": [
7721
+ {
7722
+ "type": "object",
7723
+ "dynamicDefaults": {
7724
+ "stepId": "uuid"
7725
+ },
7726
+ "properties": {
7727
+ "stepId": {
7728
+ "type": "string",
7729
+ "description": "ID of the step."
7730
+ },
7731
+ "description": {
7732
+ "type": "string",
7733
+ "description": "Description of the step."
7734
+ },
7735
+ "outputs": {
7736
+ "type": "object",
7737
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
7738
+ "default": {},
7739
+ "patternProperties": {
7740
+ "^[A-Za-z0-9_]+$": {
7741
+ "type": "string",
7742
+ "description": "Runtime expression for a user-defined output value."
7743
+ }
7744
+ }
7745
+ },
7746
+ "variables": {
7747
+ "type": "object",
7748
+ "description": "Environment variables to set from user-defined expressions.",
7749
+ "default": {},
7750
+ "patternProperties": {
7751
+ "^[A-Za-z0-9_]+$": {
7752
+ "type": "string",
7753
+ "description": "Runtime expression for a user-defined output value."
7754
+ }
7755
+ }
7756
+ }
7757
+ }
7758
+ },
7759
+ {
7760
+ "type": "object",
7761
+ "required": [
7762
+ "screenshot"
7763
+ ],
7764
+ "properties": {
7765
+ "screenshot": {
7766
+ "$schema": "http://json-schema.org/draft-07/schema#",
7767
+ "title": "screenshot",
7768
+ "description": "Takes a screenshot in PNG format.",
7769
+ "anyOf": [
7770
+ {
7771
+ "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.",
7772
+ "type": "string",
7773
+ "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)",
7774
+ "transform": [
7775
+ "trim"
7776
+ ]
7777
+ },
7778
+ {
7779
+ "type": "object",
7780
+ "additionalProperties": false,
7781
+ "properties": {
7782
+ "path": {
7783
+ "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.",
7784
+ "type": "string",
7785
+ "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)",
7786
+ "transform": [
7787
+ "trim"
7788
+ ]
7789
+ },
7790
+ "directory": {
7791
+ "type": "string",
7792
+ "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.",
7793
+ "transform": [
7794
+ "trim"
7795
+ ]
7796
+ },
7797
+ "maxVariation": {
7798
+ "type": "number",
7799
+ "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.",
7800
+ "default": 0.05,
7801
+ "minimum": 0,
7802
+ "maximum": 1
7803
+ },
7804
+ "overwrite": {
7805
+ "type": "string",
7806
+ "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.",
7807
+ "enum": [
7808
+ "true",
7809
+ "false",
7810
+ "aboveVariation"
7811
+ ],
7812
+ "default": "aboveVariation"
7813
+ },
7814
+ "crop": {
7815
+ "anyOf": [
7816
+ {
7817
+ "title": "Crop by element",
7818
+ "type": "string",
7819
+ "description": "Display text or selector of the element to screenshot."
7820
+ },
7821
+ {
7822
+ "title": "Crop by element (detailed)",
7823
+ "type": "object",
7824
+ "description": "Crop the screenshot to a specific element.",
7825
+ "additionalProperties": false,
7826
+ "anyOf": [
7827
+ {
7828
+ "required": [
7829
+ "selector"
7830
+ ]
7831
+ },
7832
+ {
7833
+ "required": [
7834
+ "elementText"
7835
+ ]
7836
+ }
7837
+ ],
7838
+ "properties": {
7839
+ "elementText": {
7840
+ "type": "string",
7841
+ "description": "Display text of the element to screenshot."
7842
+ },
7843
+ "selector": {
7844
+ "type": "string",
7845
+ "description": "Selector of the element to screenshot."
7846
+ },
7847
+ "padding": {
7848
+ "anyOf": [
7849
+ {
7850
+ "type": "number",
7851
+ "description": "Padding in pixels to add to the bounds of the element.",
7852
+ "minimum": 0
7853
+ },
7854
+ {
7855
+ "type": "object",
7856
+ "additionalProperties": false,
7857
+ "properties": {
7858
+ "top": {
7859
+ "type": "number",
7860
+ "minimum": 0
7861
+ },
7862
+ "right": {
7863
+ "type": "number",
7864
+ "minimum": 0
7865
+ },
7866
+ "bottom": {
7867
+ "type": "number",
7868
+ "minimum": 0
7869
+ },
7870
+ "left": {
7871
+ "type": "number",
7872
+ "minimum": 0
7873
+ }
7874
+ }
7875
+ }
7876
+ ]
7877
+ }
7878
+ }
7879
+ }
7880
+ ]
7881
+ }
7882
+ }
7883
+ },
7884
+ {
7885
+ "type": "boolean"
7886
+ }
7887
+ ],
7888
+ "components": {
7889
+ "schemas": {
7890
+ "path": {
7891
+ "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.",
7892
+ "type": "string",
7893
+ "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)",
7894
+ "transform": [
7895
+ "trim"
7896
+ ]
7897
+ },
7898
+ "object": {
7899
+ "type": "object",
7900
+ "additionalProperties": false,
7901
+ "properties": {
7902
+ "path": {
7903
+ "description": "File path of the PNG file. Accepts absolute paths. If not specified, the file name is the ID of the step.",
7904
+ "type": "string",
7905
+ "pattern": "([A-Za-z0-9_-]*\\.(png|PNG)$|\\$[A-Za-z0-9_]+)",
7906
+ "transform": [
7907
+ "trim"
7908
+ ]
7909
+ },
7910
+ "directory": {
7911
+ "type": "string",
7912
+ "description": "Directory of the PNG file. If the directory doesn't exist, creates the directory.",
7913
+ "transform": [
7914
+ "trim"
7915
+ ]
7916
+ },
7917
+ "maxVariation": {
7918
+ "type": "number",
7919
+ "description": "Allowed variation in percentage of pixels between the new screenshot and the existing screenshot at `path`. If the difference between the new screenshot and the existing screenshot is greater than `maxVariation`, the step fails. If a screenshot doesn't exist at `path`, this value is ignored.",
7920
+ "default": 0.05,
7921
+ "minimum": 0,
7922
+ "maximum": 1
7923
+ },
7924
+ "overwrite": {
7925
+ "type": "string",
7926
+ "description": "If `true`, overwrites the existing screenshot at `path` if it exists.\nIf `aboveVariation`, overwrites the existing screenshot at `path` if the difference between the new screenshot and the existing screenshot is greater than `maxVariation`.",
7927
+ "enum": [
7928
+ "true",
7929
+ "false",
7930
+ "aboveVariation"
7931
+ ],
7932
+ "default": "aboveVariation"
7933
+ },
7934
+ "crop": {
7935
+ "anyOf": [
7936
+ {
7937
+ "title": "Crop by element",
7938
+ "type": "string",
7939
+ "description": "Display text or selector of the element to screenshot."
7940
+ },
7941
+ {
7942
+ "title": "Crop by element (detailed)",
7943
+ "type": "object",
7944
+ "description": "Crop the screenshot to a specific element.",
7945
+ "additionalProperties": false,
7946
+ "anyOf": [
7947
+ {
7948
+ "required": [
7949
+ "selector"
7950
+ ]
7951
+ },
7952
+ {
7953
+ "required": [
7954
+ "elementText"
7955
+ ]
7956
+ }
7957
+ ],
7958
+ "properties": {
7959
+ "elementText": {
7960
+ "type": "string",
7961
+ "description": "Display text of the element to screenshot."
7962
+ },
7963
+ "selector": {
7964
+ "type": "string",
7965
+ "description": "Selector of the element to screenshot."
7966
+ },
7967
+ "padding": {
7968
+ "anyOf": [
7969
+ {
7970
+ "type": "number",
7971
+ "description": "Padding in pixels to add to the bounds of the element.",
7972
+ "minimum": 0
7973
+ },
7974
+ {
7975
+ "type": "object",
7976
+ "additionalProperties": false,
7977
+ "properties": {
7978
+ "top": {
7979
+ "type": "number",
7980
+ "minimum": 0
7981
+ },
7982
+ "right": {
7983
+ "type": "number",
7984
+ "minimum": 0
7985
+ },
7986
+ "bottom": {
7987
+ "type": "number",
7988
+ "minimum": 0
7989
+ },
7990
+ "left": {
7991
+ "type": "number",
7992
+ "minimum": 0
7993
+ }
7994
+ }
7995
+ }
7996
+ ]
7997
+ }
7998
+ }
7999
+ }
8000
+ ]
8001
+ }
8002
+ }
8003
+ },
8004
+ "crop_element": {
8005
+ "title": "Crop by element (detailed)",
8006
+ "type": "object",
8007
+ "description": "Crop the screenshot to a specific element.",
8008
+ "additionalProperties": false,
8009
+ "anyOf": [
8010
+ {
8011
+ "required": [
8012
+ "selector"
8013
+ ]
8014
+ },
8015
+ {
8016
+ "required": [
8017
+ "elementText"
8018
+ ]
8019
+ }
8020
+ ],
8021
+ "properties": {
8022
+ "elementText": {
8023
+ "type": "string",
8024
+ "description": "Display text of the element to screenshot."
8025
+ },
8026
+ "selector": {
8027
+ "type": "string",
8028
+ "description": "Selector of the element to screenshot."
8029
+ },
8030
+ "padding": {
8031
+ "anyOf": [
8032
+ {
8033
+ "type": "number",
8034
+ "description": "Padding in pixels to add to the bounds of the element.",
8035
+ "minimum": 0
8036
+ },
8037
+ {
8038
+ "type": "object",
8039
+ "additionalProperties": false,
8040
+ "properties": {
8041
+ "top": {
8042
+ "type": "number",
8043
+ "minimum": 0
8044
+ },
8045
+ "right": {
8046
+ "type": "number",
8047
+ "minimum": 0
8048
+ },
8049
+ "bottom": {
8050
+ "type": "number",
8051
+ "minimum": 0
8052
+ },
8053
+ "left": {
8054
+ "type": "number",
8055
+ "minimum": 0
8056
+ }
8057
+ }
8058
+ }
8059
+ ]
8060
+ }
8061
+ }
8062
+ },
8063
+ "padding": {
8064
+ "type": "object",
8065
+ "additionalProperties": false,
8066
+ "properties": {
8067
+ "top": {
8068
+ "type": "number",
8069
+ "minimum": 0
8070
+ },
8071
+ "right": {
8072
+ "type": "number",
8073
+ "minimum": 0
8074
+ },
8075
+ "bottom": {
8076
+ "type": "number",
8077
+ "minimum": 0
8078
+ },
8079
+ "left": {
8080
+ "type": "number",
8081
+ "minimum": 0
8082
+ }
8083
+ }
8084
+ }
8085
+ }
8086
+ },
8087
+ "examples": [
8088
+ true,
8089
+ "image.png",
8090
+ "static/images/image.png",
8091
+ "/User/manny/projects/doc-detective/static/images/image.png",
8092
+ {
8093
+ "path": "image.png",
8094
+ "directory": "static/images",
8095
+ "maxVariation": 0.1,
8096
+ "overwrite": "aboveVariation",
8097
+ "crop": "#elementToScreenshot"
8098
+ },
8099
+ {
8100
+ "path": "image.png",
8101
+ "directory": "static/images",
8102
+ "maxVariation": 0.1,
8103
+ "overwrite": "aboveVariation"
8104
+ },
8105
+ {
8106
+ "path": "image.png",
8107
+ "directory": "static/images",
8108
+ "maxVariation": 0.1,
8109
+ "overwrite": "aboveVariation",
8110
+ "crop": {
8111
+ "selector": "#elementToScreenshot",
8112
+ "elementText": "Element text",
8113
+ "padding": {
8114
+ "top": 0,
8115
+ "right": 0,
8116
+ "bottom": 0,
8117
+ "left": 0
8118
+ }
8119
+ }
8120
+ }
8121
+ ]
8122
+ }
8123
+ }
8124
+ }
8125
+ ]
8126
+ },
8127
+ {
8128
+ "allOf": [
8129
+ {
8130
+ "type": "object",
8131
+ "dynamicDefaults": {
8132
+ "stepId": "uuid"
8133
+ },
8134
+ "properties": {
8135
+ "stepId": {
8136
+ "type": "string",
8137
+ "description": "ID of the step."
8138
+ },
8139
+ "description": {
8140
+ "type": "string",
8141
+ "description": "Description of the step."
8142
+ },
8143
+ "outputs": {
8144
+ "type": "object",
8145
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
8146
+ "default": {},
8147
+ "patternProperties": {
8148
+ "^[A-Za-z0-9_]+$": {
8149
+ "type": "string",
8150
+ "description": "Runtime expression for a user-defined output value."
8151
+ }
8152
+ }
8153
+ },
8154
+ "variables": {
8155
+ "type": "object",
8156
+ "description": "Environment variables to set from user-defined expressions.",
8157
+ "default": {},
8158
+ "patternProperties": {
8159
+ "^[A-Za-z0-9_]+$": {
8160
+ "type": "string",
8161
+ "description": "Runtime expression for a user-defined output value."
8162
+ }
8163
+ }
8164
+ }
8165
+ }
8166
+ },
8167
+ {
8168
+ "type": "object",
8169
+ "required": [
8170
+ "record"
8171
+ ],
8172
+ "properties": {
8173
+ "record": {
8174
+ "$schema": "http://json-schema.org/draft-07/schema#",
8175
+ "title": "record",
8176
+ "description": "Start recording the current browser viewport. Must be followed by a `stopRecord` step. Only runs in Chrome browsers when they are visible. Supported extensions: [ '.mp4', '.webm', '.gif' ]",
8177
+ "anyOf": [
8178
+ {
8179
+ "type": "string",
8180
+ "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.",
8181
+ "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)",
8182
+ "transform": [
8183
+ "trim"
8184
+ ]
8185
+ },
8186
+ {
8187
+ "type": "object",
8188
+ "properties": {
8189
+ "path": {
8190
+ "type": "string",
8191
+ "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.",
8192
+ "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)",
8193
+ "transform": [
8194
+ "trim"
8195
+ ]
8196
+ },
8197
+ "directory": {
8198
+ "type": "string",
8199
+ "description": "Directory of the file. If the directory doesn't exist, creates the directory.",
8200
+ "transform": [
8201
+ "trim"
8202
+ ]
8203
+ },
8204
+ "overwrite": {
8205
+ "type": "string",
8206
+ "description": "If `true`, overwrites the existing recording at `path` if it exists.",
8207
+ "enum": [
8208
+ "true",
8209
+ "false"
8210
+ ]
8211
+ }
8212
+ }
8213
+ },
8214
+ {
8215
+ "type": "boolean"
8216
+ }
8217
+ ],
8218
+ "components": {
8219
+ "schemas": {
8220
+ "string": {
8221
+ "type": "string",
8222
+ "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.",
8223
+ "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)",
8224
+ "transform": [
8225
+ "trim"
8226
+ ]
8227
+ },
8228
+ "object": {
8229
+ "type": "object",
8230
+ "properties": {
8231
+ "path": {
8232
+ "type": "string",
8233
+ "description": "File path of the recording. Supports the `.mp4`, `.webm`, and `.gif` extensions. If not specified, the file name is the ID of the step, and the extension is `.mp4`.",
8234
+ "pattern": "([A-Za-z0-9_-]*\\.(mp4|webm|gif)$|\\$[A-Za-z0-9_]+)",
8235
+ "transform": [
8236
+ "trim"
8237
+ ]
8238
+ },
8239
+ "directory": {
8240
+ "type": "string",
8241
+ "description": "Directory of the file. If the directory doesn't exist, creates the directory.",
8242
+ "transform": [
8243
+ "trim"
8244
+ ]
8245
+ },
8246
+ "overwrite": {
8247
+ "type": "string",
8248
+ "description": "If `true`, overwrites the existing recording at `path` if it exists.",
8249
+ "enum": [
8250
+ "true",
8251
+ "false"
8252
+ ]
8253
+ }
8254
+ }
8255
+ }
8256
+ }
8257
+ },
8258
+ "examples": [
8259
+ true,
8260
+ "results.mp4",
8261
+ {
8262
+ "path": "results.mp4",
8263
+ "directory": "static/media",
8264
+ "overwrite": "true"
8265
+ }
8266
+ ]
8267
+ }
8268
+ }
8269
+ }
8270
+ ]
8271
+ },
8272
+ {
8273
+ "allOf": [
8274
+ {
8275
+ "type": "object",
8276
+ "dynamicDefaults": {
8277
+ "stepId": "uuid"
8278
+ },
8279
+ "properties": {
8280
+ "stepId": {
8281
+ "type": "string",
8282
+ "description": "ID of the step."
8283
+ },
8284
+ "description": {
8285
+ "type": "string",
8286
+ "description": "Description of the step."
8287
+ },
8288
+ "outputs": {
8289
+ "type": "object",
8290
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
8291
+ "default": {},
8292
+ "patternProperties": {
8293
+ "^[A-Za-z0-9_]+$": {
8294
+ "type": "string",
8295
+ "description": "Runtime expression for a user-defined output value."
8296
+ }
8297
+ }
8298
+ },
8299
+ "variables": {
8300
+ "type": "object",
8301
+ "description": "Environment variables to set from user-defined expressions.",
8302
+ "default": {},
8303
+ "patternProperties": {
8304
+ "^[A-Za-z0-9_]+$": {
8305
+ "type": "string",
8306
+ "description": "Runtime expression for a user-defined output value."
8307
+ }
8308
+ }
8309
+ }
8310
+ }
8311
+ },
8312
+ {
8313
+ "type": "object",
8314
+ "required": [
8315
+ "stopRecord"
8316
+ ],
8317
+ "properties": {
8318
+ "stopRecord": {
8319
+ "$schema": "http://json-schema.org/draft-07/schema#",
8320
+ "title": "stopRecord",
8321
+ "description": "Stop the current recording.",
8322
+ "anyOf": [
8323
+ {
8324
+ "type": "boolean",
8325
+ "nullable": true
8326
+ }
8327
+ ],
8328
+ "examples": [
8329
+ true
8330
+ ]
8331
+ }
8332
+ }
8333
+ }
8334
+ ]
8335
+ },
8336
+ {
8337
+ "allOf": [
8338
+ {
8339
+ "type": "object",
8340
+ "dynamicDefaults": {
8341
+ "stepId": "uuid"
8342
+ },
8343
+ "properties": {
8344
+ "stepId": {
8345
+ "type": "string",
8346
+ "description": "ID of the step."
8347
+ },
8348
+ "description": {
8349
+ "type": "string",
8350
+ "description": "Description of the step."
8351
+ },
8352
+ "outputs": {
8353
+ "type": "object",
8354
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
8355
+ "default": {},
8356
+ "patternProperties": {
8357
+ "^[A-Za-z0-9_]+$": {
8358
+ "type": "string",
8359
+ "description": "Runtime expression for a user-defined output value."
8360
+ }
8361
+ }
8362
+ },
8363
+ "variables": {
8364
+ "type": "object",
8365
+ "description": "Environment variables to set from user-defined expressions.",
8366
+ "default": {},
8367
+ "patternProperties": {
8368
+ "^[A-Za-z0-9_]+$": {
8369
+ "type": "string",
8370
+ "description": "Runtime expression for a user-defined output value."
8371
+ }
8372
+ }
8373
+ }
8374
+ }
8375
+ },
8376
+ {
8377
+ "required": [
8378
+ "loadVariables"
8379
+ ],
8380
+ "properties": {
8381
+ "loadVariables": {
8382
+ "$schema": "http://json-schema.org/draft-07/schema#",
8383
+ "title": "loadVariables",
8384
+ "type": "string",
8385
+ "description": "Load environment variables from the specified `.env` file.",
8386
+ "examples": [
8387
+ ".env"
8388
+ ]
8389
+ }
8390
+ }
8391
+ }
8392
+ ]
8393
+ },
8394
+ {
8395
+ "allOf": [
8396
+ {
8397
+ "type": "object",
8398
+ "dynamicDefaults": {
8399
+ "stepId": "uuid"
8400
+ },
8401
+ "properties": {
8402
+ "stepId": {
8403
+ "type": "string",
8404
+ "description": "ID of the step."
8405
+ },
8406
+ "description": {
8407
+ "type": "string",
8408
+ "description": "Description of the step."
8409
+ },
8410
+ "outputs": {
8411
+ "type": "object",
8412
+ "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.",
8413
+ "default": {},
8414
+ "patternProperties": {
8415
+ "^[A-Za-z0-9_]+$": {
8416
+ "type": "string",
8417
+ "description": "Runtime expression for a user-defined output value."
8418
+ }
8419
+ }
8420
+ },
8421
+ "variables": {
8422
+ "type": "object",
8423
+ "description": "Environment variables to set from user-defined expressions.",
8424
+ "default": {},
8425
+ "patternProperties": {
8426
+ "^[A-Za-z0-9_]+$": {
8427
+ "type": "string",
8428
+ "description": "Runtime expression for a user-defined output value."
8429
+ }
8430
+ }
8431
+ }
8432
+ }
8433
+ },
8434
+ {
8435
+ "required": [
8436
+ "wait"
8437
+ ],
8438
+ "properties": {
8439
+ "wait": {
8440
+ "$schema": "http://json-schema.org/draft-07/schema#",
8441
+ "title": "wait",
8442
+ "description": "Pause (in milliseconds) before performing the next action.",
8443
+ "default": 5000,
8444
+ "anyOf": [
8445
+ {
8446
+ "type": "number"
8447
+ },
8448
+ {
8449
+ "type": "string",
8450
+ "pattern": "(\\$[A-Za-z0-9_]+)",
8451
+ "transform": [
8452
+ "trim"
8453
+ ]
8454
+ },
8455
+ {
8456
+ "type": "boolean"
8457
+ }
8458
+ ],
8459
+ "components": {
8460
+ "schemas": {
8461
+ "string": {
8462
+ "type": "string",
8463
+ "pattern": "(\\$[A-Za-z0-9_]+)",
8464
+ "transform": [
8465
+ "trim"
8466
+ ]
8467
+ }
8468
+ }
8469
+ },
8470
+ "examples": [
8471
+ 5000,
8472
+ "$WAIT_DURATION",
8473
+ true
8474
+ ]
8475
+ }
8476
+ }
8477
+ }
8478
+ ]
8479
+ }
8480
+ ],
8481
+ "examples": [
8482
+ {
8483
+ "stepId": "uuid",
8484
+ "description": "Description of the step.",
8485
+ "checkLink": "https://www.google.com",
8486
+ "outputs": {
8487
+ "outputKey": "outputValue"
8488
+ },
8489
+ "variables": {
8490
+ "variableKey": "variableValue"
8491
+ }
8492
+ },
8493
+ {
8494
+ "checkLink": "https://www.google.com"
8495
+ },
8496
+ {
8497
+ "stepId": "path-only",
8498
+ "checkLink": "/search"
8499
+ },
8500
+ {
8501
+ "stepId": "status-code",
8502
+ "checkLink": {
8503
+ "url": "https://www.google.com",
8504
+ "statusCodes": [
8505
+ 200
8506
+ ]
8507
+ }
8508
+ },
8509
+ {
8510
+ "goTo": {
8511
+ "url": "https://www.google.com"
8512
+ }
8513
+ },
8514
+ {
8515
+ "goTo": "https://www.google.com"
8516
+ },
8517
+ {
8518
+ "wait": 5000
8519
+ },
8520
+ {
8521
+ "runCode": {
8522
+ "language": "python",
8523
+ "code": "print('Hello from Python')",
8524
+ "workingDirectory": ".",
8525
+ "exitCodes": [
8526
+ 0
8527
+ ],
8528
+ "stdio": "Hello from Python!",
8529
+ "path": "python-output.txt",
8530
+ "directory": "output",
8531
+ "maxVariation": 0.1,
8532
+ "overwrite": "aboveVariation"
8533
+ }
8534
+ },
8535
+ {
8536
+ "stopRecord": true
8537
+ },
8538
+ {
8539
+ "screenshot": true
8540
+ },
8541
+ {
8542
+ "screenshot": "image.png"
8543
+ },
8544
+ {
8545
+ "screenshot": "static/images/image.png"
8546
+ },
8547
+ {
8548
+ "screenshot": "/User/manny/projects/doc-detective/static/images/image.png"
8549
+ },
8550
+ {
8551
+ "screenshot": {
8552
+ "path": "image.png",
8553
+ "directory": "static/images",
8554
+ "maxVariation": 0.1,
8555
+ "overwrite": "aboveVariation",
8556
+ "crop": "#elementToScreenshot"
8557
+ }
8558
+ },
8559
+ {
8560
+ "screenshot": {
8561
+ "path": "image.png",
8562
+ "directory": "static/images",
8563
+ "maxVariation": 0.1,
8564
+ "overwrite": "aboveVariation"
8565
+ }
8566
+ },
8567
+ {
8568
+ "screenshot": {
8569
+ "path": "image.png",
8570
+ "directory": "static/images",
8571
+ "maxVariation": 0.1,
8572
+ "overwrite": "aboveVariation",
8573
+ "crop": {
8574
+ "selector": "#elementToScreenshot",
8575
+ "elementText": "Element text",
8576
+ "padding": {
8577
+ "top": 0,
8578
+ "right": 0,
8579
+ "bottom": 0,
8580
+ "left": 0
8581
+ }
8582
+ }
8583
+ }
8584
+ },
8585
+ {
8586
+ "record": true
8587
+ },
8588
+ {
8589
+ "record": "video.mp4"
8590
+ },
8591
+ {
8592
+ "record": "static/media/video.mp4"
8593
+ },
8594
+ {
8595
+ "record": "/User/manny/projects/doc-detective/static/media/video.mp4"
8596
+ },
8597
+ {
8598
+ "record": {
8599
+ "path": "video.mp4",
8600
+ "directory": "static/media",
8601
+ "overwrite": true
8602
+ }
8603
+ },
8604
+ {
8605
+ "loadVariables": "variables.env"
8606
+ },
8607
+ {
8608
+ "find": "Find me!"
8609
+ },
8610
+ {
8611
+ "find": {
8612
+ "selector": "[title=Search]"
8613
+ }
8614
+ },
8615
+ {
8616
+ "find": {
8617
+ "selector": "[title=Search]",
8618
+ "timeout": 10000,
8619
+ "elementText": "Search",
8620
+ "moveTo": true,
8621
+ "click": true,
8622
+ "type": "shorthair cat"
8623
+ }
8624
+ },
8625
+ {
8626
+ "find": {
8627
+ "selector": "[title=Search]",
8628
+ "click": {
8629
+ "button": "right"
8630
+ }
8631
+ }
8632
+ },
8633
+ {
8634
+ "find": {
8635
+ "selector": "[title=Search]",
8636
+ "timeout": 10000,
8637
+ "elementText": "Search",
8638
+ "moveTo": true,
8639
+ "click": true,
8640
+ "type": {
8641
+ "keys": [
8642
+ "shorthair cat"
8643
+ ],
8644
+ "inputDelay": 100
8645
+ }
8646
+ }
8647
+ },
8648
+ {
8649
+ "click": true
8650
+ },
8651
+ {
8652
+ "click": "right"
8653
+ },
8654
+ {
8655
+ "click": {
8656
+ "button": "left",
8657
+ "elementText": "Element text"
8658
+ }
8659
+ },
8660
+ {
8661
+ "click": {
8662
+ "selector": "#elementToScreenshot",
8663
+ "elementText": "Element text",
8664
+ "button": "middle"
8665
+ }
8666
+ },
8667
+ {
8668
+ "httpRequest": "https://reqres.in/api/users"
8669
+ },
8670
+ {
8671
+ "httpRequest": {
8672
+ "url": "https://reqres.in/api/users"
8673
+ }
8674
+ },
8675
+ {
8676
+ "httpRequest": {
8677
+ "url": "https://reqres.in/api/users/2",
8678
+ "method": "put",
8679
+ "request": {
8680
+ "body": {
8681
+ "name": "morpheus",
8682
+ "job": "zion resident"
8683
+ }
8684
+ }
8685
+ }
8686
+ },
8687
+ {
8688
+ "httpRequest": {
8689
+ "url": "https://reqres.in/api/users",
8690
+ "method": "post",
8691
+ "request": {
8692
+ "body": {
8693
+ "name": "morpheus",
8694
+ "job": "leader"
8695
+ }
8696
+ },
8697
+ "response": {
8698
+ "body": {
8699
+ "name": "morpheus",
8700
+ "job": "leader"
8701
+ }
8702
+ },
8703
+ "statusCodes": [
8704
+ 200,
8705
+ 201
8706
+ ]
8707
+ }
8708
+ },
8709
+ {
8710
+ "httpRequest": {
8711
+ "url": "https://www.api-server.com",
8712
+ "method": "post",
8713
+ "timeout": 30000,
8714
+ "request": {
8715
+ "body": {
8716
+ "field": "value"
8717
+ },
8718
+ "headers": {
8719
+ "header": "value"
8720
+ },
8721
+ "parameters": {
8722
+ "param": "value"
8723
+ }
8724
+ },
8725
+ "response": {
8726
+ "body": {
8727
+ "field": "value"
8728
+ },
8729
+ "headers": {
8730
+ "header": "value"
8731
+ }
8732
+ },
8733
+ "statusCodes": [
8734
+ 200
8735
+ ]
8736
+ }
8737
+ },
8738
+ {
8739
+ "httpRequest": {
8740
+ "url": "https://reqres.in/api/users",
8741
+ "method": "post",
8742
+ "request": {
8743
+ "body": {
8744
+ "name": "morpheus",
8745
+ "job": "leader"
8746
+ }
8747
+ },
8748
+ "response": {
8749
+ "body": {
8750
+ "name": "morpheus",
8751
+ "job": "leader"
8752
+ }
8753
+ },
8754
+ "statusCodes": [
8755
+ 200,
8756
+ 201
8757
+ ],
8758
+ "path": "response.json",
8759
+ "directory": "media",
8760
+ "maxVariation": 0.05,
8761
+ "overwrite": "aboveVariation"
8762
+ }
8763
+ },
8764
+ {
8765
+ "httpRequest": {
8766
+ "openApi": "getUserById"
8767
+ }
8768
+ },
8769
+ {
8770
+ "httpRequest": {
8771
+ "openApi": {
8772
+ "name": "Reqres",
8773
+ "operationId": "getUserById"
8774
+ },
8775
+ "request": {
8776
+ "parameters": {
8777
+ "id": 123
8778
+ }
8779
+ }
8780
+ }
8781
+ },
8782
+ {
8783
+ "httpRequest": {
8784
+ "openApi": {
8785
+ "descriptionPath": "https://api.example.com/openapi.json",
8786
+ "operationId": "getUserById"
8787
+ },
8788
+ "request": {
8789
+ "parameters": {
8790
+ "id": 123
8791
+ }
8792
+ }
8793
+ }
8794
+ },
8795
+ {
8796
+ "httpRequest": {
8797
+ "openApi": {
8798
+ "descriptionPath": "https://api.example.com/openapi.json",
8799
+ "operationId": "createUser",
8800
+ "useExample": "both"
8801
+ }
8802
+ }
8803
+ },
8804
+ {
8805
+ "httpRequest": {
8806
+ "openApi": {
8807
+ "descriptionPath": "https://api.example.com/openapi.json",
8808
+ "operationId": "updateUser",
8809
+ "useExample": "request",
8810
+ "exampleKey": "acme"
8811
+ }
8812
+ }
8813
+ },
8814
+ {
8815
+ "httpRequest": {
8816
+ "openApi": {
8817
+ "descriptionPath": "https://api.example.com/openapi.json",
8818
+ "operationId": "updateUser",
8819
+ "useExample": "request",
8820
+ "exampleKey": "acme",
8821
+ "headers": {
8822
+ "Authorization": "Bearer $TOKEN"
8823
+ }
8824
+ }
8825
+ }
8826
+ }
8827
+ ]
8828
+ }
8829
+ }
8830
+ }
8831
+ }
4666
8832
  }
4667
8833
  },
4668
8834
  "dynamicDefaults": {
4669
8835
  "testId": "uuid"
4670
8836
  },
4671
- "required": [
4672
- "steps"
8837
+ "anyOf": [
8838
+ {
8839
+ "required": [
8840
+ "steps"
8841
+ ]
8842
+ },
8843
+ {
8844
+ "required": [
8845
+ "contexts"
8846
+ ]
8847
+ }
4673
8848
  ],
4674
8849
  "additionalProperties": false,
4675
8850
  "examples": [