gulp | use a Promise as a gulp task | Apply universal to angular project | Search

This Gulp script is a build script for an Angular project that automates tasks such as code replacement, file copying, and dependency resolution using various modules and functions. The script defines several Gulp tasks, including project relatives and server module, and uses the gulp-replace module to replace specific code patterns in JavaScript files.

Cell 2

var fs = require('fs');
var path = require('path');
var replace = require('gulp-replace');
var gulp = require('gulp');

// add automock to project for callback services
var client, renderer, server, core;

function applyUniversal(project) {
    // gulp.task('theme',
    //    gulp.src('./some/dir/**/*.js', {cwd: 'path/to/project'})
    //        .src('./specific-file.ts')) // already within cwd in chain?

    // TODO: copy auth, resolve dependencies using file system script, generate code below

    // replace package.json
    gulp.task(
        'project relatives',
        gulp.series(projectRelatives(project)))
    // in *.js Can't resolve 'socket.io-client/package'
    // in *.ts Cannot find name 'JwtHelper' -> trace back to import statements?


    gulp.task('server module', function () {
        return gulp.src(['**/server/app/app.server.module.js'], {cwd: project})
        // add mock socket server to server/render-server or app.server.module
            .pipe(replace('import { AppComponent } from \'./app.component\'', `
import { AppComponent } from './app.component';
import { AuthService } from '../../client/app/auth/auth.service';
import { LogService } from '../../imports/log.service';
import { AuthManager } from '../../client/app/auth/auth.manager';
import { JwtHelper } from 'angular2-jwt/angular2-jwt';
import { MailgunValidatorService } from '../../client/app/auth/mailgun-validate.service';
`))
            // TODO: pipe server.ts to add log provider for log service
            .pipe(replace(
                /\)\],\s*AppModule\s*,providers\s*:\s*\[/ig,
                `)],
        AppModule
    ],
    providers: [
        {
            provide: AuthService,
            useValue: require('./sockify-server').sockifyRequire(AuthService, 'AuthService')
        },
        {
            provide: PlatformLocation,
            useValue: require('./sockify-server').sockifyRequire(PlatformLocation, 'PlatformLocation')
        },
        {
            provide: LogService,
            useValue: require('./sockify-server').sockifyRequire(LogService, 'LogService')
        },
        {
            provide: AuthGuard,
            useValue: require('./sockify-server').sockifyRequire(AuthGuard, 'AuthGuard')
        },
        AuthManager, JwtHelper, MailgunValidatorService,

    `))
            .pipe(gulp.dest(project))
    });

    // add socket-client provider for auth module to app.browser.module
    gulp.task('browser module', function () {
        return gulp.src(['**/client/app/app.browser.module.ts'], {cwd: project})
            .pipe(replace('import { AppComponent } from \'./app.component\'', `
import { AppComponent } from './app.component';
import { AuthService } from './auth/auth.service';
import { PlatformLocation } from '@angular/common';
import { LogService } from '../../imports/log.service';
import { AuthManager } from './auth/auth.manager';
import { JwtHelper } from 'angular2-jwt/angular2-jwt';
import { MailgunValidatorService } from './auth/mailgun-validate.service';
`))
            .pipe(replace(
                /\)\],\s*AppModule/ig,
                `)],
        AppModule,
    ],
    providers: [ AuthManager, JwtHelper, MailgunValidatorService,
        {
            provide: AuthService,
            useValue: require('./sockify-client').sockifyClient(AuthService, 'AuthService'),
        },
        {
            provide: PlatformLocation,
            useValue: require('./sockify-client').sockifyClient(PlatformLocation, 'PlatformLocation'),
        },
`))
            .pipe(gulp.dest(project))
    });

    // replace routes with lazy modules from other projects
    gulp.task('app router', function () {
        return gulp.src(['**/client/app/app.routes.ts'], {cwd: project})
            .pipe(replace(
                /children: \[/ig,
                `children: [
            {
                path: 'auth',
                loadChildren: './auth/auth.module#AuthModule'
            },
`))
            .pipe(gulp.dest(project))
    });

    // TODO: try new versions of packages to act like greenkeeper.io

    // gulp apply everything
    gulp.task('apply universal',
        gulp.series('server module', 'browser module''app router'));

    return tasksToPromise(['apply universal'], []);
};
applyUniversal;

What the code could have been:

const fs = require('fs');
const path = require('path');
const glob = require('glob');
const { src, dest, series, watch, parallel, task } = require('gulp');
const replace = require('gulp-replace');
const { applyMock } = require('./utils');

function getRelativePath(project) {
  return (relativePath) => {
    return path.join(project, relativePath);
  };
}

function applyUniversal(project) {
  const projectRelative = getRelativePath(project);
  const authFile = projectRelative('client/app/auth/auth.service.ts');
  const browserModuleFile = projectRelative('client/app/app.browser.module.ts');
  const serverModuleFile = projectRelative('server/app/app.server.module.ts');

  task('replace package.json', () => {
    return src('package.json', { cwd: project })
     .pipe(replace('name', 'New App Name'))
     .pipe(replace('version', '1.0.0'))
     .pipe(dest(project));
  });

  task('apply auth', () => {
    return src(authFile, { cwd: project })
     .pipe(replace(/import { AuthService } from '/, `import { AuthService } from '${projectRelative('client/app/auth/auth.service.ts')}';`))
     .pipe(gulp.dest(project));
  });

  task('apply server module', () => {
    return src(serverModuleFile, { cwd: project })
     .pipe(replace(/import { AppComponent } from '\.\/app\.component/', `import { AppComponent } from '${projectRelative('client/app/app.component.ts')}';`))
     .pipe(replace(/providers:\s*\[/, `
        providers: [
          AuthService,
          LogService,
          AuthManager,
          JwtHelper,
          MailgunValidatorService,
        ],`))
     .pipe(replace(/MockSocketProvider,/, `MockSocketProvider, ${applyMock(AuthService, 'AuthService')}, ${applyMock(LogService, 'LogService')}, ${applyMock(AuthManager, 'AuthManager')}, ${applyMock(JwtHelper, 'JwtHelper')}, ${applyMock(MailgunValidatorService, 'MailgunValidatorService')} `))
     .pipe(gulp.dest(project));
  });

  task('apply browser module', () => {
    return src(browserModuleFile, { cwd: project })
     .pipe(replace(/import { AppComponent } from '\.\/app\.component/', `import { AppComponent } from '${projectRelative('client/app/app.component.ts')}';`))
     .pipe(replace(/providers:\s*\[/, `
        providers: [
          AuthService,
          LogService,
          AuthManager,
          JwtHelper,
          MailgunValidatorService,
        ],`))
     .pipe(replace(/MockSocketProvider,/, `MockSocketProvider, ${applyMock(AuthService, 'AuthService')}, ${applyMock(LogService, 'LogService')}, ${applyMock(AuthManager, 'AuthManager')}, ${applyMock(JwtHelper, 'JwtHelper')}, ${applyMock(MailgunValidatorService, 'MailgunValidatorService')} `))
     .pipe(gulp.dest(project));
  });

  task('apply app router', () => {
    return src(projectRelative('client/app/app.routes.ts'), { cwd: project })
     .pipe(replace(/children: \[/, `children: [
        {
          path: 'auth',
          loadChildren: './auth/auth.module#AuthModule'
        },`))
     .pipe(gulp.dest(project));
  });

  task('apply universal', series('apply auth', 'apply server module', 'apply browser module', 'apply app router'));

  return series('apply universal');
}

module.exports = applyUniversal;

Overview of the Code

This code is a Gulp script written in JavaScript. It appears to be a build script for an Angular project that uses the Gulp task runner. The script has several tasks that perform various operations such as:

Key Components

Code Snippets

Context