From 46268dd13c47ec78a0d2f80207c57172cfe52fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20C=C3=A1ceres?= Date: Mon, 16 Jan 2017 17:53:54 +1000 Subject: [PATCH] feat: allow async functions for pre/postProc/afterAll (closes #1034) (#1038) --- src/core/base-runner.js | 13 +++-- src/core/post-process.js | 16 +++++- src/core/pre-process.js | 14 ++++- tests/spec/SpecHelper.js | 5 +- tests/spec/core/pre-process-spec.html | 80 +++++++++++++++++++++++++++ tests/spec/core/pre-process-spec.js | 29 ++++++++++ tests/testFiles.json | 1 + 7 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 tests/spec/core/pre-process-spec.html create mode 100644 tests/spec/core/pre-process-spec.js diff --git a/src/core/base-runner.js b/src/core/base-runner.js index 0ab1de3a1f..81d2a5c8a0 100644 --- a/src/core/base-runner.js +++ b/src/core/base-runner.js @@ -2,8 +2,8 @@ // The module in charge of running the whole processing pipeline. import { pub } from "core/pubsubhub"; import "core/default-root-attr"; -import "core/pre-process"; -import "core/post-process" +import { done as preProcessDone } from "core/pre-process"; +import { done as postProcessDone } from "core/post-process"; import "core/respec-ready"; import "core/override-configuration"; import "core/include-config"; @@ -21,16 +21,19 @@ function toRunnable(plug) { } export async function runAll(plugs) { - pub("start-all", window.respecConfig); + pub("start-all", respecConfig); + await preProcessDone; const runnables = plugs .filter(plug => plug && typeof plug.run === "function" && plug !== this) .map(toRunnable); for (const task of runnables) { try { - await task(window.respecConfig); + await task(respecConfig); } catch (err) { console.error(err); } } - pub("end-all", window.respecConfig); + pub("plugins-done", respecConfig); + await postProcessDone; + pub("end-all", respecConfig); }; diff --git a/src/core/post-process.js b/src/core/post-process.js index 4f382131bf..63df34ca65 100644 --- a/src/core/post-process.js +++ b/src/core/post-process.js @@ -10,11 +10,21 @@ */ import { sub } from "core/pubsubhub"; -sub("end-all", config => { +let doneResolver; +export const done = new Promise(resolve => doneResolver = resolve); + +sub("plugins-done", async config => { + const result = []; if (Array.isArray(config.postProcess)) { - config.postProcess.forEach(f => f(config)); + const values = await Promise.all( + config.postProcess + .filter(f => typeof f === "function") + .map(f => Promise.resolve(f(config, document))) + ); + result.push(...values); } if (typeof config.afterEnd === "function") { - config.afterEnd(); + result.push(await Promise.resolve(config.afterEnd(config, document))); } + doneResolver(result); }, { once: true }); diff --git a/src/core/pre-process.js b/src/core/pre-process.js index 1cdef3429f..b9c9962f6b 100644 --- a/src/core/pre-process.js +++ b/src/core/pre-process.js @@ -9,8 +9,18 @@ */ import { sub } from "core/pubsubhub"; -sub("start-all", config => { +let doneResolver; +export const done = new Promise(resolve => doneResolver = resolve); + +sub("start-all", async config => { + const result = []; if (Array.isArray(config.preProcess)) { - config.preProcess.forEach(f => f(config)); + const values = await Promise.all( + config.preProcess + .filter(f => typeof f === "function") + .map(f => Promise.resolve(f(config, document))) + ); + result.push(...values); } + doneResolver(result); }, { once: true }); diff --git a/tests/spec/SpecHelper.js b/tests/spec/SpecHelper.js index bea917baad..4037fe1916 100644 --- a/tests/spec/SpecHelper.js +++ b/tests/spec/SpecHelper.js @@ -51,7 +51,10 @@ function decorateDocument(doc, opts) { var path = opts.jsPath || "../js/"; var loader = this.ownerDocument.createElement("script"); var config = this.ownerDocument.createElement("script"); - var configText = "var respecConfig = " + JSON.stringify(opts.config || {}) + ";"; + var configText = ""; + if (opts.config) { + configText = "var respecConfig = " + JSON.stringify(opts.config || {}) + ";"; + } config.classList.add("remove"); config.innerText = configText; var loadAttr = { diff --git a/tests/spec/core/pre-process-spec.html b/tests/spec/core/pre-process-spec.html new file mode 100644 index 0000000000..26582932bf --- /dev/null +++ b/tests/spec/core/pre-process-spec.html @@ -0,0 +1,80 @@ + + + +
+

+ abstract. +

+
+
+

+ CUSTOM PARAGRAPH +

+
+
+

FAIL

+

FAIL

+

FAIL

+

FAIL

+

FAIL

+
diff --git a/tests/spec/core/pre-process-spec.js b/tests/spec/core/pre-process-spec.js new file mode 100644 index 0000000000..a70d0e71d0 --- /dev/null +++ b/tests/spec/core/pre-process-spec.js @@ -0,0 +1,29 @@ +"use strict"; +describe("Core - preProcess, postProcess, afterEnd", () => { + afterAll(done => { + flushIframes(); + done(); + }); + let doc; + + beforeAll(done => { + const ops = makeStandardOps(); + ops.config = null; // use src doc's config + const cb = iframe => { + doc = iframe; + done(); + }; + makeRSDoc(ops, cb, "spec/core/pre-process-spec.html"); + }); + + it("runs the preProcess and postProces arrays", () => { + expect(doc.querySelector("#pre-sync").innerHTML).toEqual("pass"); + expect(doc.querySelector("#pre-async").innerHTML).toEqual("pass"); + expect(doc.querySelector("#post-sync").innerHTML).toEqual("pass"); + expect(doc.querySelector("#post-async").innerHTML).toEqual("pass"); + }); + + it("runs afterEnd method", () => { + expect(doc.querySelector("#afterend").innerHTML).toEqual("pass"); + }); +}); diff --git a/tests/testFiles.json b/tests/testFiles.json index 4e4dcdcfac..b164cafcde 100644 --- a/tests/testFiles.json +++ b/tests/testFiles.json @@ -19,6 +19,7 @@ "spec/core/jquery-enhanced-spec.js", "spec/core/markdown-spec.js", "spec/core/override-configuration-spec.js", + "spec/core/pre-process-spec.js", "spec/core/ready-promise-spec.js", "spec/core/remove-respec-spec.js", "spec/core/requirements-spec.js",