# @vrx-volar/tsc

> 该包处于实验阶段，不建议直接使用在生产环境

为解决 使用 [vue-tsc](https://github.com/vuejs/language-tools/tree/master/packages/tsc) 内部 API 生成 `.d.ts` 文件时,

由于[vue-tsc](https://github.com/vuejs/language-tools/tree/master/packages/tsc)内部 API 变更过于频繁,

无法基于 [semver](https://semver.org/lang/zh-CN/) 规范宽松匹配 [vue-tsc](https://github.com/vuejs/language-tools/tree/master/packages/tsc) 版本的问题。


> 基于 [vue-tsc](https://github.com/vuejs/language-tools/tree/master/packages/tsc) >=2.0.19 封装


>
> 如果部分 volar 插件无法正确的加载，可能是 该 volar 插件未适配 [vue/language-tools](https://github.com/vuejs/language-tools) 2.x.x 的更新

## 安装

```shell
npm i @vrx-volar/tsc
yarn add @vrx-volar/tsc
pnpm add @vrx-volar/tsc
bun add @vrx-volar/tsc
```

## proxyCreateProgram

将 `ts.Program` 处理拥有能处理 vue 文件的能力

> 为了使 [vue-tsc#run](https://github.com/vuejs/language-tools/blob/master/packages/tsc/index.ts) 方法可以单独用来创建 `ts.Program`

```ts
import { proxyCreateProgram } from '@vrx-volar/tsc'
import * as vue from '@vue/language-core'
import ts from 'typescript'

const host = ts.createCompilerHost({})

const createProgram = proxyCreateProgram({})

const program = createProgram({
  rootNames,
  options: {
    target: ts.ScriptTarget.ESNext,
    moduleResolution: ts.ModuleResolutionKind.Bundler,
    noImplicitAny: false,
    allowJs: true,
    declaration: true,
    emitDeclarationOnly: true,
    strict: true,
    isolatedModules: true,
    esModuleInterop: true,
    skipLibCheck: true,
    jsx: ts.JsxEmit.Preserve,
  },
  host,
  configFileParsingDiagnostics,
})
```

## createProgram

创建 可解析 vue 文件的 `ts.Program`

```ts
import { createProgram } from '@vrx-volar/tsc'
import { globby } from 'globby'

const rootNames = await globby(
  ['**/*.vue', '**/*.?({m,c}){ts,js}?(x)'],
  { 
    absolute: true,
    onlyFiles: true,
  },
)
const program = await createProgram(rootNames)
```

## typeCheck

检查 `ts.Program` 内项目文件语法合理性

```ts
import { createProgram } from '@vrx-volar/tsc'

const program = await createProgram(rootNames)

typeCheck(program)
```

## triggerProgramResult

获取`ts.Program` 处理后的项目文件

```ts
import { writeFile } from 'node:fs/promises'
import { createProgram } from '@vrx-volar/tsc'

const program = await createProgram(rootNames)

const { files } = triggerProgramResult(program)

await Promise.all(
  files.map((item) => {
    return writeFile(item.file, item.content)
  })
)
```
