import assert from 'node:assert/strict' import { execFileSync } from 'node:child_process' // eslint-disable-next-line test/no-import-node-test -- Verify editor failure and race contracts with controlled asynchronous boundaries. import test from 'node:test' import vm from 'node:vm' import ts from 'typescript' import { readEditorFile } from '../packages/artplayer-vitepress/browser/editor-files.ts' import { readPreference, writePreference, } from '../packages/artplayer-vitepress/browser/editor-preferences.ts' import { createEditorSession } from '../packages/artplayer-vitepress/browser/editor-session.ts' const tick = () => new Promise(resolve => setImmediate(resolve)) function deferred() { let resolve const promise = new Promise((done) => { resolve = done }) return { promise, resolve } } test('old editor executes TS syntax directly and has no file error settlement', async () => { const old = execFileSync( 'git', [ 'show', 'a468cb2c39e626f7b4f737d0ca60334150deae2b:docs/assets/js/common.js', ], { encoding: 'utf8' }, ) const ast = ts.createSourceFile('old.js', old, ts.ScriptTarget.Latest, true) function find(name) { let code function visit(node) { if (ts.isFunctionDeclaration(node) && node.name.text === name) code = node.getText(ast) ts.forEachChild(node, visit) } visit(ast) return code } assert.throws( () => vm.runInNewContext(`${find('runCode')};runCode()`, { Event, window: { dispatchEvent() {} }, Artplayer: { instances: [] }, editor: { getValue: () => 'const count: number = 7;' }, }), /Missing initializer|Unexpected token/, ) let reader class Reader { constructor() { reader = this } readAsText() {} } const pending = vm.runInNewContext( `${find('readFile')};readFile({name:'broken.js'})`, { FileReader: Reader }, ) let settled = false pending.then( () => { settled = true }, () => { settled = true }, ) assert.equal(reader.onerror, undefined) await tick() assert.equal(settled, false) const html = execFileSync('git', ['show', 'a468cb2c39e626f7b4f737d0ca60334150deae2b:docs/index.html'], { encoding: 'utf8' }) const boot = html.match(/