{
  "displayName": "Prisma",
  "fileTypes": [
    "prisma"
  ],
  "name": "prisma",
  "patterns": [
    {
      "include": "#triple_comment"
    },
    {
      "include": "#double_comment"
    },
    {
      "include": "#multi_line_comment"
    },
    {
      "include": "#model_block_definition"
    },
    {
      "include": "#config_block_definition"
    },
    {
      "include": "#enum_block_definition"
    },
    {
      "include": "#type_definition"
    }
  ],
  "repository": {
    "array": {
      "begin": "\\[",
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "end": "]",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "name": "source.prisma.array",
      "patterns": [
        {
          "include": "#value"
        }
      ]
    },
    "assignment": {
      "patterns": [
        {
          "begin": "^\\s*(\\w+)\\s*(=)\\s*",
          "beginCaptures": {
            "1": {
              "name": "variable.other.assignment.prisma"
            },
            "2": {
              "name": "keyword.operator.terraform"
            }
          },
          "end": "\\n",
          "patterns": [
            {
              "include": "#value"
            },
            {
              "include": "#double_comment_inline"
            }
          ]
        }
      ]
    },
    "attribute": {
      "captures": {
        "1": {
          "name": "entity.name.function.attribute.prisma"
        }
      },
      "match": "(@@?[.\\w]+)",
      "name": "source.prisma.attribute"
    },
    "attribute_with_arguments": {
      "begin": "(@@?[.\\w]+)(\\()",
      "beginCaptures": {
        "1": {
          "name": "entity.name.function.attribute.prisma"
        },
        "2": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "name": "source.prisma.attribute.with_arguments",
      "patterns": [
        {
          "include": "#named_argument"
        },
        {
          "include": "#value"
        }
      ]
    },
    "boolean": {
      "match": "\\b(true|false)\\b",
      "name": "constant.language.boolean.prisma"
    },
    "config_block_definition": {
      "begin": "^\\s*(generator|datasource)\\s+([A-Za-z]\\w*)\\s+(\\{)",
      "beginCaptures": {
        "1": {
          "name": "storage.type.config.prisma"
        },
        "2": {
          "name": "entity.name.type.config.prisma"
        },
        "3": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "end": "\\s*}",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "name": "source.prisma.embedded.source",
      "patterns": [
        {
          "include": "#triple_comment"
        },
        {
          "include": "#double_comment"
        },
        {
          "include": "#multi_line_comment"
        },
        {
          "include": "#assignment"
        }
      ]
    },
    "double_comment": {
      "begin": "//",
      "end": "$\\n?",
      "name": "comment.prisma"
    },
    "double_comment_inline": {
      "match": "//[^\\n]*",
      "name": "comment.prisma"
    },
    "double_quoted_string": {
      "begin": "\"",
      "beginCaptures": {
        "0": {
          "name": "string.quoted.double.start.prisma"
        }
      },
      "end": "\"",
      "endCaptures": {
        "0": {
          "name": "string.quoted.double.end.prisma"
        }
      },
      "name": "unnamed",
      "patterns": [
        {
          "include": "#string_interpolation"
        },
        {
          "match": "([-%./:=?@\\\\_\\w]+)",
          "name": "string.quoted.double.prisma"
        }
      ]
    },
    "enum_block_definition": {
      "begin": "^\\s*(enum)\\s+([A-Za-z]\\w*)\\s+(\\{)",
      "beginCaptures": {
        "1": {
          "name": "storage.type.enum.prisma"
        },
        "2": {
          "name": "entity.name.type.enum.prisma"
        },
        "3": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "end": "\\s*}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "name": "source.prisma.embedded.source",
      "patterns": [
        {
          "include": "#triple_comment"
        },
        {
          "include": "#double_comment"
        },
        {
          "include": "#multi_line_comment"
        },
        {
          "include": "#enum_value_definition"
        }
      ]
    },
    "enum_value_definition": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "variable.other.assignment.prisma"
            }
          },
          "match": "^\\s*(\\w+)\\s*"
        },
        {
          "include": "#attribute_with_arguments"
        },
        {
          "include": "#attribute"
        }
      ]
    },
    "field_definition": {
      "name": "scalar.field",
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "variable.other.assignment.prisma"
            },
            "2": {
              "name": "invalid.illegal.colon.prisma"
            },
            "3": {
              "name": "variable.language.relations.prisma"
            },
            "4": {
              "name": "support.type.primitive.prisma"
            },
            "5": {
              "name": "keyword.operator.list_type.prisma"
            },
            "6": {
              "name": "keyword.operator.optional_type.prisma"
            },
            "7": {
              "name": "invalid.illegal.required_type.prisma"
            }
          },
          "match": "^\\s*(\\w+)(\\s*:)?\\s+((?!(?:Int|BigInt|String|DateTime|Bytes|Decimal|Float|Json|Boolean)\\b)\\b\\w+)?(Int|BigInt|String|DateTime|Bytes|Decimal|Float|Json|Boolean)?(\\[])?(\\?)?(!)?"
        },
        {
          "include": "#attribute_with_arguments"
        },
        {
          "include": "#attribute"
        }
      ]
    },
    "functional": {
      "begin": "(\\w+)(\\()",
      "beginCaptures": {
        "1": {
          "name": "support.function.functional.prisma"
        },
        "2": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "name": "source.prisma.functional",
      "patterns": [
        {
          "include": "#value"
        }
      ]
    },
    "identifier": {
      "patterns": [
        {
          "match": "\\b(\\w)+\\b",
          "name": "support.constant.constant.prisma"
        }
      ]
    },
    "literal": {
      "name": "source.prisma.literal",
      "patterns": [
        {
          "include": "#boolean"
        },
        {
          "include": "#number"
        },
        {
          "include": "#double_quoted_string"
        },
        {
          "include": "#identifier"
        }
      ]
    },
    "map_key": {
      "name": "source.prisma.key",
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "variable.parameter.key.prisma"
            },
            "2": {
              "name": "punctuation.definition.separator.key-value.prisma"
            }
          },
          "match": "(\\w+)\\s*(:)\\s*"
        }
      ]
    },
    "model_block_definition": {
      "begin": "^\\s*(model|type|view)\\s+([A-Za-z]\\w*)\\s*(\\{)",
      "beginCaptures": {
        "1": {
          "name": "storage.type.model.prisma"
        },
        "2": {
          "name": "entity.name.type.model.prisma"
        },
        "3": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "end": "\\s*}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.tag.prisma"
        }
      },
      "name": "source.prisma.embedded.source",
      "patterns": [
        {
          "include": "#triple_comment"
        },
        {
          "include": "#double_comment"
        },
        {
          "include": "#multi_line_comment"
        },
        {
          "include": "#field_definition"
        }
      ]
    },
    "multi_line_comment": {
      "begin": "/\\*",
      "end": "\\*/",
      "name": "comment.prisma"
    },
    "named_argument": {
      "name": "source.prisma.named_argument",
      "patterns": [
        {
          "include": "#map_key"
        },
        {
          "include": "#value"
        }
      ]
    },
    "number": {
      "match": "((0([Xx])\\h*)|([-+])?\\b(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))(([Ee])([-+])?[0-9]+)?)([DFLUdfglu]|UL|ul)?\\b",
      "name": "constant.numeric.prisma"
    },
    "string_interpolation": {
      "patterns": [
        {
          "begin": "\\$\\{",
          "beginCaptures": {
            "0": {
              "name": "keyword.control.interpolation.start.prisma"
            }
          },
          "end": "\\s*}",
          "endCaptures": {
            "0": {
              "name": "keyword.control.interpolation.end.prisma"
            }
          },
          "name": "source.tag.embedded.source.prisma",
          "patterns": [
            {
              "include": "#value"
            }
          ]
        }
      ]
    },
    "triple_comment": {
      "begin": "///",
      "end": "$\\n?",
      "name": "comment.prisma"
    },
    "type_definition": {
      "patterns": [
        {
          "captures": {
            "1": {
              "name": "storage.type.type.prisma"
            },
            "2": {
              "name": "entity.name.type.type.prisma"
            },
            "3": {
              "name": "support.type.primitive.prisma"
            }
          },
          "match": "^\\s*(type)\\s+(\\w+)\\s*=\\s*(\\w+)"
        },
        {
          "include": "#attribute_with_arguments"
        },
        {
          "include": "#attribute"
        }
      ]
    },
    "value": {
      "name": "source.prisma.value",
      "patterns": [
        {
          "include": "#array"
        },
        {
          "include": "#functional"
        },
        {
          "include": "#literal"
        }
      ]
    }
  },
  "scopeName": "source.prisma"
}
