// 提取 ts 中的 import,以及使用到了的全局变量 // TODO 考虑不做,直接使用 vscode 的自动引入,主要就是 vue 的常用方法 import { parse, type SFCScriptBlock } from '@vue/compiler-sfc'; import * as ts from 'typescript'; export function extractGlobals(script: SFCScriptBlock) { const importNames = new Set(); if (!script) { return importNames; } const { statements } = ts.createSourceFile( 'index.d.ts', script.content, ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS, ); // TODO 用户自定义的变量就先不考虑? for (const s of statements) { // import { useI18n } from 'vue-i18n'; // import VueI18n from 'vue-i18n'; if (!ts.isImportDeclaration(s)) { continue; } // { useI18n } or VueI18n const { importClause } = s; if (!importClause) { continue; } const { // VueI18n name, // { useI18n } namedBindings, } = importClause; if (name) { importNames.add(name.text); } if (namedBindings) { if (ts.isNamedImports(namedBindings)) { for (const n of namedBindings.elements) { importNames.add(n.name.text); } } else if (ts.isNamespaceImport(namedBindings)) { // import * as Name importNames.add(namedBindings.name.text); } } } return importNames; }