Skip to content

perf: use Shiki shorthand #2026

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 47 additions & 8 deletions packages/slidev/node/setups/shiki.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
import type { MarkdownItShikiOptions } from '@shikijs/markdown-it'
import type { ShikiSetup } from '@slidev/types'
import type { Highlighter } from 'shiki'
import type { LanguageInput, ShorthandsBundle } from 'shiki/core'
import fs from 'node:fs/promises'
import { bundledLanguages, createHighlighter } from 'shiki'
import { red } from 'kolorist'
import { bundledLanguages, bundledThemes } from 'shiki/bundle/full'
import { createdBundledHighlighter, createSingletonShorthands } from 'shiki/core'
import { createJavaScriptRegexEngine } from 'shiki/engine/javascript'
import { loadSetups } from './load'

let cachedRoots: string[] | undefined
let cachedShiki: {
shiki: Highlighter
shiki: ShorthandsBundle<string, string>
shikiOptions: MarkdownItShikiOptions
} | undefined

export default async function setupShiki(roots: string[]) {
// Here we use shallow equality because when server is restarted, the roots will be different object.
if (cachedRoots === roots)
return cachedShiki!
cachedShiki?.shiki.dispose()

const options = await loadSetups<ShikiSetup>(
roots,
Expand All @@ -28,7 +30,43 @@ export default async function setupShiki(roots: string[]) {
},
}],
)

const browserLanguages: any[] = []
const nodeLanguages: Record<string, LanguageInput> = bundledLanguages
for (const option of options) {
const langs = option?.langs
if (Array.isArray(langs)) {
for (const lang of langs.flat()) {
if (typeof lang === 'function') {
console.error(red('[slidev] `langs` option in shiki setup cannot be array containing functions. Please use `{ name: loaderFunction }` format instead.'))
}
else if (typeof lang === 'string') {
// Name of a Shiki built-in language
// In Node environment, they can be loaded on demand without overhead, so all built-in languages are available.
// Only need to include them explicitly in browser environment.
browserLanguages.push(lang)
}
else if (lang.name) {
// Custom grammar object
browserLanguages.push(lang)
nodeLanguages[lang.name] = lang
for (const alias of lang.aliases || [])
nodeLanguages[alias] = lang
}
}
}
else if (typeof option?.langs === 'object') {
// Map from name to loader or grammar object
Object.assign(nodeLanguages, option.langs)
browserLanguages.push(...Object.values(option.langs).filter(lang => lang?.name))
}
else {
console.error(red('[slidev] Invalid langs option in shiki setup:'), langs)
}
}

const mergedOptions = Object.assign({}, ...options)
mergedOptions.langs = browserLanguages

if ('theme' in mergedOptions && 'themes' in mergedOptions)
delete mergedOptions.theme
Expand All @@ -50,11 +88,12 @@ export default async function setupShiki(roots: string[]) {
if (mergedOptions.themes)
mergedOptions.defaultColor = false

const shiki = await createHighlighter({
...mergedOptions,
langs: mergedOptions.langs ?? Object.keys(bundledLanguages),
themes: 'themes' in mergedOptions ? Object.values(mergedOptions.themes) : [mergedOptions.theme],
const createHighlighter = createdBundledHighlighter<string, string>({
langs: nodeLanguages,
themes: bundledThemes,
engine: createJavaScriptRegexEngine,
})
const shiki = createSingletonShorthands<string, string>(createHighlighter)

cachedRoots = roots
return cachedShiki = {
Expand Down
4 changes: 2 additions & 2 deletions packages/slidev/node/syntax/markdown-it/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { ResolvedSlidevOptions } from '@slidev/types'
import type MagicString from 'magic-string'
import type MarkdownIt from 'markdown-it'
import type { MarkdownItAsync } from 'markdown-it-async'
import { taskLists as MarkdownItTaskList } from '@hedgedoc/markdown-it-plugins'
// @ts-expect-error missing types
import MarkdownItFootnote from 'markdown-it-footnote'
Expand All @@ -11,7 +11,7 @@ import MarkdownItLink from './markdown-it-link'
import MarkdownItShiki from './markdown-it-shiki'
import MarkdownItVDrag from './markdown-it-v-drag'

export async function useMarkdownItPlugins(md: MarkdownIt, options: ResolvedSlidevOptions, markdownTransformMap: Map<string, MagicString>) {
export async function useMarkdownItPlugins(md: MarkdownItAsync, options: ResolvedSlidevOptions, markdownTransformMap: Map<string, MagicString>) {
const { data: { features, config }, utils: { katexOptions } } = options

if (config.highlighter === 'shiki') {
Expand Down
28 changes: 19 additions & 9 deletions packages/slidev/node/syntax/markdown-it/markdown-it-shiki.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
import type { ResolvedSlidevOptions } from '@slidev/types'
import type { ShikiTransformer } from 'shiki'
import { isTruthy } from '@antfu/utils'
import { fromHighlighter } from '@shikijs/markdown-it/core'
import { fromAsyncCodeToHtml } from '@shikijs/markdown-it/async'
import { escapeVueInCode } from '../transform/utils'

export default async function MarkdownItShiki({ data: { config }, mode, utils }: ResolvedSlidevOptions) {
const transformers = [
...utils.shikiOptions.transformers || [],
(config.twoslash === true || config.twoslash === mode)
&& (await import('@shikijs/vitepress-twoslash')).transformerTwoslash({
export default async function MarkdownItShiki({ data: { config }, mode, utils: { shiki, shikiOptions } }: ResolvedSlidevOptions) {
async function getTwoslashTransformer() {
const [,,{ transformerTwoslash }] = await Promise.all([
// trigger the shiki to load the langs
shiki.codeToHast('', { lang: 'js', ...shikiOptions }),
shiki.codeToHast('', { lang: 'ts', ...shikiOptions }),
Comment on lines +10 to +12
Copy link
Member Author

@kermanx kermanx Jan 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is an ugly workaround 🥲

I tried passing lang and langAlias to transformerTwoslash, but it either complains "language not loaded" or doesn't transform the code.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I want to work on that to have codeToHast able to load grammars on demand - but that would requires quote some changes to the codebase to provide an async version of shiki - which I not yet have time to work on it properly 😇


import('@shikijs/vitepress-twoslash'),
])
return transformerTwoslash({
explicitTrigger: true,
twoslashOptions: {
handbookOptions: {
noErrorValidation: true,
},
},
}),
})
}

const transformers = [
...shikiOptions.transformers || [],
(config.twoslash === true || config.twoslash === mode) && await getTwoslashTransformer(),
{
pre(pre) {
this.addClassToHast(pre, 'slidev-code')
Expand All @@ -27,8 +37,8 @@ export default async function MarkdownItShiki({ data: { config }, mode, utils }:
} satisfies ShikiTransformer,
].filter(isTruthy) as ShikiTransformer[]

return fromHighlighter(utils.shiki, {
...utils.shikiOptions,
return fromAsyncCodeToHtml(shiki.codeToHtml, {
...shikiOptions,
transformers,
})
}
57 changes: 37 additions & 20 deletions packages/slidev/node/syntax/transform/magic-move.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { MarkdownTransformContext } from '@slidev/types'
import lz from 'lz-string'
import { codeToKeyedTokens } from 'shiki-magic-move/core'
import { toKeyedTokens } from 'shiki-magic-move/core'
import { reCodeBlock } from './code-wrapper'
import { normalizeRangeStr } from './utils'

Expand All @@ -13,27 +13,44 @@
/**
* Transform magic-move code blocks
*/
export function transformMagicMove(ctx: MarkdownTransformContext) {
export async function transformMagicMove(ctx: MarkdownTransformContext) {
const { codeToTokens } = ctx.options.utils.shiki

Check failure on line 17 in packages/slidev/node/syntax/transform/magic-move.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, ubuntu-latest)

Unhandled error

TypeError: Cannot destructure property 'codeToTokens' of 'ctx.options.utils.shiki' as it is undefined. ❯ transformMagicMove packages/slidev/node/syntax/transform/magic-move.ts:17:11 ❯ test/transform-all.test.ts:49:5 ❯ node_modules/.pnpm/@vitest[email protected]/node_modules/@vitest/runner/dist/index.js:561:22 This error originated in "test/transform-all.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. The latest test that might've caused the error is "test/transform-all.test.ts". It might mean one of the following: - The error was thrown, while Vitest was running this test. - If the error occurred after the test had been completed, this was the last documented test before it was thrown.

Check failure on line 17 in packages/slidev/node/syntax/transform/magic-move.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, windows-latest)

Unhandled error

TypeError: Cannot destructure property 'codeToTokens' of 'ctx.options.utils.shiki' as it is undefined. ❯ transformMagicMove packages/slidev/node/syntax/transform/magic-move.ts:17:11 ❯ test/transform-all.test.ts:49:5 ❯ node_modules/.pnpm/@vitest[email protected]/node_modules/@vitest/runner/dist/index.js:561:22 This error originated in "test/transform-all.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. The latest test that might've caused the error is "test/transform-all.test.ts". It might mean one of the following: - The error was thrown, while Vitest was running this test. - If the error occurred after the test had been completed, this was the last documented test before it was thrown.

Check failure on line 17 in packages/slidev/node/syntax/transform/magic-move.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, macos-latest)

Unhandled error

TypeError: Cannot destructure property 'codeToTokens' of 'ctx.options.utils.shiki' as it is undefined. ❯ transformMagicMove packages/slidev/node/syntax/transform/magic-move.ts:17:11 ❯ test/transform-all.test.ts:49:5 ❯ node_modules/.pnpm/@vitest[email protected]/node_modules/@vitest/runner/dist/index.js:561:22 This error originated in "test/transform-all.test.ts" test file. It doesn't mean the error was thrown inside the file itself, but while it was running. The latest test that might've caused the error is "test/transform-all.test.ts". It might mean one of the following: - The error was thrown, while Vitest was running this test. - If the error occurred after the test had been completed, this was the last documented test before it was thrown.
const replacements: [number, number, Promise<string>][] = []

ctx.s.replace(
reMagicMoveBlock,
(full, options = '{}', _attrs = '', body: string) => {
const matches = Array.from(body.matchAll(reCodeBlock))

if (!matches.length)
throw new Error('Magic Move block must contain at least one code block')

const defaultLineNumbers = parseLineNumbersOption(options) ?? ctx.options.data.config.lineNumbers

const ranges = matches.map(i => normalizeRangeStr(i[2]))
const steps = matches.map((i) => {
const lineNumbers = parseLineNumbersOption(i[3]) ?? defaultLineNumbers
return codeToKeyedTokens(ctx.options.utils.shiki, i[5].trimEnd(), {
...ctx.options.utils.shikiOptions,
lang: i[1] as any,
}, lineNumbers)
})
const compressed = lz.compressToBase64(JSON.stringify(steps))
return `<ShikiMagicMove v-bind="${options}" steps-lz="${compressed}" :step-ranges='${JSON.stringify(ranges)}' />`
(full, options = '{}', _attrs = '', body: string, start: number) => {
const end = start + full.length
replacements.push([start, end, worker()])
return ''
async function worker() {
const matches = Array.from(body.matchAll(reCodeBlock))

if (!matches.length)
throw new Error('Magic Move block must contain at least one code block')

const defaultLineNumbers = parseLineNumbersOption(options) ?? ctx.options.data.config.lineNumbers

const ranges = matches.map(i => normalizeRangeStr(i[2]))
const steps = await Promise.all(matches.map(async (i) => {
const lang = i[1]
const lineNumbers = parseLineNumbersOption(i[3]) ?? defaultLineNumbers
const code = i[5].trimEnd()
const options = {
...ctx.options.utils.shikiOptions,
lang,
}
const { tokens } = await codeToTokens(code, options)
return toKeyedTokens(code, tokens, JSON.stringify([lang, 'themes' in options ? options.themes : options.theme]), lineNumbers)
}))
const compressed = lz.compressToBase64(JSON.stringify(steps))
return `<ShikiMagicMove v-bind="${options}" steps-lz="${compressed}" :step-ranges='${JSON.stringify(ranges)}' />`
}
},
)

for (const [start, end, content] of replacements) {
// magic-string internally uses `overwrite` instead of `update` in the `replace` method
ctx.s.overwrite(start, end, await content)
}
}
2 changes: 1 addition & 1 deletion packages/slidev/node/virtual/shiki.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export const templateShiki: VirtualModuleTemplate = {
id: '/@slidev/shiki',
getContent: async ({ utils }) => {
const options = utils.shikiOptions
const langs = await resolveLangs(options.langs || ['markdown', 'vue', 'javascript', 'typescript', 'html', 'css'])
const langs = await resolveLangs(options.langs?.length ? options.langs : ['markdown', 'vue', 'javascript', 'typescript', 'html', 'css'])
const resolvedThemeOptions = 'themes' in options
? {
themes: Object.fromEntries(await Promise.all(Object.entries(options.themes)
Expand Down
8 changes: 4 additions & 4 deletions packages/types/src/options.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { MarkdownItShikiOptions } from '@shikijs/markdown-it/index.mjs'
import type { MarkdownItShikiOptions } from '@shikijs/markdown-it'
import type { KatexOptions } from 'katex'
import type { HighlighterGeneric } from 'shiki/types.mjs'
import type { CodeOptionsThemes, ShorthandsBundle } from 'shiki/core'
import type { SlidevData } from './types'

export interface RootsInfo {
Expand Down Expand Up @@ -57,8 +57,8 @@ export interface ResolvedSlidevOptions extends RootsInfo, SlidevEntryOptions {
}

export interface ResolvedSlidevUtils {
shiki: HighlighterGeneric<any, any>
shikiOptions: MarkdownItShikiOptions
shiki: ShorthandsBundle<string, string>
shikiOptions: MarkdownItShikiOptions & CodeOptionsThemes
katexOptions: KatexOptions | null
indexHtml: string
define: Record<string, string>
Expand Down
5 changes: 2 additions & 3 deletions packages/types/src/setups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { Awaitable } from '@antfu/utils'
import type { KatexOptions } from 'katex'
import type { MermaidConfig } from 'mermaid'
import type * as monaco from 'monaco-editor'
import type { BuiltinLanguage, BuiltinTheme, CodeOptionsMeta, CodeOptionsThemes, CodeToHastOptionsCommon, Highlighter, LanguageInput } from 'shiki'
import type { BuiltinLanguage, BuiltinTheme, CodeOptionsMeta, CodeOptionsThemes, CodeToHastOptionsCommon, LanguageInput, LanguageRegistration, MaybeArray } from 'shiki'
import type { VitePluginConfig as UnoCssConfig } from 'unocss/vite'
import type { App, ComputedRef, Ref } from 'vue'
import type { Router, RouteRecordRaw } from 'vue-router'
Expand Down Expand Up @@ -57,8 +57,7 @@ export type ShikiSetupReturn =
& CodeOptionsThemes<BuiltinTheme>
& CodeOptionsMeta
& {
setup: (highlighter: Highlighter) => Awaitable<void>
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems that this function is never called. And I don't know how to support it because there's no longer a Highlighter

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can get the highlighter with:

  const shiki = createSingletonShorthands<string, string>(createHighlighter)
  const highlighter = await shiki.getSingletonHighlighter()

But I don't mind removing it if no one uses it

langs: (LanguageInput | BuiltinLanguage)[]
langs: (MaybeArray<LanguageRegistration> | BuiltinLanguage)[] | Record<string, LanguageInput>
}
>

Expand Down
2 changes: 1 addition & 1 deletion pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ catalog:
'@iconify-json/svg-spinners': ^1.2.2
'@iconify/json': ^2.2.300
'@lillallol/outline-pdf': ^4.0.0
'@shikijs/engine-javascript': ^2.1.0
'@shikijs/markdown-it': ^2.1.0
'@shikijs/monaco': ^2.1.0
'@shikijs/engine-javascript': ^2.1.0
'@shikijs/twoslash': ^2.1.0
'@shikijs/vitepress-twoslash': ^2.1.0
'@slidev/rough-notation': ^0.1.0
Expand Down
4 changes: 2 additions & 2 deletions test/transform-magic-move.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@

const ctx = createTransformContext(code, shiki)

transformMagicMove(ctx)
await transformMagicMove(ctx)

expect(ctx.s.toString())
.toMatchInlineSnapshot(`

Check failure on line 34 in test/transform-magic-move.test.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, ubuntu-latest)

test/transform-magic-move.test.ts > basic

Error: Snapshot `basic 1` mismatched - Expected + Received " Some text before - <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXGA9CgBAFQBYEsDO6B6AhutPOgEYA2UEA1gDoB20L+UNcAdHQOYAKAOQAJODToAadAGUaueADcAhMICUYKWGwl82JGAC2AeRMB3AB4MSJywCstYAC5QGcDklCQoLZx+dDNCw8QmIyCjhqOkYnKAAzePw4QMQABm1oOgAnQwBiADYARgKAUQAOcqd432dZZwBPbiQMsHcGw1MLa1sHAFo0sABfKXB2fz9DVjjE5NSAJgBmbXbOsysbO3s+ouHRnz8Aw3ZOZu0EpJSkeYAWTK4oXOQ8gBFyl9LSgE5q2vqmhDpFZwDrILobXrbeZ7Ma1I7IHgzS6pRZFe45fKlADCpQAYribr8/P9mkC2iC1t1Nv1FjCDhNUmABEi5khFvN0Y98pUsWkXoNtDViY1Sa1VmD1j0tn1CSNYYdJshBCyrohFgBWTlPMCvd6fL74ol1EWAsUUiVUyF9dV08bwsDCFUogpazE4/GEwV/E0tYGg4yS6nbAq2uGKsDiSRQGTyRRwVROtkAdldzwAgosAEIVLFGkmmv2UiHSpOhhWMx3nWaq9VonwY57YvEEvM+snigOW6VVOX0+2aKvIpDqjn1rnPN4fb6Gr3CgG+8n+8FS/o/Xt28PTQesxDq5aLosr7ZFQZDAC62gULDgADkAK5GKhwbL4JDxEg0ZLaKj8fLzOCLDcNxpIk1S/s8MDlPAcBfKB2jONgcBGLeJDIYYLCPDATg0CQLDgS4r7rrAgJMik6DIfg+AkPwUQALzoGIEjSHICjKGoTi6Pohi4LIADSvFQNg5gMIsJBOK47ieIg3gboy3CBNuqqtFk446uURRpkUWK7LOxrzu25pgDx/GCcJokDGWDKGOgiZqqmOqTvqM5gEKemioWyDGQJQkiSQOyWfaFFUTRtl3GO2q6lOPy6fmC4dl5pm+X00JEeW1m2UUdYqRFjnTrirb6Wa/oJT55m0qlVnILRGWjtl3IaVpOkud6hUeUZfHeWZfmyvssnpYpqRFPudUTnqeUFe5B6eR1iXmTaFX2pWYAXDuRRhSNOpNh6E0FlN7UmaVfkhgt4aRsxsZsRlmrhfkGbZuUuYxW2RXcTNh19KWJ0VrZ8xfPZeRbS2T2tXtJVdX0Pa9WGjJbst1Yoi900HeDa4XkyuDXvej7Pq+iDvp+cDfvheT/oBwFwS5xOQdBsHxOJiHITeqEkRh2RYZeuH4c4hFnkAA===" :step-ranges='[[],[]]' /> + <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXGA9CgBAFQBYEsDO6B6AhutPOgEYA2UEA1gDoB20L+UNcAdHQOYAKAOQAJODToAadAGUaueADcAhMICUYKWGwl82JGAC2AeRMB3AB4MSJywCstYAC5QGcDklCQoLZx+dDNCw8QmIyCjhqOkYnKAAzePw4QMQABm1oOgAnQwBiADYARgKAUQAOcqd432dZZwBPbiQMsHcGw1MLa1sHAFo0sABfKXB2fz9DVjjE5NSAJgBmbXbOsysbO3s+ouHRnz8Aw3ZOZu0EpJSkeYAWTK4oXOQ8gBFyl9LSgE5q2vqmhDpFZwDrILobXrbeZ7Ma1I7IHgzS6pRZFe45fKlADCpQAYribr8/P9mkC2iC1t1Nv1FjCDhNUmABEi5khFvN0Y98pUsWkXoNtDViY1Sa1VmD1j0tn1CSNYYdJshBCyrohFgBWTlPMCvd6fL74ol1EWAsUUiVUyF9dV08bwsDCFUogpazE4/GEwV/E0tYGg4yS6nbAq2uGKsDiSRQGTyRRwVROtkAdldzwAgosAEIVLFGkmmv2UiHSpOhhWMx3nWaq9VonwY57YvEEvM+snigOW6VVOX0+2aKvIpDqjn1rnPN4fb6Gr3CgG+8n+8FS/o/Xt28PTQesxDq5aLosr7ZFQZDAC62gULDgADkAK5GKhwbL4JDxEg0ZLr2CApkpdBGHA+D4CQ/BRAAvOgYgSNIcgKMoahOLo+iGLgsgANLoVA2DmAwiwkE4rjuJ4iDeBujLcIE26qq0WTjjq5RFGmRRYrss7GvO7bmmAaGYdhuH4QMZYMoY6CJmqqY6pO+ozmAQocaKhbILxWE4XhJA7MJ9qAcBoEINRqR3GO2q6lOPzsfmC4dip/HqX00LfuWoniUUdZ0SZ0nTriracWa/o2Wpgm0o5InIOBLmju53JMSxbFyd6vlKTxGGqQJGmyvs5HOQZSBFPuUUTnqXk+YpB7KSltmCTaIX2pWYAXDuRRGQVOpNh6JUFmVyV8YFGkhjV4aRrBsYIS5mrGfkGbZuUuYWW2fmoRVvV9KWA0VuJ8xfJJeRtS2c2JV1AVpX0PaZWGjJbvV1Yogt5U9cda4XkyuDXvej7Pq+iDvp+cDnkAA" :step-ranges='[[],[]]' /> Some text after " ❯ test/transform-magic-move.test.ts:34:6

Check failure on line 34 in test/transform-magic-move.test.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, windows-latest)

test/transform-magic-move.test.ts > basic

Error: Snapshot `basic 1` mismatched - Expected + Received " Some text before - <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXGA9CgBAFQBYEsDO6B6AhutPOgEYA2UEA1gDoB20L+UNcAdHQOYAKAOQAJODToAadAGUaueADcAhMICUYKWGwl82JGAC2AeRMB3AB4MSJywCstYAC5QGcDklCQoLZx+dDNCw8QmIyCjhqOkYnKAAzePw4QMQABm1oOgAnQwBiADYARgKAUQAOcqd432dZZwBPbiQMsHcGw1MLa1sHAFo0sABfKXB2fz9DVjjE5NSAJgBmbXbOsysbO3s+ouHRnz8Aw3ZOZu0EpJSkeYAWTK4oXOQ8gBFyl9LSgE5q2vqmhDpFZwDrILobXrbeZ7Ma1I7IHgzS6pRZFe45fKlADCpQAYribr8/P9mkC2iC1t1Nv1FjCDhNUmABEi5khFvN0Y98pUsWkXoNtDViY1Sa1VmD1j0tn1CSNYYdJshBCyrohFgBWTlPMCvd6fL74ol1EWAsUUiVUyF9dV08bwsDCFUogpazE4/GEwV/E0tYGg4yS6nbAq2uGKsDiSRQGTyRRwVROtkAdldzwAgosAEIVLFGkmmv2UiHSpOhhWMx3nWaq9VonwY57YvEEvM+snigOW6VVOX0+2aKvIpDqjn1rnPN4fb6Gr3CgG+8n+8FS/o/Xt28PTQesxDq5aLosr7ZFQZDAC62gULDgADkAK5GKhwbL4JDxEg0ZLaKj8fLzOCLDcNxpIk1S/s8MDlPAcBfKB2jONgcBGLeJDIYYLCPDATg0CQLDgS4r7rrAgJMik6DIfg+AkPwUQALzoGIEjSHICjKGoTi6Pohi4LIADSvFQNg5gMIsJBOK47ieIg3gboy3CBNuqqtFk446uURRpkUWK7LOxrzu25pgDx/GCcJokDGWDKGOgiZqqmOqTvqM5gEKemioWyDGQJQkiSQOyWfaFFUTRtl3GO2q6lOPy6fmC4dl5pm+X00JEeW1m2UUdYqRFjnTrirb6Wa/oJT55m0qlVnILRGWjtl3IaVpOkud6hUeUZfHeWZfmyvssnpYpqRFPudUTnqeUFe5B6eR1iXmTaFX2pWYAXDuRRhSNOpNh6E0FlN7UmaVfkhgt4aRsxsZsRlmrhfkGbZuUuYxW2RXcTNh19KWJ0VrZ8xfPZeRbS2T2tXtJVdX0Pa9WGjJbst1Yoi900HeDa4XkyuDXvej7Pq+iDvp+cDfvheT/oBwFwS5xOQdBsHxOJiHITeqEkRh2RYZeuH4c4hFnkAA===" :step-ranges='[[],[]]' /> + <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXGA9CgBAFQBYEsDO6B6AhutPOgEYA2UEA1gDoB20L+UNcAdHQOYAKAOQAJODToAadAGUaueADcAhMICUYKWGwl82JGAC2AeRMB3AB4MSJywCstYAC5QGcDklCQoLZx+dDNCw8QmIyCjhqOkYnKAAzePw4QMQABm1oOgAnQwBiADYARgKAUQAOcqd432dZZwBPbiQMsHcGw1MLa1sHAFo0sABfKXB2fz9DVjjE5NSAJgBmbXbOsysbO3s+ouHRnz8Aw3ZOZu0EpJSkeYAWTK4oXOQ8gBFyl9LSgE5q2vqmhDpFZwDrILobXrbeZ7Ma1I7IHgzS6pRZFe45fKlADCpQAYribr8/P9mkC2iC1t1Nv1FjCDhNUmABEi5khFvN0Y98pUsWkXoNtDViY1Sa1VmD1j0tn1CSNYYdJshBCyrohFgBWTlPMCvd6fL74ol1EWAsUUiVUyF9dV08bwsDCFUogpazE4/GEwV/E0tYGg4yS6nbAq2uGKsDiSRQGTyRRwVROtkAdldzwAgosAEIVLFGkmmv2UiHSpOhhWMx3nWaq9VonwY57YvEEvM+snigOW6VVOX0+2aKvIpDqjn1rnPN4fb6Gr3CgG+8n+8FS/o/Xt28PTQesxDq5aLosr7ZFQZDAC62gULDgADkAK5GKhwbL4JDxEg0ZLr2CApkpdBGHA+D4CQ/BRAAvOgYgSNIcgKMoahOLo+iGLgsgANLoVA2DmAwiwkE4rjuJ4iDeBujLcIE26qq0WTjjq5RFGmRRYrss7GvO7bmmAaGYdhuH4QMZYMoY6CJmqqY6pO+ozmAQocaKhbILxWE4XhJA7MJ9qAcBoEINRqR3GO2q6lOPzsfmC4dip/HqX00LfuWoniUUdZ0SZ0nTriracWa/o2Wpgm0o5InIOBLmju53JMSxbFyd6vlKTxGGqQJGmyvs5HOQZSBFPuUUTnqXk+YpB7KSltmCTaIX2pWYAXDuRRGQVOpNh6JUFmVyV8YFGkhjV4aRrBsYIS5mrGfkGbZuUuYWW2fmoRVvV9KWA0VuJ8xfJJeRtS2c2JV1AVpX0PaZWGjJbvV1Yogt5U9cda4XkyuDXvej7Pq+iDvp+cDnkAA" :step-ranges='[[],[]]' /> Some text after " ❯ test/transform-magic-move.test.ts:34:6

Check failure on line 34 in test/transform-magic-move.test.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, macos-latest)

test/transform-magic-move.test.ts > basic

Error: Snapshot `basic 1` mismatched - Expected + Received " Some text before - <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXGA9CgBAFQBYEsDO6B6AhutPOgEYA2UEA1gDoB20L+UNcAdHQOYAKAOQAJODToAadAGUaueADcAhMICUYKWGwl82JGAC2AeRMB3AB4MSJywCstYAC5QGcDklCQoLZx+dDNCw8QmIyCjhqOkYnKAAzePw4QMQABm1oOgAnQwBiADYARgKAUQAOcqd432dZZwBPbiQMsHcGw1MLa1sHAFo0sABfKXB2fz9DVjjE5NSAJgBmbXbOsysbO3s+ouHRnz8Aw3ZOZu0EpJSkeYAWTK4oXOQ8gBFyl9LSgE5q2vqmhDpFZwDrILobXrbeZ7Ma1I7IHgzS6pRZFe45fKlADCpQAYribr8/P9mkC2iC1t1Nv1FjCDhNUmABEi5khFvN0Y98pUsWkXoNtDViY1Sa1VmD1j0tn1CSNYYdJshBCyrohFgBWTlPMCvd6fL74ol1EWAsUUiVUyF9dV08bwsDCFUogpazE4/GEwV/E0tYGg4yS6nbAq2uGKsDiSRQGTyRRwVROtkAdldzwAgosAEIVLFGkmmv2UiHSpOhhWMx3nWaq9VonwY57YvEEvM+snigOW6VVOX0+2aKvIpDqjn1rnPN4fb6Gr3CgG+8n+8FS/o/Xt28PTQesxDq5aLosr7ZFQZDAC62gULDgADkAK5GKhwbL4JDxEg0ZLaKj8fLzOCLDcNxpIk1S/s8MDlPAcBfKB2jONgcBGLeJDIYYLCPDATg0CQLDgS4r7rrAgJMik6DIfg+AkPwUQALzoGIEjSHICjKGoTi6Pohi4LIADSvFQNg5gMIsJBOK47ieIg3gboy3CBNuqqtFk446uURRpkUWK7LOxrzu25pgDx/GCcJokDGWDKGOgiZqqmOqTvqM5gEKemioWyDGQJQkiSQOyWfaFFUTRtl3GO2q6lOPy6fmC4dl5pm+X00JEeW1m2UUdYqRFjnTrirb6Wa/oJT55m0qlVnILRGWjtl3IaVpOkud6hUeUZfHeWZfmyvssnpYpqRFPudUTnqeUFe5B6eR1iXmTaFX2pWYAXDuRRhSNOpNh6E0FlN7UmaVfkhgt4aRsxsZsRlmrhfkGbZuUuYxW2RXcTNh19KWJ0VrZ8xfPZeRbS2T2tXtJVdX0Pa9WGjJbst1Yoi900HeDa4XkyuDXvej7Pq+iDvp+cDfvheT/oBwFwS5xOQdBsHxOJiHITeqEkRh2RYZeuH4c4hFnkAA===" :step-ranges='[[],[]]' /> + <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXGA9CgBAFQBYEsDO6B6AhutPOgEYA2UEA1gDoB20L+UNcAdHQOYAKAOQAJODToAadAGUaueADcAhMICUYKWGwl82JGAC2AeRMB3AB4MSJywCstYAC5QGcDklCQoLZx+dDNCw8QmIyCjhqOkYnKAAzePw4QMQABm1oOgAnQwBiADYARgKAUQAOcqd432dZZwBPbiQMsHcGw1MLa1sHAFo0sABfKXB2fz9DVjjE5NSAJgBmbXbOsysbO3s+ouHRnz8Aw3ZOZu0EpJSkeYAWTK4oXOQ8gBFyl9LSgE5q2vqmhDpFZwDrILobXrbeZ7Ma1I7IHgzS6pRZFe45fKlADCpQAYribr8/P9mkC2iC1t1Nv1FjCDhNUmABEi5khFvN0Y98pUsWkXoNtDViY1Sa1VmD1j0tn1CSNYYdJshBCyrohFgBWTlPMCvd6fL74ol1EWAsUUiVUyF9dV08bwsDCFUogpazE4/GEwV/E0tYGg4yS6nbAq2uGKsDiSRQGTyRRwVROtkAdldzwAgosAEIVLFGkmmv2UiHSpOhhWMx3nWaq9VonwY57YvEEvM+snigOW6VVOX0+2aKvIpDqjn1rnPN4fb6Gr3CgG+8n+8FS/o/Xt28PTQesxDq5aLosr7ZFQZDAC62gULDgADkAK5GKhwbL4JDxEg0ZLr2CApkpdBGHA+D4CQ/BRAAvOgYgSNIcgKMoahOLo+iGLgsgANLoVA2DmAwiwkE4rjuJ4iDeBujLcIE26qq0WTjjq5RFGmRRYrss7GvO7bmmAaGYdhuH4QMZYMoY6CJmqqY6pO+ozmAQocaKhbILxWE4XhJA7MJ9qAcBoEINRqR3GO2q6lOPzsfmC4dip/HqX00LfuWoniUUdZ0SZ0nTriracWa/o2Wpgm0o5InIOBLmju53JMSxbFyd6vlKTxGGqQJGmyvs5HOQZSBFPuUUTnqXk+YpB7KSltmCTaIX2pWYAXDuRRGQVOpNh6JUFmVyV8YFGkhjV4aRrBsYIS5mrGfkGbZuUuYWW2fmoRVvV9KWA0VuJ8xfJJeRtS2c2JV1AVpX0PaZWGjJbvV1Yogt5U9cda4XkyuDXvej7Pq+iDvp+cDnkAA" :step-ranges='[[],[]]' /> Some text after " ❯ test/transform-magic-move.test.ts:34:6
"

Some text before
Expand Down Expand Up @@ -68,10 +68,10 @@

const ctx = createTransformContext(code, shiki)

transformMagicMove(ctx)
await transformMagicMove(ctx)

expect(ctx.s.toString())
.toMatchInlineSnapshot(`

Check failure on line 74 in test/transform-magic-move.test.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, ubuntu-latest)

test/transform-magic-move.test.ts > hyphenated code language

Error: Snapshot `hyphenated code language 1` mismatched - Expected + Received " Some text before - <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXJKA7AzlANnAdFqAcwAoByACTiwIBoACAQVUIFcsBDAJwEJSBKMDTAALdumFIwABwBeABgBCAMQCcCgMwAtAG6CwAFygBrOBiSgUqfaf2ToGbAiFQAZi/RxbiOUOgFOkgDEACIAHMEAohEqei5o+gDK+gCeOEg+YCbJkrKKqho6ALRyYAC+NOD21laSuHqu7p5IAOy+2FAByIERAMIRSkoALLHxSakI3kJZOfLKalrahQCMZRWW1V5gBIT1bh5eoW3+QaGhPXLBJUJxVmNpk5lw2ci5cwWLAEyrlfE2ksS7RpeJZLI4dIJhSLRAYjW4pe4ZaYvWb5BaFdTfdZ/ZCkQH7JBLD5gzpgbp9AbDa6jeETRFPGZ5eZFYblH5WbFgSjUKD0JisDg8PFNRBLdTEoIMdQKCJnWGJGnpKb05GM96FACsmKqHNxzj2wo+hxQxy6vX6Qzld1pSue0hRTMWADYtb8asgBHqgUgPipxV1IVEVDCqXDxorHrbXqiis0Xey3WAADqoIVedR0yP2tWhMoAXSEWAAlqg4AA5FgAWwARnBOOgkC52FgPEIqzsuh84OpBoM5G5Yu3STBQvA4Cp+0J9MI4BWy+xZ5JUB0YHoOMxJOxmGwuIV9PXWSh4HY0JgcPgiGQubRGFuBXRAh9eB6RGIJMgAGpLBgQbRLACKAAaACyOaTsYpj1ogFjagm9ink4YANPiDx+OC/rhIGloKg8SJgJ+36/oBIHFHGGy1KmLR+qSZoUlhYY4cqeFfj+/7AaEyykRy2wUYgRqoSSgSnOclx0QiNqSPhLFEexXwHjBmwAp6yEglRIQYdCSiidaEYScxhFseinEJrqiH6sCRLGmh1HkhaIbyvRGa6QRrHESyazyZIV48je/JcPej48aKqmStKsp2Va4a4ZJ+nEZqcmupsJlIcK6igpZAk0bZYA3PZYk6R+ekuexzrxfGmzPslaYWfxELqUGmnhdhjkFc50mFLGpVkcgyY8eoYr5UxrUGTmpT5lsxZlpWNZ1g2TYtmAbZBJ23a9hO2WDoEw6juOLh6FOM5zguyBLpwK4Fpug4XdunC7vuuZAA=" :step-ranges='[[],[]]' /> + <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXJKA7AzlANnAdFqAcwAoByACTiwIBoACAQVUIFcsBDAJwEJSBKMDTAALdumFIwABwBeABgBCAMQCcCgMwAtAG6CwAFygBrOBiSgUqfaf2ToGbAiFQAZi/RxbiOUOgFOkgDEACIAHMEAohEqei5o+gDK+gCeOEg+YCbJkrKKqho6ALRyYAC+NOD21laSuHqu7p5IAOy+2FAByIERAMIRSkoALLHxSakI3kJZOfLKalrahQCMZRWW1V5gBIT1bh5eoW3+QaGhPXLBJUJxVmNpk5lw2ci5cwWLAEyrlfE2ksS7RpeJZLI4dIJhSLRAYjW4pe4ZaYvWb5BaFdTfdZ/ZCkQH7JBLD5gzpgbp9AbDa6jeETRFPGZ5eZFYblH5WbFgSjUKD0JisDg8PFNRBLdTEoIMdQKCJnWGJGnpKb05GM96FACsmKqHNxzj2wo+hxQxy6vX6Qzld1pSue0hRTMWADYtb8asgBHqgUgPipxV1IVEVDCqXDxorHrbXqiis0Xey3WAADqoIVedR0yP2tWhMoAXSEWAAlqg4AA5FgAWwARnBOOgkC52FgPKyUPA7GhMDh8EQyFzaIxmGwuHRAh9eB6RGIJMgAGpLBgQbRLACKAA0ALI5oSGExmRAWbUJ+xdpxgBr4h5+cH+8KBy0Kh5IsDzxfL9db4pxja1VMtP2kmaFIPmGT7Ki+C5Lqum6hMs34ctsf6IEa14koEpznJcIEIjakivlBH6wV8rZHpsAKepeIIASEd7Qko2HWhGeGQe+MHovBCa6ue+rAkSxo3oB5IWiG8qgRmzFvtBn4smspGSP2PKDvyI5jtwSGitRkrSrKIlWuGz74axn6aiRrqbFxF7CuooL8WhQHCWANyiThTFzixUmwc6pnxpsk6WWmfGoRCtFBvRumPuJbmSYRhSxt5P7IMmSHqGKrkQdFbE5qU+ZbMWZaVjWdYNk2La5kAA==" :step-ranges='[[],[]]' /> Some text after " ❯ test/transform-magic-move.test.ts:74:6

Check failure on line 74 in test/transform-magic-move.test.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, windows-latest)

test/transform-magic-move.test.ts > hyphenated code language

Error: Snapshot `hyphenated code language 1` mismatched - Expected + Received " Some text before - <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXJKA7AzlANnAdFqAcwAoByACTiwIBoACAQVUIFcsBDAJwEJSBKMDTAALdumFIwABwBeABgBCAMQCcCgMwAtAG6CwAFygBrOBiSgUqfaf2ToGbAiFQAZi/RxbiOUOgFOkgDEACIAHMEAohEqei5o+gDK+gCeOEg+YCbJkrKKqho6ALRyYAC+NOD21laSuHqu7p5IAOy+2FAByIERAMIRSkoALLHxSakI3kJZOfLKalrahQCMZRWW1V5gBIT1bh5eoW3+QaGhPXLBJUJxVmNpk5lw2ci5cwWLAEyrlfE2ksS7RpeJZLI4dIJhSLRAYjW4pe4ZaYvWb5BaFdTfdZ/ZCkQH7JBLD5gzpgbp9AbDa6jeETRFPGZ5eZFYblH5WbFgSjUKD0JisDg8PFNRBLdTEoIMdQKCJnWGJGnpKb05GM96FACsmKqHNxzj2wo+hxQxy6vX6Qzld1pSue0hRTMWADYtb8asgBHqgUgPipxV1IVEVDCqXDxorHrbXqiis0Xey3WAADqoIVedR0yP2tWhMoAXSEWAAlqg4AA5FgAWwARnBOOgkC52FgPEIqzsuh84OpBoM5G5Yu3STBQvA4Cp+0J9MI4BWy+xZ5JUB0YHoOMxJOxmGwuIV9PXWSh4HY0JgcPgiGQubRGFuBXRAh9eB6RGIJMgAGpLBgQbRLACKAAaACyOaTsYpj1ogFjagm9ink4YANPiDx+OC/rhIGloKg8SJgJ+36/oBIHFHGGy1KmLR+qSZoUlhYY4cqeFfj+/7AaEyykRy2wUYgRqoSSgSnOclx0QiNqSPhLFEexXwHjBmwAp6yEglRIQYdCSiidaEYScxhFseinEJrqiH6sCRLGmh1HkhaIbyvRGa6QRrHESyazyZIV48je/JcPej48aKqmStKsp2Va4a4ZJ+nEZqcmupsJlIcK6igpZAk0bZYA3PZYk6R+ekuexzrxfGmzPslaYWfxELqUGmnhdhjkFc50mFLGpVkcgyY8eoYr5UxrUGTmpT5lsxZlpWNZ1g2TYtmAbZBJ23a9hO2WDoEw6juOLh6FOM5zguyBLpwK4Fpug4XdunC7vuuZAA=" :step-ranges='[[],[]]' /> + <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXJKA7AzlANnAdFqAcwAoByACTiwIBoACAQVUIFcsBDAJwEJSBKMDTAALdumFIwABwBeABgBCAMQCcCgMwAtAG6CwAFygBrOBiSgUqfaf2ToGbAiFQAZi/RxbiOUOgFOkgDEACIAHMEAohEqei5o+gDK+gCeOEg+YCbJkrKKqho6ALRyYAC+NOD21laSuHqu7p5IAOy+2FAByIERAMIRSkoALLHxSakI3kJZOfLKalrahQCMZRWW1V5gBIT1bh5eoW3+QaGhPXLBJUJxVmNpk5lw2ci5cwWLAEyrlfE2ksS7RpeJZLI4dIJhSLRAYjW4pe4ZaYvWb5BaFdTfdZ/ZCkQH7JBLD5gzpgbp9AbDa6jeETRFPGZ5eZFYblH5WbFgSjUKD0JisDg8PFNRBLdTEoIMdQKCJnWGJGnpKb05GM96FACsmKqHNxzj2wo+hxQxy6vX6Qzld1pSue0hRTMWADYtb8asgBHqgUgPipxV1IVEVDCqXDxorHrbXqiis0Xey3WAADqoIVedR0yP2tWhMoAXSEWAAlqg4AA5FgAWwARnBOOgkC52FgPKyUPA7GhMDh8EQyFzaIxmGwuHRAh9eB6RGIJMgAGpLBgQbRLACKAA0ALI5oSGExmRAWbUJ+xdpxgBr4h5+cH+8KBy0Kh5IsDzxfL9db4pxja1VMtP2kmaFIPmGT7Ki+C5Lqum6hMs34ctsf6IEa14koEpznJcIEIjakivlBH6wV8rZHpsAKepeIIASEd7Qko2HWhGeGQe+MHovBCa6ue+rAkSxo3oB5IWiG8qgRmzFvtBn4smspGSP2PKDvyI5jtwSGitRkrSrKIlWuGz74axn6aiRrqbFxF7CuooL8WhQHCWANyiThTFzixUmwc6pnxpsk6WWmfGoRCtFBvRumPuJbmSYRhSxt5P7IMmSHqGKrkQdFbE5qU+ZbMWZaVjWdYNk2La5kAA==" :step-ranges='[[],[]]' /> Some text after " ❯ test/transform-magic-move.test.ts:74:6

Check failure on line 74 in test/transform-magic-move.test.ts

View workflow job for this annotation

GitHub Actions / test (lts/*, macos-latest)

test/transform-magic-move.test.ts > hyphenated code language

Error: Snapshot `hyphenated code language 1` mismatched - Expected + Received " Some text before - <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXJKA7AzlANnAdFqAcwAoByACTiwIBoACAQVUIFcsBDAJwEJSBKMDTAALdumFIwABwBeABgBCAMQCcCgMwAtAG6CwAFygBrOBiSgUqfaf2ToGbAiFQAZi/RxbiOUOgFOkgDEACIAHMEAohEqei5o+gDK+gCeOEg+YCbJkrKKqho6ALRyYAC+NOD21laSuHqu7p5IAOy+2FAByIERAMIRSkoALLHxSakI3kJZOfLKalrahQCMZRWW1V5gBIT1bh5eoW3+QaGhPXLBJUJxVmNpk5lw2ci5cwWLAEyrlfE2ksS7RpeJZLI4dIJhSLRAYjW4pe4ZaYvWb5BaFdTfdZ/ZCkQH7JBLD5gzpgbp9AbDa6jeETRFPGZ5eZFYblH5WbFgSjUKD0JisDg8PFNRBLdTEoIMdQKCJnWGJGnpKb05GM96FACsmKqHNxzj2wo+hxQxy6vX6Qzld1pSue0hRTMWADYtb8asgBHqgUgPipxV1IVEVDCqXDxorHrbXqiis0Xey3WAADqoIVedR0yP2tWhMoAXSEWAAlqg4AA5FgAWwARnBOOgkC52FgPEIqzsuh84OpBoM5G5Yu3STBQvA4Cp+0J9MI4BWy+xZ5JUB0YHoOMxJOxmGwuIV9PXWSh4HY0JgcPgiGQubRGFuBXRAh9eB6RGIJMgAGpLBgQbRLACKAAaACyOaTsYpj1ogFjagm9ink4YANPiDx+OC/rhIGloKg8SJgJ+36/oBIHFHGGy1KmLR+qSZoUlhYY4cqeFfj+/7AaEyykRy2wUYgRqoSSgSnOclx0QiNqSPhLFEexXwHjBmwAp6yEglRIQYdCSiidaEYScxhFseinEJrqiH6sCRLGmh1HkhaIbyvRGa6QRrHESyazyZIV48je/JcPej48aKqmStKsp2Va4a4ZJ+nEZqcmupsJlIcK6igpZAk0bZYA3PZYk6R+ekuexzrxfGmzPslaYWfxELqUGmnhdhjkFc50mFLGpVkcgyY8eoYr5UxrUGTmpT5lsxZlpWNZ1g2TYtmAbZBJ23a9hO2WDoEw6juOLh6FOM5zguyBLpwK4Fpug4XdunC7vuuZAA=" :step-ranges='[[],[]]' /> + <ShikiMagicMove v-bind="{}" steps-lz="NobwRAxg9gJgpmAXJKA7AzlANnAdFqAcwAoByACTiwIBoACAQVUIFcsBDAJwEJSBKMDTAALdumFIwABwBeABgBCAMQCcCgMwAtAG6CwAFygBrOBiSgUqfaf2ToGbAiFQAZi/RxbiOUOgFOkgDEACIAHMEAohEqei5o+gDK+gCeOEg+YCbJkrKKqho6ALRyYAC+NOD21laSuHqu7p5IAOy+2FAByIERAMIRSkoALLHxSakI3kJZOfLKalrahQCMZRWW1V5gBIT1bh5eoW3+QaGhPXLBJUJxVmNpk5lw2ci5cwWLAEyrlfE2ksS7RpeJZLI4dIJhSLRAYjW4pe4ZaYvWb5BaFdTfdZ/ZCkQH7JBLD5gzpgbp9AbDa6jeETRFPGZ5eZFYblH5WbFgSjUKD0JisDg8PFNRBLdTEoIMdQKCJnWGJGnpKb05GM96FACsmKqHNxzj2wo+hxQxy6vX6Qzld1pSue0hRTMWADYtb8asgBHqgUgPipxV1IVEVDCqXDxorHrbXqiis0Xey3WAADqoIVedR0yP2tWhMoAXSEWAAlqg4AA5FgAWwARnBOOgkC52FgPKyUPA7GhMDh8EQyFzaIxmGwuHRAh9eB6RGIJMgAGpLBgQbRLACKAA0ALI5oSGExmRAWbUJ+xdpxgBr4h5+cH+8KBy0Kh5IsDzxfL9db4pxja1VMtP2kmaFIPmGT7Ki+C5Lqum6hMs34ctsf6IEa14koEpznJcIEIjakivlBH6wV8rZHpsAKepeIIASEd7Qko2HWhGeGQe+MHovBCa6ue+rAkSxo3oB5IWiG8qgRmzFvtBn4smspGSP2PKDvyI5jtwSGitRkrSrKIlWuGz74axn6aiRrqbFxF7CuooL8WhQHCWANyiThTFzixUmwc6pnxpsk6WWmfGoRCtFBvRumPuJbmSYRhSxt5P7IMmSHqGKrkQdFbE5qU+ZbMWZaVjWdYNk2La5kAA==" :step-ranges='[[],[]]' /> Some text after " ❯ test/transform-magic-move.test.ts:74:6
"

Some text before
Expand Down
Loading