mirror of
https://github.com/google/blockly.git
synced 2026-01-10 02:17:09 +01:00
* fix(typings): Remove bogus .d.ts files; add new languages PR #3821 added .d.ts files for every file in msg/json/, but several of these are internal utility files rather than translations, and do not result in a langfile being output by create_messages.py when building langfiles. In the meantime we have added a few new languages that are being published but which have (until now) not had the corresponding type declarations. * feat(build)!: Add exports section to package.json Add an exports stanza to package.json, enumerating existing entrypoints in a new format. - The original main entrypoint, index.js, is removed since the exports section can point directly at node.js or browser.js. - No change made (yet) to other entrypoints (core, blocks, generators); these will be dealt with in a subsequent PR. - The msg/en entrypoint is included in the top-level package.json as an example; entries for all other languages created as part of the packageJSON package task. BREAKING CHANGE: The introduction of an exports stanza means that correctly-behaved tools (node.js, bundlers like webpack, etc.) will only allow importing of the specified entrypoints. Here is the full list of permitted entrypoints that can be imported or required: - blockly - blockly/core - blockly/blocks - blockly/dart - blockly/lua - blockly/javascript - blockly/php - blockly/python - blockly/msg/<lang>, for all supported language codes <lang> (e.g blockly/msg/en, blockly/msg/fr, blockly/msg/de, etc.) If you previously impored any other paths from the blockly package you will need to update your imports. Here are the most common paths that may have been used, and their correct replacements: | If you previously imported: | Import instead: | | -------------------------------- | -------------------------- | | blockly/index.js | blockly | | blockly/node.js | blockly | | blockly/browser.js | blockly | | blockly/blockly.min | This file should only be loaded as a <script>. | | blockly/core.js | blockly/core | | blockly/core-browser.js | blockly/core | | blockly/blockly_compressed.js | blockly/core | | blockly/blocks.js | blockly/blocks | | blockly/blocks_compressed.js | blockly/blocks | | blockly/dart.js | blockly/dart | | blockly/dart_compressed.js | blockly/dart | | blockly/lua.js | blockly/lua | | blockly/lua_compressed.js | blockly/lua | | blockly/javascript.js | blockly/javascript | | blockly/javascript_compressed.js | blockly/javascript | | blockly/php.js | blockly/php | | blockly/php_compressed.js | blockly/php | | blockly/python.js | blockly/python | | blockly/python_compressed.js | blockly/python | | blockly/msg/en.js | blockly/msg/en | * fix(build): Use package-paths (blockly/*) in wrapper imports Use 'blockly/core' instead of './core' when importing core into other wrappers (and similarly for other entries in package.json exports stanza), so that (e.g.) dist/javascript.js won't import dist/core.js (the node.js version that loads jsdom) when being loaded in a browser environment. This fixes an issue where blockly attempts to load jsdom even in browser environments because the browser stanza in package.json, which caused attempts to load core.js to load core-browser.js instead in browser environments, was removed in a previous commit. * refactor(build): Remove unnecessray wrappers Remove pointless wrapper modules that no longer server any purpose; use exports stanza in package.json to point directly to compiled chunks where possible. * refactor(build)!: Eliminate separate browser and node entrypoints Combine scripts/package/browser/index.js (becomes dist/browser.js) and scripts/package/node/index.js (becomes dist/node.js) into a single environment-agnostic index.js. BREAKING CHANGE: Historically, importing the main 'blockly' package would import 'blockly/core', 'blockly/blocks', 'blockly/en' and 'blockly/javascript' - and additionally, in node.js, also import 'blockly/dart', 'blockly/lua', 'blockly/php' and 'blockly/python'. Now the main 'blockly' package entrypoint never loads any of the generator modules. This change has been made because of changes to generator exports made in blockly v9.0.0 that make necessary to always separately import generator modules. Note that this change does not affect loading the blockly package via <script src="https://unpkg.com/blockly"; that continues to load to blockly.min.js, which includes javascript_compressed.js and (due to being loaded as a script) makes it available via Blockly.JavaScript. * refactor(build): Simplify core entrypoint wrapper for node.js Move scripts/package/node/core.js to scripts/package/core-node.js, and have it packaged as dist/core-node.js rather than dist/core.js - without a UMD wrapper, since it will always be loaded as a CJS module. * chore(build): Remove disused packageCommonJS helper * refactor(build): Use subpath pattern (wildcard) for msg/* exports Use a subpath pattern (wildcard) for the msg/* entrypoints, obviating the need for special handling in packageJSON. * fix(tests): Fix node tests run_node_test.js previously directly require()d the dist/blockly.js and dist/javascript.js wrapper module, which no longer exist. Change it to require('blockly-test') (and …blockly-test/javascript) and create a symlink ./node_modules/blocky-test -> dist/ to satisfy this. * fix(build): Add types: and default: entries to exports['./core'] In the 'blockly/core' export: - Replace the browser: entrypoint with a default: one. - Add a types: entrypoint for core.
210 lines
6.0 KiB
JavaScript
210 lines
6.0 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright 2018 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @fileoverview Gulp tasks to package Blockly for distribution on NPM.
|
|
*/
|
|
|
|
const gulp = require('gulp');
|
|
gulp.concat = require('gulp-concat');
|
|
gulp.replace = require('gulp-replace');
|
|
gulp.rename = require('gulp-rename');
|
|
gulp.insert = require('gulp-insert');
|
|
gulp.umd = require('gulp-umd');
|
|
gulp.replace = require('gulp-replace');
|
|
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const {rimraf} = require('rimraf');
|
|
const build = require('./build_tasks');
|
|
const {getPackageJson} = require('./helper_tasks');
|
|
const {BUILD_DIR, LANG_BUILD_DIR, RELEASE_DIR, TYPINGS_BUILD_DIR} = require('./config');
|
|
|
|
// Path to template files for gulp-umd.
|
|
const TEMPLATE_DIR = 'scripts/package/templates';
|
|
|
|
/**
|
|
* A helper method for wrapping a file into a Universal Module Definition.
|
|
* @param {string} namespace The export namespace.
|
|
* @param {Array<Object>} dependencies An array of dependencies to inject.
|
|
*/
|
|
function packageUMD(namespace, dependencies, template = 'umd.template') {
|
|
return gulp.umd({
|
|
dependencies: function () { return dependencies; },
|
|
namespace: function () { return namespace; },
|
|
exports: function () { return namespace; },
|
|
template: path.join(TEMPLATE_DIR, template)
|
|
});
|
|
};
|
|
|
|
/**
|
|
* This task wraps scripts/package/index.js into a UMD module.
|
|
*
|
|
* This module is the main entrypoint for the blockly package, and
|
|
* loads blockly/core, blockly/blocks and blockly/msg/en and then
|
|
* calls setLocale(en).
|
|
*/
|
|
function packageIndex() {
|
|
return gulp.src('scripts/package/index.js')
|
|
.pipe(packageUMD('Blockly', [{
|
|
name: 'Blockly',
|
|
amd: 'blockly/core',
|
|
cjs: 'blockly/core',
|
|
},{
|
|
name: 'en',
|
|
amd: 'blockly/msg/en',
|
|
cjs: 'blockly/msg/en',
|
|
global: 'Blockly.Msg',
|
|
},{
|
|
name: 'blocks',
|
|
amd: 'blockly/blocks',
|
|
cjs: 'blockly/blocks',
|
|
global: 'Blockly.Blocks',
|
|
}]))
|
|
.pipe(gulp.dest(RELEASE_DIR));
|
|
};
|
|
|
|
/**
|
|
* This task copies scripts/package/core-node.js into into the
|
|
* package. This module will be the 'blockly/core' entrypoint for
|
|
* node.js environments.
|
|
*
|
|
* Note that, unlike index.js, this file does not get a UMD wrapper.
|
|
* This is because it is only used in node.js environments and so is
|
|
* guaranteed to be loaded as a CJS module.
|
|
*/
|
|
function packageCoreNode() {
|
|
return gulp.src('scripts/package/core-node.js')
|
|
.pipe(gulp.dest(RELEASE_DIR));
|
|
};
|
|
|
|
/**
|
|
* This task wraps each of the files in ${BUILD_DIR/msg/ into a UMD module.
|
|
* @example import * as En from 'blockly/msg/en';
|
|
*/
|
|
function packageLocales() {
|
|
// Remove references to goog.provide and goog.require.
|
|
return gulp.src(`${LANG_BUILD_DIR}/*.js`)
|
|
.pipe(gulp.replace(/goog\.[^\n]+/g, ''))
|
|
.pipe(packageUMD('Blockly.Msg', [], 'umd-msg.template'))
|
|
.pipe(gulp.dest(`${RELEASE_DIR}/msg`));
|
|
};
|
|
|
|
/**
|
|
* This task creates a UMD bundle of Blockly which includes the Blockly
|
|
* core files, the built-in blocks, the JavaScript code generator and the
|
|
* English localization files.
|
|
* @example <script src="https://unpkg.com/blockly/blockly.min.js"></script>
|
|
*/
|
|
function packageUMDBundle() {
|
|
const srcs = [
|
|
`${RELEASE_DIR}/blockly_compressed.js`,
|
|
`${RELEASE_DIR}/msg/en.js`,
|
|
`${RELEASE_DIR}/blocks_compressed.js`,
|
|
`${RELEASE_DIR}/javascript_compressed.js`,
|
|
];
|
|
return gulp.src(srcs)
|
|
.pipe(gulp.concat('blockly.min.js'))
|
|
.pipe(gulp.dest(`${RELEASE_DIR}`));
|
|
};
|
|
|
|
/**
|
|
* This task copies all the media/* files into the release directory.
|
|
*/
|
|
function packageMedia() {
|
|
return gulp.src('media/*')
|
|
.pipe(gulp.dest(`${RELEASE_DIR}/media`));
|
|
};
|
|
|
|
/**
|
|
* This task copies the package.json file into the release directory,
|
|
* with modifications:
|
|
*
|
|
* - The scripts section is removed.
|
|
*
|
|
* Prerequisite: buildLangfiles.
|
|
*/
|
|
function packageJSON(cb) {
|
|
// Copy package.json, so we can safely modify it.
|
|
const json = JSON.parse(JSON.stringify(getPackageJson()));
|
|
// Remove unwanted entries.
|
|
delete json['scripts'];
|
|
// Write resulting package.json file to release directory.
|
|
if (!fs.existsSync(RELEASE_DIR)) {
|
|
fs.mkdirSync(RELEASE_DIR, {recursive: true});
|
|
}
|
|
fs.writeFileSync(`${RELEASE_DIR}/package.json`,
|
|
JSON.stringify(json, null, 2));
|
|
cb();
|
|
};
|
|
|
|
/**
|
|
* This task copies the scripts/package/README.md file into the
|
|
* release directory. This file is what developers will see at
|
|
* https://www.npmjs.com/package/blockly .
|
|
*/
|
|
function packageReadme() {
|
|
return gulp.src('scripts/package/README.md')
|
|
.pipe(gulp.dest(RELEASE_DIR));
|
|
};
|
|
|
|
/**
|
|
* This task copies the generated .d.ts files in build/declarations and the
|
|
* hand-written .d.ts files in typings/ into the release directory. The main
|
|
* entrypoint file (index.d.ts) is referenced in package.json in the types
|
|
* property.
|
|
*/
|
|
function packageDTS() {
|
|
const handwrittenSrcs = [
|
|
'typings/*.d.ts',
|
|
'typings/msg/*.d.ts',
|
|
];
|
|
return gulp.src(handwrittenSrcs, {base: 'typings'})
|
|
.pipe(gulp.src(`${TYPINGS_BUILD_DIR}/**/*.d.ts`, {ignore: [
|
|
`${TYPINGS_BUILD_DIR}/blocks/**/*`,
|
|
]}))
|
|
.pipe(gulp.replace('AnyDuringMigration', 'any'))
|
|
.pipe(gulp.dest(RELEASE_DIR));
|
|
};
|
|
|
|
/**
|
|
* This task cleans the release directory (by deleting it).
|
|
*/
|
|
function cleanReleaseDir() {
|
|
// Sanity check.
|
|
if (RELEASE_DIR === '.' || RELEASE_DIR === '/') {
|
|
return Promise.reject(`Refusing to rm -rf ${RELEASE_DIR}`);
|
|
}
|
|
return rimraf(RELEASE_DIR);
|
|
}
|
|
|
|
/**
|
|
* This task prepares the files to be included in the NPM by copying
|
|
* them into the release directory.
|
|
*
|
|
* Prerequisite: build.
|
|
*/
|
|
const package = gulp.series(
|
|
gulp.parallel(
|
|
build.cleanBuildDir,
|
|
cleanReleaseDir),
|
|
build.build,
|
|
gulp.parallel(
|
|
packageIndex,
|
|
packageCoreNode,
|
|
packageMedia,
|
|
gulp.series(packageLocales, packageUMDBundle),
|
|
packageJSON,
|
|
packageReadme,
|
|
packageDTS)
|
|
);
|
|
|
|
module.exports = {
|
|
// Main sequence targets. Each should invoke any immediate prerequisite(s).
|
|
cleanReleaseDir: cleanReleaseDir,
|
|
package: package,
|
|
};
|