mirror of
https://github.com/josdejong/mathjs.git
synced 2025-12-08 19:46:04 +00:00
* 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>
268 lines
6.6 KiB
JavaScript
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
|
|
))
|