From 4f74210e74ef0b06216ab0f288268192674d69c9 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Mon, 31 Jan 2022 18:36:10 +0000 Subject: [PATCH] fix!: Export loopTypes from Blockly.blocks.loops (#5900) * refactor(blocks): Make loopTypes a Set This is likely to slightly improve performance, especially if there are many entries. * refactor(blocks): Re-export individual block modules from Blockly.blocks.all * fix!(blocks): Have blocks_compressed.js export Blockly.blocks.all Previously the value obtained by const blocks = require('blockly/blocks'); // Node.js or import blocks from 'blockly/blocks.js'; // ES Modules would be the block definitions dictionary (Blockly.Blocks). Change this so that it is instead the export object from Blockly.blocks.all. This means you can now access loopTypes via: import blocks from 'blockly/blocks.js'; blocks.loops.loopTypes.add('my_loop_blocktype'); This is a breaking change for any code which depended on the value that was exported by blocks_compressed.js. BREAKING CHANGE: the exports provided by blocks_compressed.js (and therefore by `import ... from 'blockly/blocks'`) have changed; see above. --- blocks/all.js | 31 ++++++++++++++++++++++--------- blocks/loops.js | 12 ++++++------ scripts/gulpfiles/build_tasks.js | 6 +++--- tests/deps.js | 2 +- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/blocks/all.js b/blocks/all.js index 17000f8c96d..b145d4107d7 100644 --- a/blocks/all.js +++ b/blocks/all.js @@ -11,13 +11,26 @@ 'use strict'; goog.module('Blockly.blocks.all'); +goog.module.declareLegacyNamespace(); + +const colour = goog.require('Blockly.blocks.colour'); +const lists = goog.require('Blockly.blocks.lists'); +const logic = goog.require('Blockly.blocks.logic'); +const loops = goog.require('Blockly.blocks.loops'); +const math = goog.require('Blockly.blocks.math'); +const procedures = goog.require('Blockly.blocks.procedures'); +const texts = goog.require('Blockly.blocks.texts'); +const variables = goog.require('Blockly.blocks.variables'); +const variablesDynamic = goog.require('Blockly.blocks.variablesDynamic'); + + +exports.colour = colour; +exports.lists = lists; +exports.logic = logic; +exports.loops = loops; +exports.math = math; +exports.procedures = procedures; +exports.texts = texts; +exports.variables = variables; +exports.variablesDynamic = variablesDynamic; -goog.require('Blockly.blocks.colour'); -goog.require('Blockly.blocks.lists'); -goog.require('Blockly.blocks.logic'); -goog.require('Blockly.blocks.loops'); -goog.require('Blockly.blocks.math'); -goog.require('Blockly.blocks.procedures'); -goog.require('Blockly.blocks.texts'); -goog.require('Blockly.blocks.variables'); -goog.require('Blockly.blocks.variablesDynamic'); diff --git a/blocks/loops.js b/blocks/loops.js index cc3c27d371f..21e66ece3ad 100644 --- a/blocks/loops.js +++ b/blocks/loops.js @@ -287,21 +287,21 @@ Extensions.register( * * // If using the Blockly npm package and es6 import syntax: * import {loopTypes} from 'blockly/blocks'; - * loopTypes.push('custom_loop'); + * loopTypes.add('custom_loop'); * * // Else if using Closure Compiler and goog.modules: * const {loopTypes} = goog.require('Blockly.blocks.loops'); - * loopTypes.push('custom_loop'); + * loopTypes.add('custom_loop'); * - * @type {!Array} + * @type {!Set} */ -const loopTypes = [ +const loopTypes = new Set([ 'controls_repeat', 'controls_repeat_ext', 'controls_forEach', 'controls_for', 'controls_whileUntil', -]; +]); exports.loopTypes = loopTypes; /** @@ -321,7 +321,7 @@ const CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = { getSurroundLoop: function() { let block = this; do { - if (loopTypes.includes(block.type)) { + if (loopTypes.has(block.type)) { return block; } block = block.getSurroundParent(); diff --git a/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index aeec016fb76..4706461d6fe 100644 --- a/scripts/gulpfiles/build_tasks.js +++ b/scripts/gulpfiles/build_tasks.js @@ -107,7 +107,7 @@ const chunks = [ }, { name: 'blocks', entry: 'blocks/all.js', - exports: 'Blockly.Blocks', + exports: 'Blockly.blocks.all', importAs: 'BlocklyBlocks', }, { name: 'javascript', @@ -314,7 +314,7 @@ function chunkWrapper(chunk) { const cjsDeps = fileNames.map(f => `require(${f})`).join(', '); const browserDeps = chunk.dependencies.map(d => `root.${d.exports}`).join(', '); - const imports = chunk.dependencies.map(d => d.importAs).join(', '); + const factoryParams = chunk.dependencies.map(d => d.importAs).join(', '); return `// Do not edit this file; automatically generated. /* eslint-disable */ @@ -326,7 +326,7 @@ function chunkWrapper(chunk) { } else { // Browser root.${chunk.exports} = factory(${browserDeps}); } -}(this, function(${imports}) { +}(this, function(${factoryParams}) { ${chunk.factoryPreamble || FACTORY_PREAMBLE} %output% ${chunk.factoryPostamble || FACTORY_POSTAMBLE} diff --git a/tests/deps.js b/tests/deps.js index a46277b5ad4..10e89592bf4 100644 --- a/tests/deps.js +++ b/tests/deps.js @@ -1,4 +1,4 @@ -goog.addDependency('../../blocks/all.js', ['Blockly.blocks.all'], ['Blockly.blocks.colour', 'Blockly.blocks.lists', 'Blockly.blocks.logic', 'Blockly.blocks.loops', 'Blockly.blocks.math', 'Blockly.blocks.procedures', 'Blockly.blocks.texts', 'Blockly.blocks.variables', 'Blockly.blocks.variablesDynamic'], {'module': 'goog'}); +goog.addDependency('../../blocks/all.js', ['Blockly.blocks.all'], ['Blockly.blocks.colour', 'Blockly.blocks.lists', 'Blockly.blocks.logic', 'Blockly.blocks.loops', 'Blockly.blocks.math', 'Blockly.blocks.procedures', 'Blockly.blocks.texts', 'Blockly.blocks.variables', 'Blockly.blocks.variablesDynamic'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../blocks/colour.js', ['Blockly.blocks.colour'], ['Blockly.FieldColour', 'Blockly.common'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../blocks/lists.js', ['Blockly.blocks.lists'], ['Blockly.ConnectionType', 'Blockly.FieldDropdown', 'Blockly.FieldDropdown', 'Blockly.Input', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.blocks', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../blocks/logic.js', ['Blockly.blocks.logic'], ['Blockly.Events', 'Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldLabel', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'});