diff --git a/src/project.ts b/src/project.ts index b8ae7fa4..5508a11b 100644 --- a/src/project.ts +++ b/src/project.ts @@ -6,7 +6,6 @@ import { Platform } from "./baseplatform"; type BuildResultCallback = (result:WorkerResult) => void; type BuildStatusCallback = (busy:boolean) => void; -type LoadFilesCallback = (err:string, result?:Dependency[]) => void; type IterateFilesCallback = (path:string, data:FileData) => void; type GetRemoteCallback = (path:string, callback:(data:FileData) => void, datatype:'text'|'arraybuffer') => any; @@ -122,18 +121,18 @@ export class CodeProject { return files; } - loadFileDependencies(text:string, callback:LoadFilesCallback) { + loadFileDependencies(text:string) : Promise { let includes = this.parseIncludeDependencies(text); let linkfiles = this.parseLinkDependencies(text); let allfiles = includes.concat(linkfiles); - this.loadFiles(allfiles, (err:string, result?:Dependency[]) => { + return this.loadFiles(allfiles).then((result) => { // set 'link' property on files that are link dependencies (must match filename) if (result) { for (let dep of result) { dep.link = linkfiles.indexOf(dep.path) >= 0; } } - callback(err, result); + return result; }); } @@ -175,7 +174,8 @@ export class CodeProject { } // TODO: get local file as well as presets? - loadFiles(paths:string[], callback:LoadFilesCallback) { + loadFiles(paths:string[]) : Promise { + return new Promise( (yes,no) => { var result : Dependency[] = []; var addResult = (path, data) => { result.push({ @@ -189,7 +189,7 @@ export class CodeProject { var path = paths.shift(); if (!path) { // finished loading all files; return result - callback(null, result); + yes(result); } else { // look in cache if (path in this.filedata) { // found in cache? @@ -201,7 +201,7 @@ export class CodeProject { // look in store this.store.getItem(path, (err, value) => { if (err) { // err fetching from store - callback(err, result); + no(err); } else if (value) { // found in store? this.filedata[path] = value; // do not update store, just cache addResult(path, value); @@ -231,6 +231,7 @@ export class CodeProject { } } loadNext(); // load first file + }); } getFile(path:string):FileData { @@ -262,10 +263,7 @@ export class CodeProject { // otherwise, make it a string var text = typeof maindata === "string" ? maindata : ''; // TODO: load dependencies of non-main files - this.loadFileDependencies(text, (err, depends) => { - if (err) { - console.log(err); // TODO? - } + return this.loadFileDependencies(text).then( (depends) => { if (!depends) depends = []; var workermsg = this.buildWorkerMessage(depends); this.worker.postMessage(workermsg); diff --git a/src/ui.ts b/src/ui.ts index dd70cdc4..c4a4e9f9 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -260,10 +260,8 @@ function loadProject(preset_id:string) { current_project.mainPath = preset_id; setLastPreset(preset_id); // load files from storage or web URLs - current_project.loadFiles([preset_id], function(err, result) { - if (err) { - alertError(err); - } else if (result && result.length) { + current_project.loadFiles([preset_id]).then((result) => { + if (result && result.length) { // file found; continue loadMainWindow(preset_id); } else { @@ -1376,7 +1374,7 @@ function addFileToProject(type, ext, linefn) { if (!checkEnteredFilename(filename)) return; var path = filename; var newline = "\n" + linefn(filename) + "\n"; - current_project.loadFiles([path], (err, result) => { + current_project.loadFiles([path]).then((result) => { if (result && result.length) { alertError(filename + " already exists; including anyway"); } else { diff --git a/test/cli/teststore.js b/test/cli/teststore.js index 62977cbb..07b223eb 100644 --- a/test/cli/teststore.js +++ b/test/cli/teststore.js @@ -45,8 +45,7 @@ describe('Store', function() { remote.push(path); success(); }; - project.loadFiles(['local/test','test'], function(err, result) { - assert.equal(null, err); + project.loadFiles(['local/test','test']).then((result) => { assert.deepEqual(["presets/_TEST/test"], remote); assert.deepEqual([ { path: 'local/test', filename: 'local/test', data: 'a', link:true } ], result); done(); @@ -81,13 +80,15 @@ describe('Store', function() { project.callbackBuildStatus = function(b) { msgs.push(b) }; project.updateFile('test.a', ' lda #0'); project.setMainFile('test.a'); - project.updateFile('test.a', ' lda #1'); // don't send twice (yet) - assert.deepEqual(msgs, expectmsgs); - store.getItem('test.a', function(err, result) { - assert.equal(null, err); - assert.equal(' lda #1', result); - done(); - }); + setTimeout(() => { + project.updateFile('test.a', ' lda #1'); // don't send twice (yet) + assert.deepEqual(msgs, expectmsgs); + store.getItem('test.a', function(err, result) { + assert.equal(null, err); + assert.equal(' lda #1', result); + done(); + }); + }, 1); }); });