mirror of
https://github.com/artegoser/pimi-launcher-core.git
synced 2024-12-23 10:23:47 +03:00
OS path friendly, should address #8.
Also refactored code! Thanks Melon!
This commit is contained in:
parent
e207529dac
commit
fd534159c8
3 changed files with 89 additions and 98 deletions
|
@ -13,6 +13,7 @@ function downloadAsync (url, directory, name) {
|
|||
const _request = request(url, {timeout: 10000});
|
||||
|
||||
_request.on('error', function(error) {
|
||||
shelljs.rm(path.join(directory, name)); // Prevents duplicates.
|
||||
resolve({
|
||||
failed: true,
|
||||
asset: {
|
||||
|
@ -87,7 +88,7 @@ module.exports.getAssets = function (directory, version) {
|
|||
|
||||
const index = require(path.join(directory, 'assets', 'indexes',`${version.assetIndex.id}.json`));
|
||||
|
||||
const mainAssetsDownload = Object.keys(index.objects).map(async asset => {
|
||||
await Promise.all(Object.keys(index.objects).map(async asset => {
|
||||
const hash = index.objects[asset].hash;
|
||||
const subhash = hash.substring(0,2);
|
||||
const assetDirectory = path.join(directory, 'assets', 'objects', subhash);
|
||||
|
@ -97,9 +98,7 @@ module.exports.getAssets = function (directory, version) {
|
|||
|
||||
if(download.failed) failed.push(download.asset);
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all(mainAssetsDownload);
|
||||
}));
|
||||
|
||||
// why do we have this? B/c sometimes Minecraft's resource site times out!
|
||||
if(failed) {
|
||||
|
@ -108,7 +107,7 @@ module.exports.getAssets = function (directory, version) {
|
|||
|
||||
// Copy assets to legacy if it's an older Minecarft version.
|
||||
if(version.assets === "legacy" || version.assets === "pre-1.6") {
|
||||
const legacyCopy = Object.keys(index.objects).map(async asset => {
|
||||
await Promise.all(Object.keys(index.objects).map(async asset => {
|
||||
const hash = index.objects[asset].hash;
|
||||
const subhash = hash.substring(0,2);
|
||||
const assetDirectory = path.join(directory, 'assets', 'objects', subhash);
|
||||
|
@ -123,9 +122,7 @@ module.exports.getAssets = function (directory, version) {
|
|||
if (!fs.existsSync(path.join(directory, 'assets', 'legacy', asset))) {
|
||||
fs.copyFileSync(path.join(assetDirectory, hash), path.join(directory, 'assets', 'legacy', asset))
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all(legacyCopy);
|
||||
}));
|
||||
}
|
||||
|
||||
resolve();
|
||||
|
@ -143,7 +140,7 @@ module.exports.getNatives = function (root, version, os) {
|
|||
|
||||
shelljs.mkdir('-p', nativeDirectory);
|
||||
|
||||
const download = version.libraries.map(async function (lib) {
|
||||
await Promise.all(version.libraries.map(async function (lib) {
|
||||
if (!lib.downloads.classifiers) return;
|
||||
const type = `natives-${os}`;
|
||||
const native = lib.downloads.classifiers[type];
|
||||
|
@ -159,9 +156,7 @@ module.exports.getNatives = function (root, version, os) {
|
|||
}
|
||||
shelljs.rm(path.join(nativeDirectory, name));
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all(download);
|
||||
}));
|
||||
}
|
||||
|
||||
resolve(nativeDirectory);
|
||||
|
@ -175,12 +170,11 @@ module.exports.getForgeDependencies = async function(root, version, forgeJarPath
|
|||
await new zip(forgeJarPath).extractEntryTo('version.json', path.join(root, 'forge', `${version.id}`), false, true);
|
||||
|
||||
const forge = require(path.join(root, 'forge', `${version.id}`, 'version.json'));
|
||||
const forgeLibs = forge.libraries;
|
||||
const mavenUrl = 'http://files.minecraftforge.net/maven/';
|
||||
const defaultRepo = 'https://libraries.minecraft.net/';
|
||||
const paths = [];
|
||||
|
||||
const download = forgeLibs.map(async library => {
|
||||
await Promise.all(forge.libraries.map(async library => {
|
||||
const lib = library.name.split(':');
|
||||
|
||||
if(lib[0] === 'net.minecraftforge' && lib[1].includes('forge')) return;
|
||||
|
@ -200,17 +194,15 @@ module.exports.getForgeDependencies = async function(root, version, forgeJarPath
|
|||
const downloadLink = `${url}${lib[0].replace(/\./g, '/')}/${lib[1]}/${lib[2]}/${lib[1]}-${lib[2]}.jar`;
|
||||
|
||||
if(fs.existsSync(path.join(jarPath, name))) {
|
||||
paths.push(`${jarPath}\\${name}`);
|
||||
paths.push(`${jarPath}${path.sep}${name}`);
|
||||
return;
|
||||
}
|
||||
if(!fs.existsSync(jarPath)) shelljs.mkdir('-p', jarPath);
|
||||
|
||||
await downloadAsync(downloadLink, jarPath, name);
|
||||
|
||||
paths.push(`${jarPath}\\${name}`);
|
||||
});
|
||||
|
||||
await Promise.all(download);
|
||||
paths.push(`${jarPath}${path.sep}${name}`);
|
||||
}));
|
||||
|
||||
return {paths, forge};
|
||||
};
|
||||
|
@ -227,11 +219,11 @@ module.exports.getClasses = function (options, version) {
|
|||
const jarPath = path.join(options.root, 'libraries', `${lib[0].replace(/\./g, '/')}/${lib[1]}/${lib[2]}`);
|
||||
const name = `${lib[1]}-${lib[2]}.jar`;
|
||||
|
||||
libs.push(`${jarPath}\\${name}`);
|
||||
libs.push(`${jarPath}/${name}`);
|
||||
})
|
||||
}
|
||||
|
||||
const libraries = version.libraries.map(async (_lib) => {
|
||||
await Promise.all(version.libraries.map(async (_lib) => {
|
||||
if(!_lib.downloads.artifact) return;
|
||||
|
||||
const libraryPath = _lib.downloads.artifact.path;
|
||||
|
@ -239,17 +231,15 @@ module.exports.getClasses = function (options, version) {
|
|||
const libraryDirectory = path.join(options.root, 'libraries', libraryPath);
|
||||
|
||||
if(!fs.existsSync(libraryDirectory)) {
|
||||
let directory = libraryDirectory.split('\\');
|
||||
let directory = libraryDirectory.split(path.sep);
|
||||
const name = directory.pop();
|
||||
directory = directory.join('\\');
|
||||
directory = directory.join(path.sep);
|
||||
|
||||
await downloadAsync(libraryUrl, directory, name);
|
||||
}
|
||||
|
||||
libs.push(libraryDirectory);
|
||||
});
|
||||
|
||||
await Promise.all(libraries);
|
||||
}));
|
||||
|
||||
resolve(libs)
|
||||
});
|
||||
|
|
|
@ -6,6 +6,7 @@ const fs = require('fs');
|
|||
|
||||
|
||||
module.exports = async function (options) {
|
||||
options.root = path.normalize(options.root);
|
||||
if(!fs.existsSync(options.root)) fs.mkdirSync(options.root);
|
||||
|
||||
if(options.clientPackage) {
|
||||
|
|
144
package-lock.json
generated
144
package-lock.json
generated
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "mcclauncher",
|
||||
"version": "0.0.1",
|
||||
"name": "minecraft-launcher-core",
|
||||
"version": "2.5.6",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
@ -14,10 +14,10 @@
|
|||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
|
||||
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
|
||||
"requires": {
|
||||
"co": "4.6.0",
|
||||
"fast-deep-equal": "1.1.0",
|
||||
"fast-json-stable-stringify": "2.0.0",
|
||||
"json-schema-traverse": "0.3.1"
|
||||
"co": "^4.6.0",
|
||||
"fast-deep-equal": "^1.0.0",
|
||||
"fast-json-stable-stringify": "^2.0.0",
|
||||
"json-schema-traverse": "^0.3.0"
|
||||
}
|
||||
},
|
||||
"asn1": {
|
||||
|
@ -25,7 +25,7 @@
|
|||
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
|
||||
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
|
||||
"requires": {
|
||||
"safer-buffer": "2.1.2"
|
||||
"safer-buffer": "~2.1.0"
|
||||
}
|
||||
},
|
||||
"assert-plus": {
|
||||
|
@ -59,7 +59,7 @@
|
|||
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"tweetnacl": "0.14.5"
|
||||
"tweetnacl": "^0.14.3"
|
||||
}
|
||||
},
|
||||
"brace-expansion": {
|
||||
|
@ -67,7 +67,7 @@
|
|||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"requires": {
|
||||
"balanced-match": "1.0.0",
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
|
@ -86,7 +86,7 @@
|
|||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
|
||||
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
|
||||
"requires": {
|
||||
"delayed-stream": "1.0.0"
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"concat-map": {
|
||||
|
@ -104,7 +104,7 @@
|
|||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0"
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"delayed-stream": {
|
||||
|
@ -118,8 +118,8 @@
|
|||
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"jsbn": "0.1.1",
|
||||
"safer-buffer": "2.1.2"
|
||||
"jsbn": "~0.1.0",
|
||||
"safer-buffer": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"extend": {
|
||||
|
@ -152,9 +152,9 @@
|
|||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
|
||||
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
|
||||
"requires": {
|
||||
"asynckit": "0.4.0",
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "1.0.6",
|
||||
"mime-types": "2.1.20"
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"dependencies": {
|
||||
"combined-stream": {
|
||||
|
@ -162,7 +162,7 @@
|
|||
"resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
|
||||
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
|
||||
"requires": {
|
||||
"delayed-stream": "1.0.0"
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -177,7 +177,7 @@
|
|||
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
|
||||
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0"
|
||||
"assert-plus": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"glob": {
|
||||
|
@ -185,12 +185,12 @@
|
|||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
|
||||
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
|
||||
"requires": {
|
||||
"fs.realpath": "1.0.0",
|
||||
"inflight": "1.0.6",
|
||||
"inherits": "2.0.3",
|
||||
"minimatch": "3.0.4",
|
||||
"once": "1.4.0",
|
||||
"path-is-absolute": "1.0.1"
|
||||
"fs.realpath": "^1.0.0",
|
||||
"inflight": "^1.0.4",
|
||||
"inherits": "2",
|
||||
"minimatch": "^3.0.4",
|
||||
"once": "^1.3.0",
|
||||
"path-is-absolute": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"har-schema": {
|
||||
|
@ -203,8 +203,8 @@
|
|||
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
|
||||
"integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
|
||||
"requires": {
|
||||
"ajv": "5.5.2",
|
||||
"har-schema": "2.0.0"
|
||||
"ajv": "^5.3.0",
|
||||
"har-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"http-signature": {
|
||||
|
@ -212,9 +212,9 @@
|
|||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
||||
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"jsprim": "1.4.1",
|
||||
"sshpk": "1.14.2"
|
||||
"assert-plus": "^1.0.0",
|
||||
"jsprim": "^1.2.2",
|
||||
"sshpk": "^1.7.0"
|
||||
}
|
||||
},
|
||||
"inflight": {
|
||||
|
@ -222,8 +222,8 @@
|
|||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||
"requires": {
|
||||
"once": "1.4.0",
|
||||
"wrappy": "1.0.2"
|
||||
"once": "^1.3.0",
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
|
@ -288,7 +288,7 @@
|
|||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
|
||||
"integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
|
||||
"requires": {
|
||||
"mime-db": "1.36.0"
|
||||
"mime-db": "~1.36.0"
|
||||
}
|
||||
},
|
||||
"minimatch": {
|
||||
|
@ -296,7 +296,7 @@
|
|||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"requires": {
|
||||
"brace-expansion": "1.1.11"
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
},
|
||||
"node-fetch": {
|
||||
|
@ -314,7 +314,7 @@
|
|||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"requires": {
|
||||
"wrappy": "1.0.2"
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"path-is-absolute": {
|
||||
|
@ -352,7 +352,7 @@
|
|||
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
||||
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
|
||||
"requires": {
|
||||
"resolve": "1.8.1"
|
||||
"resolve": "^1.1.6"
|
||||
}
|
||||
},
|
||||
"request": {
|
||||
|
@ -360,26 +360,26 @@
|
|||
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
|
||||
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
|
||||
"requires": {
|
||||
"aws-sign2": "0.7.0",
|
||||
"aws4": "1.8.0",
|
||||
"caseless": "0.12.0",
|
||||
"combined-stream": "1.0.7",
|
||||
"extend": "3.0.2",
|
||||
"forever-agent": "0.6.1",
|
||||
"form-data": "2.3.2",
|
||||
"har-validator": "5.1.0",
|
||||
"http-signature": "1.2.0",
|
||||
"is-typedarray": "1.0.0",
|
||||
"isstream": "0.1.2",
|
||||
"json-stringify-safe": "5.0.1",
|
||||
"mime-types": "2.1.20",
|
||||
"oauth-sign": "0.9.0",
|
||||
"performance-now": "2.1.0",
|
||||
"qs": "6.5.2",
|
||||
"safe-buffer": "5.1.2",
|
||||
"tough-cookie": "2.4.3",
|
||||
"tunnel-agent": "0.6.0",
|
||||
"uuid": "3.3.2"
|
||||
"aws-sign2": "~0.7.0",
|
||||
"aws4": "^1.8.0",
|
||||
"caseless": "~0.12.0",
|
||||
"combined-stream": "~1.0.6",
|
||||
"extend": "~3.0.2",
|
||||
"forever-agent": "~0.6.1",
|
||||
"form-data": "~2.3.2",
|
||||
"har-validator": "~5.1.0",
|
||||
"http-signature": "~1.2.0",
|
||||
"is-typedarray": "~1.0.0",
|
||||
"isstream": "~0.1.2",
|
||||
"json-stringify-safe": "~5.0.1",
|
||||
"mime-types": "~2.1.19",
|
||||
"oauth-sign": "~0.9.0",
|
||||
"performance-now": "^2.1.0",
|
||||
"qs": "~6.5.2",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"tough-cookie": "~2.4.3",
|
||||
"tunnel-agent": "^0.6.0",
|
||||
"uuid": "^3.3.2"
|
||||
}
|
||||
},
|
||||
"resolve": {
|
||||
|
@ -387,7 +387,7 @@
|
|||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
|
||||
"integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
|
||||
"requires": {
|
||||
"path-parse": "1.0.6"
|
||||
"path-parse": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
|
@ -405,9 +405,9 @@
|
|||
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz",
|
||||
"integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==",
|
||||
"requires": {
|
||||
"glob": "7.1.3",
|
||||
"interpret": "1.1.0",
|
||||
"rechoir": "0.6.2"
|
||||
"glob": "^7.0.0",
|
||||
"interpret": "^1.0.0",
|
||||
"rechoir": "^0.6.2"
|
||||
}
|
||||
},
|
||||
"sshpk": {
|
||||
|
@ -415,15 +415,15 @@
|
|||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
|
||||
"integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
|
||||
"requires": {
|
||||
"asn1": "0.2.4",
|
||||
"assert-plus": "1.0.0",
|
||||
"bcrypt-pbkdf": "1.0.2",
|
||||
"dashdash": "1.14.1",
|
||||
"ecc-jsbn": "0.1.2",
|
||||
"getpass": "0.1.7",
|
||||
"jsbn": "0.1.1",
|
||||
"safer-buffer": "2.1.2",
|
||||
"tweetnacl": "0.14.5"
|
||||
"asn1": "~0.2.3",
|
||||
"assert-plus": "^1.0.0",
|
||||
"bcrypt-pbkdf": "^1.0.0",
|
||||
"dashdash": "^1.12.0",
|
||||
"ecc-jsbn": "~0.1.1",
|
||||
"getpass": "^0.1.1",
|
||||
"jsbn": "~0.1.0",
|
||||
"safer-buffer": "^2.0.2",
|
||||
"tweetnacl": "~0.14.0"
|
||||
}
|
||||
},
|
||||
"tough-cookie": {
|
||||
|
@ -431,8 +431,8 @@
|
|||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
|
||||
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
|
||||
"requires": {
|
||||
"psl": "1.1.29",
|
||||
"punycode": "1.4.1"
|
||||
"psl": "^1.1.24",
|
||||
"punycode": "^1.4.1"
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
|
@ -440,7 +440,7 @@
|
|||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.2"
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"tweetnacl": {
|
||||
|
@ -459,9 +459,9 @@
|
|||
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
|
||||
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
|
||||
"requires": {
|
||||
"assert-plus": "1.0.0",
|
||||
"assert-plus": "^1.0.0",
|
||||
"core-util-is": "1.0.2",
|
||||
"extsprintf": "1.3.0"
|
||||
"extsprintf": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"wrappy": {
|
||||
|
|
Loading…
Add table
Reference in a new issue