{"version":3,"file":"braces.mjs","sources":["../../../src/slate-plugins/braces.ts"],"sourcesContent":["import { Annotation } from 'slate';\nimport { Plugin } from 'slate-react';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst BRACES: Record<string, string> = {\n  '[': ']',\n  '{': '}',\n  '(': ')',\n};\n\nconst MATCH_MARK = 'brace_match';\n\nexport function BracesPlugin(): Plugin {\n  return {\n    onKeyDown(event, editor, next) {\n      const { value } = editor;\n\n      switch (event.key) {\n        case '(':\n        case '{':\n        case '[': {\n          const {\n            start: { offset: startOffset, key: startKey },\n            end: { offset: endOffset, key: endKey },\n            focus: { offset: focusOffset },\n          } = value.selection;\n          const text = value.focusText.text;\n\n          // If text is selected, wrap selected text in parens\n          if (value.selection.isExpanded) {\n            event.preventDefault();\n            editor\n              .insertTextByKey(startKey, startOffset, event.key)\n              .insertTextByKey(endKey, endOffset + 1, BRACES[event.key])\n              .moveEndBackward(1);\n            return true;\n          } else if (\n            // Insert matching brace when there is no input after caret\n            focusOffset === text.length ||\n            text[focusOffset] === ' ' ||\n            Object.values(BRACES).includes(text[focusOffset])\n          ) {\n            event.preventDefault();\n            const complement = BRACES[event.key];\n            const matchAnnotation = {\n              key: `${MATCH_MARK}-${uuidv4()}`,\n              type: `${MATCH_MARK}-${complement}`,\n              anchor: {\n                key: startKey,\n                offset: startOffset,\n                object: 'point',\n              },\n              focus: {\n                key: endKey,\n                offset: endOffset + 1,\n                object: 'point',\n              },\n              object: 'annotation',\n            } as Annotation;\n            editor.insertText(event.key).insertText(complement).addAnnotation(matchAnnotation).moveBackward(1);\n\n            return true;\n          }\n          break;\n        }\n\n        case ')':\n        case '}':\n        case ']': {\n          const text = value.anchorText.text;\n          const offset = value.selection.anchor.offset;\n          const nextChar = text[offset];\n          // Handle closing brace when it's already the next character\n          const complement = event.key;\n          const annotationType = `${MATCH_MARK}-${complement}`;\n          const annotation = value.annotations.find(\n            (a) => a?.type === annotationType && a.anchor.key === value.anchorText.key\n          );\n          if (annotation && nextChar === complement && !value.selection.isExpanded) {\n            event.preventDefault();\n            editor.moveFocusForward(1).removeAnnotation(annotation).moveAnchorForward(1);\n            return true;\n          }\n          break;\n        }\n\n        case 'Backspace': {\n          const text = value.anchorText.text;\n          const offset = value.selection.anchor.offset;\n          const previousChar = text[offset - 1];\n          const nextChar = text[offset];\n          if (BRACES[previousChar] && BRACES[previousChar] === nextChar) {\n            event.preventDefault();\n            // Remove closing brace if directly following\n            editor.deleteBackward(1).deleteForward(1).focus();\n            return true;\n          }\n        }\n\n        default: {\n          break;\n        }\n      }\n\n      return next();\n    },\n  };\n}\n"],"names":["uuidv4"],"mappings":"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"}