mathjs/gulpfile.cjs
Jos de Jong 6f00715754
Specify import require paths (continuation of #1941) (#1962)
* Add `.js` extension to source file imports

* Specify package `exports` in `package.json`

Specify package type as `commonjs` (It's good to be specific)

* Move all compiled scripts into `lib` directory

Remove ./number.js (You can use the compiled ones in `./lib/*`)

Tell node that the `esm` directory is type `module` and enable tree shaking.

Remove unused files from packages `files` property

* Allow importing of package.json

* Make library ESM first

* - Fix merge conflicts
- Refactor `bundleAny` into `defaultInstance.js` and `browserBundle.cjs`
- Refactor unit tests to be able to run with plain nodejs (no transpiling)
- Fix browser examples

* Fix browser and browserstack tests

* Fix running unit tests on Node 10 (which has no support for modules)

* Fix node.js examples (those are still commonjs)

* Remove the need for `browserBundle.cjs`

* Generate minified bundle only

* [Security] Bump node-fetch from 2.6.0 to 2.6.1 (#1963)

Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.6.0 to 2.6.1. **This update includes a security fix.**
- [Release notes](https://github.com/bitinn/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bitinn/node-fetch/compare/v2.6.0...v2.6.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

* Cleanup console.log

* Add integration tests to test the entry points (commonjs/esm, full/number only)

* Create backward compatibility error messages in the files moved/removed since v8

* Describe breaking changes in HISTORY.md

* Bump karma from 5.2.1 to 5.2.2 (#1965)

Bumps [karma](https://github.com/karma-runner/karma) from 5.2.1 to 5.2.2.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v5.2.1...v5.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>

Co-authored-by: Lee Langley-Rees <lee@greenimp.co.uk>
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-09-20 18:01:29 +02:00

268 lines
6.6 KiB
JavaScript

// @ts-nocheck
const fs = require('fs')
const path = require('path')
const gulp = require('gulp')
const del = require('del')
const log = require('fancy-log')
const webpack = require('webpack')
const babel = require('gulp-babel')
const mkdirp = require('mkdirp')
const docgenerator = require('./tools/docgenerator')
const entryGenerator = require('./tools/entryGenerator')
const validateAsciiChars = require('./tools/validateAsciiChars')
const SRC_DIR = path.join(__dirname, '/src')
const BUNDLE_ENTRY = `${SRC_DIR}/defaultInstance.js`
const HEADER = `${SRC_DIR}/header.js`
const VERSION = `${SRC_DIR}/version.js`
const COMPILE_SRC = `${SRC_DIR}/**/*.?(c)js`
const COMPILE_ENTRY_SRC = `${SRC_DIR}/entry/**/*.js`
const COMPILE_DIR = path.join(__dirname, '/lib')
const COMPILE_BROWSER = `${COMPILE_DIR}/browser`
const COMPILE_CJS = `${COMPILE_DIR}/cjs`
const COMPILE_ESM = `${COMPILE_DIR}/esm` // es modules
const COMPILE_ENTRY_LIB = `${COMPILE_CJS}/entry`
const FILE = 'math.js'
const REF_SRC = `${COMPILE_CJS}/`
const REF_DIR = path.join(__dirname, '/docs')
const REF_DEST = `${REF_DIR}/reference/functions`
const REF_ROOT = `${REF_DIR}/reference`
const MATH_JS = `${COMPILE_BROWSER}/${FILE}`
const COMPILED_HEADER = `${COMPILE_CJS}/header.js`
const PACKAGE_JSON_COMMONJS = '{\n "type": "commonjs"\n}\n'
// read the version number from package.json
function getVersion () {
return JSON.parse(String(fs.readFileSync('./package.json'))).version
}
// generate banner with today's date and correct version
function createBanner () {
const today = new Date().toISOString().substr(0, 10) // today, formatted as yyyy-mm-dd
const version = getVersion()
return String(fs.readFileSync(HEADER))
.replace('@@date', today)
.replace('@@version', version)
}
// generate a js file containing the version number
function updateVersionFile (done) {
const version = getVersion()
fs.writeFileSync(VERSION, `export const version = '${version}'
// Note: This file is automatically generated when building math.js.
// Changes made in this file will be overwritten.
`)
done()
}
const bannerPlugin = new webpack.BannerPlugin({
banner: createBanner(),
entryOnly: true,
raw: true
})
const webpackConfig = {
entry: BUNDLE_ENTRY,
mode: 'production',
performance: { hints: false }, // to hide the "asset size limit" warning
output: {
library: 'math',
libraryTarget: 'umd',
libraryExport: 'default',
path: COMPILE_BROWSER,
globalObject: 'this',
filename: FILE
},
externals: [
'crypto' // is referenced by decimal.js
],
plugins: [
bannerPlugin
// new webpack.optimize.ModuleConcatenationPlugin()
// TODO: ModuleConcatenationPlugin seems not to work. https://medium.com/webpack/webpack-3-official-release-15fd2dd8f07b
],
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: 'babel-loader'
}
]
},
devtool: 'source-map',
cache: true
}
// create a single instance of the compiler to allow caching
const compiler = webpack(webpackConfig)
function bundle (done) {
// update the banner contents (has a date in it which should stay up to date)
bannerPlugin.banner = createBanner()
compiler.run(function (err, stats) {
if (err) {
log(err)
done(err)
}
const info = stats.toJson()
if (stats.hasWarnings()) {
log('Webpack warnings:\n' + info.warnings.join('\n'))
}
if (stats.hasErrors()) {
log('Webpack errors:\n' + info.errors.join('\n'))
done(new Error('Compile failed'))
}
// create commonjs package.json file
fs.writeFileSync(path.join(COMPILE_BROWSER, 'package.json'), PACKAGE_JSON_COMMONJS)
log(`bundled ${MATH_JS}`)
done()
})
}
function compileCommonJs () {
// create a package.json file in the commonjs folder
mkdirp.sync(COMPILE_CJS)
fs.writeFileSync(path.join(COMPILE_CJS, 'package.json'), PACKAGE_JSON_COMMONJS)
return gulp.src(COMPILE_SRC)
.pipe(babel())
.pipe(gulp.dest(COMPILE_CJS))
}
function compileESModules () {
const babelOptions = JSON.parse(String(fs.readFileSync('./.babelrc')))
return gulp.src(COMPILE_SRC)
.pipe(babel({
...babelOptions,
presets: [
['@babel/preset-env', {
modules: false,
targets: {
esmodules: true
}
}]
]
}))
.pipe(gulp.dest(COMPILE_ESM))
}
function compileEntryFiles () {
return gulp.src(COMPILE_ENTRY_SRC)
.pipe(babel())
.pipe(gulp.dest(COMPILE_ENTRY_LIB))
}
function writeCompiledHeader (cb) {
fs.writeFileSync(COMPILED_HEADER, createBanner())
cb()
}
function validateAscii (done) {
const Reset = '\x1b[0m'
const BgRed = '\x1b[41m'
validateAsciiChars.getAllFiles(SRC_DIR)
.map(validateAsciiChars.validateChars)
.forEach(function (invalidChars) {
invalidChars.forEach(function (res) {
console.log(res.insideComment ? '' : BgRed,
'file:', res.filename,
'ln:' + res.ln,
'col:' + res.col,
'inside comment:', res.insideComment,
'code:', res.c,
'character:', String.fromCharCode(res.c),
Reset
)
})
})
done()
}
function generateDocs (done) {
const all = require(REF_SRC + 'defaultInstance').default
const functionNames = Object.keys(all)
.filter(key => typeof all[key] === 'function')
docgenerator.cleanup(REF_DEST, REF_ROOT)
docgenerator.iteratePath(functionNames, REF_SRC, REF_DEST, REF_ROOT)
done()
}
function generateEntryFiles (done) {
entryGenerator.generateEntryFiles()
done()
}
/**
* Remove generated files
*
* @returns {Promise<string[]> | *}
*/
function clean () {
return del([
// legacy compiled files
'./es/',
// generated browser bundle, esm code, and commonjs code
'./lib/',
// generated source files
'src/**/*.generated.js'
])
}
gulp.task('browser', bundle)
gulp.task('clean', clean)
gulp.task('docs', generateDocs)
// check whether any of the source files contains non-ascii characters
gulp.task('validate:ascii', validateAscii)
// The watch task (to automatically rebuild when the source code changes)
gulp.task('watch', function watch () {
const files = ['package.json', 'src/**/*.js']
const options = {
// ignore version.js else we get an infinite loop since it's updated during bundle
ignored: /version\.js/,
ignoreInitial: false,
delay: 100
}
gulp.watch(files, options, gulp.parallel(bundle, compileCommonJs))
})
// The default task (called when you run `gulp`)
gulp.task('default', gulp.series(
clean,
updateVersionFile,
compileCommonJs,
generateEntryFiles,
compileEntryFiles,
compileESModules, // Must be after generateEntryFiles
writeCompiledHeader,
bundle,
generateDocs
))