mirror of
https://github.com/zhigang1992/Recoil.git
synced 2026-01-12 17:43:22 +08:00
281 lines
6.7 KiB
JavaScript
281 lines
6.7 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var packageData = require('./package.json');
|
|
var moduleMap = require('./scripts/module-map');
|
|
var fbjsConfigurePreset = require('babel-preset-fbjs/configure');
|
|
var del = require('del');
|
|
var gulpCheckDependencies = require('fbjs-scripts/gulp/check-dependencies');
|
|
var gulp = require('gulp');
|
|
var babel = require('gulp-babel');
|
|
var cleanCSS = require('gulp-clean-css');
|
|
var concatCSS = require('gulp-concat-css');
|
|
var derequire = require('gulp-derequire');
|
|
var flatten = require('gulp-flatten');
|
|
var header = require('gulp-header');
|
|
var gulpif = require('gulp-if');
|
|
var rename = require('gulp-rename');
|
|
var gulpUtil = require('gulp-util');
|
|
var StatsPlugin = require('stats-webpack-plugin');
|
|
var through = require('through2');
|
|
//var UglifyJsPlugin = require('uglifyjs-webpack-plugin');
|
|
var webpackStream = require('webpack-stream');
|
|
|
|
var paths = {
|
|
dist: 'dist',
|
|
lib: 'lib',
|
|
src: [
|
|
'src/**/*.js',
|
|
'!src/**/__tests__/**/*.js',
|
|
'!src/**/__mocks__/**/*.js',
|
|
],
|
|
css: ['src/**/*.css'],
|
|
};
|
|
|
|
var babelOptsJS = {
|
|
presets: [
|
|
fbjsConfigurePreset({
|
|
stripDEV: true,
|
|
rewriteModules: {map: moduleMap},
|
|
}),
|
|
],
|
|
plugins: [
|
|
require('@babel/plugin-proposal-nullish-coalescing-operator'),
|
|
require('@babel/plugin-proposal-optional-chaining'),
|
|
require('@babel/plugin-proposal-class-properties')
|
|
],
|
|
};
|
|
|
|
var babelOptsFlow = {
|
|
presets: [
|
|
fbjsConfigurePreset({
|
|
target: 'flow',
|
|
rewriteModules: {map: moduleMap},
|
|
}),
|
|
],
|
|
plugins: [
|
|
require('@babel/plugin-proposal-nullish-coalescing-operator'),
|
|
require('@babel/plugin-proposal-optional-chaining'),
|
|
require('@babel/plugin-proposal-class-properties')
|
|
],
|
|
};
|
|
|
|
var COPYRIGHT_HEADER = `/**
|
|
* Recoil v<%= version %>
|
|
*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
`;
|
|
|
|
var buildDist = function(opts) {
|
|
var webpackOpts = {
|
|
externals: {
|
|
immutable: {
|
|
root: 'Immutable',
|
|
commonjs2: 'immutable',
|
|
commonjs: 'immutable',
|
|
amd: 'immutable',
|
|
},
|
|
react: {
|
|
root: 'React',
|
|
commonjs2: 'react',
|
|
commonjs: 'react',
|
|
amd: 'react',
|
|
},
|
|
'react-dom': {
|
|
root: 'ReactDOM',
|
|
commonjs2: 'react-dom',
|
|
commonjs: 'react-dom',
|
|
amd: 'react-dom',
|
|
},
|
|
},
|
|
output: {
|
|
filename: opts.output,
|
|
libraryTarget: 'umd',
|
|
library: 'Recoil',
|
|
},
|
|
plugins: [
|
|
new webpackStream.webpack.DefinePlugin({
|
|
'process.env.NODE_ENV': JSON.stringify(
|
|
opts.debug ? 'development' : 'production',
|
|
),
|
|
}),
|
|
new webpackStream.webpack.LoaderOptionsPlugin({
|
|
debug: opts.debug,
|
|
}),
|
|
new StatsPlugin(`../meta/bundle-size-stats/${opts.output}.json`, {
|
|
chunkModules: true,
|
|
}),
|
|
],
|
|
};
|
|
/* if (!opts.debug) {
|
|
webpackOpts.plugins.push(new UglifyJsPlugin());
|
|
}*/
|
|
const wpStream = webpackStream(webpackOpts, null, function(err, stats) {
|
|
if (err) {
|
|
throw new gulpUtil.PluginError('webpack', err);
|
|
}
|
|
if (stats.compilation.errors.length) {
|
|
gulpUtil.log('webpack', '\n' + stats.toString({colors: true}));
|
|
}
|
|
});
|
|
return wpStream;
|
|
};
|
|
|
|
gulp.task(
|
|
'clean',
|
|
gulp.series(function() {
|
|
return del([paths.dist, paths.lib]);
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'modules',
|
|
gulp.series(function() {
|
|
return gulp
|
|
.src(paths.src)
|
|
.pipe(babel(babelOptsJS))
|
|
.pipe(flatten())
|
|
.pipe(gulp.dest(paths.lib));
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'flow',
|
|
gulp.series(function() {
|
|
return gulp
|
|
.src(paths.src)
|
|
.pipe(babel(babelOptsFlow))
|
|
.pipe(flatten())
|
|
.pipe(rename({extname: '.js.flow'}))
|
|
.pipe(gulp.dest(paths.lib));
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'css',
|
|
gulp.series(function() {
|
|
return (
|
|
gulp
|
|
.src(paths.css)
|
|
.pipe(
|
|
through.obj(function(file, encoding, callback) {
|
|
var contents = file.contents.toString();
|
|
var replaced = contents.replace(
|
|
// Regex based on MakeHasteCssModuleTransform: ignores comments,
|
|
// strings, and URLs
|
|
/\/\*.*?\*\/|'(?:\\.|[^'])*'|"(?:\\.|[^"])*"|url\([^)]*\)|(\.(?:public\/)?[\w-]*\/{1,2}[\w-]+)/g,
|
|
function(match, cls) {
|
|
if (cls) {
|
|
return cls.replace(/\//g, '-');
|
|
} else {
|
|
return match;
|
|
}
|
|
},
|
|
);
|
|
replaced = replaced.replace(
|
|
// MakeHasteCssVariablesTransform
|
|
/\bvar\(([\w-]+)\)/g,
|
|
function(match, name) {
|
|
var vars = {
|
|
'fig-secondary-text': '#9197a3',
|
|
'fig-light-20': '#bdc1c9',
|
|
};
|
|
if (vars[name]) {
|
|
return vars[name];
|
|
} else {
|
|
throw new Error('Unknown CSS variable ' + name);
|
|
}
|
|
},
|
|
);
|
|
file.contents = Buffer.from(replaced);
|
|
callback(null, file);
|
|
}),
|
|
)
|
|
.pipe(header(COPYRIGHT_HEADER, {version: packageData.version}))
|
|
.pipe(gulp.dest(paths.dist))
|
|
);
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'dist',
|
|
gulp.series('modules', 'css', function() {
|
|
var opts = {
|
|
debug: true,
|
|
output: 'Recoil.js',
|
|
};
|
|
return gulp
|
|
.src('./lib/Recoil.js')
|
|
.pipe(buildDist(opts))
|
|
.pipe(derequire())
|
|
.pipe(
|
|
gulpif(
|
|
'*.js',
|
|
header(COPYRIGHT_HEADER, {version: packageData.version}),
|
|
),
|
|
)
|
|
.pipe(gulp.dest(paths.dist));
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'dist:min',
|
|
gulp.series('modules', function() {
|
|
var opts = {
|
|
debug: false,
|
|
output: 'Recoil.min.js',
|
|
};
|
|
return gulp
|
|
.src('./lib/Recoil.js')
|
|
.pipe(buildDist(opts))
|
|
.pipe(
|
|
gulpif(
|
|
'*.js',
|
|
header(COPYRIGHT_HEADER, {version: packageData.version}),
|
|
),
|
|
)
|
|
.pipe(gulp.dest(paths.dist));
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'check-dependencies',
|
|
gulp.series(function() {
|
|
return gulp.src('package.json').pipe(gulpCheckDependencies());
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'watch',
|
|
gulp.series(function() {
|
|
gulp.watch(paths.src, gulp.parallel('modules'));
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'dev',
|
|
gulp.series(function() {
|
|
gulp.watch(paths.src, gulp.parallel('dist'));
|
|
}),
|
|
);
|
|
|
|
gulp.task(
|
|
'default',
|
|
gulp.series(
|
|
'check-dependencies',
|
|
'clean',
|
|
gulp.parallel('modules', 'flow'),
|
|
gulp.parallel('dist', 'dist:min'),
|
|
),
|
|
);
|