{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://json.schemastore.org/accelerator.json",
  "definitions": {
    "AcceleratorOption": {
      "type": "object",
      "properties": {
        "choices": {
          "title": "choices",
          "description": "A list of predefined choices",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "title": "text",
                "description": "The displayed text"
              },
              "value": {
                "title": "value",
                "description": "The value that the form returns for this choice"
              }
            },
            "title": "choices"
          }
        },
        "dataType": {
          "anyOf": [
            {
              "const": "string"
            },
            {
              "const": "number"
            },
            {
              "const": "boolean"
            },
            {
              "type": "string",
              "pattern": "^$|^[A-Z][a-z0-9A-Z]*$"
            },
            {
              "type": "array",
              "minItems": 1,
              "maxItems": 1,
              "items": {
                "const": "string"
              }
            },
            {
              "type": "array",
              "minItems": 1,
              "maxItems": 1,
              "items": {
                "const": "number"
              }
            },
            {
              "type": "array",
              "minItems": 1,
              "maxItems": 1,
              "items": {
                "const": "boolean"
              }
            },
            {
              "type": "array",
              "minItems": 1,
              "maxItems": 1,
              "items": {
                "type": "string",
                "pattern": "^$|^[A-Z][a-z0-9A-Z]*$"
              }
            },
            {
              "type": "null"
            }
          ],
          "title": "dataType",
          "description": "The option data type"
        },
        "defaultValue": {
          "title": "defaultValue",
          "description": "The value used to pre-populate the option"
        },
        "dependsOn": {
          "title": "dependsOn",
          "description": "The dependency that controls this options visibility",
          "allOf": [
            {
              "$ref": "#/definitions/DependsOn"
            }
          ]
        },
        "description": {
          "type": "string",
          "title": "description",
          "description": "A tooltip to accompany the input"
        },
        "inputType": {
          "enum": ["text", "textarea", "checkbox", "select", "radio"],
          "title": "inputType",
          "description": "The HTML input type used to display the option"
        },
        "label": {
          "type": "string",
          "title": "label",
          "description": "A human-readable version of the name identifying the option"
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "A unique, camelCase name",
          "minLength": 1,
          "pattern": "^$|^[a-z][a-z0-9A-Z]*$"
        },
        "required": {
          "type": "boolean",
          "title": "required",
          "description": "Whether the user is required to enter a value in the UI"
        },
        "validationRegex": {
          "title": "validationRegex",
          "description": "A regex that validates the string representation of the option value when set",
          "allOf": [
            {
              "$ref": "#/definitions/Pattern"
            }
          ]
        }
      },
      "anyOf": [
        {
          "properties": {
            "dataType": {
              "const": "string"
            },
            "defaultValue": {
              "type": "string"
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "type": "array",
              "items": {
                "const": "string"
              }
            },
            "defaultValue": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "const": "number"
            },
            "defaultValue": {
              "type": "number"
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "type": "array",
              "items": {
                "const": "number"
              }
            },
            "defaultValue": {
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "const": "boolean"
            },
            "defaultValue": {
              "type": "boolean"
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "type": "array",
              "items": {
                "const": "boolean"
              }
            },
            "defaultValue": {
              "type": "array",
              "items": {
                "type": "boolean"
              }
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "type": "string",
              "pattern": "^$|^[A-Z][a-z0-9A-Z]*$"
            },
            "defaultValue": {
              "type": "object"
            }
          }
        },
        {
          "properties": {
            "dataType": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^$|^[A-Z][a-z0-9A-Z]*$"
              }
            },
            "defaultValue": {
              "type": "array",
              "items": {
                "type": "object"
              }
            }
          }
        }
      ]
    },
    "Chain-1": {
      "type": "object",
      "properties": {
        "applyTo": {
          "title": "applyTo",
          "description": "The path patterns used to filter which files to apply the Transforms to",
          "minItems": 1,
          "type": "array",
          "items": {
            "type": "string",
            "title": "applyTo",
            "minLength": 1,
            "pattern": "^$|^[^/].*$"
          }
        },
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "transformations": {
          "title": "transformations",
          "description": "A list of child Transforms to apply sequentially",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/Chain-2"
              },
              {
                "$ref": "#/definitions/Combo-2"
              },
              {
                "$ref": "#/definitions/Exclude-2"
              },
              {
                "$ref": "#/definitions/Include-2"
              },
              {
                "$ref": "#/definitions/InvokeFragment-2"
              },
              {
                "$ref": "#/definitions/Let-2"
              },
              {
                "$ref": "#/definitions/Loop-2"
              },
              {
                "$ref": "#/definitions/Merge-2"
              },
              {
                "$ref": "#/definitions/OpenRewriteRecipe-2"
              },
              {
                "$ref": "#/definitions/Provenance-2"
              },
              {
                "$ref": "#/definitions/ReplaceText-2"
              },
              {
                "$ref": "#/definitions/RewritePath-2"
              },
              {
                "$ref": "#/definitions/UniquePath-2"
              },
              {
                "$ref": "#/definitions/UseEncoding-2"
              },
              {
                "$ref": "#/definitions/YTT-2"
              }
            ]
          }
        }
      }
    },
    "Chain-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Chain"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Chain-1"
        }
      ]
    },
    "Combo-1": {
      "type": "object",
      "properties": {
        "applyTo": {
          "title": "applyTo",
          "description": "The path patterns used to filter which files to apply the Transforms to",
          "minItems": 1,
          "type": "array",
          "items": {
            "type": "string",
            "title": "applyTo",
            "minLength": 1,
            "pattern": "^$|^[^/].*$"
          }
        },
        "chain": {
          "title": "chain",
          "description": "A list of child Transforms to apply sequentially",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/Chain-2"
              },
              {
                "$ref": "#/definitions/Combo-2"
              },
              {
                "$ref": "#/definitions/Exclude-2"
              },
              {
                "$ref": "#/definitions/Include-2"
              },
              {
                "$ref": "#/definitions/InvokeFragment-2"
              },
              {
                "$ref": "#/definitions/Let-2"
              },
              {
                "$ref": "#/definitions/Loop-2"
              },
              {
                "$ref": "#/definitions/Merge-2"
              },
              {
                "$ref": "#/definitions/OpenRewriteRecipe-2"
              },
              {
                "$ref": "#/definitions/Provenance-2"
              },
              {
                "$ref": "#/definitions/ReplaceText-2"
              },
              {
                "$ref": "#/definitions/RewritePath-2"
              },
              {
                "$ref": "#/definitions/UniquePath-2"
              },
              {
                "$ref": "#/definitions/UseEncoding-2"
              },
              {
                "$ref": "#/definitions/YTT-2"
              }
            ]
          }
        },
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "exclude": {
          "title": "exclude",
          "description": "The path patterns used to filter which files to exclude",
          "type": "array",
          "items": {
            "type": "string",
            "title": "exclude",
            "minLength": 1,
            "pattern": "^$|^[^/].*$"
          }
        },
        "include": {
          "title": "include",
          "description": "The path patterns used to filter which files to include",
          "type": "array",
          "items": {
            "type": "string",
            "title": "include",
            "minLength": 1,
            "pattern": "^$|^[^/].*$"
          }
        },
        "let": {
          "title": "let",
          "description": "A list of additional variables and their values",
          "type": "array",
          "items": {
            "title": "let",
            "allOf": [
              {
                "$ref": "#/definitions/DerivedSymbol"
              }
            ]
          }
        },
        "merge": {
          "title": "merge",
          "description": "A list of child Transforms to be executed in parallel",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/Chain-2"
              },
              {
                "$ref": "#/definitions/Combo-2"
              },
              {
                "$ref": "#/definitions/Exclude-2"
              },
              {
                "$ref": "#/definitions/Include-2"
              },
              {
                "$ref": "#/definitions/InvokeFragment-2"
              },
              {
                "$ref": "#/definitions/Let-2"
              },
              {
                "$ref": "#/definitions/Loop-2"
              },
              {
                "$ref": "#/definitions/Merge-2"
              },
              {
                "$ref": "#/definitions/OpenRewriteRecipe-2"
              },
              {
                "$ref": "#/definitions/Provenance-2"
              },
              {
                "$ref": "#/definitions/ReplaceText-2"
              },
              {
                "$ref": "#/definitions/RewritePath-2"
              },
              {
                "$ref": "#/definitions/UniquePath-2"
              },
              {
                "$ref": "#/definitions/UseEncoding-2"
              },
              {
                "$ref": "#/definitions/YTT-2"
              }
            ]
          }
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "onConflict": {
          "title": "onConflict",
          "description": "How conflict is handled when an operation produces multiple files at the same path",
          "allOf": [
            {
              "$ref": "#/definitions/ConflictResolution"
            }
          ]
        }
      }
    },
    "Combo-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Combo"
        }
      },
      "allOf": [
        {
          "$ref": "#/definitions/Combo-1"
        }
      ]
    },
    "ConflictResolution": {
      "enum": [
        "Fail",
        "UseFirst",
        "UseLast",
        "Append",
        "FavorOwn",
        "FavorForeign",
        "NWayDiff"
      ]
    },
    "DependsOn": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "title": "name",
          "description": "The options name",
          "minLength": 1,
          "pattern": "^$|^[a-z][a-z0-9A-Z]*$"
        },
        "value": {
          "title": "value",
          "description": "The desired options value to compare against"
        }
      }
    },
    "DerivedSymbol": {
      "type": "object",
      "properties": {
        "expression": {
          "title": "expression",
          "description": "The SpEL expression to evaluate to compute the symbol value",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The name under which the new symbol will be added",
          "minLength": 1,
          "pattern": "^$|^[a-z][a-z0-9A-Z]*$"
        }
      }
    },
    "Exclude-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "patterns": {
          "title": "patterns",
          "description": "The path patterns used to filter which files to exclude",
          "type": "array",
          "items": {
            "type": "string",
            "title": "patterns",
            "minLength": 1,
            "pattern": "^$|^[^/].*$"
          }
        }
      }
    },
    "Exclude-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Exclude"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Exclude-1"
        }
      ]
    },
    "Expression": {
      "type": "string"
    },
    "Include-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "patterns": {
          "title": "patterns",
          "description": "The path patterns used to filter which files to include",
          "type": "array",
          "items": {
            "type": "string",
            "title": "patterns",
            "minLength": 1,
            "pattern": "^$|^[^/].*$"
          }
        }
      }
    },
    "Include-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Include"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Include-1"
        }
      ]
    },
    "InvokeFragment-1": {
      "type": "object",
      "properties": {
        "anchor": {
          "type": "string",
          "title": "anchor",
          "pattern": "^$|^[^/]$|^[^/](.+)[^/]$"
        },
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "let": {
          "title": "let",
          "type": "array",
          "items": {
            "title": "let",
            "allOf": [
              {
                "$ref": "#/definitions/DerivedSymbol"
              }
            ]
          }
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "reference": {
          "type": "string",
          "title": "reference",
          "minLength": 1,
          "pattern": "^[a-z0-9]([a-z0-9-]*[a-z0-9])?$"
        }
      }
    },
    "InvokeFragment-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "InvokeFragment"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/InvokeFragment-1"
        }
      ]
    },
    "Let-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "in": {
          "anyOf": [
            {
              "$ref": "#/definitions/Chain-2"
            },
            {
              "$ref": "#/definitions/Combo-2"
            },
            {
              "$ref": "#/definitions/Exclude-2"
            },
            {
              "$ref": "#/definitions/Include-2"
            },
            {
              "$ref": "#/definitions/InvokeFragment-2"
            },
            {
              "$ref": "#/definitions/Let-2"
            },
            {
              "$ref": "#/definitions/Loop-2"
            },
            {
              "$ref": "#/definitions/Merge-2"
            },
            {
              "$ref": "#/definitions/OpenRewriteRecipe-2"
            },
            {
              "$ref": "#/definitions/Provenance-2"
            },
            {
              "$ref": "#/definitions/ReplaceText-2"
            },
            {
              "$ref": "#/definitions/RewritePath-2"
            },
            {
              "$ref": "#/definitions/UniquePath-2"
            },
            {
              "$ref": "#/definitions/UseEncoding-2"
            },
            {
              "$ref": "#/definitions/YTT-2"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "noShadow": {
          "type": "boolean",
          "title": "noShadow",
          "description": "Whether shadowing should be turned off"
        },
        "symbols": {
          "title": "symbols",
          "description": "A list of additional variables and their values",
          "type": "array",
          "items": {
            "title": "symbols",
            "allOf": [
              {
                "$ref": "#/definitions/DerivedSymbol"
              }
            ]
          }
        }
      }
    },
    "Let-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Let"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Let-1"
        }
      ]
    },
    "Loop-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "doAsChain": {
          "anyOf": [
            {
              "$ref": "#/definitions/Chain-2"
            },
            {
              "$ref": "#/definitions/Combo-2"
            },
            {
              "$ref": "#/definitions/Exclude-2"
            },
            {
              "$ref": "#/definitions/Include-2"
            },
            {
              "$ref": "#/definitions/InvokeFragment-2"
            },
            {
              "$ref": "#/definitions/Let-2"
            },
            {
              "$ref": "#/definitions/Loop-2"
            },
            {
              "$ref": "#/definitions/Merge-2"
            },
            {
              "$ref": "#/definitions/OpenRewriteRecipe-2"
            },
            {
              "$ref": "#/definitions/Provenance-2"
            },
            {
              "$ref": "#/definitions/ReplaceText-2"
            },
            {
              "$ref": "#/definitions/RewritePath-2"
            },
            {
              "$ref": "#/definitions/UniquePath-2"
            },
            {
              "$ref": "#/definitions/UseEncoding-2"
            },
            {
              "$ref": "#/definitions/YTT-2"
            }
          ]
        },
        "doAsMerge": {
          "anyOf": [
            {
              "$ref": "#/definitions/Chain-2"
            },
            {
              "$ref": "#/definitions/Combo-2"
            },
            {
              "$ref": "#/definitions/Exclude-2"
            },
            {
              "$ref": "#/definitions/Include-2"
            },
            {
              "$ref": "#/definitions/InvokeFragment-2"
            },
            {
              "$ref": "#/definitions/Let-2"
            },
            {
              "$ref": "#/definitions/Loop-2"
            },
            {
              "$ref": "#/definitions/Merge-2"
            },
            {
              "$ref": "#/definitions/OpenRewriteRecipe-2"
            },
            {
              "$ref": "#/definitions/Provenance-2"
            },
            {
              "$ref": "#/definitions/ReplaceText-2"
            },
            {
              "$ref": "#/definitions/RewritePath-2"
            },
            {
              "$ref": "#/definitions/UniquePath-2"
            },
            {
              "$ref": "#/definitions/UseEncoding-2"
            },
            {
              "$ref": "#/definitions/YTT-2"
            }
          ]
        },
        "index": {
          "type": "string",
          "title": "index",
          "description": "The variable's name to be assigned to the index of the current element on each iteration",
          "pattern": "^$|^[a-z][a-z0-9A-Z]*$"
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "on": {
          "title": "on",
          "description": "A SpEL expression that evaluates a list that contains the elements to be iterated over",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "var": {
          "type": "string",
          "title": "var",
          "description": "The name of the variable to be assigned to the current element on each iteration",
          "pattern": "^$|^[a-z][a-z0-9A-Z]*$"
        }
      }
    },
    "Loop-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Loop"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Loop-1"
        }
      ]
    },
    "Merge-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "sources": {
          "title": "sources",
          "description": "A list of child Transforms to be executed in parallel",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/Chain-2"
              },
              {
                "$ref": "#/definitions/Combo-2"
              },
              {
                "$ref": "#/definitions/Exclude-2"
              },
              {
                "$ref": "#/definitions/Include-2"
              },
              {
                "$ref": "#/definitions/InvokeFragment-2"
              },
              {
                "$ref": "#/definitions/Let-2"
              },
              {
                "$ref": "#/definitions/Loop-2"
              },
              {
                "$ref": "#/definitions/Merge-2"
              },
              {
                "$ref": "#/definitions/OpenRewriteRecipe-2"
              },
              {
                "$ref": "#/definitions/Provenance-2"
              },
              {
                "$ref": "#/definitions/ReplaceText-2"
              },
              {
                "$ref": "#/definitions/RewritePath-2"
              },
              {
                "$ref": "#/definitions/UniquePath-2"
              },
              {
                "$ref": "#/definitions/UseEncoding-2"
              },
              {
                "$ref": "#/definitions/YTT-2"
              }
            ]
          }
        }
      }
    },
    "Merge-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Merge"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Merge-1"
        }
      ]
    },
    "OpenRewriteRecipe-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "options": {
          "type": "object",
          "title": "options",
          "description": "Keys and values that depend on the class of the recipe"
        },
        "parseOrFail": {
          "type": "boolean",
          "title": "parseOrFail"
        },
        "recipe": {
          "type": "string",
          "pattern": "^[a-zA-Z_$][a-zA-Z\\d_$]*(?:\\.[a-zA-Z_$][a-zA-Z\\d_$]*)*$",
          "title": "recipe",
          "description": "Full qualified classname of the recipe"
        }
      }
    },
    "OpenRewriteRecipe-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "OpenRewriteRecipe"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/OpenRewriteRecipe-1"
        }
      ]
    },
    "Pattern": {
      "type": "string",
      "format": "regex"
    },
    "Provenance-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        }
      }
    },
    "Provenance-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "Provenance"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/Provenance-1"
        }
      ]
    },
    "ReplaceText-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "regex": {
          "type": "object",
          "properties": {
            "pattern": {
              "title": "pattern",
              "description": "The regular expression that determines text that will be replaced",
              "allOf": [
                {
                  "$ref": "#/definitions/Pattern"
                }
              ]
            },
            "with": {
              "title": "with",
              "description": "The SpEL expression that evaluates to the text that will replace the previous string",
              "allOf": [
                {
                  "$ref": "#/definitions/Expression"
                }
              ]
            }
          },
          "title": "regex",
          "description": "The replacement rule using a single regular expression"
        },
        "substitutions": {
          "title": "substitutions",
          "description": "The replacement rules using literal text tokens",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string",
                "title": "text",
                "description": "The text that will be replaced",
                "minLength": 1
              },
              "with": {
                "title": "with",
                "description": "The SpEL expression that evaluates to the text that will replace the previous string",
                "allOf": [
                  {
                    "$ref": "#/definitions/Expression"
                  }
                ]
              }
            },
            "title": "substitutions"
          }
        }
      }
    },
    "ReplaceText-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "ReplaceText"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/ReplaceText-1"
        }
      ]
    },
    "RewritePath-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "matchOrFail": {
          "type": "boolean",
          "title": "matchOrFail",
          "description": "Whether an error should occur if the regex doesn't match"
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "regex": {
          "title": "regex",
          "description": "The regular expression used to match each input files path",
          "allOf": [
            {
              "$ref": "#/definitions/Pattern"
            }
          ]
        },
        "rewriteTo": {
          "title": "rewriteTo",
          "description": "The SpEL expression of the location that the file will be rewritten to",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        }
      }
    },
    "RewritePath-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "RewritePath"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/RewritePath-1"
        }
      ]
    },
    "UniquePath-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        },
        "strategy": {
          "title": "strategy",
          "description": "How conflict is handled when an operation produces multiple files at the same path",
          "allOf": [
            {
              "$ref": "#/definitions/ConflictResolution"
            }
          ]
        }
      }
    },
    "UniquePath-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "UniquePath"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/UniquePath-1"
        }
      ]
    },
    "UseEncoding-1": {
      "type": "object",
      "properties": {
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "encoding": {
          "type": "object",
          "title": "encoding",
          "description": "The encuding to use, as recognized by the java java.nio.charset.Charset class"
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        }
      }
    },
    "UseEncoding-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "UseEncoding"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/UseEncoding-1"
        }
      ]
    },
    "YTT-1": {
      "type": "object",
      "properties": {
        "allowList": {
          "title": "allowList",
          "description": "A list of variable names that are allowed to be passed to YTT",
          "type": "array",
          "items": {
            "title": "allowList",
            "allOf": [
              {
                "$ref": "#/definitions/Pattern"
              }
            ]
          }
        },
        "condition": {
          "title": "condition",
          "description": "The SpEL expression that determines if this Transform should execute",
          "allOf": [
            {
              "$ref": "#/definitions/Expression"
            }
          ]
        },
        "denyList": {
          "title": "denyList",
          "description": "A list of variable names that are denied from being passed to YTT",
          "type": "array",
          "items": {
            "title": "denyList",
            "allOf": [
              {
                "$ref": "#/definitions/Pattern"
              }
            ]
          }
        },
        "extraArgs": {
          "title": "extraArgs",
          "description": "A list of SpEL expressions whose results are additional command line arguments",
          "type": "array",
          "items": {
            "title": "extraArgs",
            "allOf": [
              {
                "$ref": "#/definitions/Expression"
              }
            ]
          }
        },
        "name": {
          "type": "string",
          "title": "name",
          "description": "The transform name"
        }
      }
    },
    "YTT-2": {
      "type": "object",
      "properties": {
        "type": {
          "const": "YTT"
        }
      },
      "required": ["type"],
      "allOf": [
        {
          "$ref": "#/definitions/YTT-1"
        }
      ]
    }
  },
  "properties": {
    "accelerator": {
      "type": "object",
      "properties": {
        "description": {
          "type": "string",
          "title": "description",
          "description": "A more detailed description"
        },
        "displayName": {
          "type": "string",
          "title": "displayName",
          "description": "A human-readable name"
        },
        "iconUrl": {
          "type": "string",
          "title": "iconUrl",
          "description": "A URL pointing to an icon image"
        },
        "imports": {
          "title": "imports",
          "description": "The list of fragment to import",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "expose": {
                "title": "expose",
                "description": "The list of fragment options to make available as accelerator options",
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "as": {
                      "type": "string",
                      "title": "as",
                      "description": "The alias to use as the name of the option",
                      "minLength": 1,
                      "pattern": "^$|^[a-z][a-z0-9A-Z]*$"
                    },
                    "dependsOn": {
                      "title": "dependsOn",
                      "description": "The dependency that controls this options visibility",
                      "allOf": [
                        {
                          "$ref": "#/definitions/DependsOn"
                        }
                      ]
                    },
                    "name": {
                      "type": "string",
                      "title": "name",
                      "description": "The original name of the option",
                      "minLength": 1,
                      "pattern": "^\\*$|^$|^[a-z][a-z0-9A-Z]*$"
                    }
                  },
                  "title": "expose"
                }
              },
              "exposeTypes": {
                "title": "exposeTypes",
                "description": "The list of fragment types to make available as accelerator types",
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "as": {
                      "type": "string",
                      "title": "as",
                      "description": "The alias to use as the name of the type",
                      "minLength": 1,
                      "pattern": "^$|^[A-Z][a-z0-9A-Z]*$"
                    },
                    "name": {
                      "type": "string",
                      "title": "name",
                      "description": "The original name of the type",
                      "minLength": 1,
                      "pattern": "^\\*$|^$|^[A-Z][a-z0-9A-Z]*$"
                    }
                  },
                  "title": "exposeTypes"
                }
              },
              "name": {
                "type": "string",
                "title": "name",
                "description": "The name of the fragment to import",
                "minLength": 1
              }
            },
            "title": "imports"
          }
        },
        "options": {
          "title": "options",
          "description": "The list of options passed to the UI to create input text boxes",
          "type": "array",
          "items": {
            "title": "options",
            "allOf": [
              {
                "$ref": "#/definitions/AcceleratorOption"
              }
            ]
          }
        },
        "tags": {
          "title": "tags",
          "description": "A list of tags used to filter accelerators",
          "type": "array",
          "items": {
            "type": "string",
            "title": "tags"
          }
        },
        "types": {
          "title": "types",
          "description": "The definitions of custom types",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "title": "name",
                "description": "The capitalized name of this custom type",
                "minLength": 1,
                "pattern": "^$|^[A-Z][a-z0-9A-Z]*$"
              },
              "struct": {
                "title": "struct",
                "description": "A sequence of option definitions",
                "minItems": 1,
                "type": "array",
                "items": {
                  "title": "struct",
                  "allOf": [
                    {
                      "$ref": "#/definitions/AcceleratorOption"
                    }
                  ]
                }
              }
            },
            "title": "types"
          }
        }
      },
      "title": "accelerator",
      "description": "The metadata (non-behavioral) part of an App Accelerator's accelerator.yaml file"
    },
    "engine": {
      "anyOf": [
        {
          "$ref": "#/definitions/Chain-2"
        },
        {
          "$ref": "#/definitions/Combo-2"
        },
        {
          "$ref": "#/definitions/Exclude-2"
        },
        {
          "$ref": "#/definitions/Include-2"
        },
        {
          "$ref": "#/definitions/InvokeFragment-2"
        },
        {
          "$ref": "#/definitions/Let-2"
        },
        {
          "$ref": "#/definitions/Loop-2"
        },
        {
          "$ref": "#/definitions/Merge-2"
        },
        {
          "$ref": "#/definitions/OpenRewriteRecipe-2"
        },
        {
          "$ref": "#/definitions/Provenance-2"
        },
        {
          "$ref": "#/definitions/ReplaceText-2"
        },
        {
          "$ref": "#/definitions/RewritePath-2"
        },
        {
          "$ref": "#/definitions/UniquePath-2"
        },
        {
          "$ref": "#/definitions/UseEncoding-2"
        },
        {
          "$ref": "#/definitions/YTT-2"
        }
      ]
    }
  },
  "type": "object"
}
