import { styleTags, tags as t } from '@lezer/highlight';

export const jsHighlight = styleTags({
  'get set async static': t.modifier,
  'for while do if else switch try catch finally return throw break continue default case':
    t.controlKeyword,
  'in of await yield void typeof delete instanceof': t.operatorKeyword,
  'let var const using function class extends': t.definitionKeyword,
  'import export from': t.moduleKeyword,
  'with debugger as new': t.keyword,
  TemplateString: t.special(t.string),
  super: t.atom,
  BooleanLiteral: t.bool,
  this: t.self,
  null: t.null,
  Star: t.modifier,
  VariableName: t.variableName,
  'CallExpression/VariableName TaggedTemplateExpression/VariableName':
    t.function(t.variableName),
  VariableDefinition: t.definition(t.variableName),
  Label: t.labelName,
  PropertyName: t.propertyName,
  PrivatePropertyName: t.special(t.propertyName),
  'CallExpression/MemberExpression/PropertyName': t.function(t.propertyName),
  'FunctionDeclaration/VariableDefinition': t.function(
    t.definition(t.variableName)
  ),
  'ClassDeclaration/VariableDefinition': t.definition(t.className),
  PropertyDefinition: t.definition(t.propertyName),
  PrivatePropertyDefinition: t.definition(t.special(t.propertyName)),
  UpdateOp: t.updateOperator,
  'LineComment Hashbang': t.lineComment,
  BlockComment: t.blockComment,
  Number: t.number,
  String: t.string,
  Escape: t.escape,
  ArithOp: t.arithmeticOperator,
  LogicOp: t.logicOperator,
  BitOp: t.bitwiseOperator,
  CompareOp: t.compareOperator,
  RegExp: t.regexp,
  Equals: t.definitionOperator,
  Arrow: t.function(t.punctuation),
  ': Spread': t.punctuation,
  '( )': t.paren,
  '[ ]': t.squareBracket,
  '{ }': t.brace,
  'InterpolationStart InterpolationEnd': t.special(t.brace),
  '.': t.derefOperator,
  ', ;': t.separator,
  '@': t.meta,

  TypeName: t.typeName,
  TypeDefinition: t.definition(t.typeName),
  'type enum interface implements namespace module declare':
    t.definitionKeyword,
  'abstract global Privacy readonly override': t.modifier,
  'is keyof unique infer': t.operatorKeyword,

  JSXAttributeValue: t.attributeValue,
  JSXText: t.content,
  'JSXStartTag JSXStartCloseTag JSXSelfCloseEndTag JSXEndTag': t.angleBracket,
  'JSXIdentifier JSXNameSpacedName': t.tagName,
  'JSXAttribute/JSXIdentifier JSXAttribute/JSXNameSpacedName': t.attributeName,
  'JSXBuiltin/JSXIdentifier': t.standard(t.tagName),
});
