UNPKG

cnpmcore

Version:

Private NPM Registry for Enterprise

125 lines 9.57 kB
import { createReadStream } from 'node:fs'; import { Readable } from 'node:stream'; import { pipeline } from 'node:stream/promises'; import { fromData, fromStream } from 'ssri'; import * as tar from 'tar'; // /@cnpm%2ffoo // /@cnpm%2Ffoo // /@cnpm/foo // /foo // name max length is 214 chars // https://www.npmjs.com/package/path-to-regexp#custom-matching-parameters export const FULLNAME_REG_STRING = '@[^/]{1,220}/[^/]{1,220}|@[^%]+%2[fF][^/]{1,220}|[^@/]{1,220}'; export function getScopeAndName(fullname) { if (fullname.startsWith('@')) { return fullname.split('/', 2); } return ['', fullname]; } export function getFullname(scope, name) { return scope ? `${scope}/${name}` : name; } export function cleanUserPrefix(username) { return username.replace(/^.*:/, ''); } export function getPrefixedName(prefix, username) { return prefix ? `${prefix}${username}` : username; } export async function calculateIntegrity(contentOrFile) { let integrityObj; if (typeof contentOrFile === 'string') { integrityObj = await fromStream(createReadStream(contentOrFile), { algorithms: ['sha512', 'sha1'], }); } else { integrityObj = fromData(contentOrFile, { algorithms: ['sha512', 'sha1'], }); } const integrity = integrityObj.sha512[0].toString(); const shasum = integrityObj.sha1[0].hexDigest(); return { integrity, shasum }; } export function formatTarball(registry, scope, name, version) { const fullname = getFullname(scope, name); return `${registry}/${fullname}/-/${name}-${version}.tgz`; } export function detectInstallScript(manifest) { // https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md#abbreviated-version-object let hasInstallScript = false; const scripts = manifest.scripts; // https://www.npmjs.com/package/fix-has-install-script if (scripts?.install || scripts?.preinstall || scripts?.postinstall) { hasInstallScript = true; } return hasInstallScript; } /** 判断一个版本压缩包中是否包含 npm-shrinkwrap.json */ export async function hasShrinkWrapInTgz(contentOrFile) { let readable; if (typeof contentOrFile === 'string') { readable = createReadStream(contentOrFile); } else { readable = new Readable({ read() { this.push(contentOrFile); this.push(null); }, }); } let hasShrinkWrap = false; const abortController = new AbortController(); const parser = tar.t({ // options.strict 默认为 false,会忽略 Recoverable errors,例如 tar 解析失败 // 详见 https://github.com/isaacs/node-tar#warnings-and-errors onentry(entry) { if (entry.path === 'package/npm-shrinkwrap.json') { hasShrinkWrap = true; abortController.abort(); } }, }); try { await pipeline(readable, parser, { signal: abortController.signal }); return hasShrinkWrap; } catch (e) { if (e.code === 'ABORT_ERR') { return hasShrinkWrap; } throw Object.assign(new Error('[hasShrinkWrapInTgz] Fail to parse input file'), { cause: e }); } } /** 写入 ES 时,格式化 author */ export function formatAuthor(author) { if (author === undefined) { return author; } if (typeof author === 'string') { return { name: author }; } return author; } export async function extractPackageJSON(tarballBytes) { return new Promise((resolve, reject) => { Readable.from(tarballBytes).pipe(tar.t({ filter: (name) => name === 'package/package.json', onentry: async (entry) => { const chunks = []; for await (const chunk of entry) { chunks.push(chunk); } try { const data = Buffer.concat(chunks); return resolve(JSON.parse(data.toString())); } catch { reject(new Error('Error parsing package.json')); } }, })); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZVV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcHAvY29tbW9uL1BhY2thZ2VVdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBaUIsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFJM0IsZUFBZTtBQUNmLGVBQWU7QUFDZixhQUFhO0FBQ2IsT0FBTztBQUNQLCtCQUErQjtBQUMvQiwwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsK0RBQStELENBQUM7QUFFbkcsTUFBTSxVQUFVLGVBQWUsQ0FBQyxRQUFnQjtJQUM5QyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3QixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQ3JELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFl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