UNPKG

cnpmcore

Version:

Private NPM Registry for Enterprise

245 lines 22.2 kB
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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