cnpmcore
Version:
Private NPM Registry for Enterprise
245 lines • 22.2 kB
JavaScript
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;
};
import { join } from 'node:path';
import { SingletonProto } from 'egg';
import binaries from "../../../../config/binaries.js";
import { BinaryType } from "../../enum/Binary.js";
import { AbstractBinary, BinaryAdapter } from "./AbstractBinary.js";
let NodePreGypBinary = class NodePreGypBinary extends AbstractBinary {
async initFetch() {
// do nothing
return;
}
// https://github.com/mapbox/node-pre-gyp
async fetch(dir, binaryName) {
const binaryConfig = binaries[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}/`] = currentDir;
}
// 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 = 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 = join('/', remotePath, binaryFileName);
const remoteUrl = `${binaryConfig.distUrl}${binaryFilePath}`;
currentDir.push({
name: binaryFileName,
date,
size: '-',
isDir: false,
url: remoteUrl,
ignoreDownloadStatuses: [404],
});
}
}
}
}
return { items: dirItems[dir] };
}
};
NodePreGypBinary = __decorate([
SingletonProto(),
BinaryAdapter(BinaryType.NodePreGyp)
], NodePreGypBinary);
export { NodePreGypBinary };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZVByZUd5cEJpbmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9jb21tb24vYWRhcHRlci9iaW5hcnkvTm9kZVByZUd5cEJpbmFyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFckMsT0FBTyxRQUE2QixNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBcUMsTUFBTSxxQkFBcUIsQ0FBQztBQUloRyxJQUFNLGdCQUFnQixHQUF0QixNQUFNLGdCQUFpQixTQUFRLGNBQWM7SUFDbEQsS0FBSyxDQUFDLFNBQVM7UUFDYixhQUFhO1FBQ2IsT0FBTztJQUNULENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFXLEVBQUUsVUFBc0I7UUFDN0MsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsY0FBYyxJQUFJLFVBQVUsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyw4QkFBOEIsY0FBYyxFQUFFLENBQUM7UUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sUUFBUSxHQUVWO1lBQ0YsR0FBRyxFQUFFLEVBQUU7U0FDUixDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFNB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