cli-testing-library
Version:
Simple and complete CLI testing utilities that encourage good testing practices.
1 lines • 4.88 kB
Source Map (JSON)
{"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;;"}