├── .gitignore ├── LICENCE ├── README.md ├── assets └── MCB Title B.png ├── cli.js ├── lib └── core │ ├── check_for_lang_updates.js │ ├── config.js │ ├── error_loggers.js │ ├── errors.js │ ├── interface.js │ ├── io.js │ ├── lang_placeholder.js │ ├── load_language.js │ ├── log.js │ ├── persistent.js │ ├── secondary_entry.js │ └── shared_working.js ├── package-lock.json ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .vscode/ 3 | *.mcfunction 4 | .mcproject/ 5 | data/ 6 | src/ 7 | .cache -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Ian Senne 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # THIS REPO HAS MOVED TO [HERE](https://github.com/mc-build/mc-build) AND WILL NOT BE MAINTAINED. 2 | # FOR MORE INFO ABOUT MC-BUILD YOU CAN VISIT THE SITE [HERE](https://mcbuild.dev) 3 | 4 | MCB Banner 5 | 6 | ## need help? 7 | 8 | feel free to come ask for help in the mc-build discord https://discord.gg/kpGqTDX. 9 | 10 | # mc-build 11 | 12 | mc-build is a cli tool that helps with the creation of data packs through compiling a custom format to functions. the cli by default ships with just the mc language although you can add more languages by putting them in the `lang` folder in your project root. 13 | 14 | ## cli 15 | 16 | | command | result | 17 | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | 18 | | `mcb` | will build the project in the active directory | 19 | | `mcb -config [js,json]` | generate a config file based on the default configs of all loaded languages. | 20 | | `mcb -build` | will cause mc-build to run a single build of the project and then exit, also sets the build flag in the js config to `true` | 21 | 22 | ## installation 23 | 24 | ### prerequisites 25 | 26 | mc-build runs on nodejs, if you don't already have it you can get it at https://nodejs.org 27 | 28 | ### yarn 29 | 30 | ```bash 31 | $ yarn global add mc-build 32 | ``` 33 | 34 | ### npm 35 | 36 | ```bash 37 | $ npm i -g mc-build 38 | ``` 39 | 40 | ### documentation 41 | 42 | [https://www.notion.so/mc-build-docs-aefab309c8d3492982296abbb1853826](docs) 43 | 44 | ### I as well as the mc-build project am not affiliated with Mojang in any way. 45 | -------------------------------------------------------------------------------- /assets/MCB Title B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IanSSenne/mcbuild/9c339a8f59010da35ba86532e02b824b82f4c5c6/assets/MCB Title B.png -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require("./lib/core/check_for_lang_updates"); -------------------------------------------------------------------------------- /lib/core/check_for_lang_updates.js: -------------------------------------------------------------------------------- 1 | const fetch = require("node-fetch"); 2 | const download = require("download"); 3 | const { performance } = require("perf_hooks"); 4 | const fs = require("fs"); 5 | const path = require("path"); 6 | const logger = require("./log"); 7 | const SAVE_DIR = path.resolve(process.cwd(), "./.mcproject"); 8 | const LOCAL_DIR = path.resolve(process.env.APPDATA, 'mc-build', 'local'); 9 | fs.mkdirSync(LOCAL_DIR, { recursive: true }); 10 | const PROJECT_LOC = path.resolve(SAVE_DIR, 'PROJECT.json'); 11 | let manifest = { 12 | languages: [ 13 | { 14 | name: "lang-mc/stable", 15 | remote: { 16 | type: "github", 17 | owner: "mc-build" 18 | }, 19 | options: { 20 | logging: "all", 21 | } 22 | } 23 | ] 24 | }; 25 | if (!fs.existsSync(SAVE_DIR)) { 26 | fs.mkdirSync(SAVE_DIR); 27 | } 28 | if (fs.existsSync(PROJECT_LOC)) { 29 | manifest = JSON.parse(fs.readFileSync(PROJECT_LOC, 'utf-8')); 30 | } else { 31 | fs.writeFileSync(PROJECT_LOC, JSON.stringify(manifest, null, 2)); 32 | } 33 | (async () => { 34 | const promises = manifest.languages.map((language) => { 35 | switch (language.remote.type) { 36 | case "github": { 37 | let [name, version] = language.name.split("/"); 38 | version = version || "stable"; 39 | return fetch(`https://api.github.com/repos/${language.remote.owner}/${name}/branches/${version}`) 40 | .then((res) => res.json()) 41 | .then((data) => { 42 | return { 43 | _raw: data, 44 | sha: data.commit.sha, 45 | lang: language 46 | } 47 | }); 48 | } 49 | case "file": { 50 | return Promise.resolve( 51 | { 52 | _raw: language, 53 | sha: "NO_SHA_LANG_LOADED_FROM_FILE_SYSTEM", 54 | lang: language 55 | } 56 | ); 57 | } 58 | } 59 | }); 60 | const download_tasks = []; 61 | (await Promise.all(promises)).forEach((lang) => { 62 | if (!fs.existsSync(path.resolve(LOCAL_DIR, lang.sha))) { 63 | download_tasks.push(lang); 64 | } 65 | }); 66 | for (let i = 0; i < download_tasks.length; i++) { 67 | const task = download_tasks[i]; 68 | if (!fs.existsSync(path.resolve(LOCAL_DIR))) { 69 | fs.mkdirSync(path.resolve(LOCAL_DIR)); 70 | } 71 | if (!fs.existsSync(path.resolve(LOCAL_DIR, '.cache'))) { 72 | fs.mkdirSync(path.resolve(LOCAL_DIR, '.cache')); 73 | } 74 | const lang = task.lang; 75 | 76 | const start = performance.now(); 77 | if (lang.remote.type === "github") { 78 | let [name, version] = task.lang.name.split("/"); 79 | const SHA_PATH = path.resolve(LOCAL_DIR, 'sha1', name); 80 | if (fs.existsSync(path.resolve(path.resolve(SHA_PATH, version + ".sha"))) 81 | && task.sha === fs.readFileSync(path.resolve(SHA_PATH, version + ".sha"), "utf-8") 82 | ) { 83 | logger.log("using cached language for '" + task.lang.name + "'"); 84 | } else { 85 | 86 | version = version || "stable"; 87 | logger.info(`downloading language ${name} branch ${version} from '${`https://github.com/${task.lang.remote.owner}/${name}/archive/${task.sha}.zip'`}`) 88 | await download( 89 | `https://github.com/${task.lang.remote.owner}/${name}/archive/${task.sha}.zip`, 90 | path.resolve(LOCAL_DIR, '.cache', name, version), 91 | { 92 | extract: true, 93 | "strip": 1 94 | } 95 | ); 96 | if (!fs.existsSync(SHA_PATH)) { 97 | fs.mkdirSync(SHA_PATH, { recursive: true }); 98 | } 99 | fs.writeFileSync(path.resolve(SHA_PATH, version + ".sha"), task.sha); 100 | const end = performance.now(); 101 | logger.info(`finished download in ${end - start}ms`) 102 | } 103 | } 104 | 105 | } 106 | logger.log("starting mc-build..."); 107 | require("./secondary_entry"); 108 | })(); -------------------------------------------------------------------------------- /lib/core/config.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const logger = require("./log"); 4 | const merge = require("merge-options"); 5 | 6 | const CONFIG_PATH_JSON = path.resolve(process.cwd(), "./config.json"); 7 | const CONFIG_PATH_JS = path.resolve(process.cwd(), "./config.js"); 8 | 9 | let options = { 10 | global: { 11 | onBuildSuccess: null 12 | } 13 | }; 14 | let populated = false; 15 | 16 | function populate() { 17 | if (!populated) { 18 | populated = true; 19 | if (fs.existsSync(CONFIG_PATH_JSON)) { 20 | logger.info("using config.json"); 21 | options = merge(options, require(CONFIG_PATH_JSON)); 22 | } else if (fs.existsSync(CONFIG_PATH_JS)) { 23 | logger.info("using config.js"); 24 | const potentialOptions = require(CONFIG_PATH_JS); 25 | let computedOptions = potentialOptions; 26 | if (typeof potentialOptions === "function") { 27 | computedOptions = potentialOptions({ 28 | build: process.argv.includes("-build") 29 | }); 30 | } 31 | options = merge(options, computedOptions); 32 | } else { 33 | logger.warn( 34 | "config not found, using defaults to generate a config please use 'mcb -config [json|js]' to generate a config" 35 | ); 36 | } 37 | } 38 | } 39 | 40 | function addConfig(lang, conf) { 41 | options[lang] = conf; 42 | } 43 | 44 | module.exports.config = () => { 45 | populate(); 46 | return options; 47 | }; 48 | module.exports.addConfig = addConfig; 49 | module.exports.populate = populate; 50 | -------------------------------------------------------------------------------- /lib/core/error_loggers.js: -------------------------------------------------------------------------------- 1 | const Chalk = require("chalk"); 2 | 3 | const logger = require("./log"); 4 | 5 | function critical(message, error, exit = true) { 6 | function center(message, size, fill) { 7 | const to_fill = (size - message.length) / 2; 8 | return ( 9 | fill.repeat(Math.floor(to_fill)) + 10 | message + 11 | fill.repeat(Math.ceil(to_fill)) 12 | ); 13 | } 14 | const width = 15 | Math.max( 16 | message.length, 17 | error.message.length, 18 | process.stdout.columns - 27 19 | ) + 17; 20 | logger.error( 21 | Chalk.bold.redBright( 22 | `⠴${center( 23 | Chalk.bgRedBright.bold.yellow("[Critical Error]"), 24 | width + 30, 25 | "⠒" 26 | )}⠦` 27 | ) 28 | ); 29 | logger.error(`${Chalk.bold.redBright("⠇" + " ".repeat(width) + "⠸")}`); 30 | logger.error( 31 | `${Chalk.bold.redBright("⠇")}${center( 32 | "REASON", 33 | width, 34 | " " 35 | )}${Chalk.bold.redBright("⠸")}` 36 | ); 37 | logger.error( 38 | `${Chalk.bold.redBright("⠇")}${center( 39 | message, 40 | width, 41 | " " 42 | )}${Chalk.bold.redBright("⠸")}` 43 | ); 44 | logger.error(`${Chalk.bold.redBright("⠇" + " ".repeat(width) + "⠸")}`); 45 | logger.error( 46 | `${Chalk.bold.redBright("⠇")}${center( 47 | "ERROR", 48 | width, 49 | " " 50 | )}${Chalk.bold.redBright("⠸")}` 51 | ); 52 | logger.error( 53 | `${Chalk.bold.redBright("⠇")}${center( 54 | error.message, 55 | width, 56 | " " 57 | )}${Chalk.bold.redBright("⠸")}` 58 | ); 59 | logger.error(`${Chalk.bold.redBright("⠇" + " ".repeat(width) + "⠸")}`); 60 | logger.error(Chalk.bold.redBright(`⠙${"⠒".repeat(width)}⠋`)); 61 | if (message === "unknown error") { 62 | console.log(error); 63 | } 64 | if (exit) process.exit(message); 65 | } 66 | 67 | function compiler(error) { 68 | function center(message, size, fill) { 69 | const to_fill = (size - message.length) / 2; 70 | return ( 71 | fill.repeat(Math.floor(to_fill)) + 72 | message + 73 | fill.repeat(Math.ceil(to_fill)) 74 | ); 75 | } 76 | const width = Math.max(error.message.length, process.stdout.columns - 10); 77 | logger.error( 78 | Chalk.bold.redBright( 79 | `⠴${center(Chalk.bold.black("[Compiler Error]"), width + 19, "⠒")}⠦` 80 | ) 81 | ); 82 | logger.error(`${Chalk.bold.redBright("⠇" + " ".repeat(width) + "⠸")}`); 83 | logger.error( 84 | `${Chalk.bold.redBright("⠇" + center(error.message, width, " ") + "⠸")}` 85 | ); 86 | logger.error( 87 | `${Chalk.bold.redBright( 88 | "⠇" + center("line:" + error.line, width, " ") + "⠸" 89 | )}` 90 | ); 91 | logger.error(`${Chalk.bold.redBright("⠇" + " ".repeat(width) + "⠸")}`); 92 | logger.error(Chalk.bold.redBright(`⠙${"⠒".repeat(width)}⠋`)); 93 | } 94 | 95 | function user(error) { 96 | function center(message, size, fill) { 97 | const to_fill = (size - message.length) / 2; 98 | return ( 99 | fill.repeat(Math.floor(to_fill)) + 100 | message + 101 | fill.repeat(Math.ceil(to_fill)) 102 | ); 103 | } 104 | const width = Math.max(error.message.length, process.stdout.columns - 10); 105 | logger.error( 106 | Chalk.bold.magentaBright( 107 | `⠴${center(Chalk.bold.black("[User Error]"), width + 19, "⠒")}⠦` 108 | ) 109 | ); 110 | logger.error(`${Chalk.bold.magentaBright("⠇" + " ".repeat(width) + "⠸")}`); 111 | logger.error( 112 | `${Chalk.bold.magentaBright("⠇" + center(error.message, width, " ") + "⠸")}` 113 | ); 114 | logger.error( 115 | `${Chalk.bold.magentaBright( 116 | "⠇" + center("line:" + error.line, width, " ") + "⠸" 117 | )}` 118 | ); 119 | logger.error(`${Chalk.bold.magenta("⠇" + " ".repeat(width) + "⠸")}`); 120 | logger.error(Chalk.bold.magenta(`⠙${"⠒".repeat(width)}⠋`)); 121 | } 122 | module.exports = { critical, compiler, user }; 123 | -------------------------------------------------------------------------------- /lib/core/errors.js: -------------------------------------------------------------------------------- 1 | class CompilerError extends Error { 2 | constructor(message, line = "unknown") { 3 | super(message); 4 | this.line = line; 5 | } 6 | } 7 | 8 | class CriticalError extends Error { } 9 | 10 | class UserError extends Error { 11 | constructor(message, line = "unknown") { 12 | super(message); 13 | this.line = line; 14 | } 15 | } 16 | 17 | module.exports = { CompilerError, CriticalError, UserError }; 18 | -------------------------------------------------------------------------------- /lib/core/interface.js: -------------------------------------------------------------------------------- 1 | const Module = require("module"); 2 | const path = require("path"); 3 | 4 | const logger = require("./log"); 5 | const loader = require("./load_language"); 6 | 7 | const modules = {}; 8 | const $require = Module.prototype.require; 9 | 10 | function setModule(vloc, data, resolve) { 11 | modules[vloc] = { resolve, value: data }; 12 | } 13 | 14 | function addModule(mod, vloc, resolve) { 15 | const loc = require.resolve(mod); 16 | const data = require(loc); 17 | setModule(vloc, data, resolve); 18 | } 19 | 20 | module.exports.addModule = addModule; 21 | 22 | addModule("./io", "!io", (_) => _); 23 | addModule("./config", "!config", (_) => _.config()); 24 | addModule("./persistent", "!persistent", (_) => _); 25 | addModule("./log", "!logger", (_) => _); 26 | addModule("./errors", "!errors", (_) => _); 27 | 28 | function logPossible(k, o) { 29 | logger.error(k); 30 | if (typeof o === "object") { 31 | Object.entries(o).forEach(([name, val]) => { 32 | logPossible(k + "/" + name, val[name]); 33 | }); 34 | } 35 | } 36 | 37 | Module.prototype.require = function (id) { 38 | if (id.startsWith("!")) { 39 | try { 40 | const [base, ...rest] = id.split("/"); 41 | if (base === "!lang") { 42 | const lang_ = rest[0]; 43 | if (!modules[base + "/" + lang_]) { 44 | if ( 45 | !loader.languages[lang_] && 46 | loader.potentialLanguages.includes(lang_) 47 | ) { 48 | loader.loadLanguageFromPath(lang_, path.join(loader.target, lang_)); 49 | } 50 | } 51 | } 52 | let value = modules[base].resolve(modules[base].value); 53 | if (rest.length) { 54 | let item = null; 55 | while ((item = rest.shift())) { 56 | value = value[item]; 57 | } 58 | } 59 | return value; 60 | } catch (e) { 61 | logger.error(`failed to resolve module '${id}' (${e.message})`); 62 | logger.error(`-------------------[Virtual Modules]-------------------`); 63 | Object.entries(modules).forEach(([name, mod]) => { 64 | logPossible(name, mod.resolve(mod.value)); 65 | }); 66 | logger.error(`-------------------------------------------------------`); 67 | throw e; 68 | } 69 | } else { 70 | return $require.apply(this, [id]); 71 | } 72 | }; 73 | -------------------------------------------------------------------------------- /lib/core/io.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const util = require("util"); 4 | 5 | const logger = require("./log"); 6 | const P_CONF = require("./persistent"); 7 | const error = require("./error_loggers"); 8 | 9 | const nextWriteActions = []; 10 | const VFS = "INTERNAL/VIRTUAL_FILE_SYSTEM"; 11 | let VFS_STORED = P_CONF.has(VFS) ? P_CONF.get(VFS) : {}; 12 | 13 | //rewrite config to store in the case that its 14 | P_CONF.set(VFS, VFS_STORED); 15 | 16 | class File { 17 | getPath() { 18 | return this._path; 19 | } 20 | setPath(path) { 21 | this._path = path; 22 | } 23 | getContents() { 24 | return this._contents; 25 | } 26 | setContents(contents) { 27 | this._contents = contents; 28 | } 29 | confirm() { 30 | nextWriteActions.push(this); 31 | } 32 | unregister() { 33 | if (nextWriteActions.indexOf(this) != -1) { 34 | nextWriteActions.splice(nextWriteActions.indexOf(this), 1); 35 | } 36 | } 37 | } 38 | 39 | function rm(dir) { 40 | if (dir.endsWith("data") || !fs.existsSync(dir)) { 41 | return; 42 | } 43 | if (fs.readdirSync(dir).length === 0) { 44 | fs.rmdirSync(dir); 45 | rm(path.resolve(dir, "../")); 46 | } 47 | } 48 | 49 | function syncFSToVirtual(file) { 50 | if (file) { 51 | file = path.relative(process.cwd(), file); 52 | const virtual = (VFS_STORED[file] = VFS_STORED[file] || {}); 53 | let existingFiles = new Set(Object.keys(virtual)); 54 | const nextVirtual = {}; 55 | while (nextWriteActions.length) { 56 | const file = nextWriteActions.shift(); 57 | const loc = file.getPath(); 58 | const parsed = path.parse(loc); 59 | if (!fs.existsSync(parsed.dir)) { 60 | fs.mkdirSync(parsed.dir, { recursive: true }); 61 | } 62 | const contents = file.getContents(); 63 | fs.writeFileSync(loc, contents); 64 | const stored_loc = path.relative(process.cwd(), loc); 65 | nextVirtual[stored_loc] = contents; 66 | existingFiles.delete(stored_loc); 67 | } 68 | const dirs = new Set(); 69 | Array.from(existingFiles).forEach((file) => { 70 | if (fs.existsSync(file)) { 71 | fs.unlinkSync(file); 72 | } 73 | dirs.add(path.parse(file).dir); 74 | }); 75 | VFS_STORED[file] = nextVirtual; 76 | Array.from(dirs).forEach((dir) => { 77 | rm(dir); 78 | }); 79 | if (nextVirtual.length === 0) { 80 | delete VFS_STORED[file]; 81 | } 82 | } else { 83 | Object.entries(VFS_STORED).map(([file, assosiations]) => { 84 | if (!fs.existsSync(file) && file.indexOf("minecraft") === -1) { 85 | syncFSToVirtual(file); 86 | } 87 | }); 88 | } 89 | } 90 | 91 | function addFile(file) { 92 | file.confirm(); 93 | } 94 | 95 | function flush() { 96 | VFS_STORED = {}; 97 | P_CONF.set(VFS, VFS_STORED); 98 | } 99 | module.exports = { File, syncFSToVirtual, addFile, flush }; 100 | -------------------------------------------------------------------------------- /lib/core/lang_placeholder.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IanSSenne/mcbuild/9c339a8f59010da35ba86532e02b824b82f4c5c6/lib/core/lang_placeholder.js -------------------------------------------------------------------------------- /lib/core/load_language.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const fs = require("fs"); 3 | 4 | const config = require("./config"); 5 | const logger = require("./log"); 6 | const postload_tasks = []; 7 | const languages = {}; 8 | const file_handlers = new Map(); 9 | const PROJECT_PATH = path.resolve(process.cwd(), '.mcproject', 'PROJECT.json'); 10 | const LOCAL_PATH = path.resolve(process.env.APPDATA, 'mc-build', 'local'); 11 | 12 | 13 | let potentialLanguages = []; 14 | function loadLanguageFromPath(lang, location) { 15 | if (!languages[lang]) { 16 | languages[lang] = require(path.join(location, "/entry.js"))( 17 | file_handlers 18 | ).exported; 19 | } 20 | } 21 | function loadLanguageConfigFromPath(lang, location) { 22 | if (!languages[lang]) { 23 | config.addConfig(lang, require(path.join(location, "/config.js"))); 24 | 25 | } 26 | } 27 | function getName(name) { 28 | if (!name.startsWith("lang-")) { 29 | logger.error("malformed language name! expected 'lang-'"); 30 | } 31 | return name.substr(5).split("/")[0]; 32 | } 33 | function loadLanguages() { 34 | const project = require(PROJECT_PATH); 35 | project.languages.forEach((lang) => { 36 | if (lang.remote.type === "file") { 37 | const name = getName(lang.name); 38 | loadLanguageConfigFromPath(name, lang.remote.path); 39 | } else { 40 | const name = getName(lang.name); 41 | loadLanguageConfigFromPath(name, path.resolve(LOCAL_PATH, '.cache', lang.name)); 42 | } 43 | }); 44 | project.languages.forEach((lang) => { 45 | if (lang.remote.type === "file") { 46 | const name = getName(lang.name); 47 | loadLanguageFromPath(name, lang.remote.path); 48 | } else { 49 | const name = getName(lang.name); 50 | loadLanguageFromPath(name, path.resolve(LOCAL_PATH, '.cache', lang.name)); 51 | } 52 | }); 53 | } 54 | 55 | module.exports = { 56 | postload_tasks, 57 | loadLanguageFromPath, 58 | loadLanguages, 59 | languages, 60 | file_handlers, 61 | potentialLanguages 62 | }; 63 | -------------------------------------------------------------------------------- /lib/core/log.js: -------------------------------------------------------------------------------- 1 | const chalk = require("chalk"); 2 | 3 | const ERR = chalk.white("[") + chalk.redBright(" err ") + chalk.white("] "); 4 | const WRN = chalk.white("[") + chalk.yellowBright(" wrn ") + chalk.white("] "); 5 | const LOG = chalk.white("[") + chalk.green(" log ") + chalk.white("] "); 6 | const INF = chalk.white("[") + chalk.gray(" inf ") + chalk.white("] "); 7 | const TSK = chalk.white("[") + chalk.cyan(" tsk ") + chalk.white("] "); 8 | 9 | module.exports.log = (...args) => console.log(LOG + args.join(" ")); 10 | module.exports.error = (...args) => { 11 | console.log(ERR + args.join(" ")); 12 | }; 13 | module.exports.warn = (...args) => console.log(WRN + args.join(" ")); 14 | module.exports.info = (...args) => console.log(INF + args.join(" ")); 15 | module.exports.task = (...args) => console.log(TSK + args.join(" ")); 16 | -------------------------------------------------------------------------------- /lib/core/persistent.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | 4 | const logger = require("./log"); 5 | const CROSS_RUN_PATH = path.resolve(process.cwd(), "./.mcproject/CROSS_RUN.json"); 6 | const SAVE_DIR = path.resolve(process.cwd(), "./.mcproject"); 7 | if (!fs.existsSync(SAVE_DIR)) fs.mkdirSync(SAVE_DIR); 8 | let FLAG_IS_EXITING = false; 9 | let DATA = null; 10 | 11 | const EXIT_HANDLER = (code, ...rest) => { 12 | if (!FLAG_IS_EXITING) { 13 | logger.info( 14 | `shutdown signal recieved (${`${code} ${rest.join(" ")}`.trim()})` 15 | ); 16 | FLAG_IS_EXITING = true; 17 | logger.info("writing cross run data to disk"); 18 | fs.writeFileSync( 19 | CROSS_RUN_PATH, 20 | JSON.stringify(Array.from(DATA.entries()), null, 2) 21 | ); 22 | logger.info("exiting..."); 23 | process.exit(code); 24 | } 25 | }; 26 | 27 | if (fs.existsSync(CROSS_RUN_PATH)) { 28 | DATA = new Map( 29 | Object.values(JSON.parse(fs.readFileSync(CROSS_RUN_PATH))) 30 | ); 31 | DATA.set("lastUpdate", new Date().toString()); 32 | } else { 33 | DATA = new Map([["lastUpdate", new Date().toString()]]); 34 | } 35 | 36 | process.on("exit", EXIT_HANDLER); 37 | process.on("SIGINT", EXIT_HANDLER); 38 | process.on("uncaughtException", EXIT_HANDLER); 39 | 40 | module.exports = DATA; 41 | 42 | // lets not use these as they may break debugging. / prod only? 43 | // process.on("SIGUSR1", EXIT_HANDLER); 44 | // process.on("SIGUSR2", EXIT_HANDLER); 45 | -------------------------------------------------------------------------------- /lib/core/secondary_entry.js: -------------------------------------------------------------------------------- 1 | 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | const { performance } = require("perf_hooks"); 5 | 6 | 7 | 8 | const interface = require("./interface"); 9 | const config = require("./config"); 10 | const logger = require("./log"); 11 | const io = require("./io"); 12 | const errors = require("./errors"); 13 | const fail = require("./error_loggers"); 14 | const shared = require("./shared_working"); 15 | 16 | 17 | 18 | const F_WRITE_CONFIG_TYPE = process.argv.indexOf("-config") != -1 && process.argv[process.argv.indexOf("-config") + 1]; 19 | 20 | 21 | 22 | 23 | const SRC_DIR = path.resolve(process.cwd() + "/src"); 24 | const { loadLanguages, languages, file_handlers } = require("./load_language"); 25 | 26 | 27 | 28 | 29 | 30 | shared.set("languages", languages); 31 | 32 | 33 | interface.addModule(path.resolve(__dirname, "./lang_placeholder.js"), `!lang`, _ => languages); 34 | loadLanguages(); 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | if (F_WRITE_CONFIG_TYPE) { 45 | if (fs.existsSync(path.resolve(process.cwd(), "./config.js")) || fs.existsSync(path.resolve(process.cwd(), "./config.json"))) { 46 | logger.error("config file exists, please remove or rename your current config if you would like to generate a new one"); 47 | } else if (F_WRITE_CONFIG_TYPE === "js") { 48 | fs.writeFileSync(path.resolve(process.cwd(), "./config.js"), `//generated config\nmodule.exports = ${JSON.stringify(config.config(), null, 2)}`); 49 | } else if (F_WRITE_CONFIG_TYPE === "json") { 50 | fs.writeFileSync(path.resolve(process.cwd(), "./config.json"), JSON.stringify(config.config(), null, 2)); 51 | } else { 52 | logger.error("invalid config extension, valid extensions are [js,json] got " + F_WRITE_CONFIG_TYPE); 53 | } 54 | process.exit(1); 55 | return null; 56 | } 57 | 58 | 59 | 60 | function dec(value) { 61 | const v = value.toString(); 62 | if (v.indexOf(".") === -1) { 63 | return v + ".000"; 64 | } 65 | const parts = v.split("."); 66 | return parts[0].concat(".", parts[1].substr(0, 3)); 67 | } 68 | 69 | 70 | 71 | const rebuildProject = async () => { 72 | const files = []; 73 | function getInitialFiles(location) { 74 | if (fs.lstatSync(location).isDirectory()) { 75 | const potential = fs.readdirSync(location); 76 | potential.forEach((f) => { 77 | getInitialFiles(path.join(location, f)); 78 | }); 79 | } else { 80 | files.push(location); 81 | } 82 | } 83 | getInitialFiles(SRC_DIR); 84 | for (let i = 0; i < files.length; i++) { 85 | await compiler_handler(null, files[i], true); 86 | } 87 | const onBuildSuccess = config.config().global.onBuildSuccess 88 | if (typeof onBuildSuccess === "function") { 89 | logger.task("starting onBuildSuccess"); 90 | const start = performance.now(); 91 | const res = onBuildSuccess({ file: null, config: config.config() }); 92 | if (res instanceof Promise) { 93 | res.then(() => { 94 | const end = performance.now(); 95 | logger.task("finished onBuildSuccess after " + dec(end - start) + "ms"); 96 | }); 97 | } else { 98 | const end = performance.now(); 99 | logger.task("finished onBuildSuccess after " + dec(end - start) + "ms"); 100 | } 101 | } 102 | } 103 | 104 | 105 | 106 | const compiler_handler = async (evt, file_path, DONT_FIRE_BUILD_SUCCESS) => { 107 | try { 108 | const start = performance.now(); 109 | 110 | logger.task("build file: " + path.relative(SRC_DIR, file_path)); 111 | const parsedPath = path.parse(file_path); 112 | if (file_handlers.has(parsedPath.ext)) { 113 | file_handlers.get(parsedPath.ext)(file_path); 114 | } else { 115 | logger.error("did not find handler for file type '" + parsedPath.ext + "'"); 116 | } 117 | const startFS = performance.now(); 118 | await io.syncFSToVirtual(file_path); 119 | const end = performance.now(); 120 | if (evt === "remove") { 121 | logger.info("rebuilding project."); 122 | io.flush(); 123 | await rebuildProject(); 124 | logger.info("done rebuilding project!") 125 | } 126 | logger.task(`finished task in ${dec(end - start)} ms, FileIO took ${dec(end - startFS)} ms`); 127 | if (!DONT_FIRE_BUILD_SUCCESS) { 128 | const onBuildSuccess = config.config().global.onBuildSuccess 129 | if (typeof onBuildSuccess === "function") { 130 | logger.task("starting onBuildSuccess"); 131 | const start = performance.now(); 132 | const res = onBuildSuccess({ file: file_path, config: config.config() }); 133 | if (res instanceof Promise) { 134 | res.then(() => { 135 | const end = performance.now(); 136 | logger.task("finished onBuildSuccess after " + dec(end - start) + "ms"); 137 | }) 138 | } else { 139 | const end = performance.now(); 140 | logger.task("finished onBuildSuccess after " + dec(end - start) + "ms"); 141 | } 142 | } 143 | } 144 | } catch (e) { 145 | if (e instanceof errors.CriticalError) { 146 | fail.critical(`failed to build file ${file_path}`, e, false); 147 | } else if (e instanceof errors.CompilerError) { 148 | fail.compiler(e); 149 | logger.task(`task failed!`); 150 | } else if (e instanceof errors.UserError) { 151 | fail.user(e); 152 | logger.task(`task failed!`); 153 | } else { 154 | fail.critical("unknown error", e); 155 | } 156 | } 157 | }; 158 | 159 | 160 | 161 | //load the persistent config even if its not used. this is so that it will register its before exit event listener 162 | require("./persistent"); 163 | 164 | 165 | if (!process.argv.includes("-build")) { 166 | const watch = require("node-watch"); 167 | watch(SRC_DIR, { recursive: true }, compiler_handler); 168 | } 169 | 170 | 171 | 172 | logger.info("doing initial build."); 173 | 174 | 175 | rebuildProject(); -------------------------------------------------------------------------------- /lib/core/shared_working.js: -------------------------------------------------------------------------------- 1 | module.exports = new Map(); 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mc-build", 3 | "version": "2.5.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.7.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", 10 | "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" 11 | }, 12 | "@types/color-name": { 13 | "version": "1.1.1", 14 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 15 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" 16 | }, 17 | "ansi-styles": { 18 | "version": "4.2.1", 19 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 20 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 21 | "requires": { 22 | "@types/color-name": "^1.1.1", 23 | "color-convert": "^2.0.1" 24 | } 25 | }, 26 | "archive-type": { 27 | "version": "4.0.0", 28 | "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", 29 | "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", 30 | "requires": { 31 | "file-type": "^4.2.0" 32 | }, 33 | "dependencies": { 34 | "file-type": { 35 | "version": "4.4.0", 36 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", 37 | "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" 38 | } 39 | } 40 | }, 41 | "base64-js": { 42 | "version": "1.3.1", 43 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 44 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 45 | }, 46 | "bl": { 47 | "version": "1.2.3", 48 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 49 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 50 | "requires": { 51 | "readable-stream": "^2.3.5", 52 | "safe-buffer": "^5.1.1" 53 | } 54 | }, 55 | "buffer": { 56 | "version": "5.6.0", 57 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 58 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 59 | "requires": { 60 | "base64-js": "^1.0.2", 61 | "ieee754": "^1.1.4" 62 | } 63 | }, 64 | "buffer-alloc": { 65 | "version": "1.2.0", 66 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 67 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 68 | "requires": { 69 | "buffer-alloc-unsafe": "^1.1.0", 70 | "buffer-fill": "^1.0.0" 71 | } 72 | }, 73 | "buffer-alloc-unsafe": { 74 | "version": "1.1.0", 75 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 76 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" 77 | }, 78 | "buffer-crc32": { 79 | "version": "0.2.13", 80 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 81 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 82 | }, 83 | "buffer-fill": { 84 | "version": "1.0.0", 85 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 86 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" 87 | }, 88 | "cacheable-request": { 89 | "version": "2.1.4", 90 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", 91 | "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", 92 | "requires": { 93 | "clone-response": "1.0.2", 94 | "get-stream": "3.0.0", 95 | "http-cache-semantics": "3.8.1", 96 | "keyv": "3.0.0", 97 | "lowercase-keys": "1.0.0", 98 | "normalize-url": "2.0.1", 99 | "responselike": "1.0.2" 100 | }, 101 | "dependencies": { 102 | "get-stream": { 103 | "version": "3.0.0", 104 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 105 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 106 | }, 107 | "lowercase-keys": { 108 | "version": "1.0.0", 109 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", 110 | "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" 111 | } 112 | } 113 | }, 114 | "chalk": { 115 | "version": "4.0.0", 116 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", 117 | "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", 118 | "requires": { 119 | "ansi-styles": "^4.1.0", 120 | "supports-color": "^7.1.0" 121 | } 122 | }, 123 | "clone-response": { 124 | "version": "1.0.2", 125 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 126 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 127 | "requires": { 128 | "mimic-response": "^1.0.0" 129 | } 130 | }, 131 | "color-convert": { 132 | "version": "2.0.1", 133 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 134 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 135 | "requires": { 136 | "color-name": "~1.1.4" 137 | } 138 | }, 139 | "color-name": { 140 | "version": "1.1.4", 141 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 142 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 143 | }, 144 | "commander": { 145 | "version": "2.20.3", 146 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 147 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 148 | }, 149 | "content-disposition": { 150 | "version": "0.5.3", 151 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 152 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 153 | "requires": { 154 | "safe-buffer": "5.1.2" 155 | } 156 | }, 157 | "core-util-is": { 158 | "version": "1.0.2", 159 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 160 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 161 | }, 162 | "decode-uri-component": { 163 | "version": "0.2.0", 164 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 165 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 166 | }, 167 | "decompress": { 168 | "version": "4.2.1", 169 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", 170 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", 171 | "requires": { 172 | "decompress-tar": "^4.0.0", 173 | "decompress-tarbz2": "^4.0.0", 174 | "decompress-targz": "^4.0.0", 175 | "decompress-unzip": "^4.0.1", 176 | "graceful-fs": "^4.1.10", 177 | "make-dir": "^1.0.0", 178 | "pify": "^2.3.0", 179 | "strip-dirs": "^2.0.0" 180 | }, 181 | "dependencies": { 182 | "make-dir": { 183 | "version": "1.3.0", 184 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 185 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 186 | "requires": { 187 | "pify": "^3.0.0" 188 | }, 189 | "dependencies": { 190 | "pify": { 191 | "version": "3.0.0", 192 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 193 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 194 | } 195 | } 196 | }, 197 | "pify": { 198 | "version": "2.3.0", 199 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 200 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 201 | } 202 | } 203 | }, 204 | "decompress-response": { 205 | "version": "3.3.0", 206 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 207 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 208 | "requires": { 209 | "mimic-response": "^1.0.0" 210 | } 211 | }, 212 | "decompress-tar": { 213 | "version": "4.1.1", 214 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 215 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 216 | "requires": { 217 | "file-type": "^5.2.0", 218 | "is-stream": "^1.1.0", 219 | "tar-stream": "^1.5.2" 220 | }, 221 | "dependencies": { 222 | "file-type": { 223 | "version": "5.2.0", 224 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 225 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" 226 | } 227 | } 228 | }, 229 | "decompress-tarbz2": { 230 | "version": "4.1.1", 231 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 232 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 233 | "requires": { 234 | "decompress-tar": "^4.1.0", 235 | "file-type": "^6.1.0", 236 | "is-stream": "^1.1.0", 237 | "seek-bzip": "^1.0.5", 238 | "unbzip2-stream": "^1.0.9" 239 | }, 240 | "dependencies": { 241 | "file-type": { 242 | "version": "6.2.0", 243 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 244 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" 245 | } 246 | } 247 | }, 248 | "decompress-targz": { 249 | "version": "4.1.1", 250 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 251 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 252 | "requires": { 253 | "decompress-tar": "^4.1.1", 254 | "file-type": "^5.2.0", 255 | "is-stream": "^1.1.0" 256 | }, 257 | "dependencies": { 258 | "file-type": { 259 | "version": "5.2.0", 260 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 261 | "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" 262 | } 263 | } 264 | }, 265 | "decompress-unzip": { 266 | "version": "4.0.1", 267 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 268 | "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", 269 | "requires": { 270 | "file-type": "^3.8.0", 271 | "get-stream": "^2.2.0", 272 | "pify": "^2.3.0", 273 | "yauzl": "^2.4.2" 274 | }, 275 | "dependencies": { 276 | "file-type": { 277 | "version": "3.9.0", 278 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 279 | "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" 280 | }, 281 | "get-stream": { 282 | "version": "2.3.1", 283 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 284 | "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", 285 | "requires": { 286 | "object-assign": "^4.0.1", 287 | "pinkie-promise": "^2.0.0" 288 | } 289 | }, 290 | "pify": { 291 | "version": "2.3.0", 292 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 293 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 294 | } 295 | } 296 | }, 297 | "download": { 298 | "version": "8.0.0", 299 | "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", 300 | "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", 301 | "requires": { 302 | "archive-type": "^4.0.0", 303 | "content-disposition": "^0.5.2", 304 | "decompress": "^4.2.1", 305 | "ext-name": "^5.0.0", 306 | "file-type": "^11.1.0", 307 | "filenamify": "^3.0.0", 308 | "get-stream": "^4.1.0", 309 | "got": "^8.3.1", 310 | "make-dir": "^2.1.0", 311 | "p-event": "^2.1.0", 312 | "pify": "^4.0.1" 313 | } 314 | }, 315 | "duplexer3": { 316 | "version": "0.1.4", 317 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 318 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 319 | }, 320 | "end-of-stream": { 321 | "version": "1.4.4", 322 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 323 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 324 | "requires": { 325 | "once": "^1.4.0" 326 | } 327 | }, 328 | "escape-string-regexp": { 329 | "version": "1.0.5", 330 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 331 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 332 | }, 333 | "ext-list": { 334 | "version": "2.2.2", 335 | "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", 336 | "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", 337 | "requires": { 338 | "mime-db": "^1.28.0" 339 | } 340 | }, 341 | "ext-name": { 342 | "version": "5.0.0", 343 | "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", 344 | "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", 345 | "requires": { 346 | "ext-list": "^2.0.0", 347 | "sort-keys-length": "^1.0.0" 348 | } 349 | }, 350 | "fd-slicer": { 351 | "version": "1.1.0", 352 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 353 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 354 | "requires": { 355 | "pend": "~1.2.0" 356 | } 357 | }, 358 | "file-type": { 359 | "version": "11.1.0", 360 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", 361 | "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==" 362 | }, 363 | "filename-reserved-regex": { 364 | "version": "2.0.0", 365 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 366 | "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" 367 | }, 368 | "filenamify": { 369 | "version": "3.0.0", 370 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", 371 | "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", 372 | "requires": { 373 | "filename-reserved-regex": "^2.0.0", 374 | "strip-outer": "^1.0.0", 375 | "trim-repeated": "^1.0.0" 376 | } 377 | }, 378 | "from2": { 379 | "version": "2.3.0", 380 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 381 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 382 | "requires": { 383 | "inherits": "^2.0.1", 384 | "readable-stream": "^2.0.0" 385 | } 386 | }, 387 | "fs": { 388 | "version": "0.0.1-security", 389 | "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", 390 | "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" 391 | }, 392 | "fs-constants": { 393 | "version": "1.0.0", 394 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 395 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 396 | }, 397 | "get-stream": { 398 | "version": "4.1.0", 399 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 400 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 401 | "requires": { 402 | "pump": "^3.0.0" 403 | } 404 | }, 405 | "got": { 406 | "version": "8.3.2", 407 | "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", 408 | "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", 409 | "requires": { 410 | "@sindresorhus/is": "^0.7.0", 411 | "cacheable-request": "^2.1.1", 412 | "decompress-response": "^3.3.0", 413 | "duplexer3": "^0.1.4", 414 | "get-stream": "^3.0.0", 415 | "into-stream": "^3.1.0", 416 | "is-retry-allowed": "^1.1.0", 417 | "isurl": "^1.0.0-alpha5", 418 | "lowercase-keys": "^1.0.0", 419 | "mimic-response": "^1.0.0", 420 | "p-cancelable": "^0.4.0", 421 | "p-timeout": "^2.0.1", 422 | "pify": "^3.0.0", 423 | "safe-buffer": "^5.1.1", 424 | "timed-out": "^4.0.1", 425 | "url-parse-lax": "^3.0.0", 426 | "url-to-options": "^1.0.1" 427 | }, 428 | "dependencies": { 429 | "get-stream": { 430 | "version": "3.0.0", 431 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 432 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 433 | }, 434 | "pify": { 435 | "version": "3.0.0", 436 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 437 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 438 | } 439 | } 440 | }, 441 | "graceful-fs": { 442 | "version": "4.2.4", 443 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 444 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 445 | }, 446 | "has-flag": { 447 | "version": "4.0.0", 448 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 449 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 450 | }, 451 | "has-symbol-support-x": { 452 | "version": "1.4.2", 453 | "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", 454 | "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" 455 | }, 456 | "has-to-string-tag-x": { 457 | "version": "1.4.1", 458 | "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", 459 | "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", 460 | "requires": { 461 | "has-symbol-support-x": "^1.4.1" 462 | } 463 | }, 464 | "http-cache-semantics": { 465 | "version": "3.8.1", 466 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 467 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" 468 | }, 469 | "https": { 470 | "version": "1.0.0", 471 | "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", 472 | "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" 473 | }, 474 | "ieee754": { 475 | "version": "1.1.13", 476 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 477 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 478 | }, 479 | "inherits": { 480 | "version": "2.0.3", 481 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 482 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 483 | }, 484 | "into-stream": { 485 | "version": "3.1.0", 486 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", 487 | "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", 488 | "requires": { 489 | "from2": "^2.1.1", 490 | "p-is-promise": "^1.1.0" 491 | } 492 | }, 493 | "is-natural-number": { 494 | "version": "4.0.1", 495 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 496 | "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" 497 | }, 498 | "is-object": { 499 | "version": "1.0.1", 500 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", 501 | "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" 502 | }, 503 | "is-plain-obj": { 504 | "version": "2.1.0", 505 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 506 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" 507 | }, 508 | "is-retry-allowed": { 509 | "version": "1.2.0", 510 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 511 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" 512 | }, 513 | "is-stream": { 514 | "version": "1.1.0", 515 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 516 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 517 | }, 518 | "isarray": { 519 | "version": "1.0.0", 520 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 521 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 522 | }, 523 | "isurl": { 524 | "version": "1.0.0", 525 | "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", 526 | "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", 527 | "requires": { 528 | "has-to-string-tag-x": "^1.2.0", 529 | "is-object": "^1.0.1" 530 | } 531 | }, 532 | "json-buffer": { 533 | "version": "3.0.0", 534 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 535 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 536 | }, 537 | "keyv": { 538 | "version": "3.0.0", 539 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", 540 | "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", 541 | "requires": { 542 | "json-buffer": "3.0.0" 543 | } 544 | }, 545 | "lowercase-keys": { 546 | "version": "1.0.1", 547 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 548 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 549 | }, 550 | "make-dir": { 551 | "version": "2.1.0", 552 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", 553 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 554 | "requires": { 555 | "pify": "^4.0.1", 556 | "semver": "^5.6.0" 557 | } 558 | }, 559 | "merge-options": { 560 | "version": "2.0.0", 561 | "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-2.0.0.tgz", 562 | "integrity": "sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ==", 563 | "requires": { 564 | "is-plain-obj": "^2.0.0" 565 | } 566 | }, 567 | "mime-db": { 568 | "version": "1.44.0", 569 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 570 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 571 | }, 572 | "mimic-response": { 573 | "version": "1.0.1", 574 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 575 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 576 | }, 577 | "node-fetch": { 578 | "version": "2.6.1", 579 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 580 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 581 | }, 582 | "node-watch": { 583 | "version": "0.6.4", 584 | "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.6.4.tgz", 585 | "integrity": "sha512-cI6CHzivIFESe8djiK3Wh90CtWQBxLwMem8x8S+2GSvCvFgoMuOKVlfJtQ/2v3Afg3wOnHl/+tXotEs8z5vOrg==" 586 | }, 587 | "normalize-url": { 588 | "version": "2.0.1", 589 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", 590 | "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", 591 | "requires": { 592 | "prepend-http": "^2.0.0", 593 | "query-string": "^5.0.1", 594 | "sort-keys": "^2.0.0" 595 | }, 596 | "dependencies": { 597 | "is-plain-obj": { 598 | "version": "1.1.0", 599 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 600 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 601 | }, 602 | "sort-keys": { 603 | "version": "2.0.0", 604 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", 605 | "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", 606 | "requires": { 607 | "is-plain-obj": "^1.0.0" 608 | } 609 | } 610 | } 611 | }, 612 | "object-assign": { 613 | "version": "4.1.1", 614 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 615 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 616 | }, 617 | "once": { 618 | "version": "1.4.0", 619 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 620 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 621 | "requires": { 622 | "wrappy": "1" 623 | } 624 | }, 625 | "p-cancelable": { 626 | "version": "0.4.1", 627 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", 628 | "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" 629 | }, 630 | "p-event": { 631 | "version": "2.3.1", 632 | "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", 633 | "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", 634 | "requires": { 635 | "p-timeout": "^2.0.1" 636 | } 637 | }, 638 | "p-finally": { 639 | "version": "1.0.0", 640 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 641 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 642 | }, 643 | "p-is-promise": { 644 | "version": "1.1.0", 645 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", 646 | "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" 647 | }, 648 | "p-timeout": { 649 | "version": "2.0.1", 650 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", 651 | "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", 652 | "requires": { 653 | "p-finally": "^1.0.0" 654 | } 655 | }, 656 | "path": { 657 | "version": "0.12.7", 658 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", 659 | "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", 660 | "requires": { 661 | "process": "^0.11.1", 662 | "util": "^0.10.3" 663 | } 664 | }, 665 | "pend": { 666 | "version": "1.2.0", 667 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 668 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 669 | }, 670 | "pify": { 671 | "version": "4.0.1", 672 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 673 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 674 | }, 675 | "pinkie": { 676 | "version": "2.0.4", 677 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 678 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 679 | }, 680 | "pinkie-promise": { 681 | "version": "2.0.1", 682 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 683 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 684 | "requires": { 685 | "pinkie": "^2.0.0" 686 | } 687 | }, 688 | "prepend-http": { 689 | "version": "2.0.0", 690 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 691 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" 692 | }, 693 | "process": { 694 | "version": "0.11.10", 695 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 696 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 697 | }, 698 | "process-nextick-args": { 699 | "version": "2.0.1", 700 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 701 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 702 | }, 703 | "pump": { 704 | "version": "3.0.0", 705 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 706 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 707 | "requires": { 708 | "end-of-stream": "^1.1.0", 709 | "once": "^1.3.1" 710 | } 711 | }, 712 | "query-string": { 713 | "version": "5.1.1", 714 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", 715 | "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", 716 | "requires": { 717 | "decode-uri-component": "^0.2.0", 718 | "object-assign": "^4.1.0", 719 | "strict-uri-encode": "^1.0.0" 720 | } 721 | }, 722 | "readable-stream": { 723 | "version": "2.3.7", 724 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 725 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 726 | "requires": { 727 | "core-util-is": "~1.0.0", 728 | "inherits": "~2.0.3", 729 | "isarray": "~1.0.0", 730 | "process-nextick-args": "~2.0.0", 731 | "safe-buffer": "~5.1.1", 732 | "string_decoder": "~1.1.1", 733 | "util-deprecate": "~1.0.1" 734 | } 735 | }, 736 | "responselike": { 737 | "version": "1.0.2", 738 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 739 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 740 | "requires": { 741 | "lowercase-keys": "^1.0.0" 742 | } 743 | }, 744 | "safe-buffer": { 745 | "version": "5.1.2", 746 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 747 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 748 | }, 749 | "seek-bzip": { 750 | "version": "1.0.6", 751 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", 752 | "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", 753 | "requires": { 754 | "commander": "^2.8.1" 755 | } 756 | }, 757 | "semver": { 758 | "version": "5.7.1", 759 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 760 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 761 | }, 762 | "sort-keys": { 763 | "version": "1.1.2", 764 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", 765 | "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", 766 | "requires": { 767 | "is-plain-obj": "^1.0.0" 768 | }, 769 | "dependencies": { 770 | "is-plain-obj": { 771 | "version": "1.1.0", 772 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 773 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 774 | } 775 | } 776 | }, 777 | "sort-keys-length": { 778 | "version": "1.0.1", 779 | "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", 780 | "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", 781 | "requires": { 782 | "sort-keys": "^1.0.0" 783 | } 784 | }, 785 | "strict-uri-encode": { 786 | "version": "1.1.0", 787 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 788 | "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" 789 | }, 790 | "string_decoder": { 791 | "version": "1.1.1", 792 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 793 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 794 | "requires": { 795 | "safe-buffer": "~5.1.0" 796 | } 797 | }, 798 | "strip-dirs": { 799 | "version": "2.1.0", 800 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 801 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 802 | "requires": { 803 | "is-natural-number": "^4.0.1" 804 | } 805 | }, 806 | "strip-outer": { 807 | "version": "1.0.1", 808 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 809 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 810 | "requires": { 811 | "escape-string-regexp": "^1.0.2" 812 | } 813 | }, 814 | "supports-color": { 815 | "version": "7.1.0", 816 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 817 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 818 | "requires": { 819 | "has-flag": "^4.0.0" 820 | } 821 | }, 822 | "tar-stream": { 823 | "version": "1.6.2", 824 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 825 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 826 | "requires": { 827 | "bl": "^1.0.0", 828 | "buffer-alloc": "^1.2.0", 829 | "end-of-stream": "^1.0.0", 830 | "fs-constants": "^1.0.0", 831 | "readable-stream": "^2.3.0", 832 | "to-buffer": "^1.1.1", 833 | "xtend": "^4.0.0" 834 | } 835 | }, 836 | "through": { 837 | "version": "2.3.8", 838 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 839 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 840 | }, 841 | "timed-out": { 842 | "version": "4.0.1", 843 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 844 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" 845 | }, 846 | "to-buffer": { 847 | "version": "1.1.1", 848 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 849 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 850 | }, 851 | "trim-repeated": { 852 | "version": "1.0.0", 853 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 854 | "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", 855 | "requires": { 856 | "escape-string-regexp": "^1.0.2" 857 | } 858 | }, 859 | "unbzip2-stream": { 860 | "version": "1.4.3", 861 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 862 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 863 | "requires": { 864 | "buffer": "^5.2.1", 865 | "through": "^2.3.8" 866 | } 867 | }, 868 | "url-parse-lax": { 869 | "version": "3.0.0", 870 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 871 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 872 | "requires": { 873 | "prepend-http": "^2.0.0" 874 | } 875 | }, 876 | "url-to-options": { 877 | "version": "1.0.1", 878 | "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", 879 | "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" 880 | }, 881 | "util": { 882 | "version": "0.10.4", 883 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", 884 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", 885 | "requires": { 886 | "inherits": "2.0.3" 887 | } 888 | }, 889 | "util-deprecate": { 890 | "version": "1.0.2", 891 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 892 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 893 | }, 894 | "wrappy": { 895 | "version": "1.0.2", 896 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 897 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 898 | }, 899 | "xtend": { 900 | "version": "4.0.2", 901 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 902 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 903 | }, 904 | "yauzl": { 905 | "version": "2.10.0", 906 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 907 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 908 | "requires": { 909 | "buffer-crc32": "~0.2.3", 910 | "fd-slicer": "~1.1.0" 911 | } 912 | } 913 | } 914 | } 915 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mc-build", 3 | "version": "2.6.1", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "chalk": "^4.0.0", 8 | "download": "^8.0.0", 9 | "fs": "^0.0.1-security", 10 | "https": "^1.0.0", 11 | "merge-options": "^2.0.0", 12 | "node-fetch": "^2.6.1", 13 | "node-watch": "^0.6.4", 14 | "path": "^0.12.7" 15 | }, 16 | "bin": { 17 | "mcb": "./cli.js" 18 | } 19 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/color-name@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 8 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 9 | 10 | ansi-styles@^4.1.0: 11 | version "4.2.1" 12 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 13 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 14 | dependencies: 15 | "@types/color-name" "^1.1.1" 16 | color-convert "^2.0.1" 17 | 18 | base64-js@^1.0.2: 19 | version "1.3.1" 20 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" 21 | integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 22 | 23 | bson@^4.0.4: 24 | version "4.0.4" 25 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.0.4.tgz#4bda2cedf2ae7a18d15cb24ee1ede8c797f8eecf" 26 | integrity sha512-Ioi3TD0/1V3aI8+hPfC56TetYmzfq2H07jJa9A1lKTxWsFtHtYdLMGMXjtGEg9v0f72NSM07diRQEUNYhLupIA== 27 | dependencies: 28 | buffer "^5.1.0" 29 | long "^4.0.0" 30 | 31 | buffer@^5.1.0: 32 | version "5.6.0" 33 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" 34 | integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== 35 | dependencies: 36 | base64-js "^1.0.2" 37 | ieee754 "^1.1.4" 38 | 39 | chalk@^4.0.0: 40 | version "4.0.0" 41 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" 42 | integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== 43 | dependencies: 44 | ansi-styles "^4.1.0" 45 | supports-color "^7.1.0" 46 | 47 | color-convert@^2.0.1: 48 | version "2.0.1" 49 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 50 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 51 | dependencies: 52 | color-name "~1.1.4" 53 | 54 | color-name@~1.1.4: 55 | version "1.1.4" 56 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 57 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 58 | 59 | fs@^0.0.1-security: 60 | version "0.0.1-security" 61 | resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" 62 | integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= 63 | 64 | has-flag@^4.0.0: 65 | version "4.0.0" 66 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 67 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 68 | 69 | ieee754@^1.1.4: 70 | version "1.1.13" 71 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 72 | integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 73 | 74 | inherits@2.0.3: 75 | version "2.0.3" 76 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 77 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 78 | 79 | is-plain-obj@^2.0.0: 80 | version "2.1.0" 81 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 82 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 83 | 84 | long@^4.0.0: 85 | version "4.0.0" 86 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 87 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 88 | 89 | merge-options@^2.0.0: 90 | version "2.0.0" 91 | resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-2.0.0.tgz#36ca5038badfc3974dbde5e58ba89d3df80882c3" 92 | integrity sha512-S7xYIeWHl2ZUKF7SDeBhGg6rfv5bKxVBdk95s/I7wVF8d+hjLSztJ/B271cnUiF6CAFduEQ5Zn3HYwAjT16DlQ== 93 | dependencies: 94 | is-plain-obj "^2.0.0" 95 | 96 | node-watch@^0.6.4: 97 | version "0.6.4" 98 | resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.4.tgz#50e564046eb7be15151c25f9c5aac4b5f495c291" 99 | integrity sha512-cI6CHzivIFESe8djiK3Wh90CtWQBxLwMem8x8S+2GSvCvFgoMuOKVlfJtQ/2v3Afg3wOnHl/+tXotEs8z5vOrg== 100 | 101 | path@^0.12.7: 102 | version "0.12.7" 103 | resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" 104 | integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= 105 | dependencies: 106 | process "^0.11.1" 107 | util "^0.10.3" 108 | 109 | process@^0.11.1: 110 | version "0.11.10" 111 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 112 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 113 | 114 | supports-color@^7.1.0: 115 | version "7.1.0" 116 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 117 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 118 | dependencies: 119 | has-flag "^4.0.0" 120 | 121 | util@^0.10.3: 122 | version "0.10.4" 123 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 124 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 125 | dependencies: 126 | inherits "2.0.3" 127 | --------------------------------------------------------------------------------