diff --git a/lib/codemirror-kit/decorations.ts b/lib/codemirror-kit/decorations.ts index e04bc32..64a93f1 100644 --- a/lib/codemirror-kit/decorations.ts +++ b/lib/codemirror-kit/decorations.ts @@ -133,6 +133,8 @@ export const buildNodeDecorations = (state: EditorSta for (let line = state.doc.lineAt(node.from); line.from < node.to; line = state.doc.lineAt(line.to + 1)) { decorationRanges.push(wrapped.range(line.from)) + + if (line.to === state.doc.length) break } } diff --git a/package.json b/package.json index fa34900..10ccd5a 100644 --- a/package.json +++ b/package.json @@ -133,18 +133,18 @@ } }, "dependencies": { - "@codemirror/autocomplete": "^6.15.0", - "@codemirror/commands": "^6.3.3", - "@codemirror/lang-markdown": "^6.2.4", + "@codemirror/autocomplete": "^6.16.0", + "@codemirror/commands": "^6.5.0", + "@codemirror/lang-markdown": "^6.2.5", "@codemirror/language": "^6.10.1", - "@codemirror/language-data": "^6.4.1", + "@codemirror/language-data": "^6.5.1", "@codemirror/search": "^6.5.6", "@codemirror/state": "^6.4.1", - "@codemirror/view": "^6.26.0", + "@codemirror/view": "^6.26.3", "@lezer/common": "^1.2.1", "@lezer/highlight": "^1.2.0", - "@lezer/markdown": "^1.2.0", - "@replit/codemirror-vim": "^6.2.0", + "@lezer/markdown": "^1.3.0", + "@replit/codemirror-vim": "^6.2.1", "ink-mde": "workspace:*", "katex": "^0.16.9", "solid-js": "^1.8.7", diff --git a/plugins/katex/index.ts b/plugins/katex/index.ts index f031d2b..276b2a0 100644 --- a/plugins/katex/index.ts +++ b/plugins/katex/index.ts @@ -2,15 +2,8 @@ import { HighlightStyle, syntaxHighlighting } from '@codemirror/language' import { EditorView } from '@codemirror/view' import { plugin, pluginTypes } from 'ink-mde' import { buildBlockWidgetDecoration, buildLineDecoration, buildWidget, nodeDecorator } from '/lib/codemirror-kit' -import { useModule } from '/src/modules' import { grammar, mathInline, mathInlineMark, mathInlineMarkClose, mathInlineMarkOpen } from './grammar' -const render = (text: string, element: HTMLElement) => { - useModule('katex', (katex) => { - katex.render(text, element, { output: 'html', throwOnError: false }) - }) -} - export const katex = () => { return [ plugin({ @@ -51,23 +44,31 @@ export const katex = () => { return buildBlockWidgetDecoration({ widget: buildWidget({ id: text, - toDOM: () => { + toDOM: (view) => { const container = document.createElement('div') - const block = document.createElement('div') + const katexTarget = document.createElement('div') container.className = 'ink-mde-block-widget-container' - block.className = 'ink-mde-block-widget ink-mde-katex-target' - container.appendChild(block) + katexTarget.className = 'ink-mde-block-widget ink-mde-katex-target' + container.appendChild(katexTarget) - render(text, block) + import('katex').then(({ default: lib }) => { + lib.render(text, katexTarget, { output: 'html', throwOnError: false }) + + view.requestMeasure() + }) return container }, - updateDOM: (dom) => { + updateDOM: (dom, view) => { const katexTarget = dom.querySelector('.ink-mde-katex-target') if (katexTarget) { - render(text, katexTarget) + import('katex').then(({ default: lib }) => { + lib.render(text, katexTarget, { output: 'html', throwOnError: false }) + + view.requestMeasure() + }) return true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2668079..4d91d18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,20 +9,20 @@ importers: .: dependencies: '@codemirror/autocomplete': - specifier: ^6.15.0 - version: 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + specifier: ^6.16.0 + version: 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/commands': - specifier: ^6.3.3 - version: 6.3.3 + specifier: ^6.5.0 + version: 6.5.0 '@codemirror/lang-markdown': - specifier: ^6.2.4 - version: 6.2.4 + specifier: ^6.2.5 + version: 6.2.5 '@codemirror/language': specifier: ^6.10.1 version: 6.10.1 '@codemirror/language-data': - specifier: ^6.4.1 - version: 6.4.1(@codemirror/view@6.26.0) + specifier: ^6.5.1 + version: 6.5.1(@codemirror/view@6.26.3) '@codemirror/search': specifier: ^6.5.6 version: 6.5.6 @@ -30,8 +30,8 @@ importers: specifier: ^6.4.1 version: 6.4.1 '@codemirror/view': - specifier: ^6.26.0 - version: 6.26.0 + specifier: ^6.26.3 + version: 6.26.3 '@lezer/common': specifier: ^1.2.1 version: 1.2.1 @@ -39,11 +39,11 @@ importers: specifier: ^1.2.0 version: 1.2.0 '@lezer/markdown': - specifier: ^1.2.0 - version: 1.2.0 + specifier: ^1.3.0 + version: 1.3.0 '@replit/codemirror-vim': - specifier: ^6.2.0 - version: 6.2.0(@codemirror/commands@6.3.3)(@codemirror/language@6.10.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0) + specifier: ^6.2.1 + version: 6.2.1(@codemirror/commands@6.5.0)(@codemirror/language@6.10.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3) ink-mde: specifier: workspace:* version: 'link:' @@ -315,12 +315,13 @@ packages: - typescript dev: true - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} engines: {node: '>=6.9.0'} + requiresBuild: true dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 dev: true /@babel/compat-data@7.23.5: @@ -333,7 +334,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.6 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) @@ -523,14 +524,15 @@ packages: - supports-color dev: true - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} requiresBuild: true dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.0 dev: true /@babel/parser@7.23.6: @@ -604,7 +606,7 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 '@babel/parser': 7.23.6 '@babel/types': 7.23.6 dev: true @@ -613,7 +615,7 @@ packages: resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 '@babel/generator': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 @@ -636,8 +638,8 @@ packages: to-fast-properties: 2.0.0 dev: true - /@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1): - resolution: {integrity: sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==} + /@codemirror/autocomplete@6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1): + resolution: {integrity: sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 @@ -646,23 +648,23 @@ packages: dependencies: '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 dev: false - /@codemirror/commands@6.3.3: - resolution: {integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==} + /@codemirror/commands@6.5.0: + resolution: {integrity: sha512-rK+sj4fCAN/QfcY9BEzYMgp4wwL/q5aj/VfNSoH1RWPF9XS/dUwBkvlL3hpWgEjOqlpdN1uLC9UkjJ4tmyjJYg==} dependencies: '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 dev: false /@codemirror/lang-angular@0.1.3: resolution: {integrity: sha512-xgeWGJQQl1LyStvndWtruUvb4SnBZDAu/gvFH/ZU+c0W25tQR8e5hq7WTwiIY2dNxnf+49mRiGI/9yxIwB6f5w==} dependencies: - '@codemirror/lang-html': 6.4.8 + '@codemirror/lang-html': 6.4.9 '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 '@lezer/common': 1.2.1 @@ -677,10 +679,10 @@ packages: '@lezer/cpp': 1.1.2 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.26.0): + /@codemirror/lang-css@6.2.1(@codemirror/view@6.26.3): resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -689,15 +691,27 @@ packages: - '@codemirror/view' dev: false - /@codemirror/lang-html@6.4.8: - resolution: {integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==} + /@codemirror/lang-go@6.0.0(@codemirror/view@6.26.3): + resolution: {integrity: sha512-mMT4YeYdKGjnffDBOhr1ur1glee4oV/rfMe28vzazNHZkSt7vSiuHiBcgr3L/79Cl2RIjFdpQ1XMD0/T8Rx64g==} + dependencies: + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.1 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.1 + '@lezer/go': 1.0.0 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-html@6.4.9: + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.0) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 '@lezer/css': 1.1.8 '@lezer/html': 1.3.9 @@ -707,19 +721,19 @@ packages: resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} dependencies: '@codemirror/language': 6.10.1 - '@lezer/java': 1.1.1 + '@lezer/java': 1.1.2 dev: false /@codemirror/lang-javascript@6.2.2: resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/lint': 6.5.0 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 - '@lezer/javascript': 1.4.13 + '@lezer/javascript': 1.4.15 dev: false /@codemirror/lang-json@6.0.1: @@ -729,10 +743,10 @@ packages: '@lezer/json': 1.0.2 dev: false - /@codemirror/lang-less@6.0.2(@codemirror/view@6.26.0): + /@codemirror/lang-less@6.0.2(@codemirror/view@6.26.3): resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} dependencies: - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.0) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) '@codemirror/language': 6.10.1 '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -744,46 +758,46 @@ packages: /@codemirror/lang-liquid@6.2.1: resolution: {integrity: sha512-J1Mratcm6JLNEiX+U2OlCDTysGuwbHD76XwuL5o5bo9soJtSbz2g6RU3vGHFyS5DC8rgVmFSzi7i6oBftm7tnA==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - '@codemirror/lang-html': 6.4.8 + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/lang-html': 6.4.9 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 dev: false - /@codemirror/lang-markdown@6.2.4: - resolution: {integrity: sha512-UghkA1vSMs8bT7RSZM6vsIocigyah2bV00eRQuZy76401UmFZdsTsbQNBGdyxRQDOLeEvF5iFwap0BM8LKyd+g==} + /@codemirror/lang-markdown@6.2.5: + resolution: {integrity: sha512-Hgke565YcO4fd9pe2uLYxnMufHO5rQwRr+AAhFq8ABuhkrjyX8R5p5s+hZUTdV60O0dMRjxKhBLxz8pu/MkUVA==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - '@codemirror/lang-html': 6.4.8 + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) + '@codemirror/lang-html': 6.4.9 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 - '@lezer/markdown': 1.2.0 + '@lezer/markdown': 1.3.0 dev: false /@codemirror/lang-php@6.0.1: resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} dependencies: - '@codemirror/lang-html': 6.4.8 + '@codemirror/lang-html': 6.4.9 '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 '@lezer/php': 1.0.2 dev: false - /@codemirror/lang-python@6.1.4(@codemirror/view@6.26.0): - resolution: {integrity: sha512-b6d1TDqrkCjFNvMO01SWldFiDoZ39yl3tDMC1Y5f8glA2eZpynPxJhwYVTlGFr0stizcJgrp6ojLEGH2myoZAw==} + /@codemirror/lang-python@6.1.5(@codemirror/view@6.26.3): + resolution: {integrity: sha512-hCm+8X6wrnXJCGf+QhmFu1AXkdTVG7dHy0Ly6SI1N3SRPptaMvwX6oNQonOXOMPvmcjiB0xq342KAxX3BYpijw==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 - '@lezer/python': 1.1.12 + '@lezer/python': 1.1.13 transitivePeerDependencies: - '@codemirror/view' dev: false @@ -795,22 +809,22 @@ packages: '@lezer/rust': 1.0.2 dev: false - /@codemirror/lang-sass@6.0.2(@codemirror/view@6.26.0): + /@codemirror/lang-sass@6.0.2(@codemirror/view@6.26.3): resolution: {integrity: sha512-l/bdzIABvnTo1nzdY6U+kPAC51czYQcOErfzQ9zSm9D8GmNPD0WTW8st/CJwBTPLO8jlrbyvlSEcN20dc4iL0Q==} dependencies: - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.0) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 - '@lezer/sass': 1.0.5 + '@lezer/sass': 1.0.6 transitivePeerDependencies: - '@codemirror/view' dev: false - /@codemirror/lang-sql@6.6.1(@codemirror/view@6.26.0): - resolution: {integrity: sha512-tRHMLymUbL1yY8dzdrGdHVg+nMlfacOU54tjN5+VF45Syw5L3APxsFFhgdWIs4yg7OTt929Z9Ffw5qyV++kbWQ==} + /@codemirror/lang-sql@6.6.3(@codemirror/view@6.26.3): + resolution: {integrity: sha512-fo5i3OD/7TmmqMtKycC4OaqfPsRxk0sKOb35g8cOtyUyyI2hfP2qXkDc7Asb6h7BiJK+MU/DYVPnQm6iNB5ZTw==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 @@ -823,7 +837,7 @@ packages: /@codemirror/lang-vue@0.1.3: resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==} dependencies: - '@codemirror/lang-html': 6.4.8 + '@codemirror/lang-html': 6.4.9 '@codemirror/lang-javascript': 6.2.2 '@codemirror/language': 6.10.1 '@lezer/common': 1.2.1 @@ -843,50 +857,52 @@ packages: /@codemirror/lang-xml@6.1.0: resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 '@lezer/xml': 1.0.5 dev: false - /@codemirror/lang-yaml@6.0.0(@codemirror/view@6.26.0): - resolution: {integrity: sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q==} + /@codemirror/lang-yaml@6.1.1(@codemirror/view@6.26.3): + resolution: {integrity: sha512-HV2NzbK9bbVnjWxwObuZh5FuPCowx51mEfoFT9y3y+M37fA3+pbxx4I7uePuygFzDsAmCTwQSc/kXh/flab4uw==} dependencies: - '@codemirror/autocomplete': 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.16.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3)(@lezer/common@1.2.1) '@codemirror/language': 6.10.1 '@codemirror/state': 6.4.1 '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 '@lezer/yaml': 1.0.2 transitivePeerDependencies: - '@codemirror/view' dev: false - /@codemirror/language-data@6.4.1(@codemirror/view@6.26.0): - resolution: {integrity: sha512-NYhC3NvEMwUxSWS1sB5AePUtr5g2ASSYOZ37YixicDG8PWHslDV9mmXIX0KvmtEm50V8FT4F5i4HAsk/7i78LA==} + /@codemirror/language-data@6.5.1(@codemirror/view@6.26.3): + resolution: {integrity: sha512-0sWxeUSNlBr6OmkqybUTImADFUP0M3P0IiSde4nc24bz/6jIYzqYSgkOSLS+CBIoW1vU8Q9KUWXscBXeoMVC9w==} dependencies: '@codemirror/lang-angular': 0.1.3 '@codemirror/lang-cpp': 6.0.2 - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.0) - '@codemirror/lang-html': 6.4.8 + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.26.3) + '@codemirror/lang-go': 6.0.0(@codemirror/view@6.26.3) + '@codemirror/lang-html': 6.4.9 '@codemirror/lang-java': 6.0.1 '@codemirror/lang-javascript': 6.2.2 '@codemirror/lang-json': 6.0.1 - '@codemirror/lang-less': 6.0.2(@codemirror/view@6.26.0) + '@codemirror/lang-less': 6.0.2(@codemirror/view@6.26.3) '@codemirror/lang-liquid': 6.2.1 - '@codemirror/lang-markdown': 6.2.4 + '@codemirror/lang-markdown': 6.2.5 '@codemirror/lang-php': 6.0.1 - '@codemirror/lang-python': 6.1.4(@codemirror/view@6.26.0) + '@codemirror/lang-python': 6.1.5(@codemirror/view@6.26.3) '@codemirror/lang-rust': 6.0.1 - '@codemirror/lang-sass': 6.0.2(@codemirror/view@6.26.0) - '@codemirror/lang-sql': 6.6.1(@codemirror/view@6.26.0) + '@codemirror/lang-sass': 6.0.2(@codemirror/view@6.26.3) + '@codemirror/lang-sql': 6.6.3(@codemirror/view@6.26.3) '@codemirror/lang-vue': 0.1.3 '@codemirror/lang-wast': 6.0.2 '@codemirror/lang-xml': 6.1.0 - '@codemirror/lang-yaml': 6.0.0(@codemirror/view@6.26.0) + '@codemirror/lang-yaml': 6.1.1(@codemirror/view@6.26.3) '@codemirror/language': 6.10.1 - '@codemirror/legacy-modes': 6.3.3 + '@codemirror/legacy-modes': 6.4.0 transitivePeerDependencies: - '@codemirror/view' dev: false @@ -895,15 +911,15 @@ packages: resolution: {integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 style-mod: 4.1.2 dev: false - /@codemirror/legacy-modes@6.3.3: - resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==} + /@codemirror/legacy-modes@6.4.0: + resolution: {integrity: sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==} dependencies: '@codemirror/language': 6.10.1 dev: false @@ -912,7 +928,7 @@ packages: resolution: {integrity: sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 crelt: 1.0.6 dev: false @@ -920,7 +936,7 @@ packages: resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 crelt: 1.0.6 dev: false @@ -928,8 +944,8 @@ packages: resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} dev: false - /@codemirror/view@6.26.0: - resolution: {integrity: sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==} + /@codemirror/view@6.26.3: + resolution: {integrity: sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==} dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -1274,6 +1290,14 @@ packages: '@lezer/lr': 1.4.0 dev: false + /@lezer/go@1.0.0: + resolution: {integrity: sha512-co9JfT3QqX1YkrMmourYw2Z8meGC50Ko4d54QEcQbEYpvdUvN4yb0NBZdn/9ertgvjsySxHsKzH3lbm3vqJ4Jw==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + /@lezer/highlight@1.2.0: resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} dependencies: @@ -1288,16 +1312,16 @@ packages: '@lezer/lr': 1.4.0 dev: false - /@lezer/java@1.1.1: - resolution: {integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==} + /@lezer/java@1.1.2: + resolution: {integrity: sha512-3j8X70JvYf0BZt8iSRLXLkt0Ry1hVUgH6wT32yBxH/Xi55nW2VMhc1Az4SKwu4YGSmxCm1fsqDDcHTuFjC8pmg==} dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 '@lezer/lr': 1.4.0 dev: false - /@lezer/javascript@1.4.13: - resolution: {integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==} + /@lezer/javascript@1.4.15: + resolution: {integrity: sha512-B082ZdjI0vo2AgLqD834GlRTE9gwRX8NzHzKq5uDwEnQ9Dq+A/CEhd3nf68tiNA2f9O+8jS1NeSTUYT9IAqcTw==} dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -1318,8 +1342,8 @@ packages: '@lezer/common': 1.2.1 dev: false - /@lezer/markdown@1.2.0: - resolution: {integrity: sha512-d7MwsfAukZJo1GpPrcPGa3MxaFFOqNp0gbqF+3F7pTeNDOgeJN1muXzx1XXDPt+Ac+/voCzsH7qXqnn+xReG/g==} + /@lezer/markdown@1.3.0: + resolution: {integrity: sha512-ErbEQ15eowmJUyT095e9NJc3BI9yZ894fjSDtHftD0InkfUBGgnKSU6dvan9jqsZuNHg2+ag/1oyDRxNsENupQ==} dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -1333,8 +1357,8 @@ packages: '@lezer/lr': 1.4.0 dev: false - /@lezer/python@1.1.12: - resolution: {integrity: sha512-jDfUgOIDulv94R89dtYBfmIpCHiKn6RkeeVT7RQmbaKehJEMp30Bj5fHdAsgA2p8Gqjj+mbHVR+jyxUzSUNaOg==} + /@lezer/python@1.1.13: + resolution: {integrity: sha512-AdbRAtdQq94PfTNd4kqMEJhH2fqa2JdoyyqqVewY6w34w2Gi6dg2JuOtOgR21Bi0zP9r0KjSSHOUq/tP7FVT8A==} dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -1349,8 +1373,8 @@ packages: '@lezer/lr': 1.4.0 dev: false - /@lezer/sass@1.0.5: - resolution: {integrity: sha512-gG3h/58JSk2SY3OmKO2hyEkxMgC+dLAylRubxBiSjglvDnABsMDxgrmMDlCHugdtH+2JlgtYLoMDZ9H0JE9wAQ==} + /@lezer/sass@1.0.6: + resolution: {integrity: sha512-w/RCO2dIzZH1To8p+xjs8cE+yfgGus8NZ/dXeWl/QzHyr+TeBs71qiE70KPImEwvTsmEjoWh0A5SxMzKd5BWBQ==} dependencies: '@lezer/common': 1.2.1 '@lezer/highlight': 1.2.0 @@ -1423,8 +1447,8 @@ packages: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} dev: true - /@replit/codemirror-vim@6.2.0(@codemirror/commands@6.3.3)(@codemirror/language@6.10.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0): - resolution: {integrity: sha512-05E27W7m9HLwnhIHaXAdBTca1uN6n3j57wAsGI8rb+0LDIWgaLgS65xJ4TRJnwJOX4N0iWLGq38McDheSO5eOQ==} + /@replit/codemirror-vim@6.2.1(@codemirror/commands@6.5.0)(@codemirror/language@6.10.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.26.3): + resolution: {integrity: sha512-qDAcGSHBYU5RrdO//qCmD8K9t6vbP327iCj/iqrkVnjbrpFhrjOt92weGXGHmTNRh16cUtkUZ7Xq7rZf+8HVow==} peerDependencies: '@codemirror/commands': ^6.0.0 '@codemirror/language': ^6.1.0 @@ -1432,11 +1456,11 @@ packages: '@codemirror/state': ^6.0.1 '@codemirror/view': ^6.0.3 dependencies: - '@codemirror/commands': 6.3.3 + '@codemirror/commands': 6.5.0 '@codemirror/language': 6.10.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.26.0 + '@codemirror/view': 6.26.3 dev: false /@rollup/plugin-alias@5.1.0(rollup@4.9.2): @@ -4958,7 +4982,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5315,7 +5339,7 @@ packages: rollup: 4.9.2 typescript: 5.3.3 optionalDependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 dev: true /rollup@4.9.2: diff --git a/src/api/format.ts b/src/api/format.ts index 1f5b2a5..0a6ff4f 100644 --- a/src/api/format.ts +++ b/src/api/format.ts @@ -1,9 +1,9 @@ import { syntaxTree } from '@codemirror/language' import type { NodeType } from '@lezer/common' -import { toInk } from '/src/vendor/adapters/selections' import type * as Ink from '/types/ink' import type InkInternal from '/types/internal' import * as InkValues from '/types/values' +import { toInk } from '../editor/adapters/selections' // Todo: // - [ ] Handle special scenarios (e.g. headings in quote blocks). diff --git a/src/api/load.ts b/src/api/load.ts index 22e3ecd..223eb16 100644 --- a/src/api/load.ts +++ b/src/api/load.ts @@ -1,9 +1,9 @@ +import { createState } from '/src/editor' import { override } from '/src/utils/merge' -import { makeState } from '/src/vendor/state' import type InkInternal from '/types/internal' export const load = ([state, setState]: InkInternal.Store, doc: string) => { setState(override(state(), { options: { doc } })) - state().editor.setState(makeState([state, setState])) + state().editor.setState(createState([state, setState])) } diff --git a/src/api/select.ts b/src/api/select.ts index 3b71fb5..247d10c 100644 --- a/src/api/select.ts +++ b/src/api/select.ts @@ -1,7 +1,7 @@ -import { toCodeMirror } from '/src/vendor/adapters/selections' import type * as Ink from '/types/ink' import type InkInternal from '/types/internal' import * as InkValues from '/types/values' +import { toCodeMirror } from '../editor/adapters/selections' export const select = (store: InkInternal.Store, options: Ink.Instance.SelectOptions = {}) => { if (options.selections) diff --git a/src/api/selections.ts b/src/api/selections.ts index f4ebb7e..85e7eae 100644 --- a/src/api/selections.ts +++ b/src/api/selections.ts @@ -1,6 +1,6 @@ -import { toInk } from '/src/vendor/adapters/selections' import type * as Ink from '/types/ink' import type InkInternal from '/types/internal' +import { toInk } from '../editor/adapters/selections' export const selections = ([state]: InkInternal.Store): Ink.Editor.Selection[] => { const { editor } = state() diff --git a/src/vendor/adapters/selections.ts b/src/editor/adapters/selections.ts similarity index 100% rename from src/vendor/adapters/selections.ts rename to src/editor/adapters/selections.ts diff --git a/src/vendor/extensions/appearance.ts b/src/editor/extensions/appearance.ts similarity index 100% rename from src/vendor/extensions/appearance.ts rename to src/editor/extensions/appearance.ts diff --git a/src/vendor/extensions/autocomplete.ts b/src/editor/extensions/autocomplete.ts similarity index 100% rename from src/vendor/extensions/autocomplete.ts rename to src/editor/extensions/autocomplete.ts diff --git a/src/vendor/extensions/blockquote.ts b/src/editor/extensions/blockquote.ts similarity index 100% rename from src/vendor/extensions/blockquote.ts rename to src/editor/extensions/blockquote.ts diff --git a/src/vendor/extensions/code.ts b/src/editor/extensions/code.ts similarity index 100% rename from src/vendor/extensions/code.ts rename to src/editor/extensions/code.ts diff --git a/src/vendor/extensions/extension.ts b/src/editor/extensions/extension.ts similarity index 100% rename from src/vendor/extensions/extension.ts rename to src/editor/extensions/extension.ts diff --git a/src/vendor/extensions/images.ts b/src/editor/extensions/images.ts similarity index 100% rename from src/vendor/extensions/images.ts rename to src/editor/extensions/images.ts diff --git a/src/vendor/extensions/indentWithTab.ts b/src/editor/extensions/indentWithTab.ts similarity index 100% rename from src/vendor/extensions/indentWithTab.ts rename to src/editor/extensions/indentWithTab.ts diff --git a/src/vendor/extensions/ink.ts b/src/editor/extensions/ink.ts similarity index 100% rename from src/vendor/extensions/ink.ts rename to src/editor/extensions/ink.ts diff --git a/src/vendor/extensions/line_wrapping.ts b/src/editor/extensions/line_wrapping.ts similarity index 100% rename from src/vendor/extensions/line_wrapping.ts rename to src/editor/extensions/line_wrapping.ts diff --git a/src/vendor/extensions/lists.ts b/src/editor/extensions/lists.ts similarity index 100% rename from src/vendor/extensions/lists.ts rename to src/editor/extensions/lists.ts diff --git a/src/vendor/extensions/placeholder.ts b/src/editor/extensions/placeholder.ts similarity index 100% rename from src/vendor/extensions/placeholder.ts rename to src/editor/extensions/placeholder.ts diff --git a/src/vendor/extensions/readonly.ts b/src/editor/extensions/readonly.ts similarity index 100% rename from src/vendor/extensions/readonly.ts rename to src/editor/extensions/readonly.ts diff --git a/src/vendor/extensions/search.tsx b/src/editor/extensions/search.tsx similarity index 100% rename from src/vendor/extensions/search.tsx rename to src/editor/extensions/search.tsx diff --git a/src/vendor/extensions/spellcheck.ts b/src/editor/extensions/spellcheck.ts similarity index 100% rename from src/vendor/extensions/spellcheck.ts rename to src/editor/extensions/spellcheck.ts diff --git a/src/vendor/extensions/theme.ts b/src/editor/extensions/theme.ts similarity index 100% rename from src/vendor/extensions/theme.ts rename to src/editor/extensions/theme.ts diff --git a/src/vendor/extensions/vim.ts b/src/editor/extensions/vim.ts similarity index 100% rename from src/vendor/extensions/vim.ts rename to src/editor/extensions/vim.ts diff --git a/src/editor/index.ts b/src/editor/index.ts new file mode 100644 index 0000000..25856c7 --- /dev/null +++ b/src/editor/index.ts @@ -0,0 +1,2 @@ +export * from './state' +export * from './view' diff --git a/src/vendor/state.ts b/src/editor/state.ts similarity index 57% rename from src/vendor/state.ts rename to src/editor/state.ts index 7dd8834..2406cef 100644 --- a/src/vendor/state.ts +++ b/src/editor/state.ts @@ -1,25 +1,29 @@ import { defaultKeymap, history, historyKeymap } from '@codemirror/commands' -import { type EditorSelection, EditorState } from '@codemirror/state' +import type { EditorSelection } from '@codemirror/state' +import { EditorState } from '@codemirror/state' import { keymap } from '@codemirror/view' import { buildVendors } from '/src/extensions' -import { blockquote } from '/src/vendor/extensions/blockquote' -import { code } from '/src/vendor/extensions/code' -import { ink } from '/src/vendor/extensions/ink' -import { lineWrapping } from '/src/vendor/extensions/line_wrapping' -import { theme } from '/src/vendor/extensions/theme' import type * as Ink from '/types/ink' import type InkInternal from '/types/internal' import { toCodeMirror } from './adapters/selections' +import { blockquote } from './extensions/blockquote' +import { code } from './extensions/code' +import { ink } from './extensions/ink' +import { lineWrapping } from './extensions/line_wrapping' +import { theme } from './extensions/theme' const toVendorSelection = (selections: Ink.Editor.Selection[]): EditorSelection | undefined => { - if (selections.length > 0) + if (selections.length > 0) { return toCodeMirror(selections) + } } -export const makeState = ([state, setState]: InkInternal.Store): InkInternal.Vendor.State => { +export const createState = ([state, setState]: InkInternal.Store): InkInternal.Vendor.State => { + const { selections } = state().options + return EditorState.create({ doc: state().options.doc, - selection: toVendorSelection(state().options.selections), + selection: toVendorSelection(selections), extensions: [ keymap.of([ ...defaultKeymap, diff --git a/src/vendor/editor.ts b/src/editor/view.ts similarity index 82% rename from src/vendor/editor.ts rename to src/editor/view.ts index ec696b7..9ec7b58 100644 --- a/src/vendor/editor.ts +++ b/src/editor/view.ts @@ -1,8 +1,8 @@ import { EditorView } from '@codemirror/view' -import { makeState } from '/src/vendor/state' import type InkInternal from '/types/internal' +import { createState } from './state' -export const makeEditor = ([state, setState]: InkInternal.Store, target?: HTMLElement): InkInternal.Editor => { +export const createView = ([state, setState]: InkInternal.Store, target?: HTMLElement): InkInternal.Editor => { const rootNode = target?.getRootNode() const root = rootNode?.nodeType === 11 ? rootNode as ShadowRoot : undefined @@ -21,7 +21,7 @@ export const makeEditor = ([state, setState]: InkInternal.Store, target?: HTMLEl } }, root, - state: makeState([state, setState]), + state: createState([state, setState]), }) return editor diff --git a/src/extensions.ts b/src/extensions.ts index 495ac04..b918496 100644 --- a/src/extensions.ts +++ b/src/extensions.ts @@ -2,9 +2,9 @@ import { Compartment } from '@codemirror/state' import { markdown } from '/src/markdown' import { isAutoDark } from '/src/ui/utils' import { filterPlugins, partitionPlugins } from '/src/utils/options' -import { appearance } from '/src/vendor/extensions/appearance' import { type InkInternal } from '/types' import { appearanceTypes, pluginTypes } from '/types/values' +import { appearance } from './editor/extensions/appearance' export const buildVendors = ([state, setState]: InkInternal.Store) => { const extensions = state().extensions.map(e => e.initialValue([state, setState])) @@ -85,7 +85,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.interface.autocomplete) { - const { autocomplete } = await import('/src/vendor/extensions/autocomplete') + const { autocomplete } = await import('./editor/extensions/autocomplete') return compartment.reconfigure(autocomplete(state().options)) } @@ -94,7 +94,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.interface.images) { - const { images } = await import('/src/vendor/extensions/images') + const { images } = await import('./editor/extensions/images') return compartment.reconfigure(images()) } @@ -107,7 +107,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ const shiftTab = trapTab ?? keybindings.shiftTab if (tab || shiftTab) { - const { indentWithTab } = await import('/src/vendor/extensions/indentWithTab') + const { indentWithTab } = await import('./editor/extensions/indentWithTab') return compartment.reconfigure(indentWithTab({ tab, shiftTab })) } @@ -116,7 +116,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.interface.lists) { - const { lists } = await import('/src/vendor/extensions/lists') + const { lists } = await import('./editor/extensions/lists') return compartment.reconfigure(lists()) } @@ -125,7 +125,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.placeholder) { - const { placeholder } = await import('/src/vendor/extensions/placeholder') + const { placeholder } = await import('./editor/extensions/placeholder') return compartment.reconfigure(placeholder(state().options.placeholder)) } @@ -134,7 +134,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.interface.readonly) { - const { readonly } = await import('/src/vendor/extensions/readonly') + const { readonly } = await import('./editor/extensions/readonly') return compartment.reconfigure(readonly()) } @@ -143,7 +143,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.search) { - const { search } = await import('/src/vendor/extensions/search') + const { search } = await import('./editor/extensions/search') return compartment.reconfigure(search()) } @@ -152,7 +152,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.interface.spellcheck) { - const { spellcheck } = await import('/src/vendor/extensions/spellcheck') + const { spellcheck } = await import('./editor/extensions/spellcheck') return compartment.reconfigure(spellcheck()) } @@ -161,7 +161,7 @@ export const lazyResolvers: InkInternal.LazyExtensionResolvers = [ }, async ([state]: InkInternal.Store, compartment: InkInternal.Vendor.Compartment) => { if (state().options.vim) { - const { vim } = await import('/src/vendor/extensions/vim') + const { vim } = await import('./editor/extensions/vim') return compartment.reconfigure(vim()) } diff --git a/src/importers/katex.ts b/src/importers/katex.ts deleted file mode 100644 index 7a96b10..0000000 --- a/src/importers/katex.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type Katex = Awaited> - -export const importer = async () => { - const { default: katex } = await import('katex') - - return katex -} diff --git a/src/modules.ts b/src/modules.ts deleted file mode 100644 index d6b2fd7..0000000 --- a/src/modules.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { type Katex } from './importers/katex' - -export type ModuleMap = Partial<{ - katex: Katex | Promise, -}> - -export const modules = new Proxy({}, { - get: (target: ModuleMap, prop: keyof ModuleMap, _receiver) => { - if (target[prop]) return target[prop] - - return target[prop] = (async () => { - // Todo: Figure out whether including the extension here will pose a problem in the production build. - const { importer } = await import(`./importers/${prop}.ts`) - const imported = await importer() as Awaited - - target[prop] = imported - - return imported! - })() - }, -}) - -/** - * - * @example useModule('katex', (katex) => katex.render(...)) - */ -export const useModule = (name: keyof ModuleMap, callback: (module: Awaited[typeof name]>) => void) => { - if (!modules[name]) return console.error('[katex] module is not resolvable') - if ('then' in modules[name]!) return Promise.resolve(modules[name]!).then(callback) - - callback(modules[name] as Awaited[typeof name]>) -} diff --git a/src/ui/components/editor/index.tsx b/src/ui/components/editor/index.tsx index 3996e3e..84ad33c 100644 --- a/src/ui/components/editor/index.tsx +++ b/src/ui/components/editor/index.tsx @@ -2,7 +2,7 @@ import type { Component } from 'solid-js' import { buildVendorUpdates } from '/src/extensions' import { useStore } from '/src/ui/app' import { override } from '/src/utils/merge' -import { makeEditor } from '/src/vendor/editor' +import { createView } from '../../../editor' export const Editor: Component<{ target?: HTMLElement }> = (props) => { // Needed for tree-shaking purposes. @@ -22,7 +22,7 @@ export const Editor: Component<{ target?: HTMLElement }> = (props) => { const [state, setState] = useStore() // eslint-disable-next-line solid/reactivity - const editor = makeEditor([state, setState], props.target) + const editor = createView([state, setState], props.target) const { workQueue } = state() setState(override(state(), { editor })) diff --git a/test/mocks/editor.ts b/test/mocks/editor.ts index 4d712d4..0d76faa 100644 --- a/test/mocks/editor.ts +++ b/test/mocks/editor.ts @@ -6,7 +6,7 @@ import type InkInternal from '/types/internal' vi.mock('@codemirror/state') vi.mock('@codemirror/view') -export const makeEditor = (): InkInternal.Editor => { +export const createView = (): InkInternal.Editor => { return new EditorView({ state: EditorState.create(), }) diff --git a/test/mocks/store.ts b/test/mocks/store.ts index 45720b5..2e63e51 100644 --- a/test/mocks/store.ts +++ b/test/mocks/store.ts @@ -2,14 +2,14 @@ import { vi } from 'vitest' import { blankState } from '/src/store' import type { Options } from '/types/ink' import type InkInternal from '/types/internal' -import { makeEditor } from './editor' +import { createView } from './editor' export const makeState = (partialState: InkInternal.State): InkInternal.StateResolved => { return { ...blankState(), ...partialState } as InkInternal.StateResolved } export const makeStore = (options: Options = {}, overrides: InkInternal.State = {}): InkInternal.Store => { - const state = makeState({ editor: makeEditor(), ...overrides, options }) + const state = makeState({ editor: createView(), ...overrides, options }) const stateMock = vi.fn().mockImplementation(() => state) const setStateMock = vi.fn().mockImplementation((value: unknown) => (typeof value === 'function' ? value(state) : value))