{
  "version": 3,
  "sources": ["../../codemirror-freeze/src/facet.mts", "../../codemirror-freeze/src/theme.mts", "../../codemirror-freeze/src/transaction-filter.mts", "../../codemirror-freeze/src/utils.mts", "../../codemirror-freeze/src/view.mts", "../../codemirror-freeze/src/index.mts"],
  "sourcesContent": ["import { Facet } from \"@codemirror/state\";\n\nexport const startFreezeComment = Facet.define<string, string>({\n  combine: (values) => {\n    if (values.length > 0) {\n      return values[values.length - 1];\n    }\n    return \"start-freeze\";\n  },\n});\n\nexport const endFreezeComment = Facet.define<string, string>({\n  combine: (values) => {\n    if (values.length > 0) {\n      return values[values.length - 1];\n    }\n    return \"end-freeze\";\n  },\n});\n", "import { EditorView } from \"@codemirror/view\";\n\nexport const freezeTheme = EditorView.theme({\n  \".cm-frozen\": {\n    opacity: 0.75,\n    fontStyle: \"italic\",\n  },\n});\n", "import {\n  EditorSelection,\n  EditorState,\n  type SelectionRange,\n} from \"@codemirror/state\";\n\nimport { startFreezeComment, endFreezeComment } from \"./facet.mts\";\nimport {\n  createSelectionRangesFromSetRange,\n  createSetRangeFromSelectionRange,\n  getFreezeRanges,\n  removeFromSetRange,\n} from \"./utils.mts\";\n\nexport function getFreezeTransactionFilter(): ReturnType<\n  (typeof EditorState)[\"transactionFilter\"][\"of\"]\n> {\n  return EditorState.transactionFilter.of((transaction) => {\n    // If it's not releated to selection or the doc itself, skip\n    if (!(transaction.selection != null || transaction.docChanged)) {\n      return transaction;\n    }\n\n    const freezeRanges = getFreezeRanges(\n      transaction.startState,\n      transaction.startState.facet(startFreezeComment),\n      transaction.startState.facet(endFreezeComment)\n    );\n\n    let ignoreChanges = false;\n\n    if (transaction.docChanged) {\n      transaction.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n        const diff = Math.max(toA - fromA, toB - fromB);\n        for (let i = 0; i < freezeRanges.length; i++) {\n          let range = freezeRanges[i];\n\n          if (diff > 0) {\n            if (fromB < range.from) {\n              range = EditorSelection.range(range.from + diff, range.to + diff);\n              freezeRanges[i] = range;\n            }\n          }\n        }\n      });\n\n      for (const freezeRange of freezeRanges) {\n        const touchesRange = transaction.changes.desc.touchesRange(\n          freezeRange.from,\n          freezeRange.to\n        );\n        switch (touchesRange) {\n          case \"cover\":\n          case true:\n            ignoreChanges = true;\n            break;\n          case false:\n          default:\n          // do nothing\n        }\n\n        if (ignoreChanges) {\n          break;\n        }\n      }\n    }\n\n    let ranges: SelectionRange[] = [];\n\n    if (transaction.selection != null) {\n      let selection = transaction.newSelection;\n      if (ignoreChanges) {\n        selection = transaction.startState.selection;\n      }\n\n      for (const selectionRange of selection.ranges) {\n        const selectionRangeSet =\n          createSetRangeFromSelectionRange(selectionRange);\n        for (const freezeRange of freezeRanges) {\n          removeFromSetRange(freezeRange, selectionRangeSet);\n        }\n        ranges.push(...createSelectionRangesFromSetRange(selectionRangeSet));\n      }\n\n      // Removes the cursor at index 0 if a freeze range begins at zero\n      const findHasFromZero = (selectionRange: SelectionRange): boolean => {\n        return selectionRange.from === 0;\n      };\n      const fromZeroFreezeRange = freezeRanges.find(findHasFromZero);\n      if (fromZeroFreezeRange != null) {\n        const fromZeroRange = ranges.find(findHasFromZero);\n        if (fromZeroRange != null) {\n          ranges = ranges.filter((range) => range !== fromZeroRange);\n        }\n      }\n    }\n\n    const returnedTransaction = {\n      ...transaction,\n      ...(ranges.length > 0\n        ? { selection: EditorSelection.create(ranges) }\n        : {}),\n      ...(ignoreChanges\n        ? {\n            changes: [],\n            selection: transaction.startState.selection,\n          }\n        : {}),\n    };\n\n    return returnedTransaction;\n  });\n}\n", "import { type CommentTokens } from \"@codemirror/commands\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport {\n  type EditorState,\n  type SelectionRange,\n  EditorSelection,\n} from \"@codemirror/state\";\n\nexport function getFreezeRanges(\n  state: EditorState,\n  startFreezeComment: string,\n  endFreezeComment: string\n): SelectionRange[] {\n  const tree = syntaxTree(state);\n  const cursor = tree.cursor();\n\n  const commentTokens = state.languageDataAt<CommentTokens>(\"commentTokens\", 0);\n\n  const freezeRanges: SelectionRange[] = [];\n  let currentRangeFrom = 0;\n\n  do {\n    if (cursor.name !== \"Comment\") {\n      continue;\n    }\n\n    let fromOffset = 0;\n    let toOffset = 0;\n\n    const text = state.sliceDoc(cursor.from, cursor.to);\n    let comment = \"\";\n\n    for (const commentToken of commentTokens) {\n      if (commentToken.line != null) {\n        if (!text.startsWith(commentToken.line)) {\n          continue;\n        }\n\n        fromOffset = commentToken.line.length;\n      } else if (commentToken.block != null) {\n        if (\n          !(\n            text.startsWith(commentToken.block.open) &&\n            text.endsWith(commentToken.block.close)\n          )\n        ) {\n          continue;\n        }\n        fromOffset = commentToken.block.open.length;\n        toOffset = -commentToken.block.close.length;\n      }\n    }\n\n    comment = text.slice(fromOffset, text.length + toOffset).trim();\n\n    if (comment === startFreezeComment) {\n      currentRangeFrom = cursor.from;\n    } else if (comment === endFreezeComment) {\n      freezeRanges.push(EditorSelection.range(currentRangeFrom, cursor.to));\n      currentRangeFrom = 0;\n    }\n  } while (cursor.next());\n\n  if (currentRangeFrom > 0) {\n    freezeRanges.push(\n      EditorSelection.range(currentRangeFrom, state.doc.toString().length)\n    );\n  }\n\n  return freezeRanges;\n}\n\nexport function createSetRangeFromSelectionRange(\n  range: SelectionRange\n): Set<number> {\n  const setRange = new Set<number>();\n  for (let i = range.from; i <= range.to; i++) {\n    setRange.add(i);\n  }\n  return setRange;\n}\n\nexport function removeFromSetRange(\n  rangeToRemove: SelectionRange,\n  setRange: Set<number>\n): void {\n  const numbersToRemove = Array.from(\n    createSetRangeFromSelectionRange(rangeToRemove)\n  );\n  for (const numberToRemove of numbersToRemove) {\n    setRange.delete(numberToRemove);\n  }\n}\n\nexport function createSelectionRangesFromSetRange(\n  range: Set<number>\n): SelectionRange[] {\n  const elements = Array.from(range).sort((a, b) => a - b);\n  const min = elements.reduce((previousValue, currentValue, currentIndex) => {\n    if (currentIndex === 0) {\n      return currentValue;\n    }\n    return Math.min(previousValue, currentValue);\n  }, 0);\n  const max = elements.reduce((previousValue, currentValue, currentIndex) => {\n    if (currentIndex === 0) {\n      return currentValue;\n    }\n    return Math.max(previousValue, currentValue);\n  }, 0);\n\n  const selectionRanges: SelectionRange[] = [];\n  let selectionRange: SelectionRange | null = null;\n  for (let i = min; i < max; i++) {\n    const element = elements.find((element) => element === i);\n\n    if (element == null && selectionRange != null) {\n      selectionRanges.push(selectionRange);\n      selectionRange = null;\n      continue;\n    }\n\n    if (selectionRange == null) {\n      selectionRange = EditorSelection.range(i, i);\n    } else {\n      selectionRange = EditorSelection.range(selectionRange.from, i);\n    }\n  }\n  if (selectionRange != null) {\n    selectionRanges.push(selectionRange);\n    selectionRange = null;\n  }\n\n  return selectionRanges;\n}\n\nexport function handleEventFreezeFromPos(\n  pos: number,\n  event: Event,\n  state: EditorState,\n  startFreezeComment: string,\n  endFreezeComment: string\n): void {\n  const freezeRanges = getFreezeRanges(\n    state,\n    startFreezeComment,\n    endFreezeComment\n  );\n  for (const freezeRange of freezeRanges) {\n    if (freezeRange.from <= pos && pos < freezeRange.to) {\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      return;\n    }\n  }\n}\n", "import { type RangeSet, RangeSetBuilder } from \"@codemirror/state\";\nimport {\n  Decoration,\n  type DecorationSet,\n  type EditorView,\n  type PluginValue,\n  type ViewUpdate,\n  ViewPlugin,\n} from \"@codemirror/view\";\n\nimport { startFreezeComment, endFreezeComment } from \"./facet.mjs\";\nimport { getFreezeRanges } from \"./utils.mts\";\n\nconst frozenDecoration = Decoration.line({\n  attributes: { class: \"cm-frozen\" },\n});\n\nfunction freezeDecoration(view: EditorView): RangeSet<Decoration> {\n  const builder = new RangeSetBuilder<Decoration>();\n\n  const freezeRanges = getFreezeRanges(\n    view.state,\n    view.state.facet(startFreezeComment),\n    view.state.facet(endFreezeComment)\n  );\n\n  for (const { from, to } of view.visibleRanges) {\n    for (let pos = from; pos <= to; ) {\n      const line = view.state.doc.lineAt(pos);\n      for (const freezeRange of freezeRanges) {\n        if (\n          (freezeRange.from < line.from && line.from < freezeRange.to) ||\n          (freezeRange.from < line.to && line.to < freezeRange.to)\n        ) {\n          builder.add(line.from, line.from, frozenDecoration);\n        }\n      }\n      pos = line.to + 1;\n    }\n  }\n\n  return builder.finish();\n}\n\nclass FreezeViewPlugin implements PluginValue {\n  decorations: DecorationSet;\n\n  constructor(view: EditorView) {\n    this.decorations = freezeDecoration(view);\n  }\n\n  update(update: ViewUpdate): void {\n    if (!(update.docChanged || update.viewportChanged)) {\n      return;\n    }\n    this.decorations = freezeDecoration(update.view);\n  }\n}\n\nexport function getFreezeViewPlugin(): ViewPlugin<FreezeViewPlugin> {\n  const plugin = ViewPlugin.fromClass(FreezeViewPlugin, {\n    decorations: (value) => value.decorations,\n  });\n\n  return plugin;\n}\n", "import { type Extension } from \"@codemirror/state\";\n\nimport { startFreezeComment, endFreezeComment } from \"./facet.mts\";\nimport { freezeTheme } from \"./theme.mts\";\nimport { getFreezeTransactionFilter } from \"./transaction-filter.mts\";\nimport { getFreezeViewPlugin } from \"./view.mts\";\n\nconst _startFreezeComment = startFreezeComment;\nconst _endFreezeComment = endFreezeComment;\n\nexport function freeze(\n  startFreezeComment = \"start-freeze\",\n  endFreezeComment = \"end-freeze\"\n): Extension {\n  const startFreezeCommentOf = _startFreezeComment.of(startFreezeComment);\n  const endFreezeCommentOf = _endFreezeComment.of(endFreezeComment);\n\n  const freezeTransactionFilter = getFreezeTransactionFilter();\n  const freezeViewPlugin = getFreezeViewPlugin();\n\n  return [\n    freezeTransactionFilter,\n    freezeViewPlugin,\n    startFreezeCommentOf,\n    endFreezeCommentOf,\n    freezeTheme,\n  ];\n}\n\nexport { startFreezeComment, endFreezeComment };\n"],
  "mappings": "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",
  "names": ["Facet", "EditorView", "EditorSelection", "EditorState", "syntaxTree", "RangeSetBuilder", "Decoration", "ViewPlugin", "startFreezeComment", "values", "endFreezeComment", "freezeTheme", "getFreezeRanges", "state", "cursor", "commentTokens", "freezeRanges", "currentRangeFrom", "fromOffset", "toOffset", "text", "comment", "commentToken", "createSetRangeFromSelectionRange", "range", "setRange", "i", "removeFromSetRange", "rangeToRemove", "numbersToRemove", "numberToRemove", "createSelectionRangesFromSetRange", "elements", "a", "b", "min", "previousValue", "currentValue", "currentIndex", "max", "selectionRanges", "selectionRange", "element", "getFreezeTransactionFilter", "transaction", "ignoreChanges", "fromA", "toA", "fromB", "toB", "inserted", "diff", "freezeRange", "ranges", "selection", "selectionRangeSet", "findHasFromZero", "fromZeroRange", "frozenDecoration", "freezeDecoration", "view", "builder", "from", "to", "pos", "line", "FreezeViewPlugin", "update", "getFreezeViewPlugin", "value", "_startFreezeComment", "_endFreezeComment", "freeze", "startFreezeCommentOf", "endFreezeCommentOf", "freezeTransactionFilter", "freezeViewPlugin"]
}
