{
  "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": ["EditorSelection", "startFreezeComment", "endFreezeComment", "element"]
}
