import ts from 'typescript' const decoratorSyntax = /^\s*@[A-Za-z_$][\w$]*/m /** * Worker arguments that keep process-wide Web Storage from shadowing jsdom storage. * Node lists the positive spelling in `allowedNodeEnvironmentFlags` for this negatable flag. */ export const vitestExecArgv = process.allowedNodeEnvironmentFlags.has('--webstorage') ? ['--no-webstorage'] : [] /** * Transform standard TypeScript decorators before Vite's default parser sees source files. * @returns a pre-transform Vite plugin shared by source-mode test configurations. */ export function standardDecoratorPlugin() { return { name: 'dsh-standard-decorators', enforce: 'pre' as const, transform(code: string, id: string) { const file = id.split('?', 1)[0]! if (!/\.[cm]?tsx?$/.test(file) || !decoratorSyntax.test(code)) return const result = ts.transpileModule(code, { fileName: file, compilerOptions: { target: ts.ScriptTarget.ES2024, module: ts.ModuleKind.ESNext, jsx: file.endsWith('x') ? ts.JsxEmit.ReactJSX : undefined, sourceMap: true, }, }) return { code: result.outputText .replace( /^(\s*)(__esDecorate\()/gmu, '$1/* v8 ignore next -- compiler-synthetic decorator accessors have no source behavior */ $2', ) .replace(/\n?\/\/# sourceMappingURL=.*$/u, '\n'), map: result.sourceMapText, } }, } }