{"version":3,"file":"getNextKeyDef.cjs","sources":["../../../../src/user-event/keyboard/getNextKeyDef.ts"],"sourcesContent":["import type { keyboardKey, keyboardOptions } from \"./types\";\n\nenum bracketDict {\n  \"[\" = \"]\",\n}\n\n/**\n * Get the next key from keyMap\n *\n * Keys can be referenced by `{key}` or `{special}` as well as physical locations per `[code]`.\n * Everything else will be interpreted as a typed character - e.g. `a`.\n * Brackets `{` and `[` can be escaped by doubling - e.g. `foo[[bar` translates to `foo[bar`.\n */\nexport function getNextKeyDef(\n  text: string,\n  options: keyboardOptions,\n): {\n  keyDef: keyboardKey;\n  consumedLength: number;\n} {\n  const { type, descriptor, consumedLength } = readNextDescriptor(text);\n\n  const keyDef: keyboardKey = options.keyboardMap.find((def) => {\n    if (type === \"[\") {\n      return def.code?.toLowerCase() === descriptor.toLowerCase();\n    }\n    return def.hex === descriptor;\n  }) ?? {\n    code: descriptor,\n    hex: \"Unknown\",\n  };\n\n  return {\n    keyDef,\n    consumedLength,\n  };\n}\n\nfunction readNextDescriptor(text: string) {\n  let pos = 0;\n  const startBracket =\n    text[pos]! in bracketDict ? (text[pos] as keyof typeof bracketDict) : \"\";\n\n  pos += startBracket.length;\n\n  // `foo[[bar` is an escaped char at position 3,\n  // but `foo[[[>5}bar` should be treated as `{` pressed down for 5 keydowns.\n  const startBracketRepeated = startBracket\n    ? (text.match(new RegExp(`^\\\\${startBracket}+`)) as RegExpMatchArray)[0]\n        .length\n    : 0;\n  const isEscapedChar = startBracketRepeated === 2;\n\n  const type = isEscapedChar ? \"\" : startBracket;\n\n  return {\n    type,\n    ...(type === \"\" ? readPrintableChar(text, pos) : readTag(text, pos, type)),\n  };\n}\n\nfunction readPrintableChar(text: string, pos: number) {\n  const descriptor = text[pos];\n\n  assertDescriptor(descriptor, text, pos);\n\n  pos += descriptor.length;\n\n  return {\n    consumedLength: pos,\n    descriptor,\n    releasePrevious: false,\n    releaseSelf: true,\n    repeat: 1,\n  };\n}\n\nfunction readTag(\n  text: string,\n  pos: number,\n  startBracket: keyof typeof bracketDict,\n) {\n  const descriptor = text.slice(pos).match(/^\\w+/)?.[0];\n\n  assertDescriptor(descriptor, text, pos);\n\n  pos += descriptor.length;\n\n  const expectedEndBracket = bracketDict[startBracket];\n  const endBracket = text[pos] === expectedEndBracket ? expectedEndBracket : \"\";\n\n  if (!endBracket) {\n    throw new Error(\n      getErrorMessage(`\"${expectedEndBracket}\"`, text[pos], text),\n    );\n  }\n\n  pos += endBracket.length;\n\n  return {\n    consumedLength: pos,\n    descriptor,\n  };\n}\n\nfunction assertDescriptor(\n  descriptor: string | undefined,\n  text: string,\n  pos: number,\n): asserts descriptor is string {\n  if (!descriptor) {\n    throw new Error(getErrorMessage(\"key descriptor\", text[pos], text));\n  }\n}\n\nfunction getErrorMessage(\n  expected: string,\n  found: string | undefined,\n  text: string,\n) {\n  return `Expected ${expected} but found \"${found ?? \"\"}\" in \"${text}\"\n    See https://github.com/testing-library/user-event/blob/main/README.md#keyboardtext-options\n    for more information about how userEvent parses your input.`;\n}\n"],"names":["bracketDict"],"mappings":";;AAEA,IAAK,gCAAAA,iBAAL;AACEA,eAAA,GAAM,IAAA;AADHA,SAAAA;AAAA,GAAA,eAAA,CAAA,CAAA;AAWW,SAAA,cACd,MACA,SAIA;AACA,QAAM,EAAE,MAAM,YAAY,eAAe,IAAI,mBAAmB,IAAI;AAEpE,QAAM,SAAsB,QAAQ,YAAY,KAAK,CAAC,QAAQ;;AAC5D,QAAI,SAAS,KAAK;AAChB,eAAO,SAAI,SAAJ,mBAAU,mBAAkB,WAAW,YAAY;AAAA,IAAA;AAE5D,WAAO,IAAI,QAAQ;AAAA,EAAA,CACpB,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,EACP;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAc;AACxC,MAAI,MAAM;AACV,QAAM,eACJ,KAAK,GAAG,KAAM,cAAe,KAAK,GAAG,IAAiC;AAExE,SAAO,aAAa;AAIpB,QAAM,uBAAuB,eACxB,KAAK,MAAM,IAAI,OAAO,MAAM,YAAY,GAAG,CAAC,EAAuB,CAAC,EAClE,SACH;AACJ,QAAM,gBAAgB,yBAAyB;AAEzC,QAAA,OAAO,gBAAgB,KAAK;AAE3B,SAAA;AAAA,IACL;AAAA,IACA,GAAI,SAAS,KAAK,kBAAkB,MAAM,GAAG,IAAI,QAAQ,MAAM,KAAK,IAAI;AAAA,EAC1E;AACF;AAEA,SAAS,kBAAkB,MAAc,KAAa;AAC9C,QAAA,aAAa,KAAK,GAAG;AAEV,mBAAA,YAAY,MAAM,GAAG;AAEtC,SAAO,WAAW;AAEX,SAAA;AAAA,IACL,gBAAgB;AAAA,IAChB;AAAA,IACA,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,QACP,MACA,KACA,cACA;;AACM,QAAA,cAAa,UAAK,MAAM,GAAG,EAAE,MAAM,MAAM,MAA5B,mBAAgC;AAElC,mBAAA,YAAY,MAAM,GAAG;AAEtC,SAAO,WAAW;AAEZ,QAAA,qBAAqB,YAAY,YAAY;AACnD,QAAM,aAAa,KAAK,GAAG,MAAM,qBAAqB,qBAAqB;AAE3E,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,gBAAgB,IAAI,kBAAkB,KAAK,KAAK,GAAG,GAAG,IAAI;AAAA,IAC5D;AAAA,EAAA;AAGF,SAAO,WAAW;AAEX,SAAA;AAAA,IACL,gBAAgB;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,iBACP,YACA,MACA,KAC8B;AAC9B,MAAI,CAAC,YAAY;AACT,UAAA,IAAI,MAAM,gBAAgB,kBAAkB,KAAK,GAAG,GAAG,IAAI,CAAC;AAAA,EAAA;AAEtE;AAEA,SAAS,gBACP,UACA,OACA,MACA;AACA,SAAO,YAAY,QAAQ,eAAe,SAAS,EAAE,SAAS,IAAI;AAAA;AAAA;AAGpE;;"}