diff --git a/src/core/Chef.mjs b/src/core/Chef.mjs index 94d85608..ed111b65 100755 --- a/src/core/Chef.mjs +++ b/src/core/Chef.mjs @@ -157,9 +157,9 @@ class Chef { * @param {number} pos.end - The end offset. * @returns {Object} */ - calculateHighlights(recipeConfig, direction, pos) { + async calculateHighlights(recipeConfig, direction, pos) { const recipe = new Recipe(recipeConfig); - const highlights = recipe.generateHighlightList(); + const highlights = await recipe.generateHighlightList(); if (!highlights) return false; diff --git a/src/core/ChefWorker.js b/src/core/ChefWorker.js index 91f9955d..a243f32c 100644 --- a/src/core/ChefWorker.js +++ b/src/core/ChefWorker.js @@ -157,8 +157,8 @@ async function getDishAs(data) { * @param {number} pos.start - The start offset. * @param {number} pos.end - The end offset. */ -function calculateHighlights(recipeConfig, direction, pos) { - pos = self.chef.calculateHighlights(recipeConfig, direction, pos); +async function calculateHighlights(recipeConfig, direction, pos) { + pos = await self.chef.calculateHighlights(recipeConfig, direction, pos); self.postMessage({ action: "highlightsCalculated", diff --git a/src/core/Recipe.mjs b/src/core/Recipe.mjs index ed0dba2f..48ec6c97 100755 --- a/src/core/Recipe.mjs +++ b/src/core/Recipe.mjs @@ -22,7 +22,6 @@ class Recipe { */ constructor(recipeConfig) { this.opList = []; - this.opList = []; if (recipeConfig) { this._parseConfig(recipeConfig); @@ -49,6 +48,31 @@ class Recipe { } + /** + * Populate elements of opList with operation instances. + * Dynamic import here removes top-level cyclic dependency issue.For + * + * @private + */ + async _hydrateOpList() { + let modules = await import("./config/modules/OpModules"); + modules = modules.default; + + this.opList = this.opList.map((o) => { + if (o instanceof Operation) { + return o; + } else { + const op = new modules[o.module][o.name](); + op.ingValues = o.ingValues; + op.breakpoint = o.breakpoint; + op.disabled = o.disabled; + return op; + } + }); + + } + + /** * Returns the value of the Recipe as it should be displayed in a recipe config. * @@ -80,19 +104,21 @@ class Recipe { addOperations(operations) { operations.forEach((o) => { if (o instanceof Operation) { + this.opList.push(o); + + } else { + + this.opList.push({ + name: o.name, + module: o.module, + ingValues: o.args, + breakpoint: o.breakpoint, + disabled: o.disabled, + }); + } - - this.opList.push({ - name: o.name, - module: o.module, - ingValues: o.args, - breakpoint: o.breakpoint, - disabled: o.disabled, - }); - }); - } @@ -154,23 +180,13 @@ class Recipe { if (startFrom === 0) this.lastRunOp = null; - let modules = await import("./config/modules/OpModules"); - modules = modules.default; + await this._hydrateOpList(); log.debug(`[*] Executing recipe of ${this.opList.length} operations, starting at ${startFrom}`); for (let i = startFrom; i < this.opList.length; i++) { - const opConfig = this.opList[i]; - - if (opConfig instanceof Operation) { - op = opConfig; - } else { - op = new modules[opConfig.module][opConfig.name](); - op.ingValues = opConfig.ingValues; - op.breakpoint = opConfig.breakpoint; - op.disabled = opConfig.disabled; - } + op = this.opList[i]; log.debug(`[${i}] ${op.name} ${JSON.stringify(op.ingValues)}`); @@ -286,7 +302,8 @@ class Recipe { * @returns {function} highlights[].b * @returns {Object[]} highlights[].args */ - generateHighlightList() { + async generateHighlightList() { + await this._hydrateOpList(); const highlights = []; for (let i = 0; i < this.opList.length; i++) {