text: require('babel-register')
  const gulp = require('gulp')
  const eslint = require('gulp-eslint')
  const nodemon = require('gulp-nodemon')
  const rename = require('gulp-rename')
  const friendlyFormatter = require('eslint-friendly-formatter')
  const nunjucksRender = require('gulp-nunjucks-render');
  
  var jsScript = 'node'
  if (process.env.npm_config_argv !== undefined && process.env.npm_config_argv.indexOf('debug') > 0) {
    jsScript = 'node debug'
  }
  const CodeGenerateConfig = require('./codeGenerate/config').default;
  
  function lintOne(aims) {
    console.log('ESlint:' + aims)
    console.time('Finished eslint')
    return gulp.src(aims)
      .pipe(eslint({ configFile: './.eslintrc.js' }))
      .pipe(eslint.format(friendlyFormatter))
      .pipe(eslint.results(results => {
        // Called once for all ESLint results.
        console.log(`- Total Results: ${results.length}`)
        console.log(`- Total Warnings: ${results.warningCount}`)
        console.log(`- Total Errors: ${results.errorCount}`)
        console.timeEnd('Finished eslint')
      }))
  }
  
  gulp.task('ESlint', () => {
    return gulp.src(['src/**/*.js', '!node_modules/**'])
      .pipe(eslint({ configFile: './.eslintrc.js' }))
      .pipe(eslint.format(friendlyFormatter))
      // .pipe(eslint.failAfterError())
      .pipe(eslint.results(results => {
        // Called once for all ESLint results.
        console.log(`- Total Results: ${results.length}`)
        console.log(`- Total Warnings: ${results.warningCount}`)
        console.log(`- Total Errors: ${results.errorCount}`)
      }))
  })
  
  gulp.task('ESlint_nodemon', gulp.series('ESlint', function () {
    var stream = nodemon({
      script: 'build/dev-server.js',
      execMap: {
        js: jsScript
      },
      tasks: function (changedFiles) {
        lintOne(changedFiles)
        return []
      },
      verbose: true,
      ignore: ['build/*.js', 'dist/*.js', 'nodemon.json', '.git', 'node_modules/**/node_modules', 'gulpfile.js'],
      env: {
        NODE_ENV: 'development'
      },
      ext: 'js json'
    })
  
    return stream
      .on('restart', function () {
        // console.log('Application has restarted!')
      })
      .on('crash', function () {
        console.error('Application has crashed!\n')
        // stream.emit('restart', 20)  // restart the server in 20 seconds
      })
  }))
  
  gulp.task('nodemon', function () {
    return nodemon({
      script: 'build/dev-server.js',
      execMap: {
        js: jsScript
      },
      verbose: true,
      ignore: ['build/*.js', 'dist/*.js', 'nodemon.json', '.git', 'node_modules/**/node_modules', 'gulpfile.js', 'src/db', 'codeGenerate'],
      env: {
        NODE_ENV: 'development'
      },
      ext: 'js json'
    })
  })
  
  gulp.task('default', gulp.series('ESlint', 'ESlint_nodemon', function () {
    // console.log('ESlin检查完成')
  }))
  
  
  const nunjucksRenderConfig = {
    path: 'codeGenerate/serverTemplates',
    data: {
      model: CodeGenerateConfig.model,
      config: CodeGenerateConfig.config
    },
    envOptions: {
      tags: {
        blockStart: '<%',
        blockEnd: '%>',
        variableStart: '<$',
        variableEnd: '$>',
        commentStart: '<#',
        commentEnd: '#>'
      },
    },
    ext: '.js'
  }
  
  const BuildWeb = () => {
    gulp.src('codeGenerate/templates/schema/*.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(gulp.dest(ProjectRootPath + CodeGenerateConfig.config.SchemaRelativePath + CodeGenerateConfig.model.name));
  
    gulp.src('codeGenerate/templates/page.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(rename('index.jsx'))
      .pipe(gulp.dest(ProjectRootPath + CodeGenerateConfig.config.PageRelativePath));
  
    gulp.src('codeGenerate/templates/api.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(gulp.dest(ProjectRootPath + CodeGenerateConfig.config.ApiRelativePath));
  
    gulp.src('codeGenerate/templates/editModal.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(rename('edit' + CodeGenerateConfig.model.Name + 'ModalContent.jsx'))
      .pipe(gulp.dest(ProjectRootPath + CodeGenerateConfig.config.PageRelativePath));
  }
  
  const BuildServer = () => {
    gulp.src('codeGenerate/serverTemplates/route.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(rename('main-routes.js'))
      .pipe(gulp.dest(ServerProjectRootPath + CodeGenerateConfig.config.RouteRelativePath));
  
    gulp.src('codeGenerate/serverTemplates/controller.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(rename(Model.name + '.js'))
      .pipe(gulp.dest(ServerProjectRootPath + CodeGenerateConfig.config.ControllerRelativePath));
  
    gulp.src('codeGenerate/serverTemplates/service.njk')
      .pipe(nunjucksRender(nunjucksRenderConfig))
      .pipe(rename(Model.name + 'Service.js'))
      .pipe(gulp.dest(ServerProjectRootPath + CodeGenerateConfig.config.ServiceRelativePath));
  
  }
  
  const ProjectRootPath = CodeGenerateConfig.config.ProjectRootPath;
  const ServerProjectRootPath = CodeGenerateConfig.config.ServerRootPath;
  const Model = CodeGenerateConfig.model;
  
  gulp.task('code', function () {
  
    if (CodeGenerateConfig.config.Web) {
      BuildWeb();
    }
    //server
    if (CodeGenerateConfig.config.Server) {
      BuildServer();
    }
  
  });
  