@typespec/compiler
Version:
TypeSpec compiler and standard library
77 lines • 3.01 kB
JavaScript
import assert from "assert";
import { glob } from "fs/promises";
import { logDiagnostics, logVerboseTestOutput } from "../core/diagnostics.js";
import { createLogger } from "../core/logger/logger.js";
import { compile as compileProgram } from "../core/program.js";
import { expectDiagnosticEmpty } from "./expect.js";
import { createTestFileSystem } from "./fs.js";
import { addTestLib, StandardTestLibrary } from "./test-compiler-host.js";
import { createTestWrapper, resolveVirtualPath } from "./test-utils.js";
/* eslint-disable @typescript-eslint/no-deprecated -- implementing deprecated APIs for backward compatibility */
/** @deprecated Use {@link createTester} */
export async function createTestHost(config = {}) {
const testHost = await createTestHostInternal();
await testHost.addTypeSpecLibrary(StandardTestLibrary);
if (config.libraries) {
for (const library of config.libraries) {
await testHost.addTypeSpecLibrary(library);
}
}
return testHost;
}
/** @deprecated Use {@link createTester} */
export async function createTestRunner(host) {
const testHost = host ?? (await createTestHost());
return createTestWrapper(testHost);
}
async function createTestHostInternal() {
let program;
const libraries = [];
const fileSystem = await createTestFileSystem();
const testTypes = addTestLib(fileSystem);
return {
...fileSystem,
addTypeSpecLibrary: async (lib) => {
if (lib !== StandardTestLibrary) {
libraries.push(lib);
}
await fileSystem.addTypeSpecLibrary(lib);
},
compile,
diagnose,
compileAndDiagnose,
testTypes,
libraries,
get program() {
assert(program, "Program cannot be accessed without calling compile, diagnose, or compileAndDiagnose.");
return program;
},
};
async function compile(main, options = {}) {
const [testTypes, diagnostics] = await compileAndDiagnose(main, options);
expectDiagnosticEmpty(diagnostics);
return testTypes;
}
async function diagnose(main, options = {}) {
const [, diagnostics] = await compileAndDiagnose(main, options);
return diagnostics;
}
async function compileAndDiagnose(mainFile, options = {}) {
const p = await compileProgram(fileSystem.compilerHost, resolveVirtualPath(mainFile), options);
program = p;
logVerboseTestOutput((log) => logDiagnostics(p.diagnostics, createLogger({ sink: fileSystem.compilerHost.logSink })));
return [testTypes, p.diagnostics];
}
}
/* eslint-enable @typescript-eslint/no-deprecated */
export async function findFilesFromPattern(directory, pattern) {
const results = [];
for await (const file of glob(pattern, {
cwd: directory,
exclude: ["**/*.{test,spec}.{ts,tsx,js,jsx}"],
})) {
results.push(file);
}
return results;
}
//# sourceMappingURL=test-host.js.map