summaryrefslogtreecommitdiffhomepage
path: root/gui/tasks/scripts.js
blob: 36b9def82de6ddd7d8453c486106c81e0940c496 (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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const { exec } = require('child_process');
const fs = require('fs');
const { dest, series, parallel } = require('gulp');
const ts = require('gulp-typescript');
const inject = require('gulp-inject-string');
const sourcemaps = require('gulp-sourcemaps');
const TscWatchClient = require('tsc-watch/client');
const browserify = require('browserify');
const buffer = require('vinyl-buffer');
const source = require('vinyl-source-stream');

function makeWatchCompiler(onFirstSuccess, onSuccess) {
  let firstBuild = true;
  let lastBundle;
  let lastPreloadBundle;

  const compileScripts = function () {
    const watch = new TscWatchClient();
    watch.on('success', () =>
      parallel(
        makeBrowserifyRenderer(true),
        makeBrowserifyPreload(true),
      )(async () => {
        const wasFirstBuild = firstBuild;
        if (firstBuild) {
          firstBuild = false;
          onFirstSuccess();
        }

        let bundle = await fs.promises.readFile('./build/src/renderer/bundle.js');
        let preloadBundle = await fs.promises.readFile('./build/src/renderer/preloadBundle.js');
        if (
          !lastBundle ||
          !preloadBundle ||
          !lastBundle.equals(bundle) ||
          !lastPreloadBundle.equals(preloadBundle)
        ) {
          lastBundle = bundle;
          lastPreloadBundle = preloadBundle;
          !wasFirstBuild && onSuccess();
        }
      }),
    );
    watch.start(
      '--noClear',
      '--sourceMap',
      '--inlineSources',
      '--incremental',
      '--project',
      './tsconfig.dev.json',
    );
    return watch.tsc;
  };
  compileScripts.displayName = 'compile-scripts-watch';

  return compileScripts;
}

function compileScripts() {
  const tsProject = ts.createProject('tsconfig.json');

  return tsProject
    .src()
    .pipe(tsProject())
    .pipe(inject.replace('process.env.NODE_ENV', '"production"'))
    .pipe(dest('build'));
}

function makeBrowserifyRenderer(debug) {
  const browserifyRenderer = () => {
    let stream = browserify({ entries: './build/src/renderer/index.js', debug })
      .bundle()
      .pipe(source('bundle.js'))
      .pipe(buffer());

    if (debug) {
      stream = stream.pipe(sourcemaps.init({ loadMaps: true })).pipe(sourcemaps.write());
    }

    return stream.pipe(dest('./build/src/renderer/'));
  };

  browserifyRenderer.displayName = 'browserify-renderer';
  return browserifyRenderer;
}

function makeBrowserifyPreload(debug) {
  const browserifyPreload = () => {
    let stream = browserify({
      entries: './build/src/renderer/preload.js',
      debug,
      detectGlobals: false,
    })
      .exclude('electron')
      .bundle()
      .pipe(source('preloadBundle.js'))
      .pipe(buffer());

    if (debug) {
      stream = stream.pipe(sourcemaps.init({ loadMaps: true })).pipe(sourcemaps.write());
    }

    return stream.pipe(dest('./build/src/renderer/'));
  };

  browserifyPreload.displayName = 'browserify-preload';
  return browserifyPreload;
}

function buildProto(callback) {
  exec('bash ./scripts/build-proto.sh', (err) => callback(err));
}

compileScripts.displayName = 'compile-scripts';
buildProto.displayName = 'build-proto';

exports.build = series(
  compileScripts,
  parallel(makeBrowserifyPreload(false), makeBrowserifyRenderer(false)),
);
exports.buildProto = buildProto;
exports.makeWatchCompiler = makeWatchCompiler;