@theia/application-manager 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"webpack-generator.d.ts","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAIlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,gBAAiB,SAAQ,iBAAiB;IAE7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;cAOf,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAC;IAQnE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3D,SAAS,CAAC,oBAAoB,IAAI,MAAM;IAsKxC,SAAS,CAAC,wBAAwB,IAAI,MAAM;CAoB/C"}
1
+ {"version":3,"file":"webpack-generator.d.ts","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAIlF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,qBAAa,gBAAiB,SAAQ,iBAAiB;IAE7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;cAOf,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAC;IAQnE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3D,SAAS,CAAC,oBAAoB,IAAI,MAAM;IAoKxC,SAAS,CAAC,wBAAwB,IAAI,MAAM;CAoB/C"}
@@ -53,7 +53,7 @@ const webpack = require('webpack');
53
53
  const yargs = require('yargs');
54
54
  const CopyWebpackPlugin = require('copy-webpack-plugin');
55
55
  const CircularDependencyPlugin = require('circular-dependency-plugin');
56
- const CompressionPlugin = require('@theia/compression-webpack-plugin')
56
+ const CompressionPlugin = require('compression-webpack-plugin')
57
57
 
58
58
  const outputPath = path.resolve(__dirname, 'lib');
59
59
  const { mode, staticCompression } = yargs.option('mode', {
@@ -83,10 +83,7 @@ const plugins = [
83
83
  ];
84
84
  // it should go after copy-plugin in order to compress monaco as well
85
85
  if (staticCompression) {
86
- plugins.push(new CompressionPlugin({
87
- // enable reuse of compressed artifacts for incremental development
88
- cache: development
89
- }));
86
+ plugins.push(new CompressionPlugin({}));
90
87
  }
91
88
  plugins.push(new CircularDependencyPlugin({
92
89
  exclude: /(node_modules|examples)[\\\\|\/]./,
@@ -103,6 +100,7 @@ module.exports = {
103
100
  path: outputPath
104
101
  },
105
102
  target: '${this.ifBrowser('web', 'electron-renderer')}',
103
+ cache: staticCompression,
106
104
  module: {
107
105
  rules: [
108
106
  {
@@ -1 +1 @@
1
- {"version":3,"file":"webpack-generator.js","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;;AAElF,8BAA8B;AAC9B,+BAA+B;AAC/B,6DAAyD;AAEzD,MAAa,gBAAiB,SAAQ,sCAAiB;IAEnD,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,CAAC,+BAA+B,EAAE,EAAE;YAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;SACtE;IACL,CAAC;IAES,KAAK,CAAC,+BAA+B;QAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC;SACf;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IAES,OAAO,CAAC,UAAkB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;IAES,oBAAoB;QAC1B,OAAO;;+CAEgC,IAAI,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;6CAoBjB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;8CAEnB,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,IAAI,CAAC;;;;qBAI5I,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAG/B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA4BI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA8F5B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAGvC,CAAC;;;;;;GAMR,CAAC;IACA,CAAC;IAES,wBAAwB;QAC9B,OAAO;;;;;4BAKa,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;;;;;;;;;;;yBAWrC,CAAC;IACtB,CAAC;CAEJ;AAvND,4CAuNC"}
1
+ {"version":3,"file":"webpack-generator.js","sourceRoot":"","sources":["../../src/generator/webpack-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;kFAckF;;;AAElF,8BAA8B;AAC9B,+BAA+B;AAC/B,6DAAyD;AAEzD,MAAa,gBAAiB,SAAQ,sCAAiB;IAEnD,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,IAAI,CAAC,+BAA+B,EAAE,EAAE;YAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;SACtE;IACL,CAAC;IAES,KAAK,CAAC,+BAA+B;QAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC;SACf;QACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IAES,OAAO,CAAC,UAAkB,EAAE,IAAY;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;IAES,oBAAoB;QAC1B,OAAO;;+CAEgC,IAAI,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;6CAoBjB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;8CAEnB,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC,IAAI,CAAC;;;;qBAI5I,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAG/B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;eAyBI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA+F5B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;;;UAGvC,CAAC;;;;;;GAMR,CAAC;IACA,CAAC;IAES,wBAAwB;QAC9B,OAAO;;;;;4BAKa,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;;;;;;;;;;;yBAWrC,CAAC;IACtB,CAAC;CAEJ;AArND,4CAqNC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAMlF,oBAAY,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnD,eAAO,MAAM,eAAe,UAM3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB,GAAG,IAAI,CAcjF"}
1
+ {"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAOlF,oBAAY,aAAa,GAAG,UAAU,GAAG,SAAS,CAAC;AASnD,eAAO,MAAM,eAAe,UAM3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB,GAAG,IAAI,CAsBjF"}
package/lib/rebuild.js CHANGED
@@ -19,6 +19,8 @@ exports.rebuild = exports.DEFAULT_MODULES = void 0;
19
19
  const cp = require("child_process");
20
20
  const fs = require("fs-extra");
21
21
  const path = require("path");
22
+ const os = require("os");
23
+ const EXIT_SIGNALS = ['SIGINT', 'SIGTERM'];
22
24
  exports.DEFAULT_MODULES = [
23
25
  '@theia/node-pty',
24
26
  'nsfw',
@@ -34,15 +36,24 @@ function rebuild(target, options = {}) {
34
36
  const { modules = exports.DEFAULT_MODULES, cacheRoot = process.cwd(), } = options;
35
37
  const cache = path.resolve(cacheRoot, '.browser_modules');
36
38
  const cacheExists = folderExists(cache);
37
- if (target === 'electron' && !cacheExists) {
38
- rebuildElectronModules(cache, modules);
39
- }
40
- else if (target === 'browser' && cacheExists) {
41
- revertBrowserModules(cache, modules);
42
- }
43
- else {
44
- console.log(`native node modules are already rebuilt for ${target}`);
45
- }
39
+ guardExit(async (token) => {
40
+ if (target === 'electron' && !cacheExists) {
41
+ process.exitCode = await rebuildElectronModules(cache, modules, token);
42
+ }
43
+ else if (target === 'browser' && cacheExists) {
44
+ process.exitCode = await revertBrowserModules(cache, modules);
45
+ }
46
+ else {
47
+ console.log(`native node modules are already rebuilt for ${target}`);
48
+ }
49
+ }).catch(errorOrSignal => {
50
+ if (typeof errorOrSignal === 'string' && errorOrSignal in os.constants.signals) {
51
+ process.kill(process.pid, errorOrSignal);
52
+ }
53
+ else {
54
+ throw errorOrSignal;
55
+ }
56
+ });
46
57
  }
47
58
  exports.rebuild = rebuild;
48
59
  function folderExists(folder) {
@@ -56,11 +67,11 @@ function folderExists(folder) {
56
67
  }
57
68
  return false;
58
69
  }
59
- async function rebuildElectronModules(browserModuleCache, modules) {
70
+ async function rebuildElectronModules(browserModuleCache, modules, token) {
60
71
  const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
61
- const modulesJson = await fs.access(modulesJsonPath).then(exists => fs.readJSON(modulesJsonPath), missing => ({}));
72
+ const modulesJson = await fs.access(modulesJsonPath).then(() => fs.readJson(modulesJsonPath), () => ({}));
62
73
  let success = true;
63
- // backup already-built browser modules
74
+ // Backup already built browser modules.
64
75
  await Promise.all(modules.map(async (module) => {
65
76
  let modulePath;
66
77
  try {
@@ -70,13 +81,13 @@ async function rebuildElectronModules(browserModuleCache, modules) {
70
81
  }
71
82
  catch (_) {
72
83
  console.debug(`Module not found: ${module}`);
73
- return; // Skip
84
+ return; // Skip current module.
74
85
  }
75
86
  const src = path.dirname(modulePath);
76
87
  const dest = path.join(browserModuleCache, module);
77
88
  try {
78
89
  await fs.remove(dest);
79
- await fs.copy(src, dest);
90
+ await fs.copy(src, dest, { overwrite: true });
80
91
  modulesJson[module] = {
81
92
  originalLocation: src,
82
93
  };
@@ -89,68 +100,196 @@ async function rebuildElectronModules(browserModuleCache, modules) {
89
100
  }));
90
101
  if (Object.keys(modulesJson).length === 0) {
91
102
  console.debug('No module to rebuild.');
92
- process.exit(0);
103
+ return 0;
93
104
  }
94
- // update manifest tracking the backups original locations
95
- await fs.writeJSON(modulesJsonPath, modulesJson, { spaces: 2 });
96
- // if we failed to process a module then exit now
105
+ // Update manifest tracking the backups' original locations.
106
+ await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
107
+ // If we failed to process a module then exit now.
97
108
  if (!success) {
98
- process.exit(1);
109
+ return 1;
99
110
  }
100
- // rebuild for electron
101
- const todo = modules
102
- .map(m => {
111
+ const todo = modules.map(m => {
103
112
  // electron-rebuild ignores the module namespace...
104
113
  const slash = m.indexOf('/');
105
114
  return m.startsWith('@') && slash !== -1
106
115
  ? m.substring(slash + 1)
107
116
  : m;
108
- })
109
- .join(',');
110
- await new Promise((resolve, reject) => {
111
- const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
112
- stdio: 'inherit',
113
- shell: true,
114
- });
115
- electronRebuild.on('error', reject);
116
- electronRebuild.on('close', (code, signal) => {
117
- if (code || signal) {
118
- reject(`electron-rebuild exited with "${code || signal}"`);
119
- }
120
- else {
121
- resolve();
122
- }
123
- });
124
117
  });
118
+ try {
119
+ if (process.env.THEIA_REBUILD_NO_WORKAROUND) {
120
+ return await runElectronRebuild(todo, token);
121
+ }
122
+ else {
123
+ return await electronRebuildExtraModulesWorkaround(process.cwd(), todo, () => runElectronRebuild(todo, token), token);
124
+ }
125
+ }
126
+ catch (error) {
127
+ return revertBrowserModules(browserModuleCache, modules);
128
+ }
125
129
  }
126
130
  async function revertBrowserModules(browserModuleCache, modules) {
131
+ let exitCode = 0;
127
132
  const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
128
- const modulesJson = await fs.readJSON(modulesJsonPath);
133
+ const modulesJson = await fs.readJson(modulesJsonPath);
129
134
  await Promise.all(Object.entries(modulesJson).map(async ([moduleName, entry]) => {
130
135
  if (!modules.includes(moduleName)) {
131
- return; // skip modules that weren't requested
136
+ return; // Skip modules that weren't requested.
132
137
  }
133
138
  const src = path.join(browserModuleCache, moduleName);
139
+ if (!await fs.pathExists(src)) {
140
+ delete modulesJson[moduleName];
141
+ console.error(`Missing backup for ${moduleName}!`);
142
+ exitCode = 1;
143
+ return;
144
+ }
134
145
  const dest = entry.originalLocation;
135
146
  try {
136
147
  await fs.remove(dest);
137
- await fs.copy(src, dest);
148
+ await fs.copy(src, dest, { overwrite: false });
138
149
  await fs.remove(src);
139
150
  delete modulesJson[moduleName];
140
151
  console.debug(`Reverted "${moduleName}"`);
141
152
  }
142
153
  catch (error) {
143
154
  console.error(`Error while reverting "${moduleName}": ${error}`);
144
- process.exitCode = 1;
155
+ exitCode = 1;
145
156
  }
146
157
  }));
147
158
  if (Object.keys(modulesJson).length === 0) {
148
- // we restored everything so we can delete the cache
159
+ // We restored everything, so we can delete the cache.
149
160
  await fs.remove(browserModuleCache);
150
161
  }
151
162
  else {
152
- // some things were not restored so we update the manifest
153
- await fs.writeJSON(modulesJsonPath, modulesJson, { spaces: 2 });
163
+ // Some things were not restored, so we update the manifest.
164
+ await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
165
+ }
166
+ return exitCode;
167
+ }
168
+ async function runElectronRebuild(modules, token) {
169
+ const todo = modules.join(',');
170
+ return new Promise((resolve, reject) => {
171
+ const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
172
+ stdio: 'inherit',
173
+ shell: true,
174
+ });
175
+ token.onSignal(signal => electronRebuild.kill(signal));
176
+ electronRebuild.on('error', reject);
177
+ electronRebuild.on('close', (code, signal) => {
178
+ if (signal) {
179
+ reject(new Error(`electron-rebuild exited with "${signal}"`));
180
+ }
181
+ else {
182
+ resolve(code);
183
+ }
184
+ });
185
+ });
186
+ }
187
+ /**
188
+ * `electron-rebuild` is supposed to accept a list of modules to build, even when not part of the dependencies.
189
+ * But there is a bug that causes `electron-rebuild` to not correctly process this list of modules.
190
+ *
191
+ * This workaround will temporarily modify the current package.json file.
192
+ *
193
+ * PR with fix: https://github.com/electron/electron-rebuild/pull/888
194
+ *
195
+ * TODO: Remove this workaround.
196
+ */
197
+ async function electronRebuildExtraModulesWorkaround(cwd, extraModules, run, token) {
198
+ const packageJsonPath = path.resolve(cwd, 'package.json');
199
+ if (await fs.pathExists(packageJsonPath)) {
200
+ // package.json exists: We back it up before modifying it then revert it.
201
+ const packageJsonCopyPath = `${packageJsonPath}.copy`;
202
+ const packageJson = await fs.readJson(packageJsonPath);
203
+ await fs.copy(packageJsonPath, packageJsonCopyPath);
204
+ await throwIfSignal(token, async () => {
205
+ await fs.unlink(packageJsonCopyPath);
206
+ });
207
+ if (typeof packageJson.dependencies !== 'object') {
208
+ packageJson.dependencies = {};
209
+ }
210
+ for (const extraModule of extraModules) {
211
+ if (!packageJson.dependencies[extraModule]) {
212
+ packageJson.dependencies[extraModule] = '*';
213
+ }
214
+ }
215
+ try {
216
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
217
+ await throwIfSignal(token);
218
+ return await run(token);
219
+ }
220
+ finally {
221
+ await fs.move(packageJsonCopyPath, packageJsonPath, { overwrite: true });
222
+ }
223
+ }
224
+ else {
225
+ // package.json does not exist: We create one then remove it.
226
+ const packageJson = {
227
+ name: 'theia-rebuild-workaround',
228
+ version: '0.0.0',
229
+ dependencies: {},
230
+ };
231
+ for (const extraModule of extraModules) {
232
+ packageJson.dependencies[extraModule] = '*';
233
+ }
234
+ try {
235
+ await fs.writeJson(packageJsonPath, packageJson);
236
+ await throwIfSignal(token);
237
+ return await run(token);
238
+ }
239
+ finally {
240
+ await fs.unlink(packageJsonPath);
241
+ }
242
+ }
243
+ }
244
+ /**
245
+ * Temporarily install hooks to **try** to prevent the process from exiting while `run` is running.
246
+ *
247
+ * Note that it is still possible to kill the process and prevent cleanup logic (e.g. SIGKILL, computer forced shutdown, etc).
248
+ */
249
+ async function guardExit(run) {
250
+ const token = new ExitTokenImpl();
251
+ const signalListener = (signal) => token._emitSignal(signal);
252
+ for (const signal of EXIT_SIGNALS) {
253
+ process.on(signal, signalListener);
254
+ }
255
+ try {
256
+ return await run(token);
257
+ }
258
+ finally {
259
+ for (const signal of EXIT_SIGNALS) {
260
+ process.off(signal, signalListener);
261
+ }
262
+ }
263
+ }
264
+ class ExitTokenImpl {
265
+ constructor() {
266
+ this._listeners = new Set();
267
+ }
268
+ onSignal(callback) {
269
+ this._listeners.add(callback);
270
+ }
271
+ getLastSignal() {
272
+ return this._lastSignal;
273
+ }
274
+ _emitSignal(signal) {
275
+ this._lastSignal = signal;
276
+ for (const listener of this._listeners) {
277
+ listener(signal);
278
+ }
279
+ }
280
+ }
281
+ /**
282
+ * Throw `signal` if one was received, runs `cleanup` before doing so.
283
+ */
284
+ async function throwIfSignal(token, cleanup) {
285
+ if (token.getLastSignal()) {
286
+ try {
287
+ await (cleanup === null || cleanup === void 0 ? void 0 : cleanup());
288
+ }
289
+ finally {
290
+ // eslint-disable-next-line no-throw-literal
291
+ throw token.getLastSignal();
292
+ }
154
293
  }
155
294
  }
156
295
  //# sourceMappingURL=rebuild.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../src/rebuild.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theia/application-manager",
3
- "version": "1.19.0",
3
+ "version": "1.20.0",
4
4
  "description": "Theia application manager API.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -33,16 +33,15 @@
33
33
  "@babel/plugin-transform-classes": "^7.10.0",
34
34
  "@babel/plugin-transform-runtime": "^7.10.0",
35
35
  "@babel/preset-env": "^7.10.0",
36
- "@theia/application-package": "1.19.0",
37
- "@theia/compression-webpack-plugin": "^3.0.0",
36
+ "@theia/application-package": "1.20.0",
38
37
  "@types/fs-extra": "^4.0.2",
39
38
  "babel-loader": "^8.2.2",
40
39
  "buffer": "^6.0.3",
41
40
  "circular-dependency-plugin": "^5.2.2",
41
+ "compression-webpack-plugin": "^9.0.0",
42
42
  "copy-webpack-plugin": "^8.1.1",
43
43
  "css-loader": "^6.2.0",
44
44
  "electron-rebuild": "^1.8.6",
45
- "font-awesome-webpack": "0.0.5-beta.2",
46
45
  "fs-extra": "^4.0.2",
47
46
  "ignore-loader": "^0.1.2",
48
47
  "less": "^3.0.3",
@@ -57,10 +56,10 @@
57
56
  "yargs": "^15.3.1"
58
57
  },
59
58
  "devDependencies": {
60
- "@theia/ext-scripts": "1.19.0"
59
+ "@theia/ext-scripts": "1.20.0"
61
60
  },
62
61
  "nyc": {
63
62
  "extends": "../../configs/nyc.json"
64
63
  },
65
- "gitHead": "cebb5417bb40e320178e3a4e66070af514f0525f"
64
+ "gitHead": "774a2724c51d4ae026c6d2499bff3a02e3d50ba9"
66
65
  }
@@ -58,7 +58,7 @@ const webpack = require('webpack');
58
58
  const yargs = require('yargs');
59
59
  const CopyWebpackPlugin = require('copy-webpack-plugin');
60
60
  const CircularDependencyPlugin = require('circular-dependency-plugin');
61
- const CompressionPlugin = require('@theia/compression-webpack-plugin')
61
+ const CompressionPlugin = require('compression-webpack-plugin')
62
62
 
63
63
  const outputPath = path.resolve(__dirname, 'lib');
64
64
  const { mode, staticCompression } = yargs.option('mode', {
@@ -88,10 +88,7 @@ const plugins = [
88
88
  ];
89
89
  // it should go after copy-plugin in order to compress monaco as well
90
90
  if (staticCompression) {
91
- plugins.push(new CompressionPlugin({
92
- // enable reuse of compressed artifacts for incremental development
93
- cache: development
94
- }));
91
+ plugins.push(new CompressionPlugin({}));
95
92
  }
96
93
  plugins.push(new CircularDependencyPlugin({
97
94
  exclude: /(node_modules|examples)[\\\\|\/]./,
@@ -108,6 +105,7 @@ module.exports = {
108
105
  path: outputPath
109
106
  },
110
107
  target: '${this.ifBrowser('web', 'electron-renderer')}',
108
+ cache: staticCompression,
111
109
  module: {
112
110
  rules: [
113
111
  {
package/src/rebuild.ts CHANGED
@@ -17,9 +17,17 @@
17
17
  import cp = require('child_process');
18
18
  import fs = require('fs-extra');
19
19
  import path = require('path');
20
+ import os = require('os');
20
21
 
21
22
  export type RebuildTarget = 'electron' | 'browser';
22
23
 
24
+ const EXIT_SIGNALS: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'];
25
+
26
+ interface ExitToken {
27
+ getLastSignal(): NodeJS.Signals | undefined
28
+ onSignal(callback: (signal: NodeJS.Signals) => void): void
29
+ }
30
+
23
31
  export const DEFAULT_MODULES = [
24
32
  '@theia/node-pty',
25
33
  'nsfw',
@@ -54,13 +62,21 @@ export function rebuild(target: RebuildTarget, options: RebuildOptions = {}): vo
54
62
  } = options;
55
63
  const cache = path.resolve(cacheRoot, '.browser_modules');
56
64
  const cacheExists = folderExists(cache);
57
- if (target === 'electron' && !cacheExists) {
58
- rebuildElectronModules(cache, modules);
59
- } else if (target === 'browser' && cacheExists) {
60
- revertBrowserModules(cache, modules);
61
- } else {
62
- console.log(`native node modules are already rebuilt for ${target}`);
63
- }
65
+ guardExit(async token => {
66
+ if (target === 'electron' && !cacheExists) {
67
+ process.exitCode = await rebuildElectronModules(cache, modules, token);
68
+ } else if (target === 'browser' && cacheExists) {
69
+ process.exitCode = await revertBrowserModules(cache, modules);
70
+ } else {
71
+ console.log(`native node modules are already rebuilt for ${target}`);
72
+ }
73
+ }).catch(errorOrSignal => {
74
+ if (typeof errorOrSignal === 'string' && errorOrSignal in os.constants.signals) {
75
+ process.kill(process.pid, errorOrSignal);
76
+ } else {
77
+ throw errorOrSignal;
78
+ }
79
+ });
64
80
  }
65
81
 
66
82
  function folderExists(folder: string): boolean {
@@ -75,7 +91,7 @@ function folderExists(folder: string): boolean {
75
91
  }
76
92
 
77
93
  /**
78
- * Schema for `<browserModuleCache>/modules.json`
94
+ * Schema for `<browserModuleCache>/modules.json`.
79
95
  */
80
96
  interface ModulesJson {
81
97
  [moduleName: string]: ModuleBackup
@@ -84,14 +100,14 @@ interface ModuleBackup {
84
100
  originalLocation: string
85
101
  }
86
102
 
87
- async function rebuildElectronModules(browserModuleCache: string, modules: string[]): Promise<void> {
103
+ async function rebuildElectronModules(browserModuleCache: string, modules: string[], token: ExitToken): Promise<number> {
88
104
  const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
89
105
  const modulesJson: ModulesJson = await fs.access(modulesJsonPath).then(
90
- exists => fs.readJSON(modulesJsonPath),
91
- missing => ({})
106
+ () => fs.readJson(modulesJsonPath),
107
+ () => ({})
92
108
  );
93
109
  let success = true;
94
- // backup already-built browser modules
110
+ // Backup already built browser modules.
95
111
  await Promise.all(modules.map(async module => {
96
112
  let modulePath;
97
113
  try {
@@ -100,13 +116,13 @@ async function rebuildElectronModules(browserModuleCache: string, modules: strin
100
116
  });
101
117
  } catch (_) {
102
118
  console.debug(`Module not found: ${module}`);
103
- return; // Skip
119
+ return; // Skip current module.
104
120
  }
105
121
  const src = path.dirname(modulePath);
106
122
  const dest = path.join(browserModuleCache, module);
107
123
  try {
108
124
  await fs.remove(dest);
109
- await fs.copy(src, dest);
125
+ await fs.copy(src, dest, { overwrite: true });
110
126
  modulesJson[module] = {
111
127
  originalLocation: src,
112
128
  };
@@ -118,65 +134,194 @@ async function rebuildElectronModules(browserModuleCache: string, modules: strin
118
134
  }));
119
135
  if (Object.keys(modulesJson).length === 0) {
120
136
  console.debug('No module to rebuild.');
121
- process.exit(0);
137
+ return 0;
122
138
  }
123
- // update manifest tracking the backups original locations
124
- await fs.writeJSON(modulesJsonPath, modulesJson, { spaces: 2 });
125
- // if we failed to process a module then exit now
139
+ // Update manifest tracking the backups' original locations.
140
+ await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
141
+ // If we failed to process a module then exit now.
126
142
  if (!success) {
127
- process.exit(1);
143
+ return 1;
128
144
  }
129
- // rebuild for electron
130
- const todo = modules
131
- .map(m => {
132
- // electron-rebuild ignores the module namespace...
133
- const slash = m.indexOf('/');
134
- return m.startsWith('@') && slash !== -1
135
- ? m.substring(slash + 1)
136
- : m;
137
- })
138
- .join(',');
139
- await new Promise<void>((resolve, reject) => {
140
- const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
141
- stdio: 'inherit',
142
- shell: true,
143
- });
144
- electronRebuild.on('error', reject);
145
- electronRebuild.on('close', (code, signal) => {
146
- if (code || signal) {
147
- reject(`electron-rebuild exited with "${code || signal}"`);
148
- } else {
149
- resolve();
150
- }
151
- });
145
+ const todo = modules.map(m => {
146
+ // electron-rebuild ignores the module namespace...
147
+ const slash = m.indexOf('/');
148
+ return m.startsWith('@') && slash !== -1
149
+ ? m.substring(slash + 1)
150
+ : m;
152
151
  });
152
+ try {
153
+ if (process.env.THEIA_REBUILD_NO_WORKAROUND) {
154
+ return await runElectronRebuild(todo, token);
155
+ } else {
156
+ return await electronRebuildExtraModulesWorkaround(process.cwd(), todo, () => runElectronRebuild(todo, token), token);
157
+ }
158
+ } catch (error) {
159
+ return revertBrowserModules(browserModuleCache, modules);
160
+ }
153
161
  }
154
162
 
155
- async function revertBrowserModules(browserModuleCache: string, modules: string[]): Promise<void> {
163
+ async function revertBrowserModules(browserModuleCache: string, modules: string[]): Promise<number> {
164
+ let exitCode = 0;
156
165
  const modulesJsonPath = path.join(browserModuleCache, 'modules.json');
157
- const modulesJson: ModulesJson = await fs.readJSON(modulesJsonPath);
166
+ const modulesJson: ModulesJson = await fs.readJson(modulesJsonPath);
158
167
  await Promise.all(Object.entries(modulesJson).map(async ([moduleName, entry]) => {
159
168
  if (!modules.includes(moduleName)) {
160
- return; // skip modules that weren't requested
169
+ return; // Skip modules that weren't requested.
161
170
  }
162
171
  const src = path.join(browserModuleCache, moduleName);
172
+ if (!await fs.pathExists(src)) {
173
+ delete modulesJson[moduleName];
174
+ console.error(`Missing backup for ${moduleName}!`);
175
+ exitCode = 1;
176
+ return;
177
+ }
163
178
  const dest = entry.originalLocation;
164
179
  try {
165
180
  await fs.remove(dest);
166
- await fs.copy(src, dest);
181
+ await fs.copy(src, dest, { overwrite: false });
167
182
  await fs.remove(src);
168
183
  delete modulesJson[moduleName];
169
184
  console.debug(`Reverted "${moduleName}"`);
170
185
  } catch (error) {
171
186
  console.error(`Error while reverting "${moduleName}": ${error}`);
172
- process.exitCode = 1;
187
+ exitCode = 1;
173
188
  }
174
189
  }));
175
190
  if (Object.keys(modulesJson).length === 0) {
176
- // we restored everything so we can delete the cache
191
+ // We restored everything, so we can delete the cache.
177
192
  await fs.remove(browserModuleCache);
178
193
  } else {
179
- // some things were not restored so we update the manifest
180
- await fs.writeJSON(modulesJsonPath, modulesJson, { spaces: 2 });
194
+ // Some things were not restored, so we update the manifest.
195
+ await fs.writeJson(modulesJsonPath, modulesJson, { spaces: 2 });
196
+ }
197
+ return exitCode;
198
+ }
199
+
200
+ async function runElectronRebuild(modules: string[], token: ExitToken): Promise<number> {
201
+ const todo = modules.join(',');
202
+ return new Promise((resolve, reject) => {
203
+ const electronRebuild = cp.spawn(`npx --no-install electron-rebuild -f -w="${todo}" -o="${todo}"`, {
204
+ stdio: 'inherit',
205
+ shell: true,
206
+ });
207
+ token.onSignal(signal => electronRebuild.kill(signal));
208
+ electronRebuild.on('error', reject);
209
+ electronRebuild.on('close', (code, signal) => {
210
+ if (signal) {
211
+ reject(new Error(`electron-rebuild exited with "${signal}"`));
212
+ } else {
213
+ resolve(code);
214
+ }
215
+ });
216
+ });
217
+ }
218
+
219
+ /**
220
+ * `electron-rebuild` is supposed to accept a list of modules to build, even when not part of the dependencies.
221
+ * But there is a bug that causes `electron-rebuild` to not correctly process this list of modules.
222
+ *
223
+ * This workaround will temporarily modify the current package.json file.
224
+ *
225
+ * PR with fix: https://github.com/electron/electron-rebuild/pull/888
226
+ *
227
+ * TODO: Remove this workaround.
228
+ */
229
+ async function electronRebuildExtraModulesWorkaround<T>(cwd: string, extraModules: string[], run: (token: ExitToken) => Promise<T>, token: ExitToken): Promise<T> {
230
+ const packageJsonPath = path.resolve(cwd, 'package.json');
231
+ if (await fs.pathExists(packageJsonPath)) {
232
+ // package.json exists: We back it up before modifying it then revert it.
233
+ const packageJsonCopyPath = `${packageJsonPath}.copy`;
234
+ const packageJson = await fs.readJson(packageJsonPath);
235
+ await fs.copy(packageJsonPath, packageJsonCopyPath);
236
+ await throwIfSignal(token, async () => {
237
+ await fs.unlink(packageJsonCopyPath);
238
+ });
239
+ if (typeof packageJson.dependencies !== 'object') {
240
+ packageJson.dependencies = {};
241
+ }
242
+ for (const extraModule of extraModules) {
243
+ if (!packageJson.dependencies[extraModule]) {
244
+ packageJson.dependencies[extraModule] = '*';
245
+ }
246
+ }
247
+ try {
248
+ await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });
249
+ await throwIfSignal(token);
250
+ return await run(token);
251
+ } finally {
252
+ await fs.move(packageJsonCopyPath, packageJsonPath, { overwrite: true });
253
+ }
254
+ } else {
255
+ // package.json does not exist: We create one then remove it.
256
+ const packageJson = {
257
+ name: 'theia-rebuild-workaround',
258
+ version: '0.0.0',
259
+ dependencies: {} as Record<string, string>,
260
+ };
261
+ for (const extraModule of extraModules) {
262
+ packageJson.dependencies[extraModule] = '*';
263
+ }
264
+ try {
265
+ await fs.writeJson(packageJsonPath, packageJson);
266
+ await throwIfSignal(token);
267
+ return await run(token);
268
+ } finally {
269
+ await fs.unlink(packageJsonPath);
270
+ }
271
+ }
272
+ }
273
+
274
+ /**
275
+ * Temporarily install hooks to **try** to prevent the process from exiting while `run` is running.
276
+ *
277
+ * Note that it is still possible to kill the process and prevent cleanup logic (e.g. SIGKILL, computer forced shutdown, etc).
278
+ */
279
+ async function guardExit<T>(run: (token: ExitToken) => Promise<T>): Promise<T> {
280
+ const token = new ExitTokenImpl();
281
+ const signalListener = (signal: NodeJS.Signals) => token._emitSignal(signal);
282
+ for (const signal of EXIT_SIGNALS) {
283
+ process.on(signal, signalListener);
284
+ }
285
+ try {
286
+ return await run(token);
287
+ } finally {
288
+ for (const signal of EXIT_SIGNALS) {
289
+ process.off(signal, signalListener);
290
+ }
291
+ }
292
+ }
293
+
294
+ class ExitTokenImpl implements ExitToken {
295
+
296
+ protected _listeners = new Set<(signal: NodeJS.Signals) => void>();
297
+ protected _lastSignal?: NodeJS.Signals;
298
+
299
+ onSignal(callback: (signal: NodeJS.Signals) => void): void {
300
+ this._listeners.add(callback);
301
+ }
302
+
303
+ getLastSignal(): NodeJS.Signals | undefined {
304
+ return this._lastSignal;
305
+ }
306
+
307
+ _emitSignal(signal: NodeJS.Signals): void {
308
+ this._lastSignal = signal;
309
+ for (const listener of this._listeners) {
310
+ listener(signal);
311
+ }
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Throw `signal` if one was received, runs `cleanup` before doing so.
317
+ */
318
+ async function throwIfSignal(token: ExitToken, cleanup?: () => Promise<void>): Promise<void> {
319
+ if (token.getLastSignal()) {
320
+ try {
321
+ await cleanup?.();
322
+ } finally {
323
+ // eslint-disable-next-line no-throw-literal
324
+ throw token.getLastSignal()!;
325
+ }
181
326
  }
182
327
  }