mirror of
https://github.com/vector-im/element-desktop.git
synced 2024-09-09 22:05:10 +00:00
Fact: 8 out of 10 native node module packages published to npm are broken. Actual fact: npm has a library called pacote that handles resolving the package specifier you put in your dependencies to files on disk, and it's actually really nice. Change hak to use that library so now it's much simpler, handles versions correctly and supports git / github etc. urls so we can specify dependencies from git when a package author only publishes half of the package to npm.
70 lines
2.6 KiB
JavaScript
70 lines
2.6 KiB
JavaScript
/*
|
|
Copyright 2020 The Matrix.org Foundation C.I.C.
|
|
|
|
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 fsProm = require('fs').promises;
|
|
const childProcess = require('child_process');
|
|
|
|
const pacote = require('pacote');
|
|
|
|
async function fetch(hakEnv, moduleInfo) {
|
|
let haveModuleBuildDir;
|
|
try {
|
|
const stats = await fsProm.stat(moduleInfo.moduleBuildDir);
|
|
haveModuleBuildDir = stats.isDirectory();
|
|
} catch (e) {
|
|
haveModuleBuildDir = false;
|
|
}
|
|
|
|
if (haveModuleBuildDir) return;
|
|
|
|
console.log("Fetching " + moduleInfo.name + "@" + moduleInfo.version);
|
|
|
|
const packumentCache = new Map();
|
|
await pacote.extract(`${moduleInfo.name}@${moduleInfo.version}`, moduleInfo.moduleBuildDir, {
|
|
packumentCache,
|
|
});
|
|
|
|
console.log("Running yarn install in " + moduleInfo.moduleBuildDir);
|
|
await new Promise((resolve, reject) => {
|
|
const proc = childProcess.spawn(
|
|
hakEnv.isWin() ? 'yarn.cmd' : 'yarn',
|
|
['install', '--ignore-scripts'],
|
|
{
|
|
stdio: 'inherit',
|
|
cwd: moduleInfo.moduleBuildDir,
|
|
},
|
|
);
|
|
proc.on('exit', code => {
|
|
code ? reject(code) : resolve();
|
|
});
|
|
});
|
|
|
|
// also extract another copy to the output directory at this point
|
|
// nb. we do not yarn install in the output copy: we could install in
|
|
// production mode to get only runtime dependencies and not devDependencies,
|
|
// but usually native modules come with dependencies that are needed for
|
|
// building/fetching the native modules (eg. node-pre-gyp) rather than
|
|
// actually used at runtime: we do not want to bundle these into our app.
|
|
// We therefore just install no dependencies at all, and accept that any
|
|
// actual runtime dependencies will have to be added to the main app's
|
|
// dependencies. We can't tell what dependencies are real runtime deps
|
|
// and which are just used for native module building.
|
|
await pacote.extract(`${moduleInfo.name}@${moduleInfo.version}`, moduleInfo.moduleOutDir, {
|
|
packumentCache,
|
|
});
|
|
}
|
|
|
|
module.exports = fetch;
|