Skip to content

Commit

Permalink
build(): Refactor Gulpfile to TS
Browse files Browse the repository at this point in the history
  • Loading branch information
BrunnerLivio committed Aug 7, 2019
1 parent 202a572 commit 0686162
Show file tree
Hide file tree
Showing 16 changed files with 338 additions and 173 deletions.
173 changes: 11 additions & 162 deletions gulpfile.js
Original file line number Diff line number Diff line change
@@ -1,167 +1,16 @@
const fs = require('fs');
const path = require('path');
const gulp = require('gulp');
const ts = require('gulp-typescript');
const sourcemaps = require('gulp-sourcemaps');
const clean = require('gulp-clean');
const deleteEmpty = require('delete-empty');
const childProcess = require('child_process');
const log = require('fancy-log');
const clc = require('cli-color');
const promiseSeries = require('promise.series');

const { promisify } = require('util');

const exec = promisify(childProcess.exec);

const SAMPLE = path.join(__dirname, 'sample');
'use strict';
/**
* Load the TypeScript compiler, then load the TypeScript gulpfile which simply loads all
* the tasks. The tasks are really inside tools/gulp/tasks.
*/

const packages = {
common: ts.createProject('packages/common/tsconfig.json'),
core: ts.createProject('packages/core/tsconfig.json'),
microservices: ts.createProject('packages/microservices/tsconfig.json'),
websockets: ts.createProject('packages/websockets/tsconfig.json'),
testing: ts.createProject('packages/testing/tsconfig.json'),
'platform-express': ts.createProject(
'packages/platform-express/tsconfig.json',
),
'platform-fastify': ts.createProject(
'packages/platform-fastify/tsconfig.json',
),
'platform-socket.io': ts.createProject(
'packages/platform-socket.io/tsconfig.json',
),
'platform-ws': ts.createProject('packages/platform-ws/tsconfig.json'),
};
const modules = Object.keys(packages);
const source = 'packages';
const distId = process.argv.indexOf('--dist');
const dist = distId < 0 ? source : process.argv[distId + 1];

gulp.task('default', function() {
modules.forEach(module => {
gulp.watch(
[`${source}/${module}/**/*.ts`, `${source}/${module}/*.ts`],
[module],
);
});
});

gulp.task('copy-misc', function() {
return gulp
.src(['Readme.md', 'LICENSE', '.npmignore'])
.pipe(gulp.dest(`${source}/common`))
.pipe(gulp.dest(`${source}/core`))
.pipe(gulp.dest(`${source}/microservices`))
.pipe(gulp.dest(`${source}/websockets`))
.pipe(gulp.dest(`${source}/testing`))
.pipe(gulp.dest(`${source}/platform-fastify`))
.pipe(gulp.dest(`${source}/platform-express`))
.pipe(gulp.dest(`${source}/platform-ws`))
.pipe(gulp.dest(`${source}/platform-socket.io`));
});

gulp.task('clean:output', function() {
return gulp
.src(
[`${source}/**/*.js`, `${source}/**/*.d.ts`, `${source}/**/*.js.map`],
{
read: false,
},
)
.pipe(clean());
});

gulp.task('clean:dirs', function(done) {
deleteEmpty.sync(`${source}/`);
done();
});

gulp.task('clean:bundle', gulp.series('clean:output', 'clean:dirs'));

modules.forEach(module => {
gulp.task(module, () => {
return packages[module]
.src()
.pipe(packages[module]())
.pipe(gulp.dest(`${dist}/${module}`));
});
});

modules.forEach(module => {
gulp.task(module + ':dev', () => {
return packages[module]
.src()
.pipe(sourcemaps.init())
.pipe(packages[module]())
.pipe(
sourcemaps.mapSources(sourcePath => './' + sourcePath.split('/').pop()),
)
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(`${dist}/${module}`));
});
});

gulp.task('common:dev', gulp.series(modules.map(module => module + ':dev')));
gulp.task('build', gulp.series(modules));
gulp.task('build:dev', gulp.series('common:dev'));

function getFolders(dir) {
return fs.readdirSync(dir).filter(function(file) {
return fs.statSync(path.join(dir, file)).isDirectory();
});
}

const getDirs = base => getFolders(base).map(path => `${base}/${path}`);

gulp.task('install:samples', async () => {
const directories = getDirs(SAMPLE);

const promises = directories.map(async dir => {
const dirName = dir.replace(__dirname, '');
log.info(`Installing dependencies of ${clc.magenta(dirName)}`);
try {
await exec(`npm install --no-shrinkwrap --prefix ${dir}`);
log.info(`Finished installing ${clc.magenta(dirName)}`);
} catch (err) {
log.error(`Failed installing dependencies of ${dirName}`);
throw err;
}
});

return await promiseSeries(promises);
});

gulp.task('build:samples', async () => {
const directories = getDirs(SAMPLE);
const path = require('path');

const promises = directories.map(async dir => {
const dirName = dir.replace(__dirname, '');
log.info(`Building ${clc.magenta(dirName)}`);
try {
await exec(`npm run build --prefix ${dir}`);
log.info(`Finished building ${clc.magenta(dirName)}`);
} catch (err) {
log.error(`Failed building ${clc.magenta(dirName)}:`);
if (err.stdout) {
log.error(err.stdout);
}
throw err;
}
});
const projectDir = __dirname;
const tsconfigPath = path.join(projectDir, 'tools/gulp/tsconfig.json');

return await promiseSeries(promises);
require('ts-node').register({
project: tsconfigPath
});

gulp.task('move', function() {
const examplesDirs = getDirs('sample');
const integrationDirs = getDirs('integration');
const directories = examplesDirs.concat(integrationDirs);

let stream = gulp.src(['node_modules/@nestjs/**/*']);

directories.forEach(dir => {
stream = stream.pipe(gulp.dest(dir + '/node_modules/@nestjs'));
});
return stream;
});
require('./tools/gulp/gulpfile');
62 changes: 56 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
"@types/cors": "2.8.5",
"@types/express": "4.17.0",
"@types/fastify-cors": "2.1.0",
"@types/gulp": "^4.0.6",
"@types/kafka-node": "2.0.8",
"@types/mocha": "5.2.7",
"@types/node": "10.14.13",
Expand Down Expand Up @@ -121,7 +122,6 @@
"nodemon": "1.19.1",
"nyc": "14.1.1",
"prettier": "1.18.2",
"promise.series": "0.2.0",
"sinon": "7.3.2",
"sinon-chai": "3.3.0",
"socket.io-client": "2.2.0",
Expand Down
3 changes: 2 additions & 1 deletion sample/02-gateways/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"target": "es6",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./"
"baseUrl": "./",
"skipLibCheck": true
},
"exclude": ["node_modules"]
}
3 changes: 2 additions & 1 deletion sample/05-sql-typeorm/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"target": "es6",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./"
"baseUrl": "./",
"skipLibCheck": true
},
"exclude": ["node_modules"]
}
3 changes: 2 additions & 1 deletion sample/15-mvc/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"target": "es6",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./"
"baseUrl": "./",
"skipLibCheck": true
},
"exclude": ["node_modules"]
}
3 changes: 2 additions & 1 deletion sample/17-mvc-fastify/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
"target": "es6",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./"
"baseUrl": "./",
"skipLibCheck": true
},
"exclude": ["node_modules"]
}
8 changes: 8 additions & 0 deletions tools/gulp/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { getDirs } from './util/task-helpers';

// All paths are related to the base dir
export const source = 'packages';
export const integrationPath = 'integration';
export const samplePath = 'sample';

export const packagePaths = getDirs(source);
5 changes: 5 additions & 0 deletions tools/gulp/gulpfile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import './tasks/copy-misc';
import './tasks/clean';
import './tasks/packages';
import './tasks/move';
import './tasks/samples';
33 changes: 33 additions & 0 deletions tools/gulp/tasks/clean.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { task, src, series } from 'gulp';
import { source } from '../config';
import * as clean from 'gulp-clean';
import * as deleteEmpty from 'delete-empty';

/**
* Cleans the build output assets from the packages folders
*/
function cleanOutput() {
return src(
[
`${source}/**/*.js`,
`${source}/**/*.d.ts`,
`${source}/**/*.js.map`,
`${source}/**/*.d.ts.map`,
],
{
read: false,
},
).pipe(clean());
}

/**
* Cleans empty dirs
*/
function cleanDirs(done: () => void) {
deleteEmpty.sync(`${source}/`);
done();
}

task('clean:output', cleanOutput);
task('clean:dirs', cleanDirs);
task('clean:bundle', series('clean:output', 'clean:dirs'));
18 changes: 18 additions & 0 deletions tools/gulp/tasks/copy-misc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { task, src, dest } from 'gulp';
import { packagePaths } from '../config';

/**
* Copies assets like Readme.md or LICENSE from the project base path
* to all the packages.
*/
function copyMisc(): NodeJS.ReadWriteStream {
const miscFiles = src(['Readme.md', 'LICENSE', '.npmignore']);
// Since `dest()` does not take a string-array, we have to append it
// ourselves
return packagePaths.reduce(
(stream, packagePath) => stream.pipe(dest(packagePath)),
miscFiles,
);
}

task('copy-misc', copyMisc);
Loading

0 comments on commit 0686162

Please sign in to comment.