Merge pull request #3987 from balena-io/support-node-18

Add support for Node 18
This commit is contained in:
dfunckt 2023-01-27 13:35:09 +02:00 committed by GitHub
commit 8a0711e2a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 771 additions and 1328 deletions

2008
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,7 @@
"npm run lint-css" "npm run lint-css"
] ]
}, },
"author": "Balena Inc. <hello@etcher.io>", "author": "Balena Ltd. <hello@balena.io>",
"license": "Apache-2.0", "license": "Apache-2.0",
"devDependencies": { "devDependencies": {
"@balena/lint": "5.4.2", "@balena/lint": "5.4.2",
@ -70,20 +70,20 @@
"@types/tmp": "0.2.3", "@types/tmp": "0.2.3",
"@types/webpack-node-externals": "2.5.3", "@types/webpack-node-externals": "2.5.3",
"analytics-client": "^2.0.1", "analytics-client": "^2.0.1",
"aws4-axios": "2.4.9", "axios": "^0.27.2",
"chai": "4.3.7", "chai": "4.3.7",
"copy-webpack-plugin": "7.0.0", "copy-webpack-plugin": "7.0.0",
"css-loader": "5.2.7", "css-loader": "5.2.7",
"d3": "4.13.0", "d3": "4.13.0",
"debug": "4.3.4", "debug": "4.3.4",
"electron": "^13.5.0", "electron": "^13.6.9",
"electron-builder": "^23.0.9", "electron-builder": "^23.6.0",
"electron-mocha": "9.3.3", "electron-mocha": "9.3.3",
"electron-notarize": "1.2.2", "electron-notarize": "1.2.2",
"electron-rebuild": "3.2.9", "electron-rebuild": "3.2.3",
"electron-updater": "5.3.0", "electron-updater": "5.3.0",
"esbuild-loader": "2.20.0", "esbuild-loader": "2.20.0",
"etcher-sdk": "^7.4.8", "etcher-sdk": "^8.2.0",
"file-loader": "6.2.0", "file-loader": "6.2.0",
"husky": "4.3.8", "husky": "4.3.8",
"i18next": "21.10.0", "i18next": "21.10.0",
@ -124,7 +124,7 @@
"webpack-dev-server": "4.11.1" "webpack-dev-server": "4.11.1"
}, },
"engines": { "engines": {
"node": ">=14 < 16" "node": ">=14"
}, },
"versionist": { "versionist": {
"publishedAt": "2023-01-19T12:21:03.371Z" "publishedAt": "2023-01-19T12:21:03.371Z"

View File

@ -15,7 +15,7 @@
*/ */
import * as CopyPlugin from 'copy-webpack-plugin'; import * as CopyPlugin from 'copy-webpack-plugin';
import { readdirSync, existsSync } from 'fs'; import { readdirSync } from 'fs';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as os from 'os'; import * as os from 'os';
import outdent from 'outdent'; import outdent from 'outdent';
@ -23,7 +23,7 @@ import * as path from 'path';
import { env } from 'process'; import { env } from 'process';
import * as SimpleProgressWebpackPlugin from 'simple-progress-webpack-plugin'; import * as SimpleProgressWebpackPlugin from 'simple-progress-webpack-plugin';
import * as TerserPlugin from 'terser-webpack-plugin'; import * as TerserPlugin from 'terser-webpack-plugin';
import { BannerPlugin, NormalModuleReplacementPlugin } from 'webpack'; import { BannerPlugin, IgnorePlugin, NormalModuleReplacementPlugin } from 'webpack';
import * as PnpWebpackPlugin from 'pnp-webpack-plugin'; import * as PnpWebpackPlugin from 'pnp-webpack-plugin';
import * as tsconfigRaw from './tsconfig.webpack.json'; import * as tsconfigRaw from './tsconfig.webpack.json';
@ -77,26 +77,6 @@ function renameNodeModules(resourcePath: string) {
); );
} }
function findExt2fsFolder(): string {
const ext2fs = 'node_modules/ext2fs';
const biFsExt2fs = 'node_modules/balena-image-fs/node_modules/ext2fs';
if (existsSync(ext2fs)) {
return ext2fs;
} else if (existsSync(biFsExt2fs)) {
return biFsExt2fs;
} else {
throw Error('ext2fs not found');
}
}
function makeExt2FsRegex(): RegExp {
const folder = findExt2fsFolder();
const libpath = '/lib/libext2fs\\.js$';
return new RegExp(folder.concat(libpath));
}
function findUsbPrebuild(): string[] { function findUsbPrebuild(): string[] {
const usbPrebuildsFolder = path.join('node_modules', 'usb', 'prebuilds'); const usbPrebuildsFolder = path.join('node_modules', 'usb', 'prebuilds');
const prebuildFolders = readdirSync(usbPrebuildsFolder); const prebuildFolders = readdirSync(usbPrebuildsFolder);
@ -180,31 +160,6 @@ function replace(test: RegExp, ...replacements: ReplacementRule[]) {
}; };
} }
function fetchWasm(...where: string[]) {
const whereStr = where.map((x) => `'${x}'`).join(', ');
return outdent`
const Path = require('path');
let electron;
try {
// This doesn't exist in the child-writer
electron = require('electron');
} catch {
}
function appPath() {
return Path.isAbsolute(__dirname) ?
__dirname :
Path.join(
// With macOS universal builds, getAppPath() returns the path to an app.asar file containing an index.js file which will
// include the app-x64 or app-arm64 folder depending on the arch.
// We don't care about the app.asar file, we want the actual folder.
electron.remote.app.getAppPath().replace(/\\.asar$/, () => process.platform === 'darwin' ? '-' + process.arch : ''),
'generated'
);
}
scriptDirectory = Path.join(appPath(), 'modules', ${whereStr}, '/');
`;
}
const commonConfig = { const commonConfig = {
mode: 'production', mode: 'production',
optimization: { optimization: {
@ -339,18 +294,6 @@ const commonConfig = {
); );
`, `,
}), }),
// Use the libext2fs.wasm file in the generated folder
// The way to find the app directory depends on whether we run in the renderer or in the child-writer
// We use __dirname in the child-writer and electron.remote.app.getAppPath() in the renderer
replace(makeExt2FsRegex(), {
search: 'scriptDirectory = __dirname + "/";',
replace: fetchWasm('ext2fs', 'lib'),
}),
// Same for node-crc-utils
replace(/node_modules\/@balena\/node-crc-utils\/crc32\.js$/, {
search: 'scriptDirectory=__dirname+"/"',
replace: fetchWasm('@balena', 'node-crc-utils'),
}),
// Copy native modules to generated folder // Copy native modules to generated folder
{ {
test: /\.node$/, test: /\.node$/,
@ -377,6 +320,14 @@ const commonConfig = {
slashOrAntislash(/node_modules\/axios\/lib\/adapters\/xhr\.js/), slashOrAntislash(/node_modules\/axios\/lib\/adapters\/xhr\.js/),
'./http.js', './http.js',
), ),
// Ignore `aws-crt` which is a dependency of (ultimately) `aws4-axios` which is used
// by etcher-sdk and does a runtime check to its availability. Were not currently
// using the “assume role” functionality (AFAIU) of aws4-axios and we dont care that
// its not found, so force webpack to ignore the import.
// See https://github.com/aws/aws-sdk-js-v3/issues/3025
new IgnorePlugin({
resourceRegExp: /^aws-crt$/,
})
], ],
resolveLoader: { resolveLoader: {
plugins: [PnpWebpackPlugin.moduleLoader(module)], plugins: [PnpWebpackPlugin.moduleLoader(module)],
@ -404,14 +355,6 @@ const guiConfigCopyPatterns = [
from: 'node_modules/node-raspberrypi-usbboot/blobs', from: 'node_modules/node-raspberrypi-usbboot/blobs',
to: 'modules/node-raspberrypi-usbboot/blobs', to: 'modules/node-raspberrypi-usbboot/blobs',
}, },
{
from: `${findExt2fsFolder()}/lib/libext2fs.wasm`,
to: 'modules/ext2fs/lib/libext2fs.wasm',
},
{
from: 'node_modules/@balena/node-crc-utils/crc32.wasm',
to: 'modules/@balena/node-crc-utils/crc32.wasm',
},
]; ];
if (os.platform() === 'win32') { if (os.platform() === 'win32') {