mirror of
https://gitee.com/myxzgzs/boyue_jnpf.git
synced 2025-08-11 00:32:45 +08:00
326 lines
9.7 KiB
JavaScript
326 lines
9.7 KiB
JavaScript
![]() |
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.normalizePackageData = normalizePackageData;
|
||
|
const hosted_git_info_1 = require("hosted-git-info");
|
||
|
const semver = require("semver");
|
||
|
const url = require("url");
|
||
|
function normalizePackageData(data) {
|
||
|
for (const it of check) {
|
||
|
it(data);
|
||
|
}
|
||
|
}
|
||
|
const depTypes = ["dependencies", "devDependencies", "optionalDependencies"];
|
||
|
const check = [
|
||
|
function (data) {
|
||
|
if (data.repositories) {
|
||
|
data.repository = data.repositories[0];
|
||
|
}
|
||
|
if (typeof data.repository === "string") {
|
||
|
data.repository = {
|
||
|
type: "git",
|
||
|
url: data.repository,
|
||
|
};
|
||
|
}
|
||
|
if (data.repository != null && data.repository.url) {
|
||
|
const hosted = (0, hosted_git_info_1.fromUrl)(data.repository.url);
|
||
|
if (hosted) {
|
||
|
data.repository.url = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString();
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
function (data) {
|
||
|
const files = data.files;
|
||
|
if (files && !Array.isArray(files)) {
|
||
|
delete data.files;
|
||
|
}
|
||
|
else if (data.files) {
|
||
|
data.files = data.files.filter(function (file) {
|
||
|
return !(!file || typeof file !== "string");
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
function (data) {
|
||
|
if (!data.bin) {
|
||
|
return;
|
||
|
}
|
||
|
if (typeof data.bin === "string") {
|
||
|
const b = {};
|
||
|
const match = data.name.match(/^@[^/]+[/](.*)$/);
|
||
|
if (match) {
|
||
|
b[match[1]] = data.bin;
|
||
|
}
|
||
|
else {
|
||
|
b[data.name] = data.bin;
|
||
|
}
|
||
|
data.bin = b;
|
||
|
}
|
||
|
},
|
||
|
function (data) {
|
||
|
if (data.description && typeof data.description !== "string") {
|
||
|
delete data.description;
|
||
|
}
|
||
|
if (data.description === undefined) {
|
||
|
delete data.description;
|
||
|
}
|
||
|
},
|
||
|
fixBundleDependenciesField,
|
||
|
function fixDependencies(data) {
|
||
|
objectifyDeps(data);
|
||
|
fixBundleDependenciesField(data);
|
||
|
for (const deps of ["dependencies", "devDependencies", "optionalDependencies"]) {
|
||
|
if (!(deps in data)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (!data[deps] || typeof data[deps] !== "object") {
|
||
|
delete data[deps];
|
||
|
continue;
|
||
|
}
|
||
|
Object.keys(data[deps]).forEach(function (d) {
|
||
|
const r = data[deps][d];
|
||
|
if (typeof r !== "string") {
|
||
|
delete data[deps][d];
|
||
|
}
|
||
|
const hosted = (0, hosted_git_info_1.fromUrl)(data[deps][d]);
|
||
|
if (hosted) {
|
||
|
data[deps][d] = hosted.toString();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
function fixBugsField(data) {
|
||
|
if (!data.bugs && data.repository && data.repository.url) {
|
||
|
const hosted = (0, hosted_git_info_1.fromUrl)(data.repository.url);
|
||
|
if (hosted && hosted.bugs()) {
|
||
|
data.bugs = { url: hosted.bugs() };
|
||
|
}
|
||
|
}
|
||
|
else if (data.bugs) {
|
||
|
const emailRe = /^.+@.*\..+$/;
|
||
|
if (typeof data.bugs == "string") {
|
||
|
if (emailRe.test(data.bugs)) {
|
||
|
data.bugs = { email: data.bugs };
|
||
|
}
|
||
|
else if (url.parse(data.bugs).protocol) {
|
||
|
data.bugs = { url: data.bugs };
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
bugsTypos(data.bugs);
|
||
|
const oldBugs = data.bugs;
|
||
|
data.bugs = {};
|
||
|
if (oldBugs.url) {
|
||
|
if (typeof oldBugs.url == "string" && url.parse(oldBugs.url).protocol) {
|
||
|
data.bugs.url = oldBugs.url;
|
||
|
}
|
||
|
}
|
||
|
if (oldBugs.email) {
|
||
|
if (typeof oldBugs.email == "string" && emailRe.test(oldBugs.email)) {
|
||
|
data.bugs.email = oldBugs.email;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (!data.bugs.email && !data.bugs.url) {
|
||
|
delete data.bugs;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
function fixModulesField(data) {
|
||
|
if (data.modules) {
|
||
|
delete data.modules;
|
||
|
}
|
||
|
},
|
||
|
function fixKeywordsField(data) {
|
||
|
if (typeof data.keywords === "string") {
|
||
|
data.keywords = data.keywords.split(/,\s+/);
|
||
|
}
|
||
|
if (data.keywords && !Array.isArray(data.keywords)) {
|
||
|
delete data.keywords;
|
||
|
}
|
||
|
else if (data.keywords) {
|
||
|
data.keywords = data.keywords.filter(function (kw) {
|
||
|
return !(typeof kw !== "string" || !kw);
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
function fixVersionField(data) {
|
||
|
const loose = true;
|
||
|
if (!data.version) {
|
||
|
data.version = "";
|
||
|
return true;
|
||
|
}
|
||
|
if (!semver.valid(data.version, loose)) {
|
||
|
throw new Error(`Invalid version: "${data.version}"`);
|
||
|
}
|
||
|
data.version = semver.clean(data.version, loose);
|
||
|
return true;
|
||
|
},
|
||
|
function fixPeople(data) {
|
||
|
modifyPeople(data, unParsePerson);
|
||
|
modifyPeople(data, parsePerson);
|
||
|
},
|
||
|
function fixNameField(data) {
|
||
|
if (!data.name) {
|
||
|
data.name = "";
|
||
|
return;
|
||
|
}
|
||
|
if (typeof data.name !== "string") {
|
||
|
throw new Error("name field must be a string.");
|
||
|
}
|
||
|
data.name = data.name.trim();
|
||
|
ensureValidName(data.name);
|
||
|
},
|
||
|
function fixHomepageField(data) {
|
||
|
if (!data.homepage && data.repository && data.repository.url) {
|
||
|
const hosted = (0, hosted_git_info_1.fromUrl)(data.repository.url);
|
||
|
if (hosted && hosted.docs()) {
|
||
|
data.homepage = hosted.docs();
|
||
|
}
|
||
|
}
|
||
|
if (!data.homepage) {
|
||
|
return;
|
||
|
}
|
||
|
if (typeof data.homepage !== "string") {
|
||
|
delete data.homepage;
|
||
|
}
|
||
|
if (!url.parse(data.homepage).protocol) {
|
||
|
data.homepage = `https://${data.homepage}`;
|
||
|
}
|
||
|
return;
|
||
|
},
|
||
|
];
|
||
|
function fixBundleDependenciesField(data) {
|
||
|
const bdd = "bundledDependencies";
|
||
|
const bd = "bundleDependencies";
|
||
|
if (data[bdd] && !data[bd]) {
|
||
|
data[bd] = data[bdd];
|
||
|
delete data[bdd];
|
||
|
}
|
||
|
if (data[bd] && !Array.isArray(data[bd])) {
|
||
|
delete data[bd];
|
||
|
}
|
||
|
else if (data[bd]) {
|
||
|
data[bd] = data[bd].filter(function (bd) {
|
||
|
if (!bd || typeof bd !== "string") {
|
||
|
return false;
|
||
|
}
|
||
|
else {
|
||
|
if (!data.dependencies) {
|
||
|
data.dependencies = {};
|
||
|
}
|
||
|
if (!("bd" in data.dependencies)) {
|
||
|
data.dependencies[bd] = "*";
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
function isValidScopedPackageName(spec) {
|
||
|
if (spec.charAt(0) !== "@") {
|
||
|
return false;
|
||
|
}
|
||
|
const rest = spec.slice(1).split("/");
|
||
|
if (rest.length !== 2) {
|
||
|
return false;
|
||
|
}
|
||
|
return rest[0] !== "" && rest[1] !== "" && rest[0] != null && rest[1] != null && rest[0] === encodeURIComponent(rest[0]) && rest[1] === encodeURIComponent(rest[1]);
|
||
|
}
|
||
|
function isCorrectlyEncodedName(spec) {
|
||
|
return !/[/@\s+%:]/.test(spec) && spec === encodeURIComponent(spec);
|
||
|
}
|
||
|
function ensureValidName(name) {
|
||
|
if (name.charAt(0) === "." ||
|
||
|
!(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) ||
|
||
|
name.toLowerCase() === "node_modules" ||
|
||
|
name.toLowerCase() === "favicon.ico") {
|
||
|
throw new Error("Invalid name: " + JSON.stringify(name));
|
||
|
}
|
||
|
}
|
||
|
function modifyPeople(data, fn) {
|
||
|
if (data.author) {
|
||
|
data.author = fn(data.author);
|
||
|
}
|
||
|
for (const set of ["maintainers", "contributors"]) {
|
||
|
if (!Array.isArray(data[set])) {
|
||
|
continue;
|
||
|
}
|
||
|
data[set] = data[set].map(fn);
|
||
|
}
|
||
|
return data;
|
||
|
}
|
||
|
function unParsePerson(person) {
|
||
|
if (typeof person === "string") {
|
||
|
return person;
|
||
|
}
|
||
|
const name = person.name || "";
|
||
|
const u = person.url || person.web;
|
||
|
const url = u ? ` (${u})` : "";
|
||
|
const e = person.email || person.mail;
|
||
|
const email = e ? ` <${e}>` : "";
|
||
|
return `${name}${email}${url}`;
|
||
|
}
|
||
|
function parsePerson(person) {
|
||
|
if (typeof person !== "string") {
|
||
|
return person;
|
||
|
}
|
||
|
const name = /^([^(<]+)/.exec(person);
|
||
|
const url = /\(([^)]+)\)/.exec(person);
|
||
|
const email = /<([^>]+)>/.exec(person);
|
||
|
const obj = {};
|
||
|
if (name && name[0].trim()) {
|
||
|
obj.name = name[0].trim();
|
||
|
}
|
||
|
if (email) {
|
||
|
obj.email = email[1];
|
||
|
}
|
||
|
if (url) {
|
||
|
obj.url = url[1];
|
||
|
}
|
||
|
return obj;
|
||
|
}
|
||
|
function depObjectify(deps) {
|
||
|
if (!deps) {
|
||
|
return {};
|
||
|
}
|
||
|
if (typeof deps === "string") {
|
||
|
deps = deps.trim().split(/[\n\r\s\t ,]+/);
|
||
|
}
|
||
|
if (!Array.isArray(deps)) {
|
||
|
return deps;
|
||
|
}
|
||
|
const o = {};
|
||
|
deps
|
||
|
.filter(function (d) {
|
||
|
return typeof d === "string";
|
||
|
})
|
||
|
.forEach(function (d) {
|
||
|
const arr = d.trim().split(/(:?[@\s><=])/);
|
||
|
const dn = arr.shift();
|
||
|
let dv = arr.join("");
|
||
|
dv = dv.trim();
|
||
|
dv = dv.replace(/^@/, "");
|
||
|
o[dn] = dv;
|
||
|
});
|
||
|
return o;
|
||
|
}
|
||
|
function objectifyDeps(data) {
|
||
|
depTypes.forEach(function (type) {
|
||
|
if (!data[type]) {
|
||
|
return;
|
||
|
}
|
||
|
data[type] = depObjectify(data[type]);
|
||
|
});
|
||
|
}
|
||
|
const typoBugs = { web: "url", name: "url" };
|
||
|
function bugsTypos(bugs) {
|
||
|
if (!bugs) {
|
||
|
return;
|
||
|
}
|
||
|
Object.keys(bugs).forEach(function (k) {
|
||
|
if (typoBugs[k]) {
|
||
|
bugs[typoBugs[k]] = bugs[k];
|
||
|
delete bugs[k];
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
//# sourceMappingURL=normalizePackageData.js.map
|