Fix #359 - Introduce build system based on Gulp

- Add Gulp and new dependencies to `package.json`
- Add `gulpfile.js` with four tasks:
    - `tsc`: For building TypeScript sources
    - `bundle`: For bundling JavaScript modules in a monolith
    - `sorcery`: For resolving the source map chains back to the original TypeScript files
    - `build` (`default`): Runs the whole `tsc` → `bundle` → `sorcery` chain
- Clean up `Dockerfile`, since `cpio` is not needed any more
- Clean up not needed dependencies from `package.json`
- Remove `bin/build`
- Update `bin/release` to use `npm run build` instead of `./bin/build`
This commit is contained in:
Paris Kasidiaris 2016-12-31 11:52:26 +02:00
parent fc528f6c0c
commit 081fe3f301
7 changed files with 111 additions and 53 deletions

View File

@ -1,11 +1,6 @@
FROM node:6.9 FROM node:6.9
MAINTAINER Paris Kasidiaris <paris@sourcelair.com> MAINTAINER Paris Kasidiaris <paris@sourcelair.com>
# Install cpio, used for building
RUN apt-get update \
&& apt-get install -y --no-install-recommends cpio \
&& rm -rf /var/lib/apt/lists/*
# Set the working directory # Set the working directory
WORKDIR /usr/src/app WORKDIR /usr/src/app

View File

@ -1,36 +0,0 @@
#! /usr/bin/env bash
set -e
# $BUILD_DIR should default to "build"
BUILD_DIR=${BUILD_DIR:=build}
# Create the build directory
mkdir -p $BUILD_DIR
# Clean lib/* to prevent confusion if files were deleted in src/
rm -rf lib/*
# Build all TypeScript files (including tests) to lib/
tsc
# Concat all xterm.js files into a single file and output as a UMD to $BUILD_DIR/xterm.js
browserify ./lib/xterm.js --standalone Terminal --debug --outfile ./$BUILD_DIR/xterm.js
cat ./$BUILD_DIR/xterm.js | exorcist ./$BUILD_DIR/xterm.js.map -b ./$BUILD_DIR > ./$BUILD_DIR/xterm.temp.js
rm ./$BUILD_DIR/xterm.js
mv ./$BUILD_DIR/xterm.temp.js ./$BUILD_DIR/xterm.js
# Resolve the chain of sourcemaps so that ./$BUILD_DIR/xterm.js.map points at ./src
sorcery -i $BUILD_DIR/xterm.js
# Copy all CSS files from src/ to $BUILD_DIR/ and lib/
cd src
find . -name '*.css' | cpio -pdm ../$BUILD_DIR
find . -name '*.css' | cpio -pdm ../lib
cd ..
# Copy addons from lib/ to $BUILD_DIR/
cd lib/addons
find . -name '*.js' | cpio -pdm ../../$BUILD_DIR/addons
cd ../..

View File

@ -21,7 +21,7 @@ CURRENT_BOWER_JSON_VERSION=$(cat bower.json \
# Build xterm.js into `dist` # Build xterm.js into `dist`
export BUILD_DIR=dist export BUILD_DIR=dist
./bin/build npm run build
# Update AUTHORS file # Update AUTHORS file
sh bin/generate-authors sh bin/generate-authors

87
gulpfile.js Normal file
View File

@ -0,0 +1,87 @@
const browserify = require('browserify');
const buffer = require('vinyl-buffer');
const fs = require('fs-extra');
const gulp = require('gulp');
const merge = require('merge-stream');
const sorcery = require('sorcery');
const source = require('vinyl-source-stream');
const sourcemaps = require('gulp-sourcemaps');
const ts = require('gulp-typescript');
const tsify = require('tsify');
let buildDir = process.env.BUILD_DIR || 'build';
/**
* Compile TypeScript sources to JavaScript files and create a source map file for each TypeScript
* file compiled.
*/
gulp.task('tsc', function () {
// Remove the lib/ directory to prevent confusion if files were deleted in src/
fs.emptyDirSync('lib');
// Build all TypeScript files (including tests) to lib/, based on the configuration defined in
// `tsconfig.json`.
let tsProject = ts.createProject('tsconfig.json');
let tsResult = tsProject.src().pipe(sourcemaps.init()).pipe(tsProject());
let tsc = tsResult.js.pipe(sourcemaps.write('.', {includeContent: false, sourceRoot: ''})).pipe(gulp.dest('lib'));
// Copy all addons from src/ to lib/
let copyAddons = gulp.src('src/addons/**/*').pipe(gulp.dest('lib/addons'));
// Copy stylesheets from src/ to lib/
let copyStylesheets = gulp.src('src/**/*.css').pipe(gulp.dest('lib'));
return merge(tsc, copyAddons, copyStylesheets);
});
/**
* Bundle JavaScript files produced by the `tsc` task, into a single file named `xterm.js` with
* Browserify.
*/
gulp.task('browserify', ['tsc'], function() {
// Ensure that the build directory exists
fs.ensureDirSync(buildDir);
let browserifyOptions = {
basedir: buildDir,
debug: true,
entries: ['../lib/xterm.js'],
standalone: 'Terminal',
cache: {},
packageCache: {}
};
let bundleStream = browserify(browserifyOptions)
.plugin(tsify)
.bundle()
.pipe(source('xterm.js'))
.pipe(buffer())
.pipe(sourcemaps.init({loadMaps: true, sourceRoot: '..'}))
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest(buildDir));
// Copy all add-ons from lib/ to buildDir
let copyAddons = gulp.src('lib/addons/**/*').pipe(gulp.dest(`${buildDir}/addons`));
// Copy stylesheets from src/ to lib/
let copyStylesheets = gulp.src('lib/**/*.css').pipe(gulp.dest(buildDir));
return merge(bundleStream, copyAddons, copyStylesheets);
});
/**
* Use `sorcery` to resolve the source map chain and point back to the TypeScript files.
* (Without this task the source maps produced for the JavaScript bundle points into the
* compiled JavaScript files in lib/).
*/
gulp.task('sorcery', ['browserify'], function () {
var chain = sorcery.loadSync(`${buildDir}/xterm.js`);
var map = chain.apply();
chain.writeSync();
});
gulp.task('build', ['sorcery']);
gulp.task('default', ['build']);

View File

@ -38,18 +38,26 @@
"browserify": "^13.1.0", "browserify": "^13.1.0",
"chai": "3.5.0", "chai": "3.5.0",
"docdash": "0.4.0", "docdash": "0.4.0",
"exorcist": "^0.4.0",
"express": "4.13.4", "express": "4.13.4",
"express-ws": "2.0.0-rc.1", "express-ws": "2.0.0-rc.1",
"fs-extra": "^1.0.0",
"glob": "^7.0.5", "glob": "^7.0.5",
"gulp": "^3.9.1",
"gulp-cli": "^1.2.2",
"gulp-sourcemaps": "^1.9.1",
"gulp-typescript": "^3.1.3",
"jsdoc": "3.4.3", "jsdoc": "3.4.3",
"merge-stream": "^1.0.1",
"mocha": "2.5.3", "mocha": "2.5.3",
"nodemon": "1.10.2", "nodemon": "1.10.2",
"pty.js": "0.3.1", "pty.js": "0.3.1",
"sleep": "^3.0.1", "sleep": "^3.0.1",
"sorcery": "^0.10.0", "sorcery": "^0.10.0",
"tsify": "^3.0.0",
"tslint": "^4.0.2", "tslint": "^4.0.2",
"typescript": "^2.0.3" "typescript": "^2.0.3",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0"
}, },
"scripts": { "scripts": {
"prestart": "npm run build", "prestart": "npm run build",
@ -58,7 +66,7 @@
"lint": "tslint src/**/*.ts", "lint": "tslint src/**/*.ts",
"test": "mocha --recursive ./lib", "test": "mocha --recursive ./lib",
"build:docs": "jsdoc -c jsdoc.json", "build:docs": "jsdoc -c jsdoc.json",
"build": "./bin/build", "build": "gulp build",
"prepublish": "npm run build" "prepublish": "npm run build"
} }
} }

View File

@ -10,13 +10,13 @@
* @license MIT * @license MIT
*/ */
import { CompositionHelper } from './CompositionHelper.js'; import { CompositionHelper } from './CompositionHelper';
import { EventEmitter } from './EventEmitter.js'; import { EventEmitter } from './EventEmitter';
import { Viewport } from './Viewport.js'; import { Viewport } from './Viewport';
import { rightClickHandler, pasteHandler, copyHandler } from './handlers/Clipboard.js'; import { rightClickHandler, pasteHandler, copyHandler } from './handlers/Clipboard';
import { CircularList } from './utils/CircularList.js'; import { CircularList } from './utils/CircularList';
import { C0 } from './EscapeSequences'; import { C0 } from './EscapeSequences';
import { CharMeasure } from './utils/CharMeasure.js'; import { CharMeasure } from './utils/CharMeasure';
import * as Browser from './utils/Browser'; import * as Browser from './utils/Browser';
import * as Keyboard from './utils/Keyboard'; import * as Keyboard from './utils/Keyboard';

View File

@ -7,13 +7,17 @@
"outDir": "lib", "outDir": "lib",
"sourceMap": true "sourceMap": true
}, },
"include": [
"src/**/*"
],
"exclude": [ "exclude": [
"addons", "src/addons/**/*",
"build", "build",
"demo", "demo",
"dist", "dist",
"out", "out",
"test", "test",
"node_modules" "node_modules",
"docs"
] ]
} }