99 lines
2.3 KiB
Plaintext
99 lines
2.3 KiB
Plaintext
|
# Kit
|
||
|
|
||
|
## Example: Use FileWatcher
|
||
|
|
||
|
```ts
|
||
|
import * as fs from 'fs';
|
||
|
import * as path from 'path';
|
||
|
import { watch } from 'chokidar';
|
||
|
import * as kit from '@volar/kit';
|
||
|
|
||
|
const tsconfig = getTsconfig();
|
||
|
const project = kit.createProject(tsconfig, [{ extension: 'foo', isMixedContent: true, scriptKind: 7 }]);
|
||
|
const config: kit.Config = {
|
||
|
languages: {
|
||
|
// ...
|
||
|
},
|
||
|
services: {
|
||
|
// ...
|
||
|
},
|
||
|
};
|
||
|
const linter = kit.createLinter(config, project.languageServiceHost);
|
||
|
|
||
|
let req = 0;
|
||
|
|
||
|
update();
|
||
|
|
||
|
createWatcher(path.dirname(tsconfig), ['ts', 'js', 'foo'])
|
||
|
.on('add', (fileName) => {
|
||
|
project.fileCreated(fileName);
|
||
|
update();
|
||
|
})
|
||
|
.on('unlink', (fileName) => {
|
||
|
project.fileDeleted(fileName);
|
||
|
update();
|
||
|
})
|
||
|
.on('change', (fileName) => {
|
||
|
project.fileUpdated(fileName);
|
||
|
update();
|
||
|
});
|
||
|
|
||
|
function createWatcher(rootPath: string, extension: string[]) {
|
||
|
return watch(`${rootPath}/**/*.{${extension.join(',')}}`, {
|
||
|
ignored: (path) => path.includes('node_modules'),
|
||
|
ignoreInitial: true
|
||
|
});
|
||
|
}
|
||
|
|
||
|
async function update() {
|
||
|
|
||
|
const currentReq = ++req;
|
||
|
const isCanceled = () => currentReq !== req;
|
||
|
await new Promise(resolve => setTimeout(resolve, 100));
|
||
|
if (isCanceled()) return;
|
||
|
|
||
|
process.stdout.write('\x1Bc'); // clear console
|
||
|
|
||
|
let hasError = false;
|
||
|
for (const fileName of project.languageServiceHost.getScriptFileNames()) {
|
||
|
const errors = await linter.check(fileName);
|
||
|
if (isCanceled()) return;
|
||
|
if (errors.length) {
|
||
|
linter.logErrors(fileName, errors);
|
||
|
hasError = true;
|
||
|
}
|
||
|
}
|
||
|
if (!hasError) {
|
||
|
console.log('No errors');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getTsconfig() {
|
||
|
|
||
|
let tsconfig = path.resolve(process.cwd(), './tsconfig.json');
|
||
|
|
||
|
const tsconfigIndex = process.argv.indexOf('--tsconfig');
|
||
|
if (tsconfigIndex >= 0) {
|
||
|
tsconfig = path.resolve(process.cwd(), process.argv[tsconfigIndex + 1]);
|
||
|
}
|
||
|
|
||
|
if (!fs.existsSync(tsconfig)) {
|
||
|
throw `tsconfig.json not found: ${tsconfig}`;
|
||
|
}
|
||
|
|
||
|
return tsconfig;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Create Project without tsconfig.json
|
||
|
|
||
|
```ts
|
||
|
const rootPath = process.cwd();
|
||
|
const fileNames = [
|
||
|
path.resolve(rootPath, './src/a.ts'),
|
||
|
path.resolve(rootPath, './src/b.js'),
|
||
|
path.resolve(rootPath, './src/c.foo'),
|
||
|
];
|
||
|
const project = kit.createInferredProject(rootPath, fileNames);
|
||
|
```
|