From 40209dc60d4ef27be3686a43348a24b3e44d9f00 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Tue, 6 Jul 2021 21:22:57 +0200 Subject: [PATCH] bundle built-in modules together --- app/package.json | 13 +----- app/src/entry.ts | 4 +- app/src/plugins.ts | 67 ++++++++++++++------------- app/webpack.config.js | 10 ---- package.json | 14 +++++- webpack.plugin.config.js | 17 +++++++ yarn.lock | 98 +++++++++++++++++++++++++++++++++++++++- 7 files changed, 167 insertions(+), 56 deletions(-) diff --git a/app/package.json b/app/package.json index 1480d864..4b8f7b85 100644 --- a/app/package.json +++ b/app/package.json @@ -14,15 +14,7 @@ "watch": "webpack --progress --color --watch" }, "dependencies": { - "@angular/animations": "^12.0.0", - "@angular/common": "^12.0.0", - "@angular/compiler": "^12.0.0", - "@angular/core": "^12.0.0", - "@angular/forms": "^12.0.0", - "@angular/platform-browser": "^12.0.0", - "@angular/platform-browser-dynamic": "^12.0.0", "@electron/remote": "1.2.0", - "@ng-bootstrap/ng-bootstrap": "^10.0.0", "any-promise": "^1.3.0", "electron-config": "2.0.0", "electron-debug": "^3.2.0", @@ -33,12 +25,9 @@ "keytar": "^7.7.0", "mz": "^2.7.0", "native-process-working-directory": "^1.0.2", - "ngx-toastr": "^14.0.0", "node-pty": "^0.10.1", "npm": "6", - "rxjs": "^7.2.0", - "yargs": "^17.0.1", - "zone.js": "^0.11.4" + "yargs": "^17.0.1" }, "optionalDependencies": { "macos-native-processlist": "^2.0.0", diff --git a/app/src/entry.ts b/app/src/entry.ts index 743e05b5..172f0a8f 100644 --- a/app/src/entry.ts +++ b/app/src/entry.ts @@ -5,13 +5,15 @@ import 'rxjs' import './global.scss' import './toastr.scss' +// Importing before @angular/* +import { findPlugins, initModuleLookup, loadPlugins } from './plugins' + import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core' import { enableDebugTools } from '@angular/platform-browser' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' import { ipcRenderer } from 'electron' import { getRootModule } from './app.module' -import { findPlugins, initModuleLookup, loadPlugins } from './plugins' import { BootstrapData, BOOTSTRAP_DATA, PluginInfo } from '../../tabby-core/src/api/mainProcess' // Always land on the start view diff --git a/app/src/plugins.ts b/app/src/plugins.ts index cb923314..96ddf6c3 100644 --- a/app/src/plugins.ts +++ b/app/src/plugins.ts @@ -18,28 +18,47 @@ function normalizePath (p: string): string { const builtinPluginsPath = process.env.TABBY_DEV ? path.dirname(remote.app.getAppPath()) : path.join((process as any).resourcesPath, 'builtin-plugins') +const cachedBuiltinModules = { + '@angular/animations': require('@angular/animations'), + '@angular/common': require('@angular/common'), + '@angular/compiler': require('@angular/compiler'), + '@angular/core': require('@angular/core'), + '@angular/forms': require('@angular/forms'), + '@angular/platform-browser': require('@angular/platform-browser'), + '@angular/platform-browser/animations': require('@angular/platform-browser/animations'), + '@angular/platform-browser-dynamic': require('@angular/platform-browser-dynamic'), + '@ng-bootstrap/ng-bootstrap': require('@ng-bootstrap/ng-bootstrap'), + 'ngx-toastr': require('ngx-toastr'), + rxjs: require('rxjs'), + 'rxjs/operators': require('rxjs/operators'), + 'zone.js/dist/zone.js': require('zone.js/dist/zone.js'), +} + const builtinModules = [ - '@angular/animations', - '@angular/common', - '@angular/compiler', - '@angular/core', - '@angular/forms', - '@angular/platform-browser', - '@angular/platform-browser-dynamic', - '@ng-bootstrap/ng-bootstrap', - 'ngx-toastr', - 'rxjs', - 'rxjs/operators', + ...Object.keys(cachedBuiltinModules), 'tabby-core', 'tabby-local', 'tabby-settings', 'tabby-terminal', - 'zone.js/dist/zone.js', ] -export type ProgressCallback = (current: number, total: number) => void // eslint-disable-line @typescript-eslint/no-type-alias +const originalRequire = (global as any).require +;(global as any).require = function (query: string) { + if (cachedBuiltinModules[query]) { + return cachedBuiltinModules[query] + } + return originalRequire.apply(this, [query]) +} -const cachedBuiltinModules = {} +const originalModuleRequire = nodeModule.prototype.require +nodeModule.prototype.require = function (query: string) { + if (cachedBuiltinModules[query]) { + return cachedBuiltinModules[query] + } + return originalModuleRequire.call(this, query) +} + +export type ProgressCallback = (current: number, total: number) => void // eslint-disable-line @typescript-eslint/no-type-alias export function initModuleLookup (userPluginsPath: string): void { global['module'].paths.map((x: string) => nodeModule.globalPaths.push(normalizePath(x))) @@ -57,24 +76,10 @@ export function initModuleLookup (userPluginsPath: string): void { } builtinModules.forEach(m => { - cachedBuiltinModules[m] = nodeRequire(m) + if (!cachedBuiltinModules[m]) { + cachedBuiltinModules[m] = nodeRequire(m) + } }) - - const originalRequire = (global as any).require - ;(global as any).require = function (query: string) { - if (cachedBuiltinModules[query]) { - return cachedBuiltinModules[query] - } - return originalRequire.apply(this, [query]) - } - - const originalModuleRequire = nodeModule.prototype.require - nodeModule.prototype.require = function (query: string) { - if (cachedBuiltinModules[query]) { - return cachedBuiltinModules[query] - } - return originalModuleRequire.call(this, query) - } } export async function findPlugins (): Promise { diff --git a/app/webpack.config.js b/app/webpack.config.js index 7e4a12e1..89210b8c 100644 --- a/app/webpack.config.js +++ b/app/webpack.config.js @@ -60,23 +60,13 @@ module.exports = { ], }, externals: { - '@angular/core': 'commonjs @angular/core', - '@angular/compiler': 'commonjs @angular/compiler', - '@angular/platform-browser': 'commonjs @angular/platform-browser', - '@angular/platform-browser-dynamic': 'commonjs @angular/platform-browser-dynamic', - '@angular/forms': 'commonjs @angular/forms', - '@angular/common': 'commonjs @angular/common', - '@ng-bootstrap/ng-bootstrap': 'commonjs @ng-bootstrap/ng-bootstrap', '@electron/remote': 'commonjs @electron/remote', child_process: 'commonjs child_process', electron: 'commonjs electron', fs: 'commonjs fs', - 'ngx-toastr': 'commonjs ngx-toastr', module: 'commonjs module', mz: 'commonjs mz', path: 'commonjs path', - rxjs: 'commonjs rxjs', - 'zone.js': 'commonjs zone.js/dist/zone.js', }, plugins: [ new webpack.optimize.ModuleConcatenationPlugin(), diff --git a/package.json b/package.json index e587cfa5..881c9608 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,14 @@ { "devDependencies": { + "@angular/animations": "^12.0.0", + "@angular/common": "^12.0.0", + "@angular/compiler": "^12.0.0", + "@angular/core": "^12.0.0", + "@angular/forms": "^12.0.0", + "@angular/platform-browser": "^12.0.0", + "@angular/platform-browser-dynamic": "^12.0.0", "@fortawesome/fontawesome-free": "^5.15.3", + "@ng-bootstrap/ng-bootstrap": "^10.0.0", "@sentry/cli": "^1.64.2", "@sentry/electron": "^2.5.0", "@tabby-gang/to-string-loader": "^1.1.7-beta.2", @@ -32,6 +40,7 @@ "json-loader": "0.5.7", "lru-cache": "^6.0.0", "macos-release": "^2.5.0", + "ngx-toastr": "^14.0.0", "node-abi": "^2.30.0", "node-sass": "^6.0.1", "npmlog": "4.1.2", @@ -43,10 +52,12 @@ "pug-loader": "^2.4.0", "pug-static-loader": "2.0.0", "raw-loader": "4.0.2", + "rxjs": "^7.2.0", "sass-loader": "^12.1.0", "shelljs": "0.8.4", "slugify": "^1.5.3", "source-code-pro": "^2.38.0", + "source-map-loader": "^3.0.0", "source-sans-pro": "3.6.0", "style-loader": "^3.0.0", "svg-inline-loader": "^0.8.2", @@ -59,7 +70,8 @@ "webpack": "^5.42.1", "webpack-bundle-analyzer": "^4.4.2", "webpack-cli": "^4.7.0", - "yaml-loader": "0.6.0" + "yaml-loader": "0.6.0", + "zone.js": "^0.11.4" }, "resolutions": { "lzma-native": "^8.0.0", diff --git a/webpack.plugin.config.js b/webpack.plugin.config.js index 73dcb14f..90150306 100644 --- a/webpack.plugin.config.js +++ b/webpack.plugin.config.js @@ -48,9 +48,26 @@ module.exports = options => { modules: ['.', 'src', 'node_modules', '../app/node_modules', '../node_modules'].map(x => path.join(options.dirname, x)), extensions: ['.ts', '.js'], }, + ignoreWarnings: [/Failed to parse source map/], module: { rules: [ ...options.rules ?? [], + { + test: /\.js$/, + enforce: 'pre', + use: { + loader: 'source-map-loader', + options: { + filterSourceMappingUrl: (url, resourcePath) => { + if (/node_modules/.test(resourcePath)) { + return false + } + return true + }, + + }, + }, + }, { test: /\.ts$/, use: { diff --git a/yarn.lock b/yarn.lock index ba3c57b0..8a8408d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,55 @@ resolved "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz" integrity sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA== +"@angular/animations@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.1.1.tgz#7da62f1c753e9d3e6f4ada9ef8f4dd97795265b5" + integrity sha512-79TfDx1AAxrVNM56oY+OwRpku9eCF6w3ko2DWDeQpgCvqM6/a53B5rPhz6yuwgadIqUdQH0T4CeE/v5hXYdOMA== + dependencies: + tslib "^2.2.0" + +"@angular/common@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-12.1.1.tgz#34f63b339570699e1ba6968fd0afdee0cbd66fe3" + integrity sha512-NnRwGMatzjthvDQ4+8tm09Ak5i27Qga8x4BdzINN1RjLmzQ0zW00Mn2AUGYEDZHt9HXVHff5stsZGqj+Ne4QJw== + dependencies: + tslib "^2.2.0" + +"@angular/compiler@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-12.1.1.tgz#ec8ae93fa905f6f71c748ba250be8f4d58e31605" + integrity sha512-QV56c+A18vdY8AB/SoWq0UkHhJxYDWY+VUY75RM2dxcsXoNeO5FTCjBRkA7yMiX6Q6cahH2ivC7tmqVU2mYHuA== + dependencies: + tslib "^2.2.0" + +"@angular/core@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-12.1.1.tgz#448cdc0927bae1420934f6463ac64414d00bc3b0" + integrity sha512-7Q4na8zCXi4ITBG8kgbS+vnnVK0GDU2WXU80/il096+8YPFKfj6MyDWZH79KA3jrIg9/yhLwSQx8x8wnj8dqBA== + dependencies: + tslib "^2.2.0" + +"@angular/forms@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.1.1.tgz#b076cc4cf9a202ab08038d0e6038c2b7f68af79e" + integrity sha512-up5P9jdqsPjrX3YgNMSIkTCwRzVNJbAlDiKrnww7pt5RL2fZGq+x/ddvtTSjdne9oknRKitADFkjuPozPH+LOg== + dependencies: + tslib "^2.2.0" + +"@angular/platform-browser-dynamic@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.1.1.tgz#d86db1da71be64f75c51b076942b0f65b441a404" + integrity sha512-x8bIQzRvrdA/LfnIp5/Fo15BqD7g5j+XQe/KyWM+jBnpKr9queet0xvSAWD+KGkdrebI1xIgNtNNTxPCxREbiQ== + dependencies: + tslib "^2.2.0" + +"@angular/platform-browser@^12.0.0": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-12.1.1.tgz#ba6243d77dbdbfb68c3f95a8fa2fd321b812e6d1" + integrity sha512-R78K0DYxplYUvctq/7MvoBjuMDgMNrL1h8Bov0g7lN5hQWBQwBjl//CiJgx8H7uSiba9DQ0Jwu5Xxvkzkr8ggA== + dependencies: + tslib "^2.2.0" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -144,6 +193,13 @@ dependencies: cross-spawn "^7.0.1" +"@ng-bootstrap/ng-bootstrap@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-10.0.0.tgz#6022927bac7029bdd12d7f1e10b5b20074db06dc" + integrity sha512-Sz+QaxjuyJYJ+zyUbf0TevgcgVesCPQiiFiggEzxKjzY5R+Hvq3YgryLdXf2r/ryePL+C3FXCcmmKpTM5bfczQ== + dependencies: + tslib "^2.1.0" + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -740,6 +796,11 @@ JSONStream@~1.3.1: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -5008,6 +5069,13 @@ neo-async@^2.6.0, neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +ngx-toastr@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/ngx-toastr/-/ngx-toastr-14.0.0.tgz#20e4737ef330b892a453768cd98b980558aeb286" + integrity sha512-dnDzSY73pF6FvNyxdh6ftfvXvUg6SU7MAT3orPUCzA77t3ZcFslro06zk4NCA2g67RF7dBwM0OJ/y0SN6fdGYw== + dependencies: + tslib "^2.1.0" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" @@ -6834,6 +6902,13 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rxjs@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.2.0.tgz#5cd12409639e9514a71c9f5f9192b2c4ae94de31" + integrity sha512-aX8w9OpKrQmiPKfT1bqETtUr9JygIz6GZ+gql8v7CijClsP0laoFUdKzxFAoWuRdSlOdU2+crss+cMf+cqMTnw== + dependencies: + tslib "~2.1.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -7135,6 +7210,15 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== +source-map-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" + integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + source-map-js "^0.6.2" + source-map-support@^0.5.19, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" @@ -7796,11 +7880,16 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.2.0, tslib@^2.3.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -8643,3 +8732,10 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zone.js@^0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.4.tgz#0f70dcf6aba80f698af5735cbb257969396e8025" + integrity sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw== + dependencies: + tslib "^2.0.0"