-
Notifications
You must be signed in to change notification settings - Fork 624
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(dev-scripts)!: Fixes, refactoring and simplification of webpack.config.js
and 'blockly'
imports
#2228
Conversation
Completes revert of PR google#335. BREAKING CHANGE: This PR removes the support that was added in PR google#335 for aquiring Blockly directly from a git:// URL. This feature was useful insofar as it enabled merging changes into blockly-samples that depend on changes in blockly that have not yet been published (even as a beta)—and still have tests pass. For this to work seamlessly, however, the code in webpack.config.js depended on a postinstall script that was removed in PR google#1630. When testing such PRs going forward use npm link for local testing and wait for changes to blockly to be published before merging the corresponding changes to samples—or wait for blockly to become a monorepo so both changes can be made in the same PR! Note that this change is breaking only to the dev-scripts plugin itself, and will not cause other plugins that use it as a dev dependency to experience a breaking change.
The commit which removed support for git:// URLS by completing the revert of PR google#335 removed the initialisation of packageJson (from the package.json of the plugin being built) which turns out to still be needed by a DefinePlugin call added later.
PR google#226 addedd a resolve.alias for blockly to webpack.config.js. It is not entirely clear what the purpose of this was at the time, but it has the effect of treating imports of submodules (e.g. 'blockly/core') as if they were direct imports (e.g. of './node_modules/blockly/core.js'), causing webpack to ignore the blockly package's package.json file. This causes plugins to fail to build due to the introduction of an exports stanza in that file (and other related changes) in google/blockly#7822.
Fix bloat caused by some plugins depending on all of blockly (instead of just blockly/core), resulting in webpack including a copy of blockly in the bundled plugin becuase only the subpackage entrypoints were listed inthe externals stanza of webpack.config.js. This will also avoid certain problems that might occur due to apps using such bundled inadvertently containing two or more different copies of Blockly. Also fix the one plugin which did still have an unnecessary dependency on blockly intead of blockly/core.
Currently webpack.conf.js is hard to understand. Attempt to improve readability by making some parts more DRY ("don't repeat yourself") and others more DAMP ("descriptive and meaningful phrases").
Add bufferutils and utf-8-validate to IgnorePlugin config when building tests. These are optional dependencies of wd, which is itself a dependency of jsdom. Also refactor how plugins config is generated to improve readability.
There doesn't appear to be any reason not to include the '.ts' in resolve.extensions even for pure-JS plugins, but it is _necessary_ to include it in TS plugins. Since the default value for resolve.extensions is ['.js', '.json', '.wasm'] set it to ['.ts', '.js', '.json', '.wasm'] which gives priority to TS, then JS, then the other default extensions. Also add a helpful comment explaining the purpose of resolve.fallback.
The latter has never been an advertised entrypoint, and will cease to be a valid entrypoint in v11 (see google/blockly#7822). Fortunately the 'blockly' entrypoint behaves the same as the 'blockly/node' entrypoint does in a node.js environment.
Note to reviewer: it may be helpful to review this PR commit-by-commit. |
I haven't reviewed this yet, but I will note that doing a breaking change in dev-tools/dev-scripts will cause every other plugin to also get a major version bump. Since we don't "need" this until blockly v11, which will independently also cause a major version bump in every plugin, I would prefer to bundle those together and therefore submit this to the v11-specific branch in samples. |
[Edited for clarity.]
That is surprising. This change to dev-scripts should not have any effect on the contents (and thus the backward-compatibility and major version number) of any of the published plugin packages, since currently none of them depends on a In the general case, while it's possible that any change to any kind of dependency could result in a breaking change to the dependent package, it's not automatic, and breaking changes to dev dependencies are even less likely to cause one than breaking changes to non-dev dependencies. Is this a result of our lerna config / publish scripts? |
webpack.config.js
and 'blockly'
importswebpack.config.js
and 'blockly'
imports
[Comment moved from #2229 as it looks like this one will probably be the one that gets merged.] CI is failing here and in #2229 due to multiple similar test failures in
These errors have the same root cause the test failures in #1452: multiple copies of In that case the issue was that each of the In this case the issue appears to be that, due to the removal of the Additional clarification:
Possible fixes:
|
Have runSerializationTestSuite accept a second argument which is the Blockly object to use for XML serialization/deserialization. This works around an issue in blockly-samples that (following the deletion of the alias for blockly in webpack.config.js) causes tests using this function to fail due to having two copies of jsdom loaded, where each will reject DOM objects created by the other. See google#2229 (comment) for more details.
Even after modifying
The root cause is the same, but this time it's the fact that there are two copies of the After discussing this with the core team it has been decided to "solve" this problem by disabling this particular test for the time being, since we expect that moving to the proposed new, npm-workspace-based arrangement will solve this problem (and also the one that necessitated the previous change to |
Ok, @maribethb: this and #2229 (same changes, but on v11 branch) are now ready for review. |
The basics
The details
Resolves
Part of google/blockly#7449.
Proposed Changes
Remove support acquiring Blockly through git. This completes the revert of PR Support acquiring Blockly through Git instead of npm #335. See BREAKING CHANGE below for more details.
Don't use alias when resolving
blockly
. PR Standardize build and start config #226 added aresolve.alias
forblockly
towebpack.config.js
. It is not entirely clear what the purpose of this was at the time, but it has the effect of treating imports of submodules (e.g.'blockly/core'
) as if they were direct imports (e.g. of./node_modules/blockly/core.js
, causing webpack to ignore the blockly package'spackage.json
file. This causes plugins to fail to build due to the introduction of an exports stanza in that file (and other related changes) in feat(build)!: Introduceexports
section inpackage.json
blockly#7822.Exclude Blockly from plugin bundles. This fixes bloat caused by some plugins importing all of
'blockly'
(instead of just'blockly/core'
), resulting in webpack including a copy of blockly in the bundled plugin because only the subpackage entrypoints were listed in theexternals
stanza ofwebpack.config.js
. This will also avoid certain problems that might occur due to apps using such bundles inadvertently containing two or more different copies of Blockly.Also fix the one plugin which did still have an unnecessary dependency on
'blockly'
intead of'blockly/core'
.Introduce an
exists()
function for readability.Ignore more
jsdom
subdependencies: addbufferutils
andutf-8-validate
to theIgnorePlugin
config when building tests. These are optional dependencies of wd, which is itself a dependency of jsdom. Also refactor how theplugins
config is generated to improve readability.Simplify
resolve.extensions
. There doesn't appear to be any harm in including'.ts'
inresolve.extensions
even for pure-JS plugins, but it is necessary to include it for TS plugins. Since the default value for resolve.extensions is['.js', '.json', '.wasm']
set it to
['.ts', '.js', '.json', '.wasm']
which gives priority to TS, then JS, then the other default extensions.
Add various comments to help future readers.
Update several plugin's
tests/*.mocha.[jt]s
files to import'blockly'
, not'blockly/node'
The latter has never been an advertised entrypoint, and will cease to be a valid entrypoint in v11 (see feat(build)!: Introduceexports
section inpackage.json
blockly#7822). Fortunately the'blockly'
entrypoint behaves the same as the'blockly/node'
entrypoint does in a node.js environment.Reason for Changes
webpack.config.js
.Test Coverage
The
build
,test
andstart
scripts for each plugin were tested against both Blockly v10.4.2 and Blockly v11.0.0.beta-3 + google/blockly#7822.Additional Information
BREAKING CHANGE: This PR removes the support that was added in PR #335 for acquiring Blockly directly from a
git://
URL.This feature was useful insofar as it enabled merging changes into
blockly-samples
that depend on changes in blockly that have not yet been published (even as a beta)—and still have tests pass. For this to work seamlessly, however, the code inwebpack.config.js
depended on apostinstall
script that was removed in PR #1630.When testing such PRs going forward use
npm link
for local testing and wait for changes to blockly to be publishedbefore merging the corresponding changes to
blockly-samples
—or wait for blockly to become a monorepo so both changes can be made in the same PR!