UNPKG

@platformos/pos-cli

Version:

Manage your platformOS application

1,901 lines (1,654 loc) 386 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var fs$1 = _interopDefault(require('fs')); var path$1 = _interopDefault(require('path')); var events = _interopDefault(require('events')); var stream = _interopDefault(require('stream')); var string_decoder = _interopDefault(require('string_decoder')); var assert = _interopDefault(require('assert')); var buffer = _interopDefault(require('buffer')); var zlib = _interopDefault(require('zlib')); var util$1 = _interopDefault(require('util')); var crypto = _interopDefault(require('crypto')); var os = _interopDefault(require('os')); var tty = _interopDefault(require('tty')); var constants$1 = _interopDefault(require('constants')); var https = _interopDefault(require('https')); var child_process = _interopDefault(require('child_process')); var url = _interopDefault(require('url')); var net = _interopDefault(require('net')); var tls = _interopDefault(require('tls')); var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function unwrapExports (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var highLevelOpt = createCommonjsModule(function (module) { // turn tar(1) style args like `C` into the more verbose things like `cwd` const argmap = new Map([ ['C', 'cwd'], ['f', 'file'], ['z', 'gzip'], ['P', 'preservePaths'], ['U', 'unlink'], ['strip-components', 'strip'], ['stripComponents', 'strip'], ['keep-newer', 'newer'], ['keepNewer', 'newer'], ['keep-newer-files', 'newer'], ['keepNewerFiles', 'newer'], ['k', 'keep'], ['keep-existing', 'keep'], ['keepExisting', 'keep'], ['m', 'noMtime'], ['no-mtime', 'noMtime'], ['p', 'preserveOwner'], ['L', 'follow'], ['h', 'follow'] ]); const parse = module.exports = opt => opt ? Object.keys(opt).map(k => [ argmap.has(k) ? argmap.get(k) : k, opt[k] ]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {}; }); var iterator = function (Yallist) { Yallist.prototype[Symbol.iterator] = function* () { for (let walker = this.head; walker; walker = walker.next) { yield walker.value; } }; }; var yallist = Yallist; Yallist.Node = Node; Yallist.create = Yallist; function Yallist (list) { var self = this; if (!(self instanceof Yallist)) { self = new Yallist(); } self.tail = null; self.head = null; self.length = 0; if (list && typeof list.forEach === 'function') { list.forEach(function (item) { self.push(item); }); } else if (arguments.length > 0) { for (var i = 0, l = arguments.length; i < l; i++) { self.push(arguments[i]); } } return self } Yallist.prototype.removeNode = function (node) { if (node.list !== this) { throw new Error('removing node which does not belong to this list') } var next = node.next; var prev = node.prev; if (next) { next.prev = prev; } if (prev) { prev.next = next; } if (node === this.head) { this.head = next; } if (node === this.tail) { this.tail = prev; } node.list.length--; node.next = null; node.prev = null; node.list = null; return next }; Yallist.prototype.unshiftNode = function (node) { if (node === this.head) { return } if (node.list) { node.list.removeNode(node); } var head = this.head; node.list = this; node.next = head; if (head) { head.prev = node; } this.head = node; if (!this.tail) { this.tail = node; } this.length++; }; Yallist.prototype.pushNode = function (node) { if (node === this.tail) { return } if (node.list) { node.list.removeNode(node); } var tail = this.tail; node.list = this; node.prev = tail; if (tail) { tail.next = node; } this.tail = node; if (!this.head) { this.head = node; } this.length++; }; Yallist.prototype.push = function () { for (var i = 0, l = arguments.length; i < l; i++) { push(this, arguments[i]); } return this.length }; Yallist.prototype.unshift = function () { for (var i = 0, l = arguments.length; i < l; i++) { unshift(this, arguments[i]); } return this.length }; Yallist.prototype.pop = function () { if (!this.tail) { return undefined } var res = this.tail.value; this.tail = this.tail.prev; if (this.tail) { this.tail.next = null; } else { this.head = null; } this.length--; return res }; Yallist.prototype.shift = function () { if (!this.head) { return undefined } var res = this.head.value; this.head = this.head.next; if (this.head) { this.head.prev = null; } else { this.tail = null; } this.length--; return res }; Yallist.prototype.forEach = function (fn, thisp) { thisp = thisp || this; for (var walker = this.head, i = 0; walker !== null; i++) { fn.call(thisp, walker.value, i, this); walker = walker.next; } }; Yallist.prototype.forEachReverse = function (fn, thisp) { thisp = thisp || this; for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { fn.call(thisp, walker.value, i, this); walker = walker.prev; } }; Yallist.prototype.get = function (n) { for (var i = 0, walker = this.head; walker !== null && i < n; i++) { // abort out of the list early if we hit a cycle walker = walker.next; } if (i === n && walker !== null) { return walker.value } }; Yallist.prototype.getReverse = function (n) { for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { // abort out of the list early if we hit a cycle walker = walker.prev; } if (i === n && walker !== null) { return walker.value } }; Yallist.prototype.map = function (fn, thisp) { thisp = thisp || this; var res = new Yallist(); for (var walker = this.head; walker !== null;) { res.push(fn.call(thisp, walker.value, this)); walker = walker.next; } return res }; Yallist.prototype.mapReverse = function (fn, thisp) { thisp = thisp || this; var res = new Yallist(); for (var walker = this.tail; walker !== null;) { res.push(fn.call(thisp, walker.value, this)); walker = walker.prev; } return res }; Yallist.prototype.reduce = function (fn, initial) { var acc; var walker = this.head; if (arguments.length > 1) { acc = initial; } else if (this.head) { walker = this.head.next; acc = this.head.value; } else { throw new TypeError('Reduce of empty list with no initial value') } for (var i = 0; walker !== null; i++) { acc = fn(acc, walker.value, i); walker = walker.next; } return acc }; Yallist.prototype.reduceReverse = function (fn, initial) { var acc; var walker = this.tail; if (arguments.length > 1) { acc = initial; } else if (this.tail) { walker = this.tail.prev; acc = this.tail.value; } else { throw new TypeError('Reduce of empty list with no initial value') } for (var i = this.length - 1; walker !== null; i--) { acc = fn(acc, walker.value, i); walker = walker.prev; } return acc }; Yallist.prototype.toArray = function () { var arr = new Array(this.length); for (var i = 0, walker = this.head; walker !== null; i++) { arr[i] = walker.value; walker = walker.next; } return arr }; Yallist.prototype.toArrayReverse = function () { var arr = new Array(this.length); for (var i = 0, walker = this.tail; walker !== null; i++) { arr[i] = walker.value; walker = walker.prev; } return arr }; Yallist.prototype.slice = function (from, to) { to = to || this.length; if (to < 0) { to += this.length; } from = from || 0; if (from < 0) { from += this.length; } var ret = new Yallist(); if (to < from || to < 0) { return ret } if (from < 0) { from = 0; } if (to > this.length) { to = this.length; } for (var i = 0, walker = this.head; walker !== null && i < from; i++) { walker = walker.next; } for (; walker !== null && i < to; i++, walker = walker.next) { ret.push(walker.value); } return ret }; Yallist.prototype.sliceReverse = function (from, to) { to = to || this.length; if (to < 0) { to += this.length; } from = from || 0; if (from < 0) { from += this.length; } var ret = new Yallist(); if (to < from || to < 0) { return ret } if (from < 0) { from = 0; } if (to > this.length) { to = this.length; } for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { walker = walker.prev; } for (; walker !== null && i > from; i--, walker = walker.prev) { ret.push(walker.value); } return ret }; Yallist.prototype.splice = function (start, deleteCount, ...nodes) { if (start > this.length) { start = this.length - 1; } if (start < 0) { start = this.length + start; } for (var i = 0, walker = this.head; walker !== null && i < start; i++) { walker = walker.next; } var ret = []; for (var i = 0; walker && i < deleteCount; i++) { ret.push(walker.value); walker = this.removeNode(walker); } if (walker === null) { walker = this.tail; } if (walker !== this.head && walker !== this.tail) { walker = walker.prev; } for (var i = 0; i < nodes.length; i++) { walker = insert(this, walker, nodes[i]); } return ret; }; Yallist.prototype.reverse = function () { var head = this.head; var tail = this.tail; for (var walker = head; walker !== null; walker = walker.prev) { var p = walker.prev; walker.prev = walker.next; walker.next = p; } this.head = tail; this.tail = head; return this }; function insert (self, node, value) { var inserted = node === self.head ? new Node(value, null, node, self) : new Node(value, node, node.next, self); if (inserted.next === null) { self.tail = inserted; } if (inserted.prev === null) { self.head = inserted; } self.length++; return inserted } function push (self, item) { self.tail = new Node(item, self.tail, null, self); if (!self.head) { self.head = self.tail; } self.length++; } function unshift (self, item) { self.head = new Node(item, null, self.head, self); if (!self.tail) { self.tail = self.head; } self.length++; } function Node (value, prev, next, list) { if (!(this instanceof Node)) { return new Node(value, prev, next, list) } this.list = list; this.value = value; if (prev) { prev.next = this; this.prev = prev; } else { this.prev = null; } if (next) { next.prev = this; this.next = next; } else { this.next = null; } } try { // add if support for Symbol.iterator is present iterator(Yallist); } catch (er) {} const SD = string_decoder.StringDecoder; const EOF = Symbol('EOF'); const MAYBE_EMIT_END = Symbol('maybeEmitEnd'); const EMITTED_END = Symbol('emittedEnd'); const EMITTING_END = Symbol('emittingEnd'); const CLOSED = Symbol('closed'); const READ = Symbol('read'); const FLUSH = Symbol('flush'); const FLUSHCHUNK = Symbol('flushChunk'); const ENCODING = Symbol('encoding'); const DECODER = Symbol('decoder'); const FLOWING = Symbol('flowing'); const PAUSED = Symbol('paused'); const RESUME = Symbol('resume'); const BUFFERLENGTH = Symbol('bufferLength'); const BUFFERPUSH = Symbol('bufferPush'); const BUFFERSHIFT = Symbol('bufferShift'); const OBJECTMODE = Symbol('objectMode'); const DESTROYED = Symbol('destroyed'); // TODO remove when Node v8 support drops const doIter = commonjsGlobal._MP_NO_ITERATOR_SYMBOLS_ !== '1'; const ASYNCITERATOR = doIter && Symbol.asyncIterator || Symbol('asyncIterator not implemented'); const ITERATOR = doIter && Symbol.iterator || Symbol('iterator not implemented'); // events that mean 'the stream is over' // these are treated specially, and re-emitted // if they are listened for after emitting. const isEndish = ev => ev === 'end' || ev === 'finish' || ev === 'prefinish'; const isArrayBuffer = b => b instanceof ArrayBuffer || typeof b === 'object' && b.constructor && b.constructor.name === 'ArrayBuffer' && b.byteLength >= 0; const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); var minipass = class Minipass extends stream { constructor (options) { super(); this[FLOWING] = false; // whether we're explicitly paused this[PAUSED] = false; this.pipes = new yallist(); this.buffer = new yallist(); this[OBJECTMODE] = options && options.objectMode || false; if (this[OBJECTMODE]) this[ENCODING] = null; else this[ENCODING] = options && options.encoding || null; if (this[ENCODING] === 'buffer') this[ENCODING] = null; this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null; this[EOF] = false; this[EMITTED_END] = false; this[EMITTING_END] = false; this[CLOSED] = false; this.writable = true; this.readable = true; this[BUFFERLENGTH] = 0; this[DESTROYED] = false; } get bufferLength () { return this[BUFFERLENGTH] } get encoding () { return this[ENCODING] } set encoding (enc) { if (this[OBJECTMODE]) throw new Error('cannot set encoding in objectMode') if (this[ENCODING] && enc !== this[ENCODING] && (this[DECODER] && this[DECODER].lastNeed || this[BUFFERLENGTH])) throw new Error('cannot change encoding') if (this[ENCODING] !== enc) { this[DECODER] = enc ? new SD(enc) : null; if (this.buffer.length) this.buffer = this.buffer.map(chunk => this[DECODER].write(chunk)); } this[ENCODING] = enc; } setEncoding (enc) { this.encoding = enc; } get objectMode () { return this[OBJECTMODE] } set objectMode (ॐ ) { this[OBJECTMODE] = this[OBJECTMODE] || !!ॐ; } write (chunk, encoding, cb) { if (this[EOF]) throw new Error('write after end') if (this[DESTROYED]) { this.emit('error', Object.assign( new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' } )); return true } if (typeof encoding === 'function') cb = encoding, encoding = 'utf8'; if (!encoding) encoding = 'utf8'; // convert array buffers and typed array views into buffers // at some point in the future, we may want to do the opposite! // leave strings and buffers as-is // anything else switches us into object mode if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { if (isArrayBufferView(chunk)) chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); else if (isArrayBuffer(chunk)) chunk = Buffer.from(chunk); else if (typeof chunk !== 'string') // use the setter so we throw if we have encoding set this.objectMode = true; } // this ensures at this point that the chunk is a buffer or string // don't buffer it up or send it to the decoder if (!this.objectMode && !chunk.length) { const ret = this.flowing; if (this[BUFFERLENGTH] !== 0) this.emit('readable'); if (cb) cb(); return ret } // fast-path writing strings of same encoding to a stream with // an empty buffer, skipping the buffer/decoder dance if (typeof chunk === 'string' && !this[OBJECTMODE] && // unless it is a string already ready for us to use !(encoding === this[ENCODING] && !this[DECODER].lastNeed)) { chunk = Buffer.from(chunk, encoding); } if (Buffer.isBuffer(chunk) && this[ENCODING]) chunk = this[DECODER].write(chunk); try { return this.flowing ? (this.emit('data', chunk), this.flowing) : (this[BUFFERPUSH](chunk), false) } finally { if (this[BUFFERLENGTH] !== 0) this.emit('readable'); if (cb) cb(); } } read (n) { if (this[DESTROYED]) return null try { if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) return null if (this[OBJECTMODE]) n = null; if (this.buffer.length > 1 && !this[OBJECTMODE]) { if (this.encoding) this.buffer = new yallist([ Array.from(this.buffer).join('') ]); else this.buffer = new yallist([ Buffer.concat(Array.from(this.buffer), this[BUFFERLENGTH]) ]); } return this[READ](n || null, this.buffer.head.value) } finally { this[MAYBE_EMIT_END](); } } [READ] (n, chunk) { if (n === chunk.length || n === null) this[BUFFERSHIFT](); else { this.buffer.head.value = chunk.slice(n); chunk = chunk.slice(0, n); this[BUFFERLENGTH] -= n; } this.emit('data', chunk); if (!this.buffer.length && !this[EOF]) this.emit('drain'); return chunk } end (chunk, encoding, cb) { if (typeof chunk === 'function') cb = chunk, chunk = null; if (typeof encoding === 'function') cb = encoding, encoding = 'utf8'; if (chunk) this.write(chunk, encoding); if (cb) this.once('end', cb); this[EOF] = true; this.writable = false; // if we haven't written anything, then go ahead and emit, // even if we're not reading. // we'll re-emit if a new 'end' listener is added anyway. // This makes MP more suitable to write-only use cases. if (this.flowing || !this[PAUSED]) this[MAYBE_EMIT_END](); return this } // don't let the internal resume be overwritten [RESUME] () { if (this[DESTROYED]) return this[PAUSED] = false; this[FLOWING] = true; this.emit('resume'); if (this.buffer.length) this[FLUSH](); else if (this[EOF]) this[MAYBE_EMIT_END](); else this.emit('drain'); } resume () { return this[RESUME]() } pause () { this[FLOWING] = false; this[PAUSED] = true; } get destroyed () { return this[DESTROYED] } get flowing () { return this[FLOWING] } get paused () { return this[PAUSED] } [BUFFERPUSH] (chunk) { if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1; else this[BUFFERLENGTH] += chunk.length; return this.buffer.push(chunk) } [BUFFERSHIFT] () { if (this.buffer.length) { if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1; else this[BUFFERLENGTH] -= this.buffer.head.value.length; } return this.buffer.shift() } [FLUSH] () { do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]())) if (!this.buffer.length && !this[EOF]) this.emit('drain'); } [FLUSHCHUNK] (chunk) { return chunk ? (this.emit('data', chunk), this.flowing) : false } pipe (dest, opts) { if (this[DESTROYED]) return const ended = this[EMITTED_END]; opts = opts || {}; if (dest === process.stdout || dest === process.stderr) opts.end = false; else opts.end = opts.end !== false; const p = { dest: dest, opts: opts, ondrain: _ => this[RESUME]() }; this.pipes.push(p); dest.on('drain', p.ondrain); this[RESUME](); // piping an ended stream ends immediately if (ended && p.opts.end) p.dest.end(); return dest } addListener (ev, fn) { return this.on(ev, fn) } on (ev, fn) { try { return super.on(ev, fn) } finally { if (ev === 'data' && !this.pipes.length && !this.flowing) this[RESUME](); else if (isEndish(ev) && this[EMITTED_END]) { super.emit(ev); this.removeAllListeners(ev); } } } get emittedEnd () { return this[EMITTED_END] } [MAYBE_EMIT_END] () { if (!this[EMITTING_END] && !this[EMITTED_END] && !this[DESTROYED] && this.buffer.length === 0 && this[EOF]) { this[EMITTING_END] = true; this.emit('end'); this.emit('prefinish'); this.emit('finish'); if (this[CLOSED]) this.emit('close'); this[EMITTING_END] = false; } } emit (ev, data) { // error and close are only events allowed after calling destroy() if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED]) return else if (ev === 'data') { if (!data) return if (this.pipes.length) this.pipes.forEach(p => p.dest.write(data) === false && this.pause()); } else if (ev === 'end') { // only actual end gets this treatment if (this[EMITTED_END] === true) return this[EMITTED_END] = true; this.readable = false; if (this[DECODER]) { data = this[DECODER].end(); if (data) { this.pipes.forEach(p => p.dest.write(data)); super.emit('data', data); } } this.pipes.forEach(p => { p.dest.removeListener('drain', p.ondrain); if (p.opts.end) p.dest.end(); }); } else if (ev === 'close') { this[CLOSED] = true; // don't emit close before 'end' and 'finish' if (!this[EMITTED_END] && !this[DESTROYED]) return } // TODO: replace with a spread operator when Node v4 support drops const args = new Array(arguments.length); args[0] = ev; args[1] = data; if (arguments.length > 2) { for (let i = 2; i < arguments.length; i++) { args[i] = arguments[i]; } } try { return super.emit.apply(this, args) } finally { if (!isEndish(ev)) this[MAYBE_EMIT_END](); else this.removeAllListeners(ev); } } // const all = await stream.collect() collect () { const buf = []; if (!this[OBJECTMODE]) buf.dataLength = 0; // set the promise first, in case an error is raised // by triggering the flow here. const p = this.promise(); this.on('data', c => { buf.push(c); if (!this[OBJECTMODE]) buf.dataLength += c.length; }); return p.then(() => buf) } // const data = await stream.concat() concat () { return this[OBJECTMODE] ? Promise.reject(new Error('cannot concat in objectMode')) : this.collect().then(buf => this[OBJECTMODE] ? Promise.reject(new Error('cannot concat in objectMode')) : this[ENCODING] ? buf.join('') : Buffer.concat(buf, buf.dataLength)) } // stream.promise().then(() => done, er => emitted error) promise () { return new Promise((resolve, reject) => { this.on(DESTROYED, () => reject(new Error('stream destroyed'))); this.on('end', () => resolve()); this.on('error', er => reject(er)); }) } // for await (let chunk of stream) [ASYNCITERATOR] () { const next = () => { const res = this.read(); if (res !== null) return Promise.resolve({ done: false, value: res }) if (this[EOF]) return Promise.resolve({ done: true }) let resolve = null; let reject = null; const onerr = er => { this.removeListener('data', ondata); this.removeListener('end', onend); reject(er); }; const ondata = value => { this.removeListener('error', onerr); this.removeListener('end', onend); this.pause(); resolve({ value: value, done: !!this[EOF] }); }; const onend = () => { this.removeListener('error', onerr); this.removeListener('data', ondata); resolve({ done: true }); }; const ondestroy = () => onerr(new Error('stream destroyed')); return new Promise((res, rej) => { reject = rej; resolve = res; this.once(DESTROYED, ondestroy); this.once('error', onerr); this.once('end', onend); this.once('data', ondata); }) }; return { next } } // for (let chunk of stream) [ITERATOR] () { const next = () => { const value = this.read(); const done = value === null; return { value, done } }; return { next } } destroy (er) { if (this[DESTROYED]) { if (er) this.emit('error', er); else this.emit(DESTROYED); return this } this[DESTROYED] = true; // throw away all buffered data, it's never coming out this.buffer = new yallist(); this[BUFFERLENGTH] = 0; if (typeof this.close === 'function' && !this[CLOSED]) this.close(); if (er) this.emit('error', er); else // if no error to emit, still reject pending promises this.emit(DESTROYED); return this } static isStream (s) { return !!s && (s instanceof Minipass || s instanceof stream || s instanceof events && ( typeof s.pipe === 'function' || // readable (typeof s.write === 'function' && typeof s.end === 'function') // writable )) } }; // Update with any zlib constants that are added or changed in the future. // Node v6 didn't export this, so we just hard code the version and rely // on all the other hard-coded values from zlib v4736. When node v6 // support drops, we can just export the realZlibConstants object. const realZlibConstants = zlib.constants || /* istanbul ignore next */ { ZLIB_VERNUM: 4736 }; var constants = Object.freeze(Object.assign(Object.create(null), { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_MEM_ERROR: -4, Z_BUF_ERROR: -5, Z_VERSION_ERROR: -6, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, DEFLATE: 1, INFLATE: 2, GZIP: 3, GUNZIP: 4, DEFLATERAW: 5, INFLATERAW: 6, UNZIP: 7, BROTLI_DECODE: 8, BROTLI_ENCODE: 9, Z_MIN_WINDOWBITS: 8, Z_MAX_WINDOWBITS: 15, Z_DEFAULT_WINDOWBITS: 15, Z_MIN_CHUNK: 64, Z_MAX_CHUNK: Infinity, Z_DEFAULT_CHUNK: 16384, Z_MIN_MEMLEVEL: 1, Z_MAX_MEMLEVEL: 9, Z_DEFAULT_MEMLEVEL: 8, Z_MIN_LEVEL: -1, Z_MAX_LEVEL: 9, Z_DEFAULT_LEVEL: -1, BROTLI_OPERATION_PROCESS: 0, BROTLI_OPERATION_FLUSH: 1, BROTLI_OPERATION_FINISH: 2, BROTLI_OPERATION_EMIT_METADATA: 3, BROTLI_MODE_GENERIC: 0, BROTLI_MODE_TEXT: 1, BROTLI_MODE_FONT: 2, BROTLI_DEFAULT_MODE: 0, BROTLI_MIN_QUALITY: 0, BROTLI_MAX_QUALITY: 11, BROTLI_DEFAULT_QUALITY: 11, BROTLI_MIN_WINDOW_BITS: 10, BROTLI_MAX_WINDOW_BITS: 24, BROTLI_LARGE_MAX_WINDOW_BITS: 30, BROTLI_DEFAULT_WINDOW: 22, BROTLI_MIN_INPUT_BLOCK_BITS: 16, BROTLI_MAX_INPUT_BLOCK_BITS: 24, BROTLI_PARAM_MODE: 0, BROTLI_PARAM_QUALITY: 1, BROTLI_PARAM_LGWIN: 2, BROTLI_PARAM_LGBLOCK: 3, BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4, BROTLI_PARAM_SIZE_HINT: 5, BROTLI_PARAM_LARGE_WINDOW: 6, BROTLI_PARAM_NPOSTFIX: 7, BROTLI_PARAM_NDIRECT: 8, BROTLI_DECODER_RESULT_ERROR: 0, BROTLI_DECODER_RESULT_SUCCESS: 1, BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2, BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3, BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0, BROTLI_DECODER_PARAM_LARGE_WINDOW: 1, BROTLI_DECODER_NO_ERROR: 0, BROTLI_DECODER_SUCCESS: 1, BROTLI_DECODER_NEEDS_MORE_INPUT: 2, BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3, BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1, BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2, BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3, BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4, BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5, BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6, BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7, BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8, BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9, BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10, BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11, BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12, BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13, BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14, BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15, BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16, BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19, BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20, BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21, BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22, BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25, BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26, BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27, BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30, BROTLI_DECODER_ERROR_UNREACHABLE: -31, }, realZlibConstants)); var minizlib = createCommonjsModule(function (module, exports) { const Buffer = buffer.Buffer; const constants$1 = exports.constants = constants; const OriginalBufferConcat = Buffer.concat; const _superWrite = Symbol('_superWrite'); class ZlibError extends Error { constructor (err) { super('zlib: ' + err.message); this.code = err.code; this.errno = err.errno; /* istanbul ignore if */ if (!this.code) this.code = 'ZLIB_ERROR'; this.message = 'zlib: ' + err.message; Error.captureStackTrace(this, this.constructor); } get name () { return 'ZlibError' } } // the Zlib class they all inherit from // This thing manages the queue of requests, and returns // true or false if there is anything in the queue when // you call the .write() method. const _opts = Symbol('opts'); const _flushFlag = Symbol('flushFlag'); const _finishFlushFlag = Symbol('finishFlushFlag'); const _fullFlushFlag = Symbol('fullFlushFlag'); const _handle = Symbol('handle'); const _onError = Symbol('onError'); const _sawError = Symbol('sawError'); const _level = Symbol('level'); const _strategy = Symbol('strategy'); const _ended = Symbol('ended'); class ZlibBase extends minipass { constructor (opts, mode) { if (!opts || typeof opts !== 'object') throw new TypeError('invalid options for ZlibBase constructor') super(opts); this[_ended] = false; this[_opts] = opts; this[_flushFlag] = opts.flush; this[_finishFlushFlag] = opts.finishFlush; // this will throw if any options are invalid for the class selected try { this[_handle] = new zlib[mode](opts); } catch (er) { // make sure that all errors get decorated properly throw new ZlibError(er) } this[_onError] = (err) => { this[_sawError] = true; // there is no way to cleanly recover. // continuing only obscures problems. this.close(); this.emit('error', err); }; this[_handle].on('error', er => this[_onError](new ZlibError(er))); this.once('end', () => this.close); } close () { if (this[_handle]) { this[_handle].close(); this[_handle] = null; this.emit('close'); } } reset () { if (!this[_sawError]) { assert(this[_handle], 'zlib binding closed'); return this[_handle].reset() } } flush (flushFlag) { if (this.ended) return if (typeof flushFlag !== 'number') flushFlag = this[_fullFlushFlag]; this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag })); } end (chunk, encoding, cb) { if (chunk) this.write(chunk, encoding); this.flush(this[_finishFlushFlag]); this[_ended] = true; return super.end(null, null, cb) } get ended () { return this[_ended] } write (chunk, encoding, cb) { // process the chunk using the sync process // then super.write() all the outputted chunks if (typeof encoding === 'function') cb = encoding, encoding = 'utf8'; if (typeof chunk === 'string') chunk = Buffer.from(chunk, encoding); if (this[_sawError]) return assert(this[_handle], 'zlib binding closed'); // _processChunk tries to .close() the native handle after it's done, so we // intercept that by temporarily making it a no-op. const nativeHandle = this[_handle]._handle; const originalNativeClose = nativeHandle.close; nativeHandle.close = () => {}; const originalClose = this[_handle].close; this[_handle].close = () => {}; // It also calls `Buffer.concat()` at the end, which may be convenient // for some, but which we are not interested in as it slows us down. Buffer.concat = (args) => args; let result; try { const flushFlag = typeof chunk[_flushFlag] === 'number' ? chunk[_flushFlag] : this[_flushFlag]; result = this[_handle]._processChunk(chunk, flushFlag); // if we don't throw, reset it back how it was Buffer.concat = OriginalBufferConcat; } catch (err) { // or if we do, put Buffer.concat() back before we emit error // Error events call into user code, which may call Buffer.concat() Buffer.concat = OriginalBufferConcat; this[_onError](new ZlibError(err)); } finally { if (this[_handle]) { // Core zlib resets `_handle` to null after attempting to close the // native handle. Our no-op handler prevented actual closure, but we // need to restore the `._handle` property. this[_handle]._handle = nativeHandle; nativeHandle.close = originalNativeClose; this[_handle].close = originalClose; // `_processChunk()` adds an 'error' listener. If we don't remove it // after each call, these handlers start piling up. this[_handle].removeAllListeners('error'); } } let writeReturn; if (result) { if (Array.isArray(result) && result.length > 0) { // The first buffer is always `handle._outBuffer`, which would be // re-used for later invocations; so, we always have to copy that one. writeReturn = this[_superWrite](Buffer.from(result[0])); for (let i = 1; i < result.length; i++) { writeReturn = this[_superWrite](result[i]); } } else { writeReturn = this[_superWrite](Buffer.from(result)); } } if (cb) cb(); return writeReturn } [_superWrite] (data) { return super.write(data) } } class Zlib extends ZlibBase { constructor (opts, mode) { opts = opts || {}; opts.flush = opts.flush || constants$1.Z_NO_FLUSH; opts.finishFlush = opts.finishFlush || constants$1.Z_FINISH; super(opts, mode); this[_fullFlushFlag] = constants$1.Z_FULL_FLUSH; this[_level] = opts.level; this[_strategy] = opts.strategy; } params (level, strategy) { if (this[_sawError]) return if (!this[_handle]) throw new Error('cannot switch params when binding is closed') // no way to test this without also not supporting params at all /* istanbul ignore if */ if (!this[_handle].params) throw new Error('not supported in this implementation') if (this[_level] !== level || this[_strategy] !== strategy) { this.flush(constants$1.Z_SYNC_FLUSH); assert(this[_handle], 'zlib binding closed'); // .params() calls .flush(), but the latter is always async in the // core zlib. We override .flush() temporarily to intercept that and // flush synchronously. const origFlush = this[_handle].flush; this[_handle].flush = (flushFlag, cb) => { this.flush(flushFlag); cb(); }; try { this[_handle].params(level, strategy); } finally { this[_handle].flush = origFlush; } /* istanbul ignore else */ if (this[_handle]) { this[_level] = level; this[_strategy] = strategy; } } } } // minimal 2-byte header class Deflate extends Zlib { constructor (opts) { super(opts, 'Deflate'); } } class Inflate extends Zlib { constructor (opts) { super(opts, 'Inflate'); } } // gzip - bigger header, same deflate compression const _portable = Symbol('_portable'); class Gzip extends Zlib { constructor (opts) { super(opts, 'Gzip'); this[_portable] = opts && !!opts.portable; } [_superWrite] (data) { if (!this[_portable]) return super[_superWrite](data) // we'll always get the header emitted in one first chunk // overwrite the OS indicator byte with 0xFF this[_portable] = false; data[9] = 255; return super[_superWrite](data) } } class Gunzip extends Zlib { constructor (opts) { super(opts, 'Gunzip'); } } // raw - no header class DeflateRaw extends Zlib { constructor (opts) { super(opts, 'DeflateRaw'); } } class InflateRaw extends Zlib { constructor (opts) { super(opts, 'InflateRaw'); } } // auto-detect header. class Unzip extends Zlib { constructor (opts) { super(opts, 'Unzip'); } } class Brotli extends ZlibBase { constructor (opts, mode) { opts = opts || {}; opts.flush = opts.flush || constants$1.BROTLI_OPERATION_PROCESS; opts.finishFlush = opts.finishFlush || constants$1.BROTLI_OPERATION_FINISH; super(opts, mode); this[_fullFlushFlag] = constants$1.BROTLI_OPERATION_FLUSH; } } class BrotliCompress extends Brotli { constructor (opts) { super(opts, 'BrotliCompress'); } } class BrotliDecompress extends Brotli { constructor (opts) { super(opts, 'BrotliDecompress'); } } exports.Deflate = Deflate; exports.Inflate = Inflate; exports.Gzip = Gzip; exports.Gunzip = Gunzip; exports.DeflateRaw = DeflateRaw; exports.InflateRaw = InflateRaw; exports.Unzip = Unzip; /* istanbul ignore else */ if (typeof zlib.BrotliCompress === 'function') { exports.BrotliCompress = BrotliCompress; exports.BrotliDecompress = BrotliDecompress; } else { exports.BrotliCompress = exports.BrotliDecompress = class { constructor () { throw new Error('Brotli is not supported in this version of Node.js') } }; } }); var minizlib_1 = minizlib.constants; var minizlib_2 = minizlib.Deflate; var minizlib_3 = minizlib.Inflate; var minizlib_4 = minizlib.Gzip; var minizlib_5 = minizlib.Gunzip; var minizlib_6 = minizlib.DeflateRaw; var minizlib_7 = minizlib.InflateRaw; var minizlib_8 = minizlib.Unzip; var minizlib_9 = minizlib.BrotliCompress; var minizlib_10 = minizlib.BrotliDecompress; var types = createCommonjsModule(function (module, exports) { // map types from key to human-friendly name exports.name = new Map([ ['0', 'File'], // same as File ['', 'OldFile'], ['1', 'Link'], ['2', 'SymbolicLink'], // Devices and FIFOs aren't fully supported // they are parsed, but skipped when unpacking ['3', 'CharacterDevice'], ['4', 'BlockDevice'], ['5', 'Directory'], ['6', 'FIFO'], // same as File ['7', 'ContiguousFile'], // pax headers ['g', 'GlobalExtendedHeader'], ['x', 'ExtendedHeader'], // vendor-specific stuff // skip ['A', 'SolarisACL'], // like 5, but with data, which should be skipped ['D', 'GNUDumpDir'], // metadata only, skip ['I', 'Inode'], // data = link path of next file ['K', 'NextFileHasLongLinkpath'], // data = path of next file ['L', 'NextFileHasLongPath'], // skip ['M', 'ContinuationFile'], // like L ['N', 'OldGnuLongPath'], // skip ['S', 'SparseFile'], // skip ['V', 'TapeVolumeHeader'], // like x ['X', 'OldExtendedHeader'] ]); // map the other direction exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])); }); var types_1 = types.name; var types_2 = types.code; const SLURP = Symbol('slurp'); var readEntry = class ReadEntry extends minipass { constructor (header, ex, gex) { super(); // read entries always start life paused. this is to avoid the // situation where Minipass's auto-ending empty streams results // in an entry ending before we're ready for it. this.pause(); this.extended = ex; this.globalExtended = gex; this.header = header; this.startBlockSize = 512 * Math.ceil(header.size / 512); this.blockRemain = this.startBlockSize; this.remain = header.size; this.type = header.type; this.meta = false; this.ignore = false; switch (this.type) { case 'File': case 'OldFile': case 'Link': case 'SymbolicLink': case 'CharacterDevice': case 'BlockDevice': case 'Directory': case 'FIFO': case 'ContiguousFile': case 'GNUDumpDir': break case 'NextFileHasLongLinkpath': case 'NextFileHasLongPath': case 'OldGnuLongPath': case 'GlobalExtendedHeader': case 'ExtendedHeader': case 'OldExtendedHeader': this.meta = true; break // NOTE: gnutar and bsdtar treat unrecognized types as 'File' // it may be worth doing the same, but with a warning. default: this.ignore = true; } this.path = header.path; this.mode = header.mode; if (this.mode) this.mode = this.mode & 0o7777; this.uid = header.uid; this.gid = header.gid; this.uname = header.uname; this.gname = header.gname; this.size = header.size; this.mtime = header.mtime; this.atime = header.atime; this.ctime = header.ctime; this.linkpath = header.linkpath; this.uname = header.uname; this.gname = header.gname; if (ex) this[SLURP](ex); if (gex) this[SLURP](gex, true); } write (data) { const writeLen = data.length; if (writeLen > this.blockRemain) throw new Error('writing more to entry than is appropriate') const r = this.remain; const br = this.blockRemain; this.remain = Math.max(0, r - writeLen); this.blockRemain = Math.max(0, br - writeLen); if (this.ignore) return true if (r >= writeLen) return super.write(data) // r < writeLen return super.write(data.slice(0, r)) } [SLURP] (ex, global) { for (let k in ex) { // we slurp in everything except for the path attribute in // a global extended header, because that's weird. if (ex[k] !== null && ex[k] !== undefined && !(global && k === 'path')) this[k] = ex[k]; } } }; var largeNumbers = createCommonjsModule(function (module, exports) { // Tar can encode large and negative numbers using a leading byte of // 0xff for negative, and 0x80 for positive. const encode = exports.encode = (num, buf) => { if (!Number.isSafeInteger(num)) // The number is so large that javascript cannot represent it with integer // precision. throw Error('cannot encode number outside of javascript safe integer range') else if (num < 0) encodeNegative(num, buf); else encodePositive(num, buf); return buf }; const encodePositive = (num, buf) => { buf[0] = 0x80; for (var i = buf.length; i > 1; i--) { buf[i-1] = num & 0xff; num = Math.floor(num / 0x100); } }; const encodeNegative = (num, buf) => { buf[0] = 0xff; var flipped = false; num = num * -1; for (var i = buf.length; i > 1; i--) { var byte = num & 0xff; num = Math.floor(num / 0x100); if (flipped) buf[i-1] = onesComp(byte); else if (byte === 0) buf[i-1] = 0; else { flipped = true; buf[i-1] = twosComp(byte); } } }; const parse = exports.parse = (buf) => { var post = buf[buf.length - 1]; var pre = buf[0]; var value; if (pre === 0x80) value = pos(buf.slice(1, buf.length)); else if (pre === 0xff) value = twos(buf); else throw Error('invalid base256 encoding') if (!Number.isSafeInteger(value)) // The number is so large that javascript cannot represent it with integer // precision. throw Error('parsed number outside of javascript safe integer range') return value }; const twos = (buf) => { var len = buf.length; var sum = 0; var flipped = false; for (var i = len - 1; i > -1; i--) { var byte = buf[i]; var f; if (flipped) f = onesComp(byte); else if (byte === 0) f = byte; else { flipped = true; f = twosComp(byte); } if (f !== 0) sum -= f * Math.pow(256, len - i - 1); } return sum }; const pos = (buf) => { var len = buf.length; var sum = 0; for (var i = len - 1; i > -1; i--) { var byte = buf[i]; if (byte !== 0) sum += byte * Math.pow(256, len - i - 1); } return sum }; const onesComp = byte => (0xff ^ byte) & 0xff; const twosComp = byte => ((0xff ^ byte) + 1) & 0xff; }); var largeNumbers_1 = largeNumbers.encode; var largeNumbers_2 = largeNumbers.parse; // parse a 512-byte header block to a data object, or vice-versa // encode returns `true` if a pax extended header is needed, because // the data could not be faithfully encoded in a simple header. // (Also, check header.needPax to see if it needs a pax header.) const pathModule = path$1.posix; const SLURP$1 = Symbol('slurp'); const TYPE = Symbol('type'); class Header { constructor (data, off, ex, gex) { this.cksumValid = false; this.needPax = false; this.nullBlock = false; this.block = null; this.path = null; this.mode = null; this.uid = null; this.gid = null; this.size = null; this.mtime = null; this.cksum = null; this[TYPE] = '0'; this.linkpath = null; this.uname = null; this.gname = null; this.devmaj = 0; this.devmin = 0; this.atime = null; this.ctime = null; if (Buffer.isBuffer(data)) this.decode(data, off || 0, ex, gex); else if (data) this.set(data); } decode (buf, off, ex, gex) { if (!off) off = 0; if (!buf || !(buf.length >= off + 512)) throw new Error('need 512 bytes for header') this.path = decString(buf, off, 100); this.mode = decNumber(buf, off + 100, 8); this.uid = decNumber(buf, off + 108, 8); this.gid = decNumber(buf, off + 116, 8); this.size = decNumber(buf, off + 124, 12); this.mtime = decDate(buf, off + 136, 12); this.cksum = decNumber(buf, off + 148, 12); // if we have extended or global extended headers, apply them now // See https://github.com/npm/node-tar/pull/187 this[SLURP$1](ex); this[SLURP$1](gex, true); // old tar versions marked dirs as a file with a trailing / this[TYPE] = decString(buf, off + 156, 1); if (this[TYPE] === '') this[TYPE] = '0'; if (this[TYPE] === '0' && this.path.substr(-1) === '/') this[TYPE] = '5'; // tar implementations sometimes incorrectly put the stat(dir).size // as the size in the tarball, even though Directory entries are // not able to have any body at all. In the very rare chance that // it actually DOES have a body, we weren't going to do anything with // it anyway, and it'll just be a warning about an invalid header. if (this[TYPE] === '5') this.size = 0; this.linkpath = decString(buf, off + 157, 100); if (buf.slice(off + 257, off + 265).toString() === 'ustar\u000000') { this.uname = decString(buf, off + 265, 32); this.gname = decString(buf, off + 297, 32); this.devmaj = decNumber(buf, off + 329, 8); this.devmin = decNumber(buf, off + 337, 8); if (buf[off + 475] !== 0) { // definitely a prefix, definitely >130 chars. const prefix = decString(buf, off + 345, 155); this.path = prefix + '/' + this.path; } else { const prefix = decString(buf, off + 345, 130); if (prefix) this.path = prefix + '/' + this.path; this.atime = decDate(buf, off + 476, 12); this.ctime = decDate(buf, off + 488, 12); } } let sum = 8 * 0x20; for (let i = off; i < off + 148; i++) { sum += buf[i]; } for (let i = off + 156; i < off + 512; i++) { sum += buf[i]; } this.cksumValid = sum === this.cksum; if (this.cksum === null && sum === 8 * 0x20) this.nullBlock = true; } [SLURP$1] (ex, global) { for (let k in ex) { // we slurp in everything except for the path attribute in // a global extended header, because that's weird. if (ex[k] !== null && ex[k] !== undefined && !(global && k === 'path')) this[k] = ex[k]; } } encode (buf, off) { if (!buf) { buf = this.block = Buffer.alloc(512); off = 0; } if (!off) off = 0; if (!(buf.length >= off + 512)) throw new Error('need 512 bytes for header') const prefixSize = this.ctime || this.atime ? 130 : 155; const split = splitPrefix(this.path || '', prefixSize); const path = split[0]; const prefix = split[1]; this.needPax = split[2]; this.needPax = encString(buf, off, 100, path) || this.needPax; this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax; this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax; this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax; this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax; this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax; buf[off + 156] = this[TYPE].charCodeAt(0); this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax; buf.write('ustar\u000000', off + 257, 8); this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax; this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax; this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax; this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax; if (buf[off + 475] !== 0) this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax; else { this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax; this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax; this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax; } let sum = 8 * 0x20; for (let i =