From 4bdb3cc9c8bcc99bd3c31069e291b679ba152fbb Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 26 Jul 2023 12:59:01 +0700 Subject: [PATCH] refactor(developer): projectReader to depend on projectLoader Fixes #9349. --- developer/src/kmc/src/commands/build.ts | 3 +- developer/src/kmc/src/util/projectLoader.ts | 6 +- developer/src/kmc/src/util/projectReader.ts | 64 ++++++--------------- 3 files changed, 23 insertions(+), 50 deletions(-) diff --git a/developer/src/kmc/src/commands/build.ts b/developer/src/kmc/src/commands/build.ts index 1617266907..6d7605a68a 100644 --- a/developer/src/kmc/src/commands/build.ts +++ b/developer/src/kmc/src/commands/build.ts @@ -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 diff --git a/developer/src/kmc/src/util/projectLoader.ts b/developer/src/kmc/src/util/projectLoader.ts index 4a2ce75785..bf291f9dce 100644 --- a/developer/src/kmc/src/util/projectLoader.ts +++ b/developer/src/kmc/src/util/projectLoader.ts @@ -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? diff --git a/developer/src/kmc/src/util/projectReader.ts b/developer/src/kmc/src/util/projectReader.ts index da5eecddd1..1f3ffdfcd3 100644 --- a/developer/src/kmc/src/util/projectReader.ts +++ b/developer/src/kmc/src/util/projectReader.ts @@ -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): Promise { - 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): Promise { + 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): Promise { - 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): Promise { - 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): Promise { 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;