{
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 6,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "env": {
    "browser": true,
    "es6": true,
    "node": true
  },
  "plugins": [
    "@typescript-eslint",
    "react",
    "security"
  ],
  "rules": {
    "no-caller": "error",
    "no-delete-var": "error",
    "no-eval": "error",
    "no-implied-eval": "error",
    "no-new-func": "error",
    "no-restricted-syntax": [
      "error",
      {
        "selector": "CallExpression > :matches(MemberExpression[object.name='document'], MemberExpression[object.object.name='window'][object.property.name='document'], :matches(MemberExpression[object.object.object.type='ThisExpression'], MemberExpression[object.object.object.name='globalThis'])[object.object.property.name='window'][object.property.name='document'])[property.name=/write|writeln/]",
        "message": "Forbidden call to document.write or document.writeln method"
      },
      {
        "selector": ":matches(MemberExpression[object.name='document'], MemberExpression[object.object.name='window'][object.property.name='document'], :matches(MemberExpression[object.object.object.type='ThisExpression'], MemberExpression[object.object.object.name='globalThis'])[object.object.property.name='window'][object.property.name='document'])[property.name='cookie']",
        "message": "Forbidden access to document.cookie property"
      },
      {
        "selector": ":matches(AssignmentExpression[left.object.name='document'], AssignmentExpression[left.object.object.name='window'][left.object.property.name='document'], :matches(AssignmentExpression[left.object.object.object.type='ThisExpression'], AssignmentExpression[left.object.object.object.name='globalThis'])[object.object.property.name='window'][left.object.property.name='document'])[operator='='][left.property.name='domain']",
        "message": "Forbidden assignment to document.domain property"
      },
      {
        "selector": "AssignmentExpression[operator='='][left.property.name=/innerHTML|outerHTML/]",
        "message": "Forbidden assignment to innerHTML or outerHTML property"
      },
      {
        "selector": "CallExpression[arguments!=''] > MemberExpression.callee[property.name='html']",
        "message": "Forbidden call to html() method"
      },
      {
        "selector": "CallExpression[callee.object.name='MSApp'][callee.property.name='execUnsafeLocalFunction']",
        "message": "Forbidden call to MSApp.execUnsafeLocalFunction method"
      },
      {
        "selector": "CallExpression[callee.object.object.name='WinJS'][callee.object.property.name='Utilities'][callee.property.name=/set(Inner|Outer)HTMLUnsafe/]",
        "message": "Forbidden call to WinJS.Utilities.setInnerHTMLUnsafe or WinJS.Utilities.setOuterHTMLUnsafe method"
      },
      {
        "selector": "CallExpression:has(Literal.arguments[value='false'])[callee.object.name='$sceProvider'][callee.property.name='enabled']",
        "message": "Calls to $sceProvider.enabled(false) disable Strict Contextual Escaping in AngularJS and need to be reviewed."
      },
      {
        "selector": "CallExpression[arguments!=''][callee.object.name='$sceDelegate'][callee.property.name='trustAs']",
        "message": "Calls to $sceDelegate.trustAs() bypass Strict Contextual Escaping in AngularJS and need to be reviewed."
      },
      {
        "selector": "CallExpression[arguments!=''][callee.object.name='$sce'][callee.property.name=/trustAs(Css|Html|Js|ResourceUrl|Url)?/]",
        "message": "Calls to $sce.trustAs() and relevant shorthand methods (e.g. trustAsHtml or trustAsJs) bypass Strict Contextual Escaping (SCE) in AngularJS and need to be reviewed."
      },
      {
        "selector": "CallExpression:has(Literal.arguments[value='true'])[callee.object.name='$sanitizeProvider'][callee.property.name='enableSvg']",
        "message": "Calls to $sanitizeProvider.enableSvg(true) increase attack surface of the application by enabling SVG support in AngularJS sanitizer and need to be reviewed."
      },
      {
        "selector": "CallExpression[arguments!=''][callee.object.name='$compileProvider'][callee.property.name=/(aHref|imgSrc)SanitizationWhitelist/]",
        "message": "Calls to $compileProvider.aHrefSanitizationWhitelist or imgSrcSanitizationWhitelist configure whitelists in AngularJS sanitizer and need to be reviewed."
      },
      {
        "selector": "CallExpression[callee.property.name=/bypassSecurityTrust(Html|ResourceUrl|Script|Style|Url)/]",
        "message": "Calls to bypassSecurityTrustHtml, bypassSecurityTrustScript and similar methods bypass DomSanitizer in Angular and need to be reviewed."
      }
    ],
    "react/no-danger": "error"
  },
  "overrides": [
    {
      "files": [
        "**/*.ts"
      ],
      "rules": {
        "@typescript-eslint/no-implied-eval": "error"
      }
    }
  ]
}