Written build script for assets

This commit is contained in:
jos 2014-05-30 10:33:11 +02:00
parent 5f9d4a54a2
commit 955232d587
8 changed files with 110 additions and 219 deletions

View File

@ -1,197 +0,0 @@
/**
* Jake build script
*/
var jake = require('jake'),
CleanCSS = require('clean-css'),
archiver = require('archiver'),
fs = require('fs');
require('jake-utils');
// constants
var BUILD = './',
ASSET = BUILD + 'asset/',
BUILD_ACE = BUILD + 'asset/ace/',
BUILD_JSONLINT = BUILD + 'asset/jsonlint/',
JSONEDITOR = BUILD +'jsoneditor.js',
JSONEDITOR_CSS = BUILD + 'jsoneditor.css',
JSONEDITOR_MIN = BUILD + 'jsoneditor.min.js',
JSONEDITOR_CSS_MIN = BUILD + 'jsoneditor.min.css';
/**
* default task
*/
desc('Execute all tasks');
task('default', ['clear', 'build', 'minify'], function () {
console.log('Done');
});
/**
* build the library
*/
desc('Clear the asset directory');
task('clear', function () {
jake.rmRf(ASSET);
});
/**
* build the library
*/
desc('Build the library');
task('build', ['clear'], function () {
var jsoneditorSrc = './src/';
// concatenate the javascript files
concat({
src: [
jsoneditorSrc + 'js/JSONEditor.js',
jsoneditorSrc + 'js/TreeEditor.js',
jsoneditorSrc + 'js/TextEditor.js',
jsoneditorSrc + 'js/Node.js',
jsoneditorSrc + 'js/AppendNode.js',
jsoneditorSrc + 'js/ContextMenu.js',
jsoneditorSrc + 'js/History.js',
jsoneditorSrc + 'js/modebox.js',
jsoneditorSrc + 'js/SearchBox.js',
jsoneditorSrc + 'js/Highlighter.js',
jsoneditorSrc + 'js/util.js',
jsoneditorSrc + 'js/module.js'
],
dest: JSONEDITOR,
header: read(jsoneditorSrc +'js/header.js') + '\n' +
'(function () {\n',
separator: '\n',
footer: '\n})();\n'
});
// update version number and stuff in the javascript files
replacePlaceholders(JSONEDITOR);
console.log('Created ' + JSONEDITOR);
// concatenate and stringify the css files
concat({
src: [
jsoneditorSrc + 'css/jsoneditor.css',
jsoneditorSrc + 'css/contextmenu.css',
jsoneditorSrc + 'css/menu.css',
jsoneditorSrc + 'css/searchbox.css'
],
dest: JSONEDITOR_CSS,
separator: '\n'
});
console.log('Created ' + JSONEDITOR_CSS);
// minify the css file
write(JSONEDITOR_CSS_MIN, new CleanCSS().minify(String(read(JSONEDITOR_CSS))));
// create a folder img and copy the icons
jake.mkdirP('./img');
jake.cpR(jsoneditorSrc + 'css/img/jsoneditor-icons.png', './img/');
console.log('Copied jsoneditor-icons.png to ./img/');
// copy assets
// concatenate and copy ace files
var aceSrc = './node_modules/ace/build/src-min/';
jake.mkdirP(BUILD_ACE);
concat({
src: [
aceSrc + 'ace.js',
aceSrc + 'ext-searchbox.js',
aceSrc + 'mode-json.js',
aceSrc + 'theme-textmate.js',
jsoneditorSrc + 'js/ace/theme-jsoneditor.js'
],
dest: BUILD_ACE + 'ace.js',
separator: '\n'
});
jake.cpR(aceSrc + 'worker-json.js', BUILD_ACE);
// copy and minify json lint file
jake.mkdirP(BUILD_JSONLINT);
minify({
src: './node_modules/jsonlint/lib/jsonlint.js',
dest: BUILD_JSONLINT + 'jsonlint.js'
});
});
/**
* minify the library
*/
desc('Minify the library');
task('minify', ['build'], function () {
// minify javascript
minify({
src: JSONEDITOR,
dest: JSONEDITOR_MIN,
header: read('./src/js/header.js'),
separator: '\n'
});
// update version number and stuff in the javascript files
replacePlaceholders(JSONEDITOR_MIN);
console.log('Created ' + JSONEDITOR_MIN);
});
/**
* zip the library
*/
desc('Zip the library');
task('zip', ['build', 'minify'], {async: true}, function () {
var pkg = 'jsoneditor-' + version();
var zipfile = BUILD + pkg + '.zip';
jake.mkdirP(BUILD);
var output = fs.createWriteStream(zipfile);
var archive = archiver('zip');
archive.on('error', function(err) {
throw err;
});
archive.pipe(output);
var filelist = new jake.FileList();
filelist.include([
'README.md',
'NOTICE',
'LICENSE',
'HISTORY.md',
JSONEDITOR,
JSONEDITOR_CSS,
JSONEDITOR_MIN,
JSONEDITOR_CSS_MIN,
'img/*.*',
'lib/**/*.*',
'docs/**/*.*',
'examples/**/*.*'
]);
var files = filelist.toArray();
files.forEach(function (file) {
archive.append(fs.createReadStream(file), {
name: pkg + '/' + file
})
});
archive.finalize(function(err, written) {
if (err) {
throw err;
}
console.log('Zipped ' + zipfile);
complete();
});
});
/**
* replace version, date, and name placeholders in the provided file
* @param {String} filename
*/
var replacePlaceholders = function (filename) {
replace({
replacements: [
{pattern: '@@date', replacement: today()},
{pattern: '@@version', replacement: version()}
],
src: filename
});
};

View File

@ -96,25 +96,23 @@ download:
### Build ### Build
The code of the JSON Editor is located in the folder `src`. To build The code of the JSON Editor is located in the folder `./src`. To build
jsoneditor: jsoneditor:
- Install dependencies: - Install dependencies:
npm install npm install
- Build Ace editor:
cd node_modules/ace
npm install
node ./Makefile.dryice.js -m
cd ../..
This generates the ace editor files in the folder `node_modules/ace/build`.
- Build JSON Editor: - Build JSON Editor:
npm run build npm run build
This will generate the files `jsoneditor.js`, `jsoneditor.css`, and minified This will generate the files `./jsoneditor.js`, `./jsoneditor.css`, and
versions in the root of the project. minified versions in the root of the project.
- To rebuild the assets (not necessary):
npm run build-assets
This will build Ace editor, and then generates necessary ace editor files in
the folder `./asset/ace`, and jsonlint in the folder `./asset/jsonlint`.

View File

@ -146,4 +146,3 @@ background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZ
var dom = require("../lib/dom"); var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass); dom.importCssString(exports.cssText, exports.cssClass);
}); });

View File

@ -133,7 +133,7 @@ var options = {
"mode": "tree", "mode": "tree",
"search": true "search": true
}; };
var editor = new JSONEditor (container, options); var editor = new JSONEditor(container, options);
var json = { var json = {
"Array": [1, 2, 3], "Array": [1, 2, 3],
"Boolean": true, "Boolean": true,
@ -155,7 +155,7 @@ var options = {
"mode": "text", "mode": "text",
"indentation": 2 "indentation": 2
}; };
var editor = new JSONEditor (container, options); var editor = new JSONEditor(container, options);
var json = { var json = {
"Array": [1, 2, 3], "Array": [1, 2, 3],
"Boolean": true, "Boolean": true,

View File

@ -1,8 +1,13 @@
var fs = require('fs'), var fs = require('fs'),
gulp = require('gulp'), gulp = require('gulp'),
gutil = require('gulp-util'), gutil = require('gulp-util'),
concat = require('gulp-concat'),
concatCss = require('gulp-concat-css'), concatCss = require('gulp-concat-css'),
minifyCSS = require('gulp-minify-css'), minifyCSS = require('gulp-minify-css'),
clean = require('gulp-clean'),
shell = require('gulp-shell'),
merge = require('merge-stream'),
mkdirp = require('mkdirp'),
webpack = require('webpack'), webpack = require('webpack'),
uglify = require('uglify-js'); uglify = require('uglify-js');
@ -16,7 +21,9 @@ var ENTRY = './src/js/JSONEditor.js',
JSONEDITOR_MIN_JS = DIST + FILE_MIN, JSONEDITOR_MIN_JS = DIST + FILE_MIN,
JSONEDITOR_MAP_JS = DIST + FILE_MAP, JSONEDITOR_MAP_JS = DIST + FILE_MAP,
JSONEDITOR_CSS = DIST + 'jsoneditor.css', JSONEDITOR_CSS = DIST + 'jsoneditor.css',
JSONEDITOR_MIN_CSS = DIST + 'jsoneditor.min.css'; JSONEDITOR_MIN_CSS = DIST + 'jsoneditor.min.css',
DIST_ACE = './asset/ace/',
DIST_JSONLINT = './asset/jsonlint/';
// generate banner with today's date and correct version // generate banner with today's date and correct version
function createBanner() { function createBanner() {
@ -55,10 +62,12 @@ var uglifyConfig = {
// create a single instance of the compiler to allow caching // create a single instance of the compiler to allow caching
var compiler = webpack(webpackConfig); var compiler = webpack(webpackConfig);
gulp.task('bundle', function (cb) { gulp.task('bundle', function (done) {
// update the banner contents (has a date in it which should stay up to date) // update the banner contents (has a date in it which should stay up to date)
bannerPlugin.banner = createBanner(); bannerPlugin.banner = createBanner();
// TODO: split this task in three tasks? bundle-js, bundle-css, bundle-img
// bundle javascript // bundle javascript
compiler.run(function (err, stats) { compiler.run(function (err, stats) {
if (err) { if (err) {
@ -67,7 +76,7 @@ gulp.task('bundle', function (cb) {
gutil.log('bundled ' + JSONEDITOR_JS); gutil.log('bundled ' + JSONEDITOR_JS);
cb(); done();
}); });
// bundle css // bundle css
@ -86,6 +95,11 @@ gulp.task('bundle', function (cb) {
gutil.log('bundled ' + JSONEDITOR_CSS); gutil.log('bundled ' + JSONEDITOR_CSS);
gutil.log('bundled ' + JSONEDITOR_MIN_CSS); gutil.log('bundled ' + JSONEDITOR_MIN_CSS);
// create a folder img and copy the icons
mkdirp.sync('./img');
gulp.src('./src/css/img/jsoneditor-icons.png')
.pipe(gulp.dest('./img/'));
gutil.log('Copied jsoneditor-icons.png to ./img/');
}); });
gulp.task('minify', ['bundle'], function () { gulp.task('minify', ['bundle'], function () {
@ -99,9 +113,80 @@ gulp.task('minify', ['bundle'], function () {
}); });
gulp.task('asset-clean', function () {
return gulp.src('./asset', {read: false})
.pipe(clean());
});
// TODO: bundle and minify assets gulp.task('build-ace', shell.task([
// see https://github.com/ajaxorg/ace/#building-ace
'cd ./node_modules/ace/; '+
'npm install; ' +
'node ./Makefile.dryice.js -m; ' +
'cd ../..'
]));
gulp.task('asset-ace', ['build-ace', 'asset-clean'], function () {
// concatenate and copy ace files
var aceSrc = './node_modules/ace/build/src-min/';
mkdirp.sync(DIST_ACE);
// TODO: throw an error when aceSrc is missing?
return merge(
gulp.src([
aceSrc + 'ace.js',
aceSrc + 'ext-searchbox.js',
aceSrc + 'mode-json.js',
aceSrc + 'theme-textmate.js',
'./src/js/ace/theme-jsoneditor.js'
])
.pipe(concat('ace.js'))
.pipe(gulp.dest(DIST_ACE)),
gulp.src(aceSrc + 'worker-json.js')
.pipe(gulp.dest(DIST_ACE))
);
});
gulp.task('asset-jsonlint', ['asset-clean'], function (done) {
// copy and minify json lint file
mkdirp.sync(DIST_JSONLINT);
var result = uglify.minify(['./node_modules/jsonlint/lib/jsonlint.js']);
fs.writeFileSync(DIST_JSONLINT + 'jsonlint.js', result.code);
gutil.log('Minified ' + DIST_JSONLINT + 'jsonlint.js');
done();
});
gulp.task('build-assets', ['asset-clean', 'asset-ace', 'asset-jsonlint'], function () {});
// TODO: create zip file?
//gulp.task('zip', ['bundle', 'minify'], function () {
// var pkg = 'jsoneditor-' + require('./package.json').version;
// var file = BUILD + pkg + '.zip';
//
// var zip = require('gulp-zip');
//
// gulp.task('default', function () {
// gulp.src([
// 'README.md',
// 'NOTICE',
// 'LICENSE',
// 'HISTORY.md',
// JSONEDITOR_JS,
// JSONEDITOR_CSS,
// JSONEDITOR_MIN_JS,
// JSONEDITOR_MAP_JS,
// JSONEDITOR_MIN_CSS,
// 'img/*.*',
// 'asset/**/*.*',
// 'docs/**/*.*',
// 'examples/**/*.*'
// ])
// .pipe(zip(file))
// .pipe(gulp.dest('.'));
// });
//});
// The default task (called when you run `gulp`) // The default task (called when you run `gulp`)
gulp.task('default', ['bundle', 'minify']); gulp.task('default', ['bundle', 'minify']);

View File

@ -24,7 +24,7 @@
* *
* @author Jos de Jong, <wjosdejong@gmail.com> * @author Jos de Jong, <wjosdejong@gmail.com>
* @version 3.0.0-SNAPSHOT * @version 3.0.0-SNAPSHOT
* @date 2014-05-29 * @date 2014-05-30
*/ */
(function webpackUniversalModuleDefinition(root, factory) { (function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object') if(typeof exports === 'object' && typeof module === 'object')

2
jsoneditor.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -17,16 +17,22 @@
}, },
"bugs": "https://github.com/josdejong/jsoneditor/issues", "bugs": "https://github.com/josdejong/jsoneditor/issues",
"scripts": { "scripts": {
"build": "gulp" "build": "gulp",
"build-assets": "gulp build-assets"
}, },
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {
"ace": "git://github.com/ajaxorg/ace.git", "ace": "git://github.com/ajaxorg/ace.git",
"gulp": "latest", "gulp": "latest",
"gulp-clean": "^0.3.0",
"gulp-concat": "^2.2.0",
"gulp-concat-css": "^0.1.4", "gulp-concat-css": "^0.1.4",
"gulp-minify-css": "^0.3.4", "gulp-minify-css": "^0.3.4",
"gulp-shell": "^0.2.5",
"gulp-util": "latest", "gulp-util": "latest",
"jsonlint": "latest", "jsonlint": "latest",
"merge-stream": "^0.1.1",
"mkdirp": "^0.5.0",
"uglify-js": "latest", "uglify-js": "latest",
"webpack": "latest" "webpack": "latest"
} }