From cdb4dd6d9c362ec46dc967845cdc61d3f0cddac1 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 10 Oct 2019 16:55:30 +0200 Subject: [PATCH 01/11] Use transform classes --- cli/asc.js | 30 +++++++++++++++++++--------- cli/transform.d.ts | 19 +++++++++++++++--- cli/transform.js | 5 +++++ examples/transform/assembly/index.ts | 1 + examples/transform/mytransform.js | 12 +++++++++++ examples/transform/package.json | 5 +++++ 6 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 cli/transform.js create mode 100644 examples/transform/assembly/index.ts create mode 100644 examples/transform/mytransform.js create mode 100644 examples/transform/package.json diff --git a/cli/asc.js b/cli/asc.js index 4ee989d100..3af3137e92 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -212,15 +212,27 @@ exports.main = function main(argv, options, callback) { // Set up transforms const transforms = []; if (args.transform) { - args.transform.forEach(transform => - transforms.push( - require( - path.isAbsolute(transform = transform.trim()) - ? transform - : path.join(process.cwd(), transform) - ) - ) - ); + class Transform { + baseDir = baseDir; + writeFile = writeFile; + readFile = readFile; + listFiles = listFiles; + } + args.transform.forEach(filename => { + const ctor = require( + path.isAbsolute(filename = filename.trim()) + ? filename + : path.join(process.cwd(), filename) + ); + let impl; + if (typeof ctor === "function") { + Object.setPrototypeOf(ctor, Transform); + impl = new ctor(); + } else { + impl = ctor; // legacy module + } + transforms.push(impl); + }); } function applyTransform(name, ...args) { transforms.forEach(transform => { diff --git a/cli/transform.d.ts b/cli/transform.d.ts index 9bc060b6df..82085bf878 100644 --- a/cli/transform.d.ts +++ b/cli/transform.d.ts @@ -3,9 +3,22 @@ * @module cli/transform *//***/ -import { Parser } from "../src/parser"; +import { Parser } from ".."; + +export abstract class Transform { + + /** Base directory. */ + readonly baseDir: string; + + /** Writes a file to disk. */ + writeFile(filename: string, contents: string | Uint8Array, baseDir: string): boolean; + + /** Reads a file from disk. */ + readFile(filename: string, baseDir: string): string | null; + + /** Lists all files in a directory. */ + listFiles(dirname: string, baseDir: string): string[] | null; -export interface Transform { /** Called when parsing is complete, before a program is instantiated from the AST. */ - afterParse(parser: Parser): void; + afterParse?(parser: Parser): void; } diff --git a/cli/transform.js b/cli/transform.js new file mode 100644 index 0000000000..dabbc389a1 --- /dev/null +++ b/cli/transform.js @@ -0,0 +1,5 @@ +class Transform { + // becomes replaced with the actual base by asc +} + +exports.Transform = Transform; diff --git a/examples/transform/assembly/index.ts b/examples/transform/assembly/index.ts new file mode 100644 index 0000000000..8b1a393741 --- /dev/null +++ b/examples/transform/assembly/index.ts @@ -0,0 +1 @@ +// empty diff --git a/examples/transform/mytransform.js b/examples/transform/mytransform.js new file mode 100644 index 0000000000..958711f277 --- /dev/null +++ b/examples/transform/mytransform.js @@ -0,0 +1,12 @@ +const { Transform } = require("../../cli/transform"); // "assemblyscript/cli/transform" +const { SourceKind } = require("../.."); // "assemblyscript" + +class MyTransform extends Transform { + afterParse(parser) { + console.error("afterParse called, baseDir = " + this.baseDir); + var sources = parser.program.sources; + sources.forEach(source => console.error(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); + } +} + +module.exports = MyTransform; diff --git a/examples/transform/package.json b/examples/transform/package.json new file mode 100644 index 0000000000..70229e6a6f --- /dev/null +++ b/examples/transform/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "test": "asc assembly/index.ts --runtime none --transform mytransform.js" + } +} From b1fbbd54ba9717654b0ecf3298c2cb56c4afcc28 Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 10 Oct 2019 21:42:45 +0200 Subject: [PATCH 02/11] support TS transforms --- cli/asc.js | 36 +++++++++++++------------ cli/transform.js | 7 ++--- examples/transform/README.md | 8 ++++++ examples/transform/mytransform.js | 2 +- examples/transform/mytransform.ts | 12 +++++++++ examples/transform/package.json | 5 +++- examples/transform/ts/assembly/index.ts | 1 + examples/transform/ts/package.json | 6 +++++ 8 files changed, 53 insertions(+), 24 deletions(-) create mode 100644 examples/transform/README.md create mode 100644 examples/transform/mytransform.ts create mode 100644 examples/transform/ts/assembly/index.ts create mode 100644 examples/transform/ts/package.json diff --git a/cli/asc.js b/cli/asc.js index 3af3137e92..88f81fb905 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -212,26 +212,28 @@ exports.main = function main(argv, options, callback) { // Set up transforms const transforms = []; if (args.transform) { - class Transform { - baseDir = baseDir; - writeFile = writeFile; - readFile = readFile; - listFiles = listFiles; - } args.transform.forEach(filename => { - const ctor = require( - path.isAbsolute(filename = filename.trim()) - ? filename - : path.join(process.cwd(), filename) - ); - let impl; - if (typeof ctor === "function") { - Object.setPrototypeOf(ctor, Transform); - impl = new ctor(); + filename = path.isAbsolute(filename = filename.trim()) + ? filename + : path.join(process.cwd(), filename); + let classOrModule; + if (/\.ts$/.test(filename)) { + require("ts-node").register({ transpileOnly: true, skipProject: true }); + classOrModule = require(filename); + } else { + classOrModule = require(filename); + } + if (typeof classOrModule === "function") { + Object.defineProperties(classOrModule.prototype, { + baseDir: { value: baseDir }, + readFile: { value: readFile }, + writeFile: { value: writeFile }, + listFiles: { value: listFiles } + }); + transforms.push(new classOrModule()); } else { - impl = ctor; // legacy module + transforms.push(classOrModule); // legacy module } - transforms.push(impl); }); } function applyTransform(name, ...args) { diff --git a/cli/transform.js b/cli/transform.js index dabbc389a1..141277d2b6 100644 --- a/cli/transform.js +++ b/cli/transform.js @@ -1,5 +1,2 @@ -class Transform { - // becomes replaced with the actual base by asc -} - -exports.Transform = Transform; +// becomes replaced with the actual base by asc +exports.Transform = function Transform() {}; diff --git a/examples/transform/README.md b/examples/transform/README.md new file mode 100644 index 0000000000..52c7931349 --- /dev/null +++ b/examples/transform/README.md @@ -0,0 +1,8 @@ +Compiler transform examples +=========================== + +Both transforms written in JS and transforms written in TS can be used, with the +latter requiring that the ts-node package is present. + +* [Example JavaScript transform](./mytransform.js) +* [Example TypeScript transform](./mytransform.ts) diff --git a/examples/transform/mytransform.js b/examples/transform/mytransform.js index 958711f277..3978ebbaab 100644 --- a/examples/transform/mytransform.js +++ b/examples/transform/mytransform.js @@ -3,7 +3,7 @@ const { SourceKind } = require("../.."); // "assemblyscript" class MyTransform extends Transform { afterParse(parser) { - console.error("afterParse called, baseDir = " + this.baseDir); + console.error("[mytransform.js] afterParse called, baseDir = " + this.baseDir); var sources = parser.program.sources; sources.forEach(source => console.error(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); } diff --git a/examples/transform/mytransform.ts b/examples/transform/mytransform.ts new file mode 100644 index 0000000000..6b0d8a61ec --- /dev/null +++ b/examples/transform/mytransform.ts @@ -0,0 +1,12 @@ +import { Transform } from "../../cli/transform"; // "assemblyscript/cli/transform" +import { Parser, SourceKind } from "../.."; // "assemblyscript" + +class MyTransform extends Transform { + afterParse(parser: Parser): void { + console.error("[mytransform.ts] afterParse called, baseDir = " + this.baseDir); + var sources = parser.program.sources; + sources.forEach(source => console.error(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); + } +} + +export = MyTransform; diff --git a/examples/transform/package.json b/examples/transform/package.json index 70229e6a6f..0c0d875507 100644 --- a/examples/transform/package.json +++ b/examples/transform/package.json @@ -1,5 +1,8 @@ { "scripts": { - "test": "asc assembly/index.ts --runtime none --transform mytransform.js" + "test:js": "asc assembly/index.ts --runtime none --transform mytransform.js", + "test:ts": "asc assembly/index.ts --runtime none --transform mytransform.ts", + "test:multi": "asc assembly/index.ts --runtime none --transform mytransform.js --transform mytransform.ts", + "test": "npm run test:js && npm run test:ts && npm run test:multi" } } diff --git a/examples/transform/ts/assembly/index.ts b/examples/transform/ts/assembly/index.ts new file mode 100644 index 0000000000..8b1a393741 --- /dev/null +++ b/examples/transform/ts/assembly/index.ts @@ -0,0 +1 @@ +// empty diff --git a/examples/transform/ts/package.json b/examples/transform/ts/package.json new file mode 100644 index 0000000000..3b8eb06f68 --- /dev/null +++ b/examples/transform/ts/package.json @@ -0,0 +1,6 @@ +{ + "scripts": { + "build": "tsc mytransform.ts", + "test": "asc assembly/index.ts --runtime none --transform mytransform.ts" + } +} From 5e760b0fee4105385df115142c728207bef2e9fd Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 10 Oct 2019 21:49:26 +0200 Subject: [PATCH 03/11] clean --- examples/transform/ts/assembly/index.ts | 1 - examples/transform/ts/package.json | 6 ------ 2 files changed, 7 deletions(-) delete mode 100644 examples/transform/ts/assembly/index.ts delete mode 100644 examples/transform/ts/package.json diff --git a/examples/transform/ts/assembly/index.ts b/examples/transform/ts/assembly/index.ts deleted file mode 100644 index 8b1a393741..0000000000 --- a/examples/transform/ts/assembly/index.ts +++ /dev/null @@ -1 +0,0 @@ -// empty diff --git a/examples/transform/ts/package.json b/examples/transform/ts/package.json deleted file mode 100644 index 3b8eb06f68..0000000000 --- a/examples/transform/ts/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "scripts": { - "build": "tsc mytransform.ts", - "test": "asc assembly/index.ts --runtime none --transform mytransform.ts" - } -} From cd5fe071d7ca86900d078afb497002a15b0da93b Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 10 Oct 2019 21:50:30 +0200 Subject: [PATCH 04/11] simpler --- cli/asc.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index 88f81fb905..f0612defec 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -219,10 +219,8 @@ exports.main = function main(argv, options, callback) { let classOrModule; if (/\.ts$/.test(filename)) { require("ts-node").register({ transpileOnly: true, skipProject: true }); - classOrModule = require(filename); - } else { - classOrModule = require(filename); } + classOrModule = require(filename); if (typeof classOrModule === "function") { Object.defineProperties(classOrModule.prototype, { baseDir: { value: baseDir }, From e213c4ce4ddac3b86fc928c3268ee56dce86e21b Mon Sep 17 00:00:00 2001 From: dcode Date: Thu, 10 Oct 2019 21:51:08 +0200 Subject: [PATCH 05/11] even simpler --- cli/asc.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index f0612defec..7a5cfa62ba 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -216,11 +216,8 @@ exports.main = function main(argv, options, callback) { filename = path.isAbsolute(filename = filename.trim()) ? filename : path.join(process.cwd(), filename); - let classOrModule; - if (/\.ts$/.test(filename)) { - require("ts-node").register({ transpileOnly: true, skipProject: true }); - } - classOrModule = require(filename); + if (/\.ts$/.test(filename)) require("ts-node").register({ transpileOnly: true, skipProject: true }); + const classOrModule = require(filename); if (typeof classOrModule === "function") { Object.defineProperties(classOrModule.prototype, { baseDir: { value: baseDir }, From 83c24129d00e244752b16702bbb503d2041639f9 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 12 Oct 2019 17:44:00 +0200 Subject: [PATCH 06/11] implement suggestions --- cli/asc.js | 13 ++++++++----- cli/transform.d.ts | 10 ++++++++++ examples/transform/mytransform.js | 4 ++-- examples/transform/mytransform.ts | 4 ++-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index 7a5cfa62ba..ca2ab4a3e6 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -219,11 +219,14 @@ exports.main = function main(argv, options, callback) { if (/\.ts$/.test(filename)) require("ts-node").register({ transpileOnly: true, skipProject: true }); const classOrModule = require(filename); if (typeof classOrModule === "function") { - Object.defineProperties(classOrModule.prototype, { - baseDir: { value: baseDir }, - readFile: { value: readFile }, - writeFile: { value: writeFile }, - listFiles: { value: listFiles } + Object.assign(classOrModule.prototype, { + baseDir, + stdout, + stderr, + log: console.error || console.log, + readFile, + writeFile, + listFiles }); transforms.push(new classOrModule()); } else { diff --git a/cli/transform.d.ts b/cli/transform.d.ts index 82085bf878..3aabeff86a 100644 --- a/cli/transform.d.ts +++ b/cli/transform.d.ts @@ -4,12 +4,22 @@ *//***/ import { Parser } from ".."; +import { OutputStream } from "./asc"; export abstract class Transform { /** Base directory. */ readonly baseDir: string; + /** Output stream used by the compiler. */ + readonly stdout: OutputStream; + + /** Error stream used by the compiler. */ + readonly stderr: OutputStream; + + /** Logs a message to console. */ + readonly log: typeof console.log; + /** Writes a file to disk. */ writeFile(filename: string, contents: string | Uint8Array, baseDir: string): boolean; diff --git a/examples/transform/mytransform.js b/examples/transform/mytransform.js index 3978ebbaab..40ec2d933c 100644 --- a/examples/transform/mytransform.js +++ b/examples/transform/mytransform.js @@ -3,9 +3,9 @@ const { SourceKind } = require("../.."); // "assemblyscript" class MyTransform extends Transform { afterParse(parser) { - console.error("[mytransform.js] afterParse called, baseDir = " + this.baseDir); + this.log("[mytransform.js] afterParse called, baseDir = " + this.baseDir); var sources = parser.program.sources; - sources.forEach(source => console.error(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); + sources.forEach(source => this.log(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); } } diff --git a/examples/transform/mytransform.ts b/examples/transform/mytransform.ts index 6b0d8a61ec..23181f3c11 100644 --- a/examples/transform/mytransform.ts +++ b/examples/transform/mytransform.ts @@ -3,9 +3,9 @@ import { Parser, SourceKind } from "../.."; // "assemblyscript" class MyTransform extends Transform { afterParse(parser: Parser): void { - console.error("[mytransform.ts] afterParse called, baseDir = " + this.baseDir); + this.log("[mytransform.ts] afterParse called, baseDir = " + this.baseDir); var sources = parser.program.sources; - sources.forEach(source => console.error(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); + sources.forEach(source => this.log(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); } } From c8d4531ec5b2f53c414f115ff504c28c9e7507b0 Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 12 Oct 2019 18:01:19 +0200 Subject: [PATCH 07/11] fix historical IE paranoia --- cli/asc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/asc.js b/cli/asc.js index ca2ab4a3e6..07f999db7c 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -223,7 +223,7 @@ exports.main = function main(argv, options, callback) { baseDir, stdout, stderr, - log: console.error || console.log, + log: console.error, readFile, writeFile, listFiles From d0647d4c303f30c2a4bb24b5acdb6b91317d067b Mon Sep 17 00:00:00 2001 From: dcode Date: Sat, 12 Oct 2019 23:16:29 +0200 Subject: [PATCH 08/11] postprocess assemblyscript.d.ts --- scripts/build-dts.js | 88 ++++++++++++++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/scripts/build-dts.js b/scripts/build-dts.js index 7f9de26678..006dc3e62b 100644 --- a/scripts/build-dts.js +++ b/scripts/build-dts.js @@ -408,41 +408,40 @@ exports.default = generate; }); -const prelude = `declare type bool = boolean; -declare type i8 = number; -declare type i16 = number; -declare type i32 = number; -declare type isize = number; -declare type u8 = number; -declare type u16 = number; -declare type u32 = number; -declare type usize = number; -declare type f32 = number; -declare type f64 = number; -declare module 'assemblyscript' { - export * from 'assemblyscript/src/index'; +const path = require("path"); +const fs = require("fs"); +const stream = require("stream"); +const util = require("util"); + +function OutputStream(options) { + stream.Writable.call(this, options); + this.chunks = []; } -`; +util.inherits(OutputStream, stream.Writable); +OutputStream.prototype._write = function(chunk, enc, cb) { + this.chunks.push(chunk); + cb(); +}; +OutputStream.prototype.toBuffer = function() { + return Buffer.concat(this.chunks); +}; +OutputStream.prototype.toString = function() { + return this.toBuffer().toString("utf8"); +}; -var path = require("path"); -var fs = require("fs"); -var stdout = fs.createWriteStream(path.resolve(__dirname, "..", "dist", "assemblyscript.d.ts")); -stdout.write(prelude); -stdout.write = (function(_write) { - return function(...args) { - if (typeof args[0] === "string") { - args[0] = args[0].replace(/\/\/\/ ]*>\r?\n/g, ""); - } - return _write.apply(stdout, args); - }; -})(stdout.write); +const stdout = new OutputStream(); +stdout.write(`declare module 'assemblyscript' { + export * from 'assemblyscript/src/index'; +} +`); module.exports.default({ project: path.resolve(__dirname, "..", "src"), prefix: "assemblyscript", exclude: [ "glue/js/index.ts", - "glue/js/node.d.ts" + "glue/js/node.d.ts", + "glue/binaryen.d.ts" ], verbose: true, sendMessage: console.log, @@ -459,3 +458,38 @@ module.exports.default({ sendMessage: console.log, stdout: stdout }); + +var source = stdout.toString().replace(/\/\/\/ ]*>\r?\n/g, ""); + +const ts = require("typescript"); +const sourceFile = ts.createSourceFile("assemblyscript.d.ts", source, ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS); + +console.log("transforming:"); +var numReplaced = 0; +const result = ts.transform(sourceFile, [ + function(context) { + const visit = node => { + node = ts.visitEachChild(node, visit, context); + if (ts.isTypeNode(node)) { + const name = node.getText(sourceFile); + switch (name) { + // this is wrong, but works + case "bool": ++numReplaced; return ts.createIdentifier("boolean"); + default: if (!/^(?:Binaryen|Relooper)/.test(name)) break; + case "i8": case "i16": case "i32": case "isize": + case "u8": case "u16": case "u32": case "usize": + case "f32": case "f64": ++numReplaced; return ts.createIdentifier("number"); + } + } + return node; + }; + return node => ts.visitNode(node, visit); + } +]); +console.log(" replaced " + numReplaced + " AS types with JS types"); + +fs.writeFileSync( + path.resolve(__dirname, "..", "dist", "assemblyscript.d.ts"), + ts.createPrinter().printFile(result.transformed[0]), + "utf8" +); From d18231a1443f63764b7c395c7afbd3b076bfe3db Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 15 Oct 2019 12:35:38 +0200 Subject: [PATCH 09/11] add afterCompile hook --- cli/asc.js | 3 +++ cli/transform.d.ts | 5 ++++- examples/transform/mytransform.js | 6 ++++++ examples/transform/mytransform.ts | 8 +++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index 07f999db7c..6dfc7fa56f 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -542,6 +542,9 @@ exports.main = function main(argv, options, callback) { return callback(Error("Compile error")); } + // Call afterCompile transform hook + applyTransform("afterCompile", module); + // Validate the module if requested if (args.validate) { stats.validateCount++; diff --git a/cli/transform.d.ts b/cli/transform.d.ts index 3aabeff86a..a1aff852fc 100644 --- a/cli/transform.d.ts +++ b/cli/transform.d.ts @@ -3,7 +3,7 @@ * @module cli/transform *//***/ -import { Parser } from ".."; +import { Parser, Module } from ".."; import { OutputStream } from "./asc"; export abstract class Transform { @@ -31,4 +31,7 @@ export abstract class Transform { /** Called when parsing is complete, before a program is instantiated from the AST. */ afterParse?(parser: Parser): void; + + /** Called when compilation is complete, before the module is being validated. */ + afterCompile?(module: Module): void; } diff --git a/examples/transform/mytransform.js b/examples/transform/mytransform.js index 40ec2d933c..e903ec0626 100644 --- a/examples/transform/mytransform.js +++ b/examples/transform/mytransform.js @@ -1,5 +1,6 @@ const { Transform } = require("../../cli/transform"); // "assemblyscript/cli/transform" const { SourceKind } = require("../.."); // "assemblyscript" +const binaryen = require("binaryen"); class MyTransform extends Transform { afterParse(parser) { @@ -7,6 +8,11 @@ class MyTransform extends Transform { var sources = parser.program.sources; sources.forEach(source => this.log(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); } + afterCompile(asModule) { + this.log("[mytransform.js] afterCompile called"); + var module = binaryen.wrapModule(asModule.ref); + this.log(module.emitBinary()); + } } module.exports = MyTransform; diff --git a/examples/transform/mytransform.ts b/examples/transform/mytransform.ts index 23181f3c11..18fd7e36be 100644 --- a/examples/transform/mytransform.ts +++ b/examples/transform/mytransform.ts @@ -1,5 +1,6 @@ import { Transform } from "../../cli/transform"; // "assemblyscript/cli/transform" -import { Parser, SourceKind } from "../.."; // "assemblyscript" +import { Parser, Module, SourceKind } from "../.."; // "assemblyscript" +import * as binaryen from "binaryen"; class MyTransform extends Transform { afterParse(parser: Parser): void { @@ -7,6 +8,11 @@ class MyTransform extends Transform { var sources = parser.program.sources; sources.forEach(source => this.log(" " + source.internalPath + " [" + SourceKind[source.sourceKind] + "]")); } + afterCompile(asModule: Module): void { + this.log("[mytransform.ts] afterCompile called"); + var module = binaryen.wrapModule(asModule.ref); + this.log(module.emitBinary()); + } } export = MyTransform; From ba613cb0ae0211cc3acce40f83cdeaa3e246a823 Mon Sep 17 00:00:00 2001 From: dcode Date: Wed, 16 Oct 2019 10:44:50 +0200 Subject: [PATCH 10/11] propagate errors to callback --- cli/asc.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index 6dfc7fa56f..65e46f8482 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -235,9 +235,16 @@ exports.main = function main(argv, options, callback) { }); } function applyTransform(name, ...args) { - transforms.forEach(transform => { - if (typeof transform[name] === "function") transform[name](...args); - }); + for (let i = 0, k = transforms.length; i < k; ++i) { + let transform = transforms[i]; + if (typeof transform[name] === "function") { + try { + transform[name](...args); + } catch (e) { + return e; + } + } + } } // Begin parsing @@ -438,7 +445,10 @@ exports.main = function main(argv, options, callback) { } // Call afterParse transform hook - applyTransform("afterParse", parser); + { + let error = applyTransform("afterParse", parser); + if (error) return callback(error); + } // Parse additional files, if any { @@ -543,7 +553,10 @@ exports.main = function main(argv, options, callback) { } // Call afterCompile transform hook - applyTransform("afterCompile", module); + { + let error = applyTransform("afterCompile", module); + if (error) return callback(error); + } // Validate the module if requested if (args.validate) { From f45544a430e373265d407a39e432ff91208dd35a Mon Sep 17 00:00:00 2001 From: dcode Date: Wed, 16 Oct 2019 12:32:48 +0200 Subject: [PATCH 11/11] also handle errors when loading transforms --- cli/asc.js | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index 65e46f8482..6fd5a61925 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -212,27 +212,33 @@ exports.main = function main(argv, options, callback) { // Set up transforms const transforms = []; if (args.transform) { - args.transform.forEach(filename => { + let transformArgs = args.transform; + for (let i = 0, k = transformArgs.length; i < k; ++i) { + let filename = transformArgs[i]; filename = path.isAbsolute(filename = filename.trim()) ? filename : path.join(process.cwd(), filename); if (/\.ts$/.test(filename)) require("ts-node").register({ transpileOnly: true, skipProject: true }); - const classOrModule = require(filename); - if (typeof classOrModule === "function") { - Object.assign(classOrModule.prototype, { - baseDir, - stdout, - stderr, - log: console.error, - readFile, - writeFile, - listFiles - }); - transforms.push(new classOrModule()); - } else { - transforms.push(classOrModule); // legacy module + try { + const classOrModule = require(filename); + if (typeof classOrModule === "function") { + Object.assign(classOrModule.prototype, { + baseDir, + stdout, + stderr, + log: console.error, + readFile, + writeFile, + listFiles + }); + transforms.push(new classOrModule()); + } else { + transforms.push(classOrModule); // legacy module + } + } catch (e) { + return callback(e); } - }); + } } function applyTransform(name, ...args) { for (let i = 0, k = transforms.length; i < k; ++i) {