cnpmcore
Version:
247 lines • 21.9 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodePreGypBinary = void 0;
const tegg_1 = require("@eggjs/tegg");
const Binary_1 = require("../../enum/Binary");
const binaries_1 = __importDefault(require("../../../../config/binaries"));
const path_1 = require("path");
const AbstractBinary_1 = require("./AbstractBinary");
let NodePreGypBinary = class NodePreGypBinary extends AbstractBinary_1.AbstractBinary {
async initFetch() {
// do nothing
return;
}
// https://github.com/mapbox/node-pre-gyp
async fetch(dir, binaryName) {
const binaryConfig = binaries_1.default[binaryName];
const npmPackageName = binaryConfig.options?.npmPackageName ?? binaryName;
const pkgUrl = `https://registry.npmjs.com/${npmPackageName}`;
const data = await this.requestJSON(pkgUrl);
const dirItems = {
'/': [],
};
const nodeABIVersions = await this.listNodeABIVersions();
const nodePlatforms = this.listNodePlatforms();
const nodeArchs = this.listNodeArchs(binaryConfig);
const nodeLibcs = this.listNodeLibcs();
for (const version in data.versions) {
const date = data.time[version];
const pkgVersion = data.versions[version];
if (!pkgVersion.binary)
continue;
// https://github.com/mapbox/node-pre-gyp#package_name
// defaults to {module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz
let binaryFile = pkgVersion.binary.package_name
|| '{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz';
if (!binaryFile)
continue;
const moduleName = pkgVersion.binary.module_name || pkgVersion.name;
binaryFile = binaryFile.replace('{version}', version)
.replace('{module_name}', moduleName);
let currentDir = dirItems['/'];
let versionPrefix = '';
let remotePath = pkgVersion.binary.remote_path;
const napiVersions = pkgVersion.binary.napi_versions ?? [];
if (binaryConfig.options?.requiredNapiVersions && napiVersions.length === 0)
continue;
if (remotePath?.includes('{version}')) {
const dirName = remotePath.includes('v{version}') ? `v${version}` : version;
versionPrefix = `/${dirName}`;
dirItems['/'].push({
name: `${dirName}/`,
date,
size: '-',
isDir: true,
url: '',
});
currentDir = dirItems[`/${dirName}/`] = [];
}
// https://node-precompiled-binaries.grpc.io/?delimiter=/&prefix=grpc/v1.24.11/
// https://github.com/grpc/grpc-node/blob/grpc%401.24.x/packages/grpc-native-core/package.json#L50
// "binary": {
// "module_name": "grpc_node",
// "module_path": "src/node/extension_binary/{node_abi}-{platform}-{arch}-{libc}",
// "host": "https://node-precompiled-binaries.grpc.io/",
// "remote_path": "{name}/v{version}",
// "package_name": "{node_abi}-{platform}-{arch}-{libc}.tar.gz"
// },
if (binaryFile.includes('{node_abi}')
&& binaryFile.includes('{platform}')
&& binaryFile.includes('{arch}')
&& binaryFile.includes('{libc}')) {
for (const nodeAbi of nodeABIVersions) {
for (const platform of nodePlatforms) {
const archs = nodeArchs[platform];
const libcs = nodeLibcs[platform];
for (const arch of archs) {
for (const libc of libcs) {
const name = binaryFile.replace('{node_abi}', `node-v${nodeAbi}`)
.replace('{platform}', platform)
.replace('{arch}', arch)
.replace('{libc}', libc);
currentDir.push({
name,
date,
size: '-',
isDir: false,
url: `${binaryConfig.distUrl}/${binaryName}${versionPrefix}/${name}`,
ignoreDownloadStatuses: [404],
});
}
}
}
}
}
else if (binaryFile.includes('{node_abi}')
&& binaryFile.includes('{platform}')
&& binaryFile.includes('{arch}')) {
for (const nodeAbi of nodeABIVersions) {
for (const platform of nodePlatforms) {
const archs = nodeArchs[platform];
for (const arch of archs) {
const name = binaryFile.replace('{node_abi}', `node-v${nodeAbi}`)
.replace('{platform}', platform)
.replace('{arch}', arch);
currentDir.push({
name,
date,
size: '-',
isDir: false,
url: `${binaryConfig.distUrl}/${binaryName}${versionPrefix}/${name}`,
ignoreDownloadStatuses: [404],
});
}
}
}
}
else if (binaryFile.includes('{platform}-{arch}-{node_napi_label}-{libc}') && napiVersions.length > 0) {
// https://skia-canvas.s3.us-east-1.amazonaws.com/v0.9.30/darwin-arm64-napi-v6-unknown.tar.gz
// https://github.com/samizdatco/skia-canvas/blob/2a75801d7cce3b4e4e6ad015a173daefaa8465e6/package.json#L48
// "binary": {
// "module_name": "index",
// "module_path": "./lib/v{napi_build_version}",
// "remote_path": "./v{version}",
// "package_name": "{platform}-{arch}-{node_napi_label}-{libc}.tar.gz",
// "host": "https://skia-canvas.s3.us-east-1.amazonaws.com",
// "napi_versions": [
// 6
// ]
// },
for (const platform of nodePlatforms) {
const archs = nodeArchs[platform];
const libcs = nodeLibcs[platform];
for (const arch of archs) {
for (const libc of libcs) {
for (const napiVersion of napiVersions) {
const name = binaryFile.replace('{platform}', platform)
.replace('{arch}', arch)
.replace('{node_napi_label}', `napi-v${napiVersion}`)
.replace('{libc}', libc);
currentDir.push({
name,
date,
size: '-',
isDir: false,
url: `${binaryConfig.distUrl}${versionPrefix}/${name}`,
ignoreDownloadStatuses: [404, 403],
});
}
}
}
}
}
else if (binaryFile.includes('{platform}-{arch}-{node_napi_label}')) {
// "_id": "skia-canvas@0.9.22",
// "binary": {
// "module_name": "index",
// "module_path": "./lib/v{napi_build_version}",
// "remote_path": "./v{version}",
// "package_name": "{platform}-{arch}-{node_napi_label}.tar.gz",
// "host": "https://skia-canvas.s3.us-east-1.amazonaws.com",
// "napi_versions": [
// 6
// ]
// },
for (const platform of nodePlatforms) {
const archs = nodeArchs[platform];
for (const arch of archs) {
for (const napiVersion of napiVersions) {
const binaryFileName = binaryFile.replace('{platform}', platform)
.replace('{arch}', arch)
.replace('{node_napi_label}', napiVersion);
remotePath = remotePath.replace('{module_name}', moduleName)
.replace('{name}', binaryName)
.replace('{version}', version)
.replace('{configuration}', 'Release');
const binaryFilePath = (0, path_1.join)('/', remotePath, binaryFileName);
const remoteUrl = `${binaryConfig.distUrl}${binaryFilePath}`;
currentDir.push({
name: binaryFileName,
date,
size: '-',
isDir: false,
url: remoteUrl,
ignoreDownloadStatuses: [404],
});
}
}
}
}
else if (binaryFile.includes('{platform}') && binaryFile.includes('{arch}')) {
// https://github.com/grpc/grpc-node/blob/master/packages/grpc-tools/package.json#L29
// "binary": {
// "module_name": "grpc_tools",
// "host": "https://node-precompiled-binaries.grpc.io/",
// "remote_path": "{name}/v{version}",
// "package_name": "{platform}-{arch}.tar.gz",
// "module_path": "bin"
// },
// handle {configuration}
// "binary": {
// "module_name": "wrtc",
// "module_path": "./build/{configuration}/",
// "remote_path": "./{module_name}/v{version}/{configuration}/",
// "package_name": "{platform}-{arch}.tar.gz",
// "host": "https://node-webrtc.s3.amazonaws.com"
// },
for (const platform of nodePlatforms) {
const archs = nodeArchs[platform];
for (const arch of archs) {
const binaryFileName = binaryFile.replace('{platform}', platform)
.replace('{arch}', arch);
remotePath = remotePath.replace('{module_name}', moduleName)
.replace('{name}', binaryName)
.replace('{version}', version)
.replace('{configuration}', 'Release');
const binaryFilePath = (0, path_1.join)('/', remotePath, binaryFileName);
const remoteUrl = `${binaryConfig.distUrl}${binaryFilePath}`;
currentDir.push({
name: binaryFileName,
date,
size: '-',
isDir: false,
url: remoteUrl,
ignoreDownloadStatuses: [404],
});
}
}
}
}
return { items: dirItems[dir] };
}
};
exports.NodePreGypBinary = NodePreGypBinary;
exports.NodePreGypBinary = NodePreGypBinary = __decorate([
(0, tegg_1.SingletonProto)(),
(0, AbstractBinary_1.BinaryAdapter)(Binary_1.BinaryType.NodePreGyp)
], NodePreGypBinary);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZVByZUd5cEJpbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9jb21tb24vYWRhcHRlci9iaW5hcnkvTm9kZVByZUd5cEJpbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBNkM7QUFDN0MsOENBQStDO0FBQy9DLDJFQUFtRTtBQUNuRSwrQkFBNEI7QUFDNUIscURBQTBGO0FBSW5GLElBQU0sZ0JBQWdCLEdBQXRCLE1BQU0sZ0JBQWlCLFNBQVEsK0JBQWM7SUFDbEQsS0FBSyxDQUFDLFNBQVM7UUFDYixhQUFhO1FBQ2IsT0FBTztJQUNULENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFXLEVBQUUsVUFBc0I7UUFDN0MsTUFBTSxZQUFZLEdBQUcsa0JBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLGNBQWMsSUFBSSxVQUFVLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUcsOEJBQThCLGNBQWMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FFVjtZQUNGLEdBQUcsRUFBRSxFQUFFO1NBQ1IsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25D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