aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/tensorboard/gulp_tasks/compile.js
blob: 01af60eba77d64b5d09dd53432ff188f3c2c919d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==============================================================================*/

const gulp = require('gulp');
const ts = require('gulp-typescript');
const typescript = require('typescript');
const gutil = require('gulp-util');
const filter = require('gulp-filter');
const merge = require('merge2');
const browserify = require('browserify');
const tsify = require('tsify');
const source = require('vinyl-source-stream');
const glob = require('glob').sync;
const concat = require('gulp-concat');

const tsProject = ts.createProject('./tsconfig.json', {
  typescript: typescript,
  noExternalResolve: true,  // opt-in for faster compilation!
});

/** List of components (and their external deps) that are using es6 modules. */
const ES6_COMPONENTS = [{
  name: 'vz_projector',
  deps: [
    'd3/d3.min.js', 'weblas/dist/weblas.js', 'three.js/build/three.min.js',
    'three.js/examples/js/controls/OrbitControls.js',
    'numericjs/lib/numeric-1.2.6.js'
  ]
}];

module.exports = function(includeDeps) {
  return function() {
    // Compile all components that are using ES6 modules into a bundle.js
    // using browserify.
    const entries = ['typings/index.d.ts'];
    const deps = {};
    ES6_COMPONENTS.forEach(function(component) {
      // Collect all the typescript files across the components.
      entries = entries.concat(glob(
          'components/' + component.name + '/**/*.ts',
          // Do not include tests or IDE-purposed files.
          {ignore: ['**/*_test.ts', '**/deps.d.ts']}));
      // Collect the unique external deps across all components using es6
      // modules.
      component.deps.forEach(function(dep) {
        deps['components/' + dep] = true;
      });
    });
    deps = Object.keys(deps);

    // Compile, bundle all the typescript files and prepend their deps.
    browserify(entries)
        .plugin(tsify)
        .bundle()
        .on('error', function(error) { console.error(error.toString()); })
        .pipe(source('bundle.js'))
        .pipe(gulp.dest('components'))
        .on('end', function() {
          // Typescript was compiled and bundled. Now we need to prepend
          // the external dependencies.
          if (includeDeps) {
            gulp.src(deps.concat(['components/bundle.js']))
                .pipe(concat('bundle.js'))
                .pipe(gulp.dest('components'));
          }
        });

    // Compile components that are using global namespaces producing 1 js file
    // for each ts file.
    const isComponent = filter([
      'components/tf_*/**/*.ts', 'components/vz_*/**/*.ts', 'typings/**/*.ts',
      'components/plottable/plottable.d.ts'
      // Ignore components that use es6 modules.
    ].concat(ES6_COMPONENTS.map(function(component) {
      return '!components/' + component.name + '/**/*.ts';
    })));

    return tsProject.src()
        .pipe(isComponent)
        .pipe(ts(tsProject))
        .js.pipe(gulp.dest('.'));
  };
};