refactor(developer): projectReader to depend on projectLoader

Fixes #9349.
This commit is contained in:
Marc Durdin 2023-07-26 12:59:01 +07:00
parent eab760c890
commit 4bdb3cc9c8
3 changed files with 23 additions and 50 deletions

View file

@ -8,6 +8,7 @@ import { InfrastructureMessages } from '../messages/messages.js';
import { CompilerFileCallbacks, CompilerOptions, KeymanFileTypes } from '@keymanapp/common-types';
import { BaseOptions } from '../util/baseOptions.js';
import { expandFileLists } from '../util/fileLists.js';
import { isProject } from 'src/util/projectLoader.js';
function commandOptionsToCompilerOptions(options: any): CompilerOptions {
@ -89,7 +90,7 @@ async function build(filename: string, parentCallbacks: NodeCompilerCallbacks, o
let builder = null;
// If infile is a directory, then we treat that as a project and build it
if(fs.statSync(filename).isDirectory() || KeymanFileTypes.filenameIs(filename, KeymanFileTypes.Source.Project)) {
if(isProject(filename)) {
builder = new BuildProject();
} else {
// Otherwise, if it's one of our known file extensions, we build it

View file

@ -4,7 +4,11 @@ import * as fs from 'fs';
import { CompilerCallbacks, KeymanDeveloperProject, KeymanFileTypes, KPJFileReader } from "@keymanapp/common-types";
import { InfrastructureMessages } from "../messages/messages.js";
// TODO: merge with projectReader.ts, which should be renamed to projectRunner
export const isProject = (filename: string): boolean =>
fs.existsSync(filename) && (
fs.statSync(filename).isDirectory() ||
KeymanFileTypes.sourceTypeFromFilename(filename) == KeymanFileTypes.Source.Project
);
export function loadProject(infile: string, callbacks: CompilerCallbacks) {
// TODO: move path requirement out of here?

View file

@ -1,60 +1,28 @@
import * as fs from 'fs';
import { CompilerCallbacks, KeymanDeveloperProject, KeymanFileTypes, KPJFileReader } from "@keymanapp/common-types";
import { InfrastructureMessages } from '../messages/messages.js';
import { CompilerCallbacks, KeymanFileTypes } from "@keymanapp/common-types";
import { isProject, loadProject } from './projectLoader.js';
async function doRunProject(callbacks: CompilerCallbacks, project: KeymanDeveloperProject, basefile: string, callback: (filename:string)=>Promise<boolean>): Promise<boolean> {
const files = project.files
.map(file => callbacks.resolveFilename(basefile, file.filePath))
.filter(file => !KeymanFileTypes.filenameIs(file, KeymanFileTypes.Source.Project)); // Don't accidentally recurse into projects
for(let file of files) {
if(!await callback(file)) {
async function runProject(callbacks: CompilerCallbacks, filename: string, callback: (filename:string)=>Promise<boolean>): Promise<boolean> {
const project = loadProject(filename, callbacks);
for(const file of project.files) {
if(KeymanFileTypes.filenameIs(file.filename, KeymanFileTypes.Source.Project)) {
// Don't accidentally recurse into projects
continue;
}
if(!await callback(project.resolveInputFilePath(file))) {
return false;
}
}
return true;
}
export async function runProject(callbacks: CompilerCallbacks, filename: string, callback: (filename:string)=>Promise<boolean>): Promise<boolean> {
const reader = new KPJFileReader(callbacks);
const source = reader.read(callbacks.loadFile(filename));
const project = reader.transform(filename, source);
return await doRunProject(callbacks, project, filename, callback);
}
export async function runProjectFolder(callbacks: CompilerCallbacks, folder: string, callback: (filename:string)=>Promise<boolean>): Promise<boolean> {
let kpjFile = callbacks.path.join(folder, callbacks.path.basename(folder) + KeymanFileTypes.Source.Project);
if(callbacks.fs.existsSync(kpjFile)) {
// TODO: callbacks.reportMessage(AnalyzerMessages.Info_ScanningFile({type:'project', name:kpjFile}));
return await runProject(callbacks, kpjFile, callback);
} else {
// TODO: this.callbacks.reportMessage(AnalyzerMessages.Info_ScanningFile({type:'project folder', name:folder}));
const project = new KeymanDeveloperProject(kpjFile, '2.0', callbacks);
project.populateFiles();
return await doRunProject(callbacks, project, folder, callback);
}
}
export async function runOnFiles(callbacks: CompilerCallbacks, filenames: string[], callback: (filename:string)=>Promise<boolean>): Promise<boolean> {
for(let filename of filenames) {
if(!fs.existsSync(filename)) {
callbacks.reportMessage(InfrastructureMessages.Error_FileDoesNotExist({filename}));
continue;
}
// If infile is a directory, then we treat that as a project and build it
if(fs.statSync(filename).isDirectory()) {
if(!await runProjectFolder(callbacks, filename, callback)) {
return false;
}
} else if(KeymanFileTypes.sourceTypeFromFilename(filename) == KeymanFileTypes.Source.Project) {
if(!await runProject(callbacks, filename, callback)) {
return false;
}
} else {
if(!await callback(filename)) {
return false;
}
const result = isProject(filename) ?
await runProject(callbacks, filename, callback) :
await callback(filename);
if(!result) {
return false;
}
}
return true;