Use baseDir as another parameter to readDir etc. to simplify compatibility between asc running under node and in the browser, see #354

This commit is contained in:
dcodeIO 2018-12-03 19:29:49 +01:00
parent aedc821c09
commit ced01216f8
6 changed files with 38 additions and 45 deletions

6
cli/asc.d.ts vendored
View File

@ -55,11 +55,11 @@ interface CompilerOptions {
/** Standard error stream to use. */ /** Standard error stream to use. */
stderr?: OutputStream; stderr?: OutputStream;
/** Reads a file from disk (or memory). */ /** Reads a file from disk (or memory). */
readFile?: (name: string) => string | null; readFile?: (filename: string, baseDir: string) => string | null;
/** Writes a file to disk (or memory). */ /** Writes a file to disk (or memory). */
writeFile?: (name: string, contents: Uint8Array) => void; writeFile?: (filename: string, contents: Uint8Array, baseDir: string) => void;
/** Lists all files within a directory. */ /** Lists all files within a directory. */
listFiles?: (dir: string) => string[] | null; listFiles?: (dirname: string, baseDir: string) => string[] | null;
} }
/** Convenience function that parses and compiles source strings directly. */ /** Convenience function that parses and compiles source strings directly. */

View File

@ -96,9 +96,7 @@ exports.compileString = (sources, options) => {
if (typeof sources === "string") sources = { "input.ts": sources }; if (typeof sources === "string") sources = { "input.ts": sources };
const output = Object.create({ const output = Object.create({
stdout: createMemoryStream(), stdout: createMemoryStream(),
stderr: createMemoryStream(), stderr: createMemoryStream()
binary: null,
text: null
}); });
var argv = [ var argv = [
"--binaryFile", "binary", "--binaryFile", "binary",
@ -270,7 +268,7 @@ exports.main = function main(argv, options, callback) {
} }
for (let j = 0, l = libFiles.length; j < l; ++j) { for (let j = 0, l = libFiles.length; j < l; ++j) {
let libPath = libFiles[j]; let libPath = libFiles[j];
let libText = readFile(path.join(libDir, libPath)); let libText = readFile(libPath, libDir);
if (libText === null) return callback(Error("Library file '" + libPath + "' not found.")); if (libText === null) return callback(Error("Library file '" + libPath + "' not found."));
stats.parseCount++; stats.parseCount++;
stats.parseTime += measure(() => { stats.parseTime += measure(() => {
@ -302,13 +300,12 @@ exports.main = function main(argv, options, callback) {
sourcePath = exports.libraryPrefix + indexName + ".ts"; sourcePath = exports.libraryPrefix + indexName + ".ts";
} else { } else {
for (let i = 0, k = customLibDirs.length; i < k; ++i) { for (let i = 0, k = customLibDirs.length; i < k; ++i) {
const dir = customLibDirs[i]; sourceText = readFile(plainName + ".ts", customLibDirs[i]);
sourceText = readFile(path.join(dir, plainName + ".ts"));
if (sourceText !== null) { if (sourceText !== null) {
sourcePath = exports.libraryPrefix + plainName + ".ts"; sourcePath = exports.libraryPrefix + plainName + ".ts";
break; break;
} else { } else {
sourceText = readFile(path.join(dir, indexName + ".ts")); sourceText = readFile(indexName + ".ts", customLibDirs[i]);
if (sourceText !== null) { if (sourceText !== null) {
sourcePath = exports.libraryPrefix + indexName + ".ts"; sourcePath = exports.libraryPrefix + indexName + ".ts";
break; break;
@ -321,11 +318,11 @@ exports.main = function main(argv, options, callback) {
} else { } else {
const plainName = sourcePath; const plainName = sourcePath;
const indexName = sourcePath + "/index"; const indexName = sourcePath + "/index";
sourceText = readFile(path.join(baseDir, plainName + ".ts")); sourceText = readFile(plainName + ".ts", baseDir);
if (sourceText !== null) { if (sourceText !== null) {
sourcePath = plainName + ".ts"; sourcePath = plainName + ".ts";
} else { } else {
sourceText = readFile(path.join(baseDir, indexName + ".ts")); sourceText = readFile(indexName + ".ts", baseDir);
if (sourceText !== null) { if (sourceText !== null) {
sourcePath = indexName + ".ts"; sourcePath = indexName + ".ts";
} else if (!plainName.startsWith(".")) { } else if (!plainName.startsWith(".")) {
@ -338,12 +335,12 @@ exports.main = function main(argv, options, callback) {
} else { } else {
for (let i = 0, k = customLibDirs.length; i < k; ++i) { for (let i = 0, k = customLibDirs.length; i < k; ++i) {
const dir = customLibDirs[i]; const dir = customLibDirs[i];
sourceText = readFile(path.join(dir, plainName + ".ts")); sourceText = readFile(plainName + ".ts", customLibDirs[i]);
if (sourceText !== null) { if (sourceText !== null) {
sourcePath = exports.libraryPrefix + plainName + ".ts"; sourcePath = exports.libraryPrefix + plainName + ".ts";
break; break;
} else { } else {
sourceText = readFile(path.join(dir, indexName + ".ts")); sourceText = readFile(indexName + ".ts", customLibDirs[i]);
if (sourceText !== null) { if (sourceText !== null) {
sourcePath = exports.libraryPrefix + indexName + ".ts"; sourcePath = exports.libraryPrefix + indexName + ".ts";
break; break;
@ -374,9 +371,9 @@ exports.main = function main(argv, options, callback) {
let sourcePath = String(filename).replace(/\\/g, "/").replace(/(\.ts|\/)$/, ""); let sourcePath = String(filename).replace(/\\/g, "/").replace(/(\.ts|\/)$/, "");
// Try entryPath.ts, then entryPath/index.ts // Try entryPath.ts, then entryPath/index.ts
let sourceText = readFile(path.join(baseDir, sourcePath) + ".ts"); let sourceText = readFile(sourcePath + ".ts", baseDir);
if (sourceText === null) { if (sourceText === null) {
sourceText = readFile(path.join(baseDir, sourcePath, "index.ts")); sourceText = readFile(sourcePath + "/index.ts", baseDir);
if (sourceText === null) { if (sourceText === null) {
return callback(Error("Entry file '" + sourcePath + ".ts' not found.")); return callback(Error("Entry file '" + sourcePath + ".ts' not found."));
} else { } else {
@ -574,7 +571,7 @@ exports.main = function main(argv, options, callback) {
}); });
if (args.binaryFile.length) { if (args.binaryFile.length) {
writeFile(path.join(baseDir, args.binaryFile), wasm.output); writeFile(args.binaryFile, wasm.output, baseDir);
} else { } else {
writeStdout(wasm.output); writeStdout(wasm.output);
hasStdout = true; hasStdout = true;
@ -594,15 +591,12 @@ exports.main = function main(argv, options, callback) {
text = exports.libraryFiles[stdName]; text = exports.libraryFiles[stdName];
} else { } else {
for (let i = 0, k = customLibDirs.length; i < k; ++i) { for (let i = 0, k = customLibDirs.length; i < k; ++i) {
text = readFile(path.join( text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]);
customLibDirs[i],
name.substring(exports.libraryPrefix.length))
);
if (text !== null) break; if (text !== null) break;
} }
} }
} else { } else {
text = readFile(path.join(baseDir, name)); text = readFile(name, baseDir);
} }
if (text === null) { if (text === null) {
return callback(Error("Source file '" + name + "' not found.")); return callback(Error("Source file '" + name + "' not found."));
@ -611,10 +605,9 @@ exports.main = function main(argv, options, callback) {
sourceMap.sourceContents[index] = text; sourceMap.sourceContents[index] = text;
}); });
writeFile(path.join( writeFile(path.join(
baseDir,
path.dirname(args.binaryFile), path.dirname(args.binaryFile),
path.basename(sourceMapURL) path.basename(sourceMapURL)
), JSON.stringify(sourceMap)); ).replace(/^\.\//, ""), JSON.stringify(sourceMap), baseDir);
} else { } else {
stderr.write("Skipped source map (stdout already occupied)" + EOL); stderr.write("Skipped source map (stdout already occupied)" + EOL);
} }
@ -629,7 +622,7 @@ exports.main = function main(argv, options, callback) {
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
asm = module.toAsmjs(); asm = module.toAsmjs();
}); });
writeFile(path.join(baseDir, args.asmjsFile), asm); writeFile(args.asmjsFile, asm, baseDir);
} else if (!hasStdout) { } else if (!hasStdout) {
stats.emitCount++; stats.emitCount++;
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
@ -649,7 +642,7 @@ exports.main = function main(argv, options, callback) {
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
idl = assemblyscript.buildIDL(program); idl = assemblyscript.buildIDL(program);
}); });
writeFile(path.join(baseDir, args.idlFile), idl); writeFile(args.idlFile, idl, baseDir);
} else if (!hasStdout) { } else if (!hasStdout) {
stats.emitCount++; stats.emitCount++;
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
@ -669,7 +662,7 @@ exports.main = function main(argv, options, callback) {
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
tsd = assemblyscript.buildTSD(program); tsd = assemblyscript.buildTSD(program);
}); });
writeFile(path.join(baseDir, args.tsdFile), tsd); writeFile(args.tsdFile, tsd, baseDir);
} else if (!hasStdout) { } else if (!hasStdout) {
stats.emitCount++; stats.emitCount++;
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
@ -689,7 +682,7 @@ exports.main = function main(argv, options, callback) {
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
wat = module.toText(); wat = module.toText();
}); });
writeFile(path.join(baseDir, args.textFile), wat); writeFile(args.textFile, wat, baseDir);
} else if (!hasStdout) { } else if (!hasStdout) {
stats.emitCount++; stats.emitCount++;
stats.emitTime += measure(() => { stats.emitTime += measure(() => {
@ -706,12 +699,12 @@ exports.main = function main(argv, options, callback) {
} }
return callback(null); return callback(null);
function readFileNode(filename) { function readFileNode(filename, baseDir) {
try { try {
let text; let text;
stats.readCount++; stats.readCount++;
stats.readTime += measure(() => { stats.readTime += measure(() => {
text = fs.readFileSync(filename, { encoding: "utf8" }); text = fs.readFileSync(path.join(baseDir, filename), { encoding: "utf8" });
}); });
return text; return text;
} catch (e) { } catch (e) {
@ -719,15 +712,15 @@ exports.main = function main(argv, options, callback) {
} }
} }
function writeFileNode(filename, contents) { function writeFileNode(filename, contents, baseDir) {
try { try {
stats.writeCount++; stats.writeCount++;
stats.writeTime += measure(() => { stats.writeTime += measure(() => {
mkdirp(path.dirname(filename)); mkdirp(path.join(baseDir, path.dirname(filename)));
if (typeof contents === "string") { if (typeof contents === "string") {
fs.writeFileSync(filename, contents, { encoding: "utf8" } ); fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: "utf8" } );
} else { } else {
fs.writeFileSync(filename, contents); fs.writeFileSync(path.join(baseDir, filename), contents);
} }
}); });
return true; return true;
@ -736,11 +729,11 @@ exports.main = function main(argv, options, callback) {
} }
} }
function listFilesNode(dirname) { function listFilesNode(dirname, baseDir) {
var files; var files;
try { try {
stats.readTime += measure(() => { stats.readTime += measure(() => {
files = fs.readdirSync(dirname).filter(file => /^(?!.*\.d\.ts$).*\.ts$/.test(file)); files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\.d\.ts$).*\.ts$/.test(file));
}); });
return files; return files;
} catch (e) { } catch (e) {

2
dist/asc.js vendored

File diff suppressed because one or more lines are too long

2
dist/asc.js.map vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -47,16 +47,16 @@ asc.main([
], { ], {
stdout: stdout, stdout: stdout,
stderr: stderr, stderr: stderr,
readFile: (name) => { readFile: (name, baseDir) => {
console.log("readFile: " + name); console.log("readFile: " + name + ", baseDir=" + baseDir);
if (files.hasOwnProperty(name)) return files[name]; if (files.hasOwnProperty(name)) return files[name];
return null; return null;
}, },
writeFile: (name, data) => { writeFile: (name, data, baseDir) => {
console.log("writeFile: " + name); console.log("writeFile: " + name + ", baseDir=" + baseDir);
}, },
listFiles: (dirname) => { listFiles: (dirname, baseDir) => {
console.log("listFiles: " + dirname); console.log("listFiles: " + dirname + ", baseDir=" + baseDir);
return []; return [];
} }
}, err => { }, err => {