mirror of https://github.com/msgbyte/tailchat
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.4 KiB
TypeScript
99 lines
2.4 KiB
TypeScript
import ts from 'typescript';
|
|
import fs from 'fs-extra';
|
|
import ora from 'ora';
|
|
|
|
async function buildTailchatServer() {
|
|
const spinner = ora({
|
|
prefixText: 'Tailchat Server',
|
|
});
|
|
|
|
try {
|
|
spinner.start('开始编译');
|
|
await fs.remove('./dist');
|
|
spinner.info('正在编译TS代码');
|
|
await compileTsCode();
|
|
spinner.info('正在移动静态资源文件');
|
|
await Promise.all([
|
|
fs.copy('./public', './dist/public', { recursive: true }),
|
|
fs.copy('./locales', './dist/locales', { recursive: true }),
|
|
fs.copy('./views', './dist/views', { recursive: true }),
|
|
fs.copy(
|
|
'./services/openapi/oidc/views',
|
|
'./dist/services/openapi/oidc/views',
|
|
{ recursive: true }
|
|
),
|
|
]);
|
|
|
|
spinner.succeed('编译完成');
|
|
} catch (e) {
|
|
console.error(e);
|
|
spinner.fail('编译失败');
|
|
}
|
|
}
|
|
|
|
buildTailchatServer();
|
|
|
|
/**
|
|
* 编译Ts代码
|
|
*
|
|
* tsc的api实现
|
|
*/
|
|
function compileTsCode(): Promise<void> {
|
|
function compile(
|
|
fileNames: string[],
|
|
options: ts.CompilerOptions
|
|
): Promise<void> {
|
|
return new Promise<void>((resolve, reject) => {
|
|
const program = ts.createProgram(fileNames, options);
|
|
const emitResult = program.emit();
|
|
|
|
const allDiagnostics = ts
|
|
.getPreEmitDiagnostics(program)
|
|
.concat(emitResult.diagnostics);
|
|
|
|
allDiagnostics.forEach((diagnostic) => {
|
|
if (diagnostic.file) {
|
|
const { line, character } = ts.getLineAndCharacterOfPosition(
|
|
diagnostic.file,
|
|
diagnostic.start!
|
|
);
|
|
const message = ts.flattenDiagnosticMessageText(
|
|
diagnostic.messageText,
|
|
'\n'
|
|
);
|
|
console.log(
|
|
`${diagnostic.file.fileName} (${line + 1},${
|
|
character + 1
|
|
}): ${message}`
|
|
);
|
|
} else {
|
|
console.log(
|
|
ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n')
|
|
);
|
|
}
|
|
});
|
|
|
|
const exitCode = emitResult.emitSkipped ? 1 : 0;
|
|
if (exitCode === 0) {
|
|
resolve();
|
|
} else {
|
|
reject();
|
|
}
|
|
});
|
|
}
|
|
|
|
const configPath = ts.findConfigFile(
|
|
process.cwd() /*searchPath*/,
|
|
ts.sys.fileExists,
|
|
'tsconfig.json'
|
|
);
|
|
const configFile = ts.readJsonConfigFile(configPath, ts.sys.readFile);
|
|
const { fileNames, options } = ts.parseJsonSourceFileConfigFileContent(
|
|
configFile,
|
|
ts.sys,
|
|
process.cwd()
|
|
);
|
|
|
|
return compile(fileNames, options);
|
|
}
|