mirror of
https://github.com/keymanapp/keyman.git
synced 2026-10-07 22:47:29 +00:00
refactor(developer): projectReader to depend on projectLoader
Fixes #9349.
This commit is contained in:
parent
eab760c890
commit
4bdb3cc9c8
3 changed files with 23 additions and 50 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue