@_davideast/stitch-mcp 0.5.3 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-18nfnnkg.js +947 -0
- package/dist/chunk-18nfnnkg.js.map +28 -0
- package/dist/chunk-1sgyj1qf.js +256 -0
- package/dist/chunk-1sgyj1qf.js.map +11 -0
- package/dist/chunk-1tzaa3zn.js +370 -0
- package/dist/chunk-1tzaa3zn.js.map +16 -0
- package/dist/chunk-2efzz3tw.js +10 -0
- package/dist/chunk-2efzz3tw.js.map +9 -0
- package/dist/chunk-2eq8thmz.js +31529 -0
- package/dist/chunk-2eq8thmz.js.map +245 -0
- package/dist/chunk-4xa2a5hb.js +19 -0
- package/dist/chunk-4xa2a5hb.js.map +9 -0
- package/dist/chunk-7vdj1qwb.js +2121 -0
- package/dist/chunk-7vdj1qwb.js.map +44 -0
- package/dist/chunk-7zyv8g2t.js +5216 -0
- package/dist/chunk-7zyv8g2t.js.map +67 -0
- package/dist/chunk-94xqpnv4.js +7 -0
- package/dist/chunk-94xqpnv4.js.map +9 -0
- package/dist/chunk-b43pzs3z.js +839 -0
- package/dist/chunk-b43pzs3z.js.map +11 -0
- package/dist/chunk-byzfppa1.js +759 -0
- package/dist/chunk-byzfppa1.js.map +19 -0
- package/dist/chunk-cjkw69md.js +94 -0
- package/dist/chunk-cjkw69md.js.map +10 -0
- package/dist/chunk-d92ngrr6.js +680 -0
- package/dist/chunk-d92ngrr6.js.map +17 -0
- package/dist/chunk-de74byjc.js +19 -0
- package/dist/chunk-de74byjc.js.map +9 -0
- package/dist/chunk-ewab4gg0.js +17 -0
- package/dist/chunk-ewab4gg0.js.map +9 -0
- package/dist/chunk-f0phn3y1.js +1495 -0
- package/dist/chunk-f0phn3y1.js.map +23 -0
- package/dist/chunk-f398cwqb.js +24 -0
- package/dist/chunk-f398cwqb.js.map +9 -0
- package/dist/chunk-fkzq5m59.js +111 -0
- package/dist/chunk-fkzq5m59.js.map +10 -0
- package/dist/chunk-gzk8pt16.js +44184 -0
- package/dist/chunk-gzk8pt16.js.map +237 -0
- package/dist/chunk-kme6y874.js +125 -0
- package/dist/chunk-kme6y874.js.map +12 -0
- package/dist/chunk-mw5wn97e.js +109 -0
- package/dist/chunk-mw5wn97e.js.map +10 -0
- package/dist/chunk-mxcybqhd.js +412 -0
- package/dist/chunk-mxcybqhd.js.map +20 -0
- package/dist/chunk-nep9nerg.js +137 -0
- package/dist/chunk-nep9nerg.js.map +10 -0
- package/dist/chunk-nrcb494d.js +50 -0
- package/dist/chunk-nrcb494d.js.map +9 -0
- package/dist/chunk-p9vvygz4.js +736 -0
- package/dist/chunk-p9vvygz4.js.map +16 -0
- package/dist/chunk-rd2ye9s7.js +17 -0
- package/dist/chunk-rd2ye9s7.js.map +9 -0
- package/dist/chunk-svk5y62j.js +164 -0
- package/dist/chunk-svk5y62j.js.map +10 -0
- package/dist/chunk-w3wh3zkf.js +269 -0
- package/dist/chunk-w3wh3zkf.js.map +10 -0
- package/dist/chunk-x1tt02n9.js +264 -0
- package/dist/chunk-x1tt02n9.js.map +12 -0
- package/dist/chunk-x7g5p1gv.js +66 -0
- package/dist/chunk-x7g5p1gv.js.map +10 -0
- package/dist/chunk-z7b1n864.js +246 -0
- package/dist/chunk-z7b1n864.js.map +14 -0
- package/dist/chunk-zcc6seqb.js +19132 -0
- package/dist/chunk-zcc6seqb.js.map +115 -0
- package/dist/commands/doctor/command.js +1 -1
- package/dist/commands/init/command.js +1 -1
- package/dist/commands/logout/command.js +1 -1
- package/dist/commands/proxy/command.js +1 -1
- package/dist/commands/screens/command.js +4 -4
- package/dist/commands/serve/command.js +5 -5
- package/dist/commands/site/command.js +1 -1
- package/dist/commands/snapshot/command.js +1 -1
- package/dist/commands/tool/command.js +1 -1
- package/dist/commands/view/command.js +1 -1
- package/dist/index.js +5 -7
- package/dist/index.js.map +1 -1
- package/dist/ui/copy-behaviors/clipboard.d.ts +0 -7
- package/package.json +1 -3
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../node_modules/adm-zip/util/constants.js", "../node_modules/adm-zip/util/errors.js", "../node_modules/adm-zip/util/utils.js", "../node_modules/adm-zip/util/fattr.js", "../node_modules/adm-zip/util/decoder.js", "../node_modules/adm-zip/util/index.js", "../node_modules/adm-zip/headers/entryHeader.js", "../node_modules/adm-zip/headers/mainHeader.js", "../node_modules/adm-zip/headers/index.js", "../node_modules/adm-zip/methods/deflater.js", "../node_modules/adm-zip/methods/inflater.js", "../node_modules/adm-zip/methods/zipcrypto.js", "../node_modules/adm-zip/methods/index.js", "../node_modules/adm-zip/zipEntry.js", "../node_modules/adm-zip/zipFile.js", "../node_modules/adm-zip/adm-zip.js", "../node_modules/cli-width/index.js", "../node_modules/mute-stream/lib/index.js", "../src/platform/detector.ts", "../src/platform/shell.ts", "../src/platform/paths.ts", "../src/services/gcloud/core.ts", "../src/services/gcloud/install.ts", "../src/services/gcloud/auth.ts", "../src/services/gcloud/spec.ts", "../src/services/gcloud/projects.ts", "../src/services/gcloud/handler.ts", "../node_modules/@inquirer/core/dist/lib/key.js", "../node_modules/@inquirer/core/dist/lib/errors.js", "../node_modules/@inquirer/core/dist/lib/use-state.js", "../node_modules/@inquirer/core/dist/lib/hook-engine.js", "../node_modules/@inquirer/core/dist/lib/use-effect.js", "../node_modules/@inquirer/core/dist/lib/theme.js", "../node_modules/@inquirer/figures/dist/index.js", "../node_modules/@inquirer/core/dist/lib/make-theme.js", "../node_modules/@inquirer/core/dist/lib/use-prefix.js", "../node_modules/@inquirer/core/dist/lib/use-memo.js", "../node_modules/@inquirer/core/dist/lib/use-ref.js", "../node_modules/@inquirer/core/dist/lib/use-keypress.js", "../node_modules/@inquirer/core/dist/lib/utils.js", "../node_modules/fast-string-truncated-width/dist/utils.js", "../node_modules/fast-string-truncated-width/dist/index.js", "../node_modules/fast-string-width/dist/index.js", "../node_modules/fast-wrap-ansi/lib/main.js", "../node_modules/@inquirer/core/dist/lib/pagination/use-pagination.js", "../node_modules/@inquirer/core/dist/lib/create-prompt.js", "../node_modules/signal-exit/dist/mjs/signals.js", "../node_modules/signal-exit/dist/mjs/index.js", "../node_modules/@inquirer/core/dist/lib/screen-manager.js", "../node_modules/@inquirer/ansi/dist/index.js", "../node_modules/@inquirer/core/dist/lib/promise-polyfill.js", "../node_modules/@inquirer/core/dist/lib/Separator.js", "../node_modules/@inquirer/confirm/dist/index.js", "../node_modules/@inquirer/input/dist/index.js", "../node_modules/@inquirer/password/dist/index.js", "../node_modules/@inquirer/select/dist/index.js", "../src/ui/wizard.ts", "../src/framework/ConsoleUI.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"module.exports = {\n /* The local file header */\n LOCHDR : 30, // LOC header size\n LOCSIG : 0x04034b50, // \"PK\\003\\004\"\n LOCVER : 4,\t// version needed to extract\n LOCFLG : 6, // general purpose bit flag\n LOCHOW : 8, // compression method\n LOCTIM : 10, // modification time (2 bytes time, 2 bytes date)\n LOCCRC : 14, // uncompressed file crc-32 value\n LOCSIZ : 18, // compressed size\n LOCLEN : 22, // uncompressed size\n LOCNAM : 26, // filename length\n LOCEXT : 28, // extra field length\n\n /* The Data descriptor */\n EXTSIG : 0x08074b50, // \"PK\\007\\008\"\n EXTHDR : 16, // EXT header size\n EXTCRC : 4, // uncompressed file crc-32 value\n EXTSIZ : 8, // compressed size\n EXTLEN : 12, // uncompressed size\n\n /* The central directory file header */\n CENHDR : 46, // CEN header size\n CENSIG : 0x02014b50, // \"PK\\001\\002\"\n CENVEM : 4, // version made by\n CENVER : 6, // version needed to extract\n CENFLG : 8, // encrypt, decrypt flags\n CENHOW : 10, // compression method\n CENTIM : 12, // modification time (2 bytes time, 2 bytes date)\n CENCRC : 16, // uncompressed file crc-32 value\n CENSIZ : 20, // compressed size\n CENLEN : 24, // uncompressed size\n CENNAM : 28, // filename length\n CENEXT : 30, // extra field length\n CENCOM : 32, // file comment length\n CENDSK : 34, // volume number start\n CENATT : 36, // internal file attributes\n CENATX : 38, // external file attributes (host system dependent)\n CENOFF : 42, // LOC header offset\n\n /* The entries in the end of central directory */\n ENDHDR : 22, // END header size\n ENDSIG : 0x06054b50, // \"PK\\005\\006\"\n ENDSUB : 8, // number of entries on this disk\n ENDTOT : 10, // total number of entries\n ENDSIZ : 12, // central directory size in bytes\n ENDOFF : 16, // offset of first CEN header\n ENDCOM : 20, // zip file comment length\n\n END64HDR : 20, // zip64 END header size\n END64SIG : 0x07064b50, // zip64 Locator signature, \"PK\\006\\007\"\n END64START : 4, // number of the disk with the start of the zip64\n END64OFF : 8, // relative offset of the zip64 end of central directory\n END64NUMDISKS : 16, // total number of disks\n\n ZIP64SIG : 0x06064b50, // zip64 signature, \"PK\\006\\006\"\n ZIP64HDR : 56, // zip64 record minimum size\n ZIP64LEAD : 12, // leading bytes at the start of the record, not counted by the value stored in ZIP64SIZE\n ZIP64SIZE : 4, // zip64 size of the central directory record\n ZIP64VEM : 12, // zip64 version made by\n ZIP64VER : 14, // zip64 version needed to extract\n ZIP64DSK : 16, // zip64 number of this disk\n ZIP64DSKDIR : 20, // number of the disk with the start of the record directory\n ZIP64SUB : 24, // number of entries on this disk\n ZIP64TOT : 32, // total number of entries\n ZIP64SIZB : 40, // zip64 central directory size in bytes\n ZIP64OFF : 48, // offset of start of central directory with respect to the starting disk number\n ZIP64EXTRA : 56, // extensible data sector\n\n /* Compression methods */\n STORED : 0, // no compression\n SHRUNK : 1, // shrunk\n REDUCED1 : 2, // reduced with compression factor 1\n REDUCED2 : 3, // reduced with compression factor 2\n REDUCED3 : 4, // reduced with compression factor 3\n REDUCED4 : 5, // reduced with compression factor 4\n IMPLODED : 6, // imploded\n // 7 reserved for Tokenizing compression algorithm\n DEFLATED : 8, // deflated\n ENHANCED_DEFLATED: 9, // enhanced deflated\n PKWARE : 10,// PKWare DCL imploded\n // 11 reserved by PKWARE\n BZIP2 : 12, // compressed using BZIP2\n // 13 reserved by PKWARE\n LZMA : 14, // LZMA\n // 15-17 reserved by PKWARE\n IBM_TERSE : 18, // compressed using IBM TERSE\n IBM_LZ77 : 19, // IBM LZ77 z\n AES_ENCRYPT : 99, // WinZIP AES encryption method\n\n /* General purpose bit flag */\n // values can obtained with expression 2**bitnr\n FLG_ENC : 1, // Bit 0: encrypted file\n FLG_COMP1 : 2, // Bit 1, compression option\n FLG_COMP2 : 4, // Bit 2, compression option\n FLG_DESC : 8, // Bit 3, data descriptor\n FLG_ENH : 16, // Bit 4, enhanced deflating\n FLG_PATCH : 32, // Bit 5, indicates that the file is compressed patched data.\n FLG_STR : 64, // Bit 6, strong encryption (patented)\n // Bits 7-10: Currently unused.\n FLG_EFS : 2048, // Bit 11: Language encoding flag (EFS)\n // Bit 12: Reserved by PKWARE for enhanced compression.\n // Bit 13: encrypted the Central Directory (patented).\n // Bits 14-15: Reserved by PKWARE.\n FLG_MSK : 4096, // mask header values\n\n /* Load type */\n FILE : 2,\n BUFFER : 1,\n NONE : 0,\n\n /* 4.5 Extensible data fields */\n EF_ID : 0,\n EF_SIZE : 2,\n\n /* Header IDs */\n ID_ZIP64 : 0x0001,\n ID_AVINFO : 0x0007,\n ID_PFS : 0x0008,\n ID_OS2 : 0x0009,\n ID_NTFS : 0x000a,\n ID_OPENVMS : 0x000c,\n ID_UNIX : 0x000d,\n ID_FORK : 0x000e,\n ID_PATCH : 0x000f,\n ID_X509_PKCS7 : 0x0014,\n ID_X509_CERTID_F : 0x0015,\n ID_X509_CERTID_C : 0x0016,\n ID_STRONGENC : 0x0017,\n ID_RECORD_MGT : 0x0018,\n ID_X509_PKCS7_RL : 0x0019,\n ID_IBM1 : 0x0065,\n ID_IBM2 : 0x0066,\n ID_POSZIP : 0x4690,\n\n EF_ZIP64_OR_32 : 0xffffffff,\n EF_ZIP64_OR_16 : 0xffff,\n EF_ZIP64_SUNCOMP : 0,\n EF_ZIP64_SCOMP : 8,\n EF_ZIP64_RHO : 16,\n EF_ZIP64_DSN : 24\n};\n",
|
|
6
|
+
"const errors = {\n /* Header error messages */\n INVALID_LOC: \"Invalid LOC header (bad signature)\",\n INVALID_CEN: \"Invalid CEN header (bad signature)\",\n INVALID_END: \"Invalid END header (bad signature)\",\n\n /* Descriptor */\n DESCRIPTOR_NOT_EXIST: \"No descriptor present\",\n DESCRIPTOR_UNKNOWN: \"Unknown descriptor format\",\n DESCRIPTOR_FAULTY: \"Descriptor data is malformed\",\n\n /* ZipEntry error messages*/\n NO_DATA: \"Nothing to decompress\",\n BAD_CRC: \"CRC32 checksum failed {0}\",\n FILE_IN_THE_WAY: \"There is a file in the way: {0}\",\n UNKNOWN_METHOD: \"Invalid/unsupported compression method\",\n\n /* Inflater error messages */\n AVAIL_DATA: \"inflate::Available inflate data did not terminate\",\n INVALID_DISTANCE: \"inflate::Invalid literal/length or distance code in fixed or dynamic block\",\n TO_MANY_CODES: \"inflate::Dynamic block code description: too many length or distance codes\",\n INVALID_REPEAT_LEN: \"inflate::Dynamic block code description: repeat more than specified lengths\",\n INVALID_REPEAT_FIRST: \"inflate::Dynamic block code description: repeat lengths with no first length\",\n INCOMPLETE_CODES: \"inflate::Dynamic block code description: code lengths codes incomplete\",\n INVALID_DYN_DISTANCE: \"inflate::Dynamic block code description: invalid distance code lengths\",\n INVALID_CODES_LEN: \"inflate::Dynamic block code description: invalid literal/length code lengths\",\n INVALID_STORE_BLOCK: \"inflate::Stored block length did not match one's complement\",\n INVALID_BLOCK_TYPE: \"inflate::Invalid block type (type == 3)\",\n\n /* ADM-ZIP error messages */\n CANT_EXTRACT_FILE: \"Could not extract the file\",\n CANT_OVERRIDE: \"Target file already exists\",\n DISK_ENTRY_TOO_LARGE: \"Number of disk entries is too large\",\n NO_ZIP: \"No zip file was loaded\",\n NO_ENTRY: \"Entry doesn't exist\",\n DIRECTORY_CONTENT_ERROR: \"A directory cannot have content\",\n FILE_NOT_FOUND: 'File not found: \"{0}\"',\n NOT_IMPLEMENTED: \"Not implemented\",\n INVALID_FILENAME: \"Invalid filename\",\n INVALID_FORMAT: \"Invalid or unsupported zip format. No END header found\",\n INVALID_PASS_PARAM: \"Incompatible password parameter\",\n WRONG_PASSWORD: \"Wrong Password\",\n\n /* ADM-ZIP */\n COMMENT_TOO_LONG: \"Comment is too long\", // Comment can be max 65535 bytes long (NOTE: some non-US characters may take more space)\n EXTRA_FIELD_PARSE_ERROR: \"Extra field parsing error\"\n};\n\n// template\nfunction E(message) {\n return function (...args) {\n if (args.length) { // Allow {0} .. {9} arguments in error message, based on argument number\n message = message.replace(/\\{(\\d)\\}/g, (_, n) => args[n] || '');\n }\n\n return new Error('ADM-ZIP: ' + message);\n };\n}\n\n// Init errors with template\nfor (const msg of Object.keys(errors)) {\n exports[msg] = E(errors[msg]);\n}\n",
|
|
7
|
+
"const fsystem = require(\"fs\");\nconst pth = require(\"path\");\nconst Constants = require(\"./constants\");\nconst Errors = require(\"./errors\");\nconst isWin = typeof process === \"object\" && \"win32\" === process.platform;\n\nconst is_Obj = (obj) => typeof obj === \"object\" && obj !== null;\n\n// generate CRC32 lookup table\nconst crcTable = new Uint32Array(256).map((t, c) => {\n for (let k = 0; k < 8; k++) {\n if ((c & 1) !== 0) {\n c = 0xedb88320 ^ (c >>> 1);\n } else {\n c >>>= 1;\n }\n }\n return c >>> 0;\n});\n\n// UTILS functions\n\nfunction Utils(opts) {\n this.sep = pth.sep;\n this.fs = fsystem;\n\n if (is_Obj(opts)) {\n // custom filesystem\n if (is_Obj(opts.fs) && typeof opts.fs.statSync === \"function\") {\n this.fs = opts.fs;\n }\n }\n}\n\nmodule.exports = Utils;\n\n// INSTANTIABLE functions\n\nUtils.prototype.makeDir = function (/*String*/ folder) {\n const self = this;\n\n // Sync - make directories tree\n function mkdirSync(/*String*/ fpath) {\n let resolvedPath = fpath.split(self.sep)[0];\n fpath.split(self.sep).forEach(function (name) {\n if (!name || name.substr(-1, 1) === \":\") return;\n resolvedPath += self.sep + name;\n var stat;\n try {\n stat = self.fs.statSync(resolvedPath);\n } catch (e) {\n if (e.message && e.message.startsWith('ENOENT')) {\n self.fs.mkdirSync(resolvedPath);\n } else {\n throw e;\n }\n }\n if (stat && stat.isFile()) throw Errors.FILE_IN_THE_WAY(`\"${resolvedPath}\"`);\n });\n }\n\n mkdirSync(folder);\n};\n\nUtils.prototype.writeFileTo = function (/*String*/ path, /*Buffer*/ content, /*Boolean*/ overwrite, /*Number*/ attr) {\n const self = this;\n if (self.fs.existsSync(path)) {\n if (!overwrite) return false; // cannot overwrite\n\n var stat = self.fs.statSync(path);\n if (stat.isDirectory()) {\n return false;\n }\n }\n var folder = pth.dirname(path);\n if (!self.fs.existsSync(folder)) {\n self.makeDir(folder);\n }\n\n var fd;\n try {\n fd = self.fs.openSync(path, \"w\", 0o666); // 0666\n } catch (e) {\n self.fs.chmodSync(path, 0o666);\n fd = self.fs.openSync(path, \"w\", 0o666);\n }\n if (fd) {\n try {\n self.fs.writeSync(fd, content, 0, content.length, 0);\n } finally {\n self.fs.closeSync(fd);\n }\n }\n self.fs.chmodSync(path, attr || 0o666);\n return true;\n};\n\nUtils.prototype.writeFileToAsync = function (/*String*/ path, /*Buffer*/ content, /*Boolean*/ overwrite, /*Number*/ attr, /*Function*/ callback) {\n if (typeof attr === \"function\") {\n callback = attr;\n attr = undefined;\n }\n\n const self = this;\n\n self.fs.exists(path, function (exist) {\n if (exist && !overwrite) return callback(false);\n\n self.fs.stat(path, function (err, stat) {\n if (exist && stat.isDirectory()) {\n return callback(false);\n }\n\n var folder = pth.dirname(path);\n self.fs.exists(folder, function (exists) {\n if (!exists) self.makeDir(folder);\n\n self.fs.open(path, \"w\", 0o666, function (err, fd) {\n if (err) {\n self.fs.chmod(path, 0o666, function () {\n self.fs.open(path, \"w\", 0o666, function (err, fd) {\n self.fs.write(fd, content, 0, content.length, 0, function () {\n self.fs.close(fd, function () {\n self.fs.chmod(path, attr || 0o666, function () {\n callback(true);\n });\n });\n });\n });\n });\n } else if (fd) {\n self.fs.write(fd, content, 0, content.length, 0, function () {\n self.fs.close(fd, function () {\n self.fs.chmod(path, attr || 0o666, function () {\n callback(true);\n });\n });\n });\n } else {\n self.fs.chmod(path, attr || 0o666, function () {\n callback(true);\n });\n }\n });\n });\n });\n });\n};\n\nUtils.prototype.findFiles = function (/*String*/ path) {\n const self = this;\n\n function findSync(/*String*/ dir, /*RegExp*/ pattern, /*Boolean*/ recursive) {\n if (typeof pattern === \"boolean\") {\n recursive = pattern;\n pattern = undefined;\n }\n let files = [];\n self.fs.readdirSync(dir).forEach(function (file) {\n const path = pth.join(dir, file);\n const stat = self.fs.statSync(path);\n\n if (!pattern || pattern.test(path)) {\n files.push(pth.normalize(path) + (stat.isDirectory() ? self.sep : \"\"));\n }\n\n if (stat.isDirectory() && recursive) files = files.concat(findSync(path, pattern, recursive));\n });\n return files;\n }\n\n return findSync(path, undefined, true);\n};\n\n/**\n * Callback for showing if everything was done.\n *\n * @callback filelistCallback\n * @param {Error} err - Error object\n * @param {string[]} list - was request fully completed\n */\n\n/**\n *\n * @param {string} dir\n * @param {filelistCallback} cb\n */\nUtils.prototype.findFilesAsync = function (dir, cb) {\n const self = this;\n let results = [];\n self.fs.readdir(dir, function (err, list) {\n if (err) return cb(err);\n let list_length = list.length;\n if (!list_length) return cb(null, results);\n list.forEach(function (file) {\n file = pth.join(dir, file);\n self.fs.stat(file, function (err, stat) {\n if (err) return cb(err);\n if (stat) {\n results.push(pth.normalize(file) + (stat.isDirectory() ? self.sep : \"\"));\n if (stat.isDirectory()) {\n self.findFilesAsync(file, function (err, res) {\n if (err) return cb(err);\n results = results.concat(res);\n if (!--list_length) cb(null, results);\n });\n } else {\n if (!--list_length) cb(null, results);\n }\n }\n });\n });\n });\n};\n\nUtils.prototype.getAttributes = function () {};\n\nUtils.prototype.setAttributes = function () {};\n\n// STATIC functions\n\n// crc32 single update (it is part of crc32)\nUtils.crc32update = function (crc, byte) {\n return crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);\n};\n\nUtils.crc32 = function (buf) {\n if (typeof buf === \"string\") {\n buf = Buffer.from(buf, \"utf8\");\n }\n\n let len = buf.length;\n let crc = ~0;\n for (let off = 0; off < len; ) crc = Utils.crc32update(crc, buf[off++]);\n // xor and cast as uint32 number\n return ~crc >>> 0;\n};\n\nUtils.methodToString = function (/*Number*/ method) {\n switch (method) {\n case Constants.STORED:\n return \"STORED (\" + method + \")\";\n case Constants.DEFLATED:\n return \"DEFLATED (\" + method + \")\";\n default:\n return \"UNSUPPORTED (\" + method + \")\";\n }\n};\n\n/**\n * removes \"..\" style path elements\n * @param {string} path - fixable path\n * @returns string - fixed filepath\n */\nUtils.canonical = function (/*string*/ path) {\n if (!path) return \"\";\n // trick normalize think path is absolute\n const safeSuffix = pth.posix.normalize(\"/\" + path.split(\"\\\\\").join(\"/\"));\n return pth.join(\".\", safeSuffix);\n};\n\n/**\n * fix file names in achive\n * @param {string} path - fixable path\n * @returns string - fixed filepath\n */\n\nUtils.zipnamefix = function (path) {\n if (!path) return \"\";\n // trick normalize think path is absolute\n const safeSuffix = pth.posix.normalize(\"/\" + path.split(\"\\\\\").join(\"/\"));\n return pth.posix.join(\".\", safeSuffix);\n};\n\n/**\n *\n * @param {Array} arr\n * @param {function} callback\n * @returns\n */\nUtils.findLast = function (arr, callback) {\n if (!Array.isArray(arr)) throw new TypeError(\"arr is not array\");\n\n const len = arr.length >>> 0;\n for (let i = len - 1; i >= 0; i--) {\n if (callback(arr[i], i, arr)) {\n return arr[i];\n }\n }\n return void 0;\n};\n\n// make abolute paths taking prefix as root folder\nUtils.sanitize = function (/*string*/ prefix, /*string*/ name) {\n prefix = pth.resolve(pth.normalize(prefix));\n var parts = name.split(\"/\");\n for (var i = 0, l = parts.length; i < l; i++) {\n var path = pth.normalize(pth.join(prefix, parts.slice(i, l).join(pth.sep)));\n if (path.indexOf(prefix) === 0) {\n return path;\n }\n }\n return pth.normalize(pth.join(prefix, pth.basename(name)));\n};\n\n// converts buffer, Uint8Array, string types to buffer\nUtils.toBuffer = function toBuffer(/*buffer, Uint8Array, string*/ input, /* function */ encoder) {\n if (Buffer.isBuffer(input)) {\n return input;\n } else if (input instanceof Uint8Array) {\n return Buffer.from(input);\n } else {\n // expect string all other values are invalid and return empty buffer\n return typeof input === \"string\" ? encoder(input) : Buffer.alloc(0);\n }\n};\n\nUtils.readBigUInt64LE = function (/*Buffer*/ buffer, /*int*/ index) {\n const lo = buffer.readUInt32LE(index);\n const hi = buffer.readUInt32LE(index + 4);\n return hi * 0x100000000 + lo;\n};\n\nUtils.fromDOS2Date = function (val) {\n return new Date(((val >> 25) & 0x7f) + 1980, Math.max(((val >> 21) & 0x0f) - 1, 0), Math.max((val >> 16) & 0x1f, 1), (val >> 11) & 0x1f, (val >> 5) & 0x3f, (val & 0x1f) << 1);\n};\n\nUtils.fromDate2DOS = function (val) {\n let date = 0;\n let time = 0;\n if (val.getFullYear() > 1979) {\n date = (((val.getFullYear() - 1980) & 0x7f) << 9) | ((val.getMonth() + 1) << 5) | val.getDate();\n time = (val.getHours() << 11) | (val.getMinutes() << 5) | (val.getSeconds() >> 1);\n }\n return (date << 16) | time;\n};\n\nUtils.isWin = isWin; // Do we have windows system\nUtils.crcTable = crcTable;\n",
|
|
8
|
+
"const pth = require(\"path\");\n\nmodule.exports = function (/*String*/ path, /*Utils object*/ { fs }) {\n var _path = path || \"\",\n _obj = newAttr(),\n _stat = null;\n\n function newAttr() {\n return {\n directory: false,\n readonly: false,\n hidden: false,\n executable: false,\n mtime: 0,\n atime: 0\n };\n }\n\n if (_path && fs.existsSync(_path)) {\n _stat = fs.statSync(_path);\n _obj.directory = _stat.isDirectory();\n _obj.mtime = _stat.mtime;\n _obj.atime = _stat.atime;\n _obj.executable = (0o111 & _stat.mode) !== 0; // file is executable who ever har right not just owner\n _obj.readonly = (0o200 & _stat.mode) === 0; // readonly if owner has no write right\n _obj.hidden = pth.basename(_path)[0] === \".\";\n } else {\n console.warn(\"Invalid path: \" + _path);\n }\n\n return {\n get directory() {\n return _obj.directory;\n },\n\n get readOnly() {\n return _obj.readonly;\n },\n\n get hidden() {\n return _obj.hidden;\n },\n\n get mtime() {\n return _obj.mtime;\n },\n\n get atime() {\n return _obj.atime;\n },\n\n get executable() {\n return _obj.executable;\n },\n\n decodeAttributes: function () {},\n\n encodeAttributes: function () {},\n\n toJSON: function () {\n return {\n path: _path,\n isDirectory: _obj.directory,\n isReadOnly: _obj.readonly,\n isHidden: _obj.hidden,\n isExecutable: _obj.executable,\n mTime: _obj.mtime,\n aTime: _obj.atime\n };\n },\n\n toString: function () {\n return JSON.stringify(this.toJSON(), null, \"\\t\");\n }\n };\n};\n",
|
|
9
|
+
"module.exports = {\n efs: true,\n encode: (data) => Buffer.from(data, \"utf8\"),\n decode: (data) => data.toString(\"utf8\")\n};\n",
|
|
10
|
+
"module.exports = require(\"./utils\");\nmodule.exports.Constants = require(\"./constants\");\nmodule.exports.Errors = require(\"./errors\");\nmodule.exports.FileAttr = require(\"./fattr\");\nmodule.exports.decoder = require(\"./decoder\");\n",
|
|
11
|
+
"var Utils = require(\"../util\"),\n Constants = Utils.Constants;\n\n/* The central directory file header */\nmodule.exports = function () {\n var _verMade = 20, // v2.0\n _version = 10, // v1.0\n _flags = 0,\n _method = 0,\n _time = 0,\n _crc = 0,\n _compressedSize = 0,\n _size = 0,\n _fnameLen = 0,\n _extraLen = 0,\n _comLen = 0,\n _diskStart = 0,\n _inattr = 0,\n _attr = 0,\n _offset = 0;\n\n _verMade |= Utils.isWin ? 0x0a00 : 0x0300;\n\n // Set EFS flag since filename and comment fields are all by default encoded using UTF-8.\n // Without it file names may be corrupted for other apps when file names use unicode chars\n _flags |= Constants.FLG_EFS;\n\n const _localHeader = {\n extraLen: 0\n };\n\n // casting\n const uint32 = (val) => Math.max(0, val) >>> 0;\n const uint16 = (val) => Math.max(0, val) & 0xffff;\n const uint8 = (val) => Math.max(0, val) & 0xff;\n\n _time = Utils.fromDate2DOS(new Date());\n\n return {\n get made() {\n return _verMade;\n },\n set made(val) {\n _verMade = val;\n },\n\n get version() {\n return _version;\n },\n set version(val) {\n _version = val;\n },\n\n get flags() {\n return _flags;\n },\n set flags(val) {\n _flags = val;\n },\n\n get flags_efs() {\n return (_flags & Constants.FLG_EFS) > 0;\n },\n set flags_efs(val) {\n if (val) {\n _flags |= Constants.FLG_EFS;\n } else {\n _flags &= ~Constants.FLG_EFS;\n }\n },\n\n get flags_desc() {\n return (_flags & Constants.FLG_DESC) > 0;\n },\n set flags_desc(val) {\n if (val) {\n _flags |= Constants.FLG_DESC;\n } else {\n _flags &= ~Constants.FLG_DESC;\n }\n },\n\n get method() {\n return _method;\n },\n set method(val) {\n switch (val) {\n case Constants.STORED:\n this.version = 10;\n case Constants.DEFLATED:\n default:\n this.version = 20;\n }\n _method = val;\n },\n\n get time() {\n return Utils.fromDOS2Date(this.timeval);\n },\n set time(val) {\n val = new Date(val);\n this.timeval = Utils.fromDate2DOS(val);\n },\n\n get timeval() {\n return _time;\n },\n set timeval(val) {\n _time = uint32(val);\n },\n\n get timeHighByte() {\n return uint8(_time >>> 8);\n },\n get crc() {\n return _crc;\n },\n set crc(val) {\n _crc = uint32(val);\n },\n\n get compressedSize() {\n return _compressedSize;\n },\n set compressedSize(val) {\n _compressedSize = uint32(val);\n },\n\n get size() {\n return _size;\n },\n set size(val) {\n _size = uint32(val);\n },\n\n get fileNameLength() {\n return _fnameLen;\n },\n set fileNameLength(val) {\n _fnameLen = val;\n },\n\n get extraLength() {\n return _extraLen;\n },\n set extraLength(val) {\n _extraLen = val;\n },\n\n get extraLocalLength() {\n return _localHeader.extraLen;\n },\n set extraLocalLength(val) {\n _localHeader.extraLen = val;\n },\n\n get commentLength() {\n return _comLen;\n },\n set commentLength(val) {\n _comLen = val;\n },\n\n get diskNumStart() {\n return _diskStart;\n },\n set diskNumStart(val) {\n _diskStart = uint32(val);\n },\n\n get inAttr() {\n return _inattr;\n },\n set inAttr(val) {\n _inattr = uint32(val);\n },\n\n get attr() {\n return _attr;\n },\n set attr(val) {\n _attr = uint32(val);\n },\n\n // get Unix file permissions\n get fileAttr() {\n return (_attr || 0) >> 16 & 0xfff;\n },\n\n get offset() {\n return _offset;\n },\n set offset(val) {\n _offset = uint32(val);\n },\n\n get encrypted() {\n return (_flags & Constants.FLG_ENC) === Constants.FLG_ENC;\n },\n\n get centralHeaderSize() {\n return Constants.CENHDR + _fnameLen + _extraLen + _comLen;\n },\n\n get realDataOffset() {\n return _offset + Constants.LOCHDR + _localHeader.fnameLen + _localHeader.extraLen;\n },\n\n get localHeader() {\n return _localHeader;\n },\n\n loadLocalHeaderFromBinary: function (/*Buffer*/ input) {\n var data = input.slice(_offset, _offset + Constants.LOCHDR);\n // 30 bytes and should start with \"PK\\003\\004\"\n if (data.readUInt32LE(0) !== Constants.LOCSIG) {\n throw Utils.Errors.INVALID_LOC();\n }\n\n // version needed to extract\n _localHeader.version = data.readUInt16LE(Constants.LOCVER);\n // general purpose bit flag\n _localHeader.flags = data.readUInt16LE(Constants.LOCFLG);\n // desc flag\n _localHeader.flags_desc = (_localHeader.flags & Constants.FLG_DESC) > 0;\n // compression method\n _localHeader.method = data.readUInt16LE(Constants.LOCHOW);\n // modification time (2 bytes time, 2 bytes date)\n _localHeader.time = data.readUInt32LE(Constants.LOCTIM);\n // uncompressed file crc-32 valu\n _localHeader.crc = data.readUInt32LE(Constants.LOCCRC);\n // compressed size\n _localHeader.compressedSize = data.readUInt32LE(Constants.LOCSIZ);\n // uncompressed size\n _localHeader.size = data.readUInt32LE(Constants.LOCLEN);\n // filename length\n _localHeader.fnameLen = data.readUInt16LE(Constants.LOCNAM);\n // extra field length\n _localHeader.extraLen = data.readUInt16LE(Constants.LOCEXT);\n\n // read extra data\n const extraStart = _offset + Constants.LOCHDR + _localHeader.fnameLen;\n const extraEnd = extraStart + _localHeader.extraLen;\n return input.slice(extraStart, extraEnd);\n },\n\n loadFromBinary: function (/*Buffer*/ data) {\n // data should be 46 bytes and start with \"PK 01 02\"\n if (data.length !== Constants.CENHDR || data.readUInt32LE(0) !== Constants.CENSIG) {\n throw Utils.Errors.INVALID_CEN();\n }\n // version made by\n _verMade = data.readUInt16LE(Constants.CENVEM);\n // version needed to extract\n _version = data.readUInt16LE(Constants.CENVER);\n // encrypt, decrypt flags\n _flags = data.readUInt16LE(Constants.CENFLG);\n // compression method\n _method = data.readUInt16LE(Constants.CENHOW);\n // modification time (2 bytes time, 2 bytes date)\n _time = data.readUInt32LE(Constants.CENTIM);\n // uncompressed file crc-32 value\n _crc = data.readUInt32LE(Constants.CENCRC);\n // compressed size\n _compressedSize = data.readUInt32LE(Constants.CENSIZ);\n // uncompressed size\n _size = data.readUInt32LE(Constants.CENLEN);\n // filename length\n _fnameLen = data.readUInt16LE(Constants.CENNAM);\n // extra field length\n _extraLen = data.readUInt16LE(Constants.CENEXT);\n // file comment length\n _comLen = data.readUInt16LE(Constants.CENCOM);\n // volume number start\n _diskStart = data.readUInt16LE(Constants.CENDSK);\n // internal file attributes\n _inattr = data.readUInt16LE(Constants.CENATT);\n // external file attributes\n _attr = data.readUInt32LE(Constants.CENATX);\n // LOC header offset\n _offset = data.readUInt32LE(Constants.CENOFF);\n },\n\n localHeaderToBinary: function () {\n // LOC header size (30 bytes)\n var data = Buffer.alloc(Constants.LOCHDR);\n // \"PK\\003\\004\"\n data.writeUInt32LE(Constants.LOCSIG, 0);\n // version needed to extract\n data.writeUInt16LE(_version, Constants.LOCVER);\n // general purpose bit flag\n data.writeUInt16LE(_flags, Constants.LOCFLG);\n // compression method\n data.writeUInt16LE(_method, Constants.LOCHOW);\n // modification time (2 bytes time, 2 bytes date)\n data.writeUInt32LE(_time, Constants.LOCTIM);\n // uncompressed file crc-32 value\n data.writeUInt32LE(_crc, Constants.LOCCRC);\n // compressed size\n data.writeUInt32LE(_compressedSize, Constants.LOCSIZ);\n // uncompressed size\n data.writeUInt32LE(_size, Constants.LOCLEN);\n // filename length\n data.writeUInt16LE(_fnameLen, Constants.LOCNAM);\n // extra field length\n data.writeUInt16LE(_localHeader.extraLen, Constants.LOCEXT);\n return data;\n },\n\n centralHeaderToBinary: function () {\n // CEN header size (46 bytes)\n var data = Buffer.alloc(Constants.CENHDR + _fnameLen + _extraLen + _comLen);\n // \"PK\\001\\002\"\n data.writeUInt32LE(Constants.CENSIG, 0);\n // version made by\n data.writeUInt16LE(_verMade, Constants.CENVEM);\n // version needed to extract\n data.writeUInt16LE(_version, Constants.CENVER);\n // encrypt, decrypt flags\n data.writeUInt16LE(_flags, Constants.CENFLG);\n // compression method\n data.writeUInt16LE(_method, Constants.CENHOW);\n // modification time (2 bytes time, 2 bytes date)\n data.writeUInt32LE(_time, Constants.CENTIM);\n // uncompressed file crc-32 value\n data.writeUInt32LE(_crc, Constants.CENCRC);\n // compressed size\n data.writeUInt32LE(_compressedSize, Constants.CENSIZ);\n // uncompressed size\n data.writeUInt32LE(_size, Constants.CENLEN);\n // filename length\n data.writeUInt16LE(_fnameLen, Constants.CENNAM);\n // extra field length\n data.writeUInt16LE(_extraLen, Constants.CENEXT);\n // file comment length\n data.writeUInt16LE(_comLen, Constants.CENCOM);\n // volume number start\n data.writeUInt16LE(_diskStart, Constants.CENDSK);\n // internal file attributes\n data.writeUInt16LE(_inattr, Constants.CENATT);\n // external file attributes\n data.writeUInt32LE(_attr, Constants.CENATX);\n // LOC header offset\n data.writeUInt32LE(_offset, Constants.CENOFF);\n return data;\n },\n\n toJSON: function () {\n const bytes = function (nr) {\n return nr + \" bytes\";\n };\n\n return {\n made: _verMade,\n version: _version,\n flags: _flags,\n method: Utils.methodToString(_method),\n time: this.time,\n crc: \"0x\" + _crc.toString(16).toUpperCase(),\n compressedSize: bytes(_compressedSize),\n size: bytes(_size),\n fileNameLength: bytes(_fnameLen),\n extraLength: bytes(_extraLen),\n commentLength: bytes(_comLen),\n diskNumStart: _diskStart,\n inAttr: _inattr,\n attr: _attr,\n offset: _offset,\n centralHeaderSize: bytes(Constants.CENHDR + _fnameLen + _extraLen + _comLen)\n };\n },\n\n toString: function () {\n return JSON.stringify(this.toJSON(), null, \"\\t\");\n }\n };\n};\n",
|
|
12
|
+
"var Utils = require(\"../util\"),\n Constants = Utils.Constants;\n\n/* The entries in the end of central directory */\nmodule.exports = function () {\n var _volumeEntries = 0,\n _totalEntries = 0,\n _size = 0,\n _offset = 0,\n _commentLength = 0;\n\n return {\n get diskEntries() {\n return _volumeEntries;\n },\n set diskEntries(/*Number*/ val) {\n _volumeEntries = _totalEntries = val;\n },\n\n get totalEntries() {\n return _totalEntries;\n },\n set totalEntries(/*Number*/ val) {\n _totalEntries = _volumeEntries = val;\n },\n\n get size() {\n return _size;\n },\n set size(/*Number*/ val) {\n _size = val;\n },\n\n get offset() {\n return _offset;\n },\n set offset(/*Number*/ val) {\n _offset = val;\n },\n\n get commentLength() {\n return _commentLength;\n },\n set commentLength(/*Number*/ val) {\n _commentLength = val;\n },\n\n get mainHeaderSize() {\n return Constants.ENDHDR + _commentLength;\n },\n\n loadFromBinary: function (/*Buffer*/ data) {\n // data should be 22 bytes and start with \"PK 05 06\"\n // or be 56+ bytes and start with \"PK 06 06\" for Zip64\n if (\n (data.length !== Constants.ENDHDR || data.readUInt32LE(0) !== Constants.ENDSIG) &&\n (data.length < Constants.ZIP64HDR || data.readUInt32LE(0) !== Constants.ZIP64SIG)\n ) {\n throw Utils.Errors.INVALID_END();\n }\n\n if (data.readUInt32LE(0) === Constants.ENDSIG) {\n // number of entries on this volume\n _volumeEntries = data.readUInt16LE(Constants.ENDSUB);\n // total number of entries\n _totalEntries = data.readUInt16LE(Constants.ENDTOT);\n // central directory size in bytes\n _size = data.readUInt32LE(Constants.ENDSIZ);\n // offset of first CEN header\n _offset = data.readUInt32LE(Constants.ENDOFF);\n // zip file comment length\n _commentLength = data.readUInt16LE(Constants.ENDCOM);\n } else {\n // number of entries on this volume\n _volumeEntries = Utils.readBigUInt64LE(data, Constants.ZIP64SUB);\n // total number of entries\n _totalEntries = Utils.readBigUInt64LE(data, Constants.ZIP64TOT);\n // central directory size in bytes\n _size = Utils.readBigUInt64LE(data, Constants.ZIP64SIZE);\n // offset of first CEN header\n _offset = Utils.readBigUInt64LE(data, Constants.ZIP64OFF);\n\n _commentLength = 0;\n }\n },\n\n toBinary: function () {\n var b = Buffer.alloc(Constants.ENDHDR + _commentLength);\n // \"PK 05 06\" signature\n b.writeUInt32LE(Constants.ENDSIG, 0);\n b.writeUInt32LE(0, 4);\n // number of entries on this volume\n b.writeUInt16LE(_volumeEntries, Constants.ENDSUB);\n // total number of entries\n b.writeUInt16LE(_totalEntries, Constants.ENDTOT);\n // central directory size in bytes\n b.writeUInt32LE(_size, Constants.ENDSIZ);\n // offset of first CEN header\n b.writeUInt32LE(_offset, Constants.ENDOFF);\n // zip file comment length\n b.writeUInt16LE(_commentLength, Constants.ENDCOM);\n // fill comment memory with spaces so no garbage is left there\n b.fill(\" \", Constants.ENDHDR);\n\n return b;\n },\n\n toJSON: function () {\n // creates 0x0000 style output\n const offset = function (nr, len) {\n let offs = nr.toString(16).toUpperCase();\n while (offs.length < len) offs = \"0\" + offs;\n return \"0x\" + offs;\n };\n\n return {\n diskEntries: _volumeEntries,\n totalEntries: _totalEntries,\n size: _size + \" bytes\",\n offset: offset(_offset, 4),\n commentLength: _commentLength\n };\n },\n\n toString: function () {\n return JSON.stringify(this.toJSON(), null, \"\\t\");\n }\n };\n};\n// Misspelled\n",
|
|
13
|
+
"exports.EntryHeader = require(\"./entryHeader\");\nexports.MainHeader = require(\"./mainHeader\");\n",
|
|
14
|
+
"module.exports = function (/*Buffer*/ inbuf) {\n var zlib = require(\"zlib\");\n\n var opts = { chunkSize: (parseInt(inbuf.length / 1024) + 1) * 1024 };\n\n return {\n deflate: function () {\n return zlib.deflateRawSync(inbuf, opts);\n },\n\n deflateAsync: function (/*Function*/ callback) {\n var tmp = zlib.createDeflateRaw(opts),\n parts = [],\n total = 0;\n tmp.on(\"data\", function (data) {\n parts.push(data);\n total += data.length;\n });\n tmp.on(\"end\", function () {\n var buf = Buffer.alloc(total),\n written = 0;\n buf.fill(0);\n for (var i = 0; i < parts.length; i++) {\n var part = parts[i];\n part.copy(buf, written);\n written += part.length;\n }\n callback && callback(buf);\n });\n tmp.end(inbuf);\n }\n };\n};\n",
|
|
15
|
+
"const version = +(process.versions ? process.versions.node : \"\").split(\".\")[0] || 0;\n\nmodule.exports = function (/*Buffer*/ inbuf, /*number*/ expectedLength) {\n var zlib = require(\"zlib\");\n const option = version >= 15 && expectedLength > 0 ? { maxOutputLength: expectedLength } : {};\n\n return {\n inflate: function () {\n return zlib.inflateRawSync(inbuf, option);\n },\n\n inflateAsync: function (/*Function*/ callback) {\n var tmp = zlib.createInflateRaw(option),\n parts = [],\n total = 0;\n tmp.on(\"data\", function (data) {\n parts.push(data);\n total += data.length;\n });\n tmp.on(\"end\", function () {\n var buf = Buffer.alloc(total),\n written = 0;\n buf.fill(0);\n for (var i = 0; i < parts.length; i++) {\n var part = parts[i];\n part.copy(buf, written);\n written += part.length;\n }\n callback && callback(buf);\n });\n tmp.end(inbuf);\n }\n };\n};\n",
|
|
16
|
+
"\"use strict\";\n\n// node crypt, we use it for generate salt\n// eslint-disable-next-line node/no-unsupported-features/node-builtins\nconst { randomFillSync } = require(\"crypto\");\nconst Errors = require(\"../util/errors\");\n\n// generate CRC32 lookup table\nconst crctable = new Uint32Array(256).map((t, crc) => {\n for (let j = 0; j < 8; j++) {\n if (0 !== (crc & 1)) {\n crc = (crc >>> 1) ^ 0xedb88320;\n } else {\n crc >>>= 1;\n }\n }\n return crc >>> 0;\n});\n\n// C-style uInt32 Multiply (discards higher bits, when JS multiply discards lower bits)\nconst uMul = (a, b) => Math.imul(a, b) >>> 0;\n\n// crc32 byte single update (actually same function is part of utils.crc32 function :) )\nconst crc32update = (pCrc32, bval) => {\n return crctable[(pCrc32 ^ bval) & 0xff] ^ (pCrc32 >>> 8);\n};\n\n// function for generating salt for encrytion header\nconst genSalt = () => {\n if (\"function\" === typeof randomFillSync) {\n return randomFillSync(Buffer.alloc(12));\n } else {\n // fallback if function is not defined\n return genSalt.node();\n }\n};\n\n// salt generation with node random function (mainly as fallback)\ngenSalt.node = () => {\n const salt = Buffer.alloc(12);\n const len = salt.length;\n for (let i = 0; i < len; i++) salt[i] = (Math.random() * 256) & 0xff;\n return salt;\n};\n\n// general config\nconst config = {\n genSalt\n};\n\n// Class Initkeys handles same basic ops with keys\nfunction Initkeys(pw) {\n const pass = Buffer.isBuffer(pw) ? pw : Buffer.from(pw);\n this.keys = new Uint32Array([0x12345678, 0x23456789, 0x34567890]);\n for (let i = 0; i < pass.length; i++) {\n this.updateKeys(pass[i]);\n }\n}\n\nInitkeys.prototype.updateKeys = function (byteValue) {\n const keys = this.keys;\n keys[0] = crc32update(keys[0], byteValue);\n keys[1] += keys[0] & 0xff;\n keys[1] = uMul(keys[1], 134775813) + 1;\n keys[2] = crc32update(keys[2], keys[1] >>> 24);\n return byteValue;\n};\n\nInitkeys.prototype.next = function () {\n const k = (this.keys[2] | 2) >>> 0; // key\n return (uMul(k, k ^ 1) >> 8) & 0xff; // decode\n};\n\nfunction make_decrypter(/*Buffer*/ pwd) {\n // 1. Stage initialize key\n const keys = new Initkeys(pwd);\n\n // return decrypter function\n return function (/*Buffer*/ data) {\n // result - we create new Buffer for results\n const result = Buffer.alloc(data.length);\n let pos = 0;\n // process input data\n for (let c of data) {\n //c ^= keys.next();\n //result[pos++] = c; // decode & Save Value\n result[pos++] = keys.updateKeys(c ^ keys.next()); // update keys with decoded byte\n }\n return result;\n };\n}\n\nfunction make_encrypter(/*Buffer*/ pwd) {\n // 1. Stage initialize key\n const keys = new Initkeys(pwd);\n\n // return encrypting function, result and pos is here so we dont have to merge buffers later\n return function (/*Buffer*/ data, /*Buffer*/ result, /* Number */ pos = 0) {\n // result - we create new Buffer for results\n if (!result) result = Buffer.alloc(data.length);\n // process input data\n for (let c of data) {\n const k = keys.next(); // save key byte\n result[pos++] = c ^ k; // save val\n keys.updateKeys(c); // update keys with decoded byte\n }\n return result;\n };\n}\n\nfunction decrypt(/*Buffer*/ data, /*Object*/ header, /*String, Buffer*/ pwd) {\n if (!data || !Buffer.isBuffer(data) || data.length < 12) {\n return Buffer.alloc(0);\n }\n\n // 1. We Initialize and generate decrypting function\n const decrypter = make_decrypter(pwd);\n\n // 2. decrypt salt what is always 12 bytes and is a part of file content\n const salt = decrypter(data.slice(0, 12));\n\n // if bit 3 (0x08) of the general-purpose flags field is set, check salt[11] with the high byte of the header time\n // 2 byte data block (as per Info-Zip spec), otherwise check with the high byte of the header entry\n const verifyByte = (header.flags & 0x8) === 0x8 ? header.timeHighByte : header.crc >>> 24;\n\n //3. does password meet expectations\n if (salt[11] !== verifyByte) {\n throw Errors.WRONG_PASSWORD();\n }\n\n // 4. decode content\n return decrypter(data.slice(12));\n}\n\n// lets add way to populate salt, NOT RECOMMENDED for production but maybe useful for testing general functionality\nfunction _salter(data) {\n if (Buffer.isBuffer(data) && data.length >= 12) {\n // be aware - currently salting buffer data is modified\n config.genSalt = function () {\n return data.slice(0, 12);\n };\n } else if (data === \"node\") {\n // test salt generation with node random function\n config.genSalt = genSalt.node;\n } else {\n // if value is not acceptable config gets reset.\n config.genSalt = genSalt;\n }\n}\n\nfunction encrypt(/*Buffer*/ data, /*Object*/ header, /*String, Buffer*/ pwd, /*Boolean*/ oldlike = false) {\n // 1. test data if data is not Buffer we make buffer from it\n if (data == null) data = Buffer.alloc(0);\n // if data is not buffer be make buffer from it\n if (!Buffer.isBuffer(data)) data = Buffer.from(data.toString());\n\n // 2. We Initialize and generate encrypting function\n const encrypter = make_encrypter(pwd);\n\n // 3. generate salt (12-bytes of random data)\n const salt = config.genSalt();\n salt[11] = (header.crc >>> 24) & 0xff;\n\n // old implementations (before PKZip 2.04g) used two byte check\n if (oldlike) salt[10] = (header.crc >>> 16) & 0xff;\n\n // 4. create output\n const result = Buffer.alloc(data.length + 12);\n encrypter(salt, result);\n\n // finally encode content\n return encrypter(data, result, 12);\n}\n\nmodule.exports = { decrypt, encrypt, _salter };\n",
|
|
17
|
+
"exports.Deflater = require(\"./deflater\");\nexports.Inflater = require(\"./inflater\");\nexports.ZipCrypto = require(\"./zipcrypto\");\n",
|
|
18
|
+
"var Utils = require(\"./util\"),\n Headers = require(\"./headers\"),\n Constants = Utils.Constants,\n Methods = require(\"./methods\");\n\nmodule.exports = function (/** object */ options, /*Buffer*/ input) {\n var _centralHeader = new Headers.EntryHeader(),\n _entryName = Buffer.alloc(0),\n _comment = Buffer.alloc(0),\n _isDirectory = false,\n uncompressedData = null,\n _extra = Buffer.alloc(0),\n _extralocal = Buffer.alloc(0),\n _efs = true;\n\n // assign options\n const opts = options;\n\n const decoder = typeof opts.decoder === \"object\" ? opts.decoder : Utils.decoder;\n _efs = decoder.hasOwnProperty(\"efs\") ? decoder.efs : false;\n\n function getCompressedDataFromZip() {\n //if (!input || !Buffer.isBuffer(input)) {\n if (!input || !(input instanceof Uint8Array)) {\n return Buffer.alloc(0);\n }\n _extralocal = _centralHeader.loadLocalHeaderFromBinary(input);\n return input.slice(_centralHeader.realDataOffset, _centralHeader.realDataOffset + _centralHeader.compressedSize);\n }\n\n function crc32OK(data) {\n // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the local header is written\n if (!_centralHeader.flags_desc && !_centralHeader.localHeader.flags_desc) {\n if (Utils.crc32(data) !== _centralHeader.localHeader.crc) {\n return false;\n }\n } else {\n const descriptor = {};\n const dataEndOffset = _centralHeader.realDataOffset + _centralHeader.compressedSize;\n // no descriptor after compressed data, instead new local header\n if (input.readUInt32LE(dataEndOffset) == Constants.LOCSIG || input.readUInt32LE(dataEndOffset) == Constants.CENSIG) {\n throw Utils.Errors.DESCRIPTOR_NOT_EXIST();\n }\n\n // get decriptor data\n if (input.readUInt32LE(dataEndOffset) == Constants.EXTSIG) {\n // descriptor with signature\n descriptor.crc = input.readUInt32LE(dataEndOffset + Constants.EXTCRC);\n descriptor.compressedSize = input.readUInt32LE(dataEndOffset + Constants.EXTSIZ);\n descriptor.size = input.readUInt32LE(dataEndOffset + Constants.EXTLEN);\n } else if (input.readUInt16LE(dataEndOffset + 12) === 0x4b50) {\n // descriptor without signature (we check is new header starting where we expect)\n descriptor.crc = input.readUInt32LE(dataEndOffset + Constants.EXTCRC - 4);\n descriptor.compressedSize = input.readUInt32LE(dataEndOffset + Constants.EXTSIZ - 4);\n descriptor.size = input.readUInt32LE(dataEndOffset + Constants.EXTLEN - 4);\n } else {\n throw Utils.Errors.DESCRIPTOR_UNKNOWN();\n }\n\n // check data integrity\n if (descriptor.compressedSize !== _centralHeader.compressedSize || descriptor.size !== _centralHeader.size || descriptor.crc !== _centralHeader.crc) {\n throw Utils.Errors.DESCRIPTOR_FAULTY();\n }\n if (Utils.crc32(data) !== descriptor.crc) {\n return false;\n }\n\n // @TODO: zip64 bit descriptor fields\n // if bit 3 is set and any value in local header \"zip64 Extended information\" extra field are set 0 (place holder)\n // then 64-bit descriptor format is used instead of 32-bit\n // central header - \"zip64 Extended information\" extra field should store real values and not place holders\n }\n return true;\n }\n\n function decompress(/*Boolean*/ async, /*Function*/ callback, /*String, Buffer*/ pass) {\n if (typeof callback === \"undefined\" && typeof async === \"string\") {\n pass = async;\n async = void 0;\n }\n if (_isDirectory) {\n if (async && callback) {\n callback(Buffer.alloc(0), Utils.Errors.DIRECTORY_CONTENT_ERROR()); //si added error.\n }\n return Buffer.alloc(0);\n }\n\n var compressedData = getCompressedDataFromZip();\n\n if (compressedData.length === 0) {\n // File is empty, nothing to decompress.\n if (async && callback) callback(compressedData);\n return compressedData;\n }\n\n if (_centralHeader.encrypted) {\n if (\"string\" !== typeof pass && !Buffer.isBuffer(pass)) {\n throw Utils.Errors.INVALID_PASS_PARAM();\n }\n compressedData = Methods.ZipCrypto.decrypt(compressedData, _centralHeader, pass);\n }\n\n var data = Buffer.alloc(_centralHeader.size);\n\n switch (_centralHeader.method) {\n case Utils.Constants.STORED:\n compressedData.copy(data);\n if (!crc32OK(data)) {\n if (async && callback) callback(data, Utils.Errors.BAD_CRC()); //si added error\n throw Utils.Errors.BAD_CRC();\n } else {\n //si added otherwise did not seem to return data.\n if (async && callback) callback(data);\n return data;\n }\n case Utils.Constants.DEFLATED:\n var inflater = new Methods.Inflater(compressedData, _centralHeader.size);\n if (!async) {\n const result = inflater.inflate(data);\n result.copy(data, 0);\n if (!crc32OK(data)) {\n throw Utils.Errors.BAD_CRC(`\"${decoder.decode(_entryName)}\"`);\n }\n return data;\n } else {\n inflater.inflateAsync(function (result) {\n result.copy(result, 0);\n if (callback) {\n if (!crc32OK(result)) {\n callback(result, Utils.Errors.BAD_CRC()); //si added error\n } else {\n callback(result);\n }\n }\n });\n }\n break;\n default:\n if (async && callback) callback(Buffer.alloc(0), Utils.Errors.UNKNOWN_METHOD());\n throw Utils.Errors.UNKNOWN_METHOD();\n }\n }\n\n function compress(/*Boolean*/ async, /*Function*/ callback) {\n if ((!uncompressedData || !uncompressedData.length) && Buffer.isBuffer(input)) {\n // no data set or the data wasn't changed to require recompression\n if (async && callback) callback(getCompressedDataFromZip());\n return getCompressedDataFromZip();\n }\n\n if (uncompressedData.length && !_isDirectory) {\n var compressedData;\n // Local file header\n switch (_centralHeader.method) {\n case Utils.Constants.STORED:\n _centralHeader.compressedSize = _centralHeader.size;\n\n compressedData = Buffer.alloc(uncompressedData.length);\n uncompressedData.copy(compressedData);\n\n if (async && callback) callback(compressedData);\n return compressedData;\n default:\n case Utils.Constants.DEFLATED:\n var deflater = new Methods.Deflater(uncompressedData);\n if (!async) {\n var deflated = deflater.deflate();\n _centralHeader.compressedSize = deflated.length;\n return deflated;\n } else {\n deflater.deflateAsync(function (data) {\n compressedData = Buffer.alloc(data.length);\n _centralHeader.compressedSize = data.length;\n data.copy(compressedData);\n callback && callback(compressedData);\n });\n }\n deflater = null;\n break;\n }\n } else if (async && callback) {\n callback(Buffer.alloc(0));\n } else {\n return Buffer.alloc(0);\n }\n }\n\n function readUInt64LE(buffer, offset) {\n return Utils.readBigUInt64LE(buffer, offset);\n }\n\n function parseExtra(data) {\n try {\n var offset = 0;\n var signature, size, part;\n while (offset + 4 < data.length) {\n signature = data.readUInt16LE(offset);\n offset += 2;\n size = data.readUInt16LE(offset);\n offset += 2;\n part = data.slice(offset, offset + size);\n offset += size;\n if (Constants.ID_ZIP64 === signature) {\n parseZip64ExtendedInformation(part);\n }\n }\n } catch (error) {\n throw Utils.Errors.EXTRA_FIELD_PARSE_ERROR();\n }\n }\n\n //Override header field values with values from the ZIP64 extra field\n function parseZip64ExtendedInformation(data) {\n var size, compressedSize, offset, diskNumStart;\n\n if (data.length >= Constants.EF_ZIP64_SCOMP) {\n size = readUInt64LE(data, Constants.EF_ZIP64_SUNCOMP);\n if (_centralHeader.size === Constants.EF_ZIP64_OR_32) {\n _centralHeader.size = size;\n }\n }\n if (data.length >= Constants.EF_ZIP64_RHO) {\n compressedSize = readUInt64LE(data, Constants.EF_ZIP64_SCOMP);\n if (_centralHeader.compressedSize === Constants.EF_ZIP64_OR_32) {\n _centralHeader.compressedSize = compressedSize;\n }\n }\n if (data.length >= Constants.EF_ZIP64_DSN) {\n offset = readUInt64LE(data, Constants.EF_ZIP64_RHO);\n if (_centralHeader.offset === Constants.EF_ZIP64_OR_32) {\n _centralHeader.offset = offset;\n }\n }\n if (data.length >= Constants.EF_ZIP64_DSN + 4) {\n diskNumStart = data.readUInt32LE(Constants.EF_ZIP64_DSN);\n if (_centralHeader.diskNumStart === Constants.EF_ZIP64_OR_16) {\n _centralHeader.diskNumStart = diskNumStart;\n }\n }\n }\n\n return {\n get entryName() {\n return decoder.decode(_entryName);\n },\n get rawEntryName() {\n return _entryName;\n },\n set entryName(val) {\n _entryName = Utils.toBuffer(val, decoder.encode);\n var lastChar = _entryName[_entryName.length - 1];\n _isDirectory = lastChar === 47 || lastChar === 92;\n _centralHeader.fileNameLength = _entryName.length;\n },\n\n get efs() {\n if (typeof _efs === \"function\") {\n return _efs(this.entryName);\n } else {\n return _efs;\n }\n },\n\n get extra() {\n return _extra;\n },\n set extra(val) {\n _extra = val;\n _centralHeader.extraLength = val.length;\n parseExtra(val);\n },\n\n get comment() {\n return decoder.decode(_comment);\n },\n set comment(val) {\n _comment = Utils.toBuffer(val, decoder.encode);\n _centralHeader.commentLength = _comment.length;\n if (_comment.length > 0xffff) throw Utils.Errors.COMMENT_TOO_LONG();\n },\n\n get name() {\n var n = decoder.decode(_entryName);\n return _isDirectory\n ? n\n .substr(n.length - 1)\n .split(\"/\")\n .pop()\n : n.split(\"/\").pop();\n },\n get isDirectory() {\n return _isDirectory;\n },\n\n getCompressedData: function () {\n return compress(false, null);\n },\n\n getCompressedDataAsync: function (/*Function*/ callback) {\n compress(true, callback);\n },\n\n setData: function (value) {\n uncompressedData = Utils.toBuffer(value, Utils.decoder.encode);\n if (!_isDirectory && uncompressedData.length) {\n _centralHeader.size = uncompressedData.length;\n _centralHeader.method = Utils.Constants.DEFLATED;\n _centralHeader.crc = Utils.crc32(value);\n _centralHeader.changed = true;\n } else {\n // folders and blank files should be stored\n _centralHeader.method = Utils.Constants.STORED;\n }\n },\n\n getData: function (pass) {\n if (_centralHeader.changed) {\n return uncompressedData;\n } else {\n return decompress(false, null, pass);\n }\n },\n\n getDataAsync: function (/*Function*/ callback, pass) {\n if (_centralHeader.changed) {\n callback(uncompressedData);\n } else {\n decompress(true, callback, pass);\n }\n },\n\n set attr(attr) {\n _centralHeader.attr = attr;\n },\n get attr() {\n return _centralHeader.attr;\n },\n\n set header(/*Buffer*/ data) {\n _centralHeader.loadFromBinary(data);\n },\n\n get header() {\n return _centralHeader;\n },\n\n packCentralHeader: function () {\n _centralHeader.flags_efs = this.efs;\n _centralHeader.extraLength = _extra.length;\n // 1. create header (buffer)\n var header = _centralHeader.centralHeaderToBinary();\n var addpos = Utils.Constants.CENHDR;\n // 2. add file name\n _entryName.copy(header, addpos);\n addpos += _entryName.length;\n // 3. add extra data\n _extra.copy(header, addpos);\n addpos += _centralHeader.extraLength;\n // 4. add file comment\n _comment.copy(header, addpos);\n return header;\n },\n\n packLocalHeader: function () {\n let addpos = 0;\n _centralHeader.flags_efs = this.efs;\n _centralHeader.extraLocalLength = _extralocal.length;\n // 1. construct local header Buffer\n const localHeaderBuf = _centralHeader.localHeaderToBinary();\n // 2. localHeader - crate header buffer\n const localHeader = Buffer.alloc(localHeaderBuf.length + _entryName.length + _centralHeader.extraLocalLength);\n // 2.1 add localheader\n localHeaderBuf.copy(localHeader, addpos);\n addpos += localHeaderBuf.length;\n // 2.2 add file name\n _entryName.copy(localHeader, addpos);\n addpos += _entryName.length;\n // 2.3 add extra field\n _extralocal.copy(localHeader, addpos);\n addpos += _extralocal.length;\n\n return localHeader;\n },\n\n toJSON: function () {\n const bytes = function (nr) {\n return \"<\" + ((nr && nr.length + \" bytes buffer\") || \"null\") + \">\";\n };\n\n return {\n entryName: this.entryName,\n name: this.name,\n comment: this.comment,\n isDirectory: this.isDirectory,\n header: _centralHeader.toJSON(),\n compressedData: bytes(input),\n data: bytes(uncompressedData)\n };\n },\n\n toString: function () {\n return JSON.stringify(this.toJSON(), null, \"\\t\");\n }\n };\n};\n",
|
|
19
|
+
"const ZipEntry = require(\"./zipEntry\");\nconst Headers = require(\"./headers\");\nconst Utils = require(\"./util\");\n\nmodule.exports = function (/*Buffer|null*/ inBuffer, /** object */ options) {\n var entryList = [],\n entryTable = {},\n _comment = Buffer.alloc(0),\n mainHeader = new Headers.MainHeader(),\n loadedEntries = false;\n var password = null;\n const temporary = new Set();\n\n // assign options\n const opts = options;\n\n const { noSort, decoder } = opts;\n\n if (inBuffer) {\n // is a memory buffer\n readMainHeader(opts.readEntries);\n } else {\n // none. is a new file\n loadedEntries = true;\n }\n\n function makeTemporaryFolders() {\n const foldersList = new Set();\n\n // Make list of all folders in file\n for (const elem of Object.keys(entryTable)) {\n const elements = elem.split(\"/\");\n elements.pop(); // filename\n if (!elements.length) continue; // no folders\n for (let i = 0; i < elements.length; i++) {\n const sub = elements.slice(0, i + 1).join(\"/\") + \"/\";\n foldersList.add(sub);\n }\n }\n\n // create missing folders as temporary\n for (const elem of foldersList) {\n if (!(elem in entryTable)) {\n const tempfolder = new ZipEntry(opts);\n tempfolder.entryName = elem;\n tempfolder.attr = 0x10;\n tempfolder.temporary = true;\n entryList.push(tempfolder);\n entryTable[tempfolder.entryName] = tempfolder;\n temporary.add(tempfolder);\n }\n }\n }\n\n function readEntries() {\n loadedEntries = true;\n entryTable = {};\n if (mainHeader.diskEntries > (inBuffer.length - mainHeader.offset) / Utils.Constants.CENHDR) {\n throw Utils.Errors.DISK_ENTRY_TOO_LARGE();\n }\n entryList = new Array(mainHeader.diskEntries); // total number of entries\n var index = mainHeader.offset; // offset of first CEN header\n for (var i = 0; i < entryList.length; i++) {\n var tmp = index,\n entry = new ZipEntry(opts, inBuffer);\n entry.header = inBuffer.slice(tmp, (tmp += Utils.Constants.CENHDR));\n\n entry.entryName = inBuffer.slice(tmp, (tmp += entry.header.fileNameLength));\n\n if (entry.header.extraLength) {\n entry.extra = inBuffer.slice(tmp, (tmp += entry.header.extraLength));\n }\n\n if (entry.header.commentLength) entry.comment = inBuffer.slice(tmp, tmp + entry.header.commentLength);\n\n index += entry.header.centralHeaderSize;\n\n entryList[i] = entry;\n entryTable[entry.entryName] = entry;\n }\n temporary.clear();\n makeTemporaryFolders();\n }\n\n function readMainHeader(/*Boolean*/ readNow) {\n var i = inBuffer.length - Utils.Constants.ENDHDR, // END header size\n max = Math.max(0, i - 0xffff), // 0xFFFF is the max zip file comment length\n n = max,\n endStart = inBuffer.length,\n endOffset = -1, // Start offset of the END header\n commentEnd = 0;\n\n // option to search header form entire file\n const trailingSpace = typeof opts.trailingSpace === \"boolean\" ? opts.trailingSpace : false;\n if (trailingSpace) max = 0;\n\n for (i; i >= n; i--) {\n if (inBuffer[i] !== 0x50) continue; // quick check that the byte is 'P'\n if (inBuffer.readUInt32LE(i) === Utils.Constants.ENDSIG) {\n // \"PK\\005\\006\"\n endOffset = i;\n commentEnd = i;\n endStart = i + Utils.Constants.ENDHDR;\n // We already found a regular signature, let's look just a bit further to check if there's any zip64 signature\n n = i - Utils.Constants.END64HDR;\n continue;\n }\n\n if (inBuffer.readUInt32LE(i) === Utils.Constants.END64SIG) {\n // Found a zip64 signature, let's continue reading the whole zip64 record\n n = max;\n continue;\n }\n\n if (inBuffer.readUInt32LE(i) === Utils.Constants.ZIP64SIG) {\n // Found the zip64 record, let's determine it's size\n endOffset = i;\n endStart = i + Utils.readBigUInt64LE(inBuffer, i + Utils.Constants.ZIP64SIZE) + Utils.Constants.ZIP64LEAD;\n break;\n }\n }\n\n if (endOffset == -1) throw Utils.Errors.INVALID_FORMAT();\n\n mainHeader.loadFromBinary(inBuffer.slice(endOffset, endStart));\n if (mainHeader.commentLength) {\n _comment = inBuffer.slice(commentEnd + Utils.Constants.ENDHDR);\n }\n if (readNow) readEntries();\n }\n\n function sortEntries() {\n if (entryList.length > 1 && !noSort) {\n entryList.sort((a, b) => a.entryName.toLowerCase().localeCompare(b.entryName.toLowerCase()));\n }\n }\n\n return {\n /**\n * Returns an array of ZipEntry objects existent in the current opened archive\n * @return Array\n */\n get entries() {\n if (!loadedEntries) {\n readEntries();\n }\n return entryList.filter((e) => !temporary.has(e));\n },\n\n /**\n * Archive comment\n * @return {String}\n */\n get comment() {\n return decoder.decode(_comment);\n },\n set comment(val) {\n _comment = Utils.toBuffer(val, decoder.encode);\n mainHeader.commentLength = _comment.length;\n },\n\n getEntryCount: function () {\n if (!loadedEntries) {\n return mainHeader.diskEntries;\n }\n\n return entryList.length;\n },\n\n forEach: function (callback) {\n this.entries.forEach(callback);\n },\n\n /**\n * Returns a reference to the entry with the given name or null if entry is inexistent\n *\n * @param entryName\n * @return ZipEntry\n */\n getEntry: function (/*String*/ entryName) {\n if (!loadedEntries) {\n readEntries();\n }\n return entryTable[entryName] || null;\n },\n\n /**\n * Adds the given entry to the entry list\n *\n * @param entry\n */\n setEntry: function (/*ZipEntry*/ entry) {\n if (!loadedEntries) {\n readEntries();\n }\n entryList.push(entry);\n entryTable[entry.entryName] = entry;\n mainHeader.totalEntries = entryList.length;\n },\n\n /**\n * Removes the file with the given name from the entry list.\n *\n * If the entry is a directory, then all nested files and directories will be removed\n * @param entryName\n * @returns {void}\n */\n deleteFile: function (/*String*/ entryName, withsubfolders = true) {\n if (!loadedEntries) {\n readEntries();\n }\n const entry = entryTable[entryName];\n const list = this.getEntryChildren(entry, withsubfolders).map((child) => child.entryName);\n\n list.forEach(this.deleteEntry);\n },\n\n /**\n * Removes the entry with the given name from the entry list.\n *\n * @param {string} entryName\n * @returns {void}\n */\n deleteEntry: function (/*String*/ entryName) {\n if (!loadedEntries) {\n readEntries();\n }\n const entry = entryTable[entryName];\n const index = entryList.indexOf(entry);\n if (index >= 0) {\n entryList.splice(index, 1);\n delete entryTable[entryName];\n mainHeader.totalEntries = entryList.length;\n }\n },\n\n /**\n * Iterates and returns all nested files and directories of the given entry\n *\n * @param entry\n * @return Array\n */\n getEntryChildren: function (/*ZipEntry*/ entry, subfolders = true) {\n if (!loadedEntries) {\n readEntries();\n }\n if (typeof entry === \"object\") {\n if (entry.isDirectory && subfolders) {\n const list = [];\n const name = entry.entryName;\n\n for (const zipEntry of entryList) {\n if (zipEntry.entryName.startsWith(name)) {\n list.push(zipEntry);\n }\n }\n return list;\n } else {\n return [entry];\n }\n }\n return [];\n },\n\n /**\n * How many child elements entry has\n *\n * @param {ZipEntry} entry\n * @return {integer}\n */\n getChildCount: function (entry) {\n if (entry && entry.isDirectory) {\n const list = this.getEntryChildren(entry);\n return list.includes(entry) ? list.length - 1 : list.length;\n }\n return 0;\n },\n\n /**\n * Returns the zip file\n *\n * @return Buffer\n */\n compressToBuffer: function () {\n if (!loadedEntries) {\n readEntries();\n }\n sortEntries();\n\n const dataBlock = [];\n const headerBlocks = [];\n let totalSize = 0;\n let dindex = 0;\n\n mainHeader.size = 0;\n mainHeader.offset = 0;\n let totalEntries = 0;\n\n for (const entry of this.entries) {\n // compress data and set local and entry header accordingly. Reason why is called first\n const compressedData = entry.getCompressedData();\n entry.header.offset = dindex;\n\n // 1. construct local header\n const localHeader = entry.packLocalHeader();\n\n // 2. offsets\n const dataLength = localHeader.length + compressedData.length;\n dindex += dataLength;\n\n // 3. store values in sequence\n dataBlock.push(localHeader);\n dataBlock.push(compressedData);\n\n // 4. construct central header\n const centralHeader = entry.packCentralHeader();\n headerBlocks.push(centralHeader);\n // 5. update main header\n mainHeader.size += centralHeader.length;\n totalSize += dataLength + centralHeader.length;\n totalEntries++;\n }\n\n totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length\n // point to end of data and beginning of central directory first record\n mainHeader.offset = dindex;\n mainHeader.totalEntries = totalEntries;\n\n dindex = 0;\n const outBuffer = Buffer.alloc(totalSize);\n // write data blocks\n for (const content of dataBlock) {\n content.copy(outBuffer, dindex);\n dindex += content.length;\n }\n\n // write central directory entries\n for (const content of headerBlocks) {\n content.copy(outBuffer, dindex);\n dindex += content.length;\n }\n\n // write main header\n const mh = mainHeader.toBinary();\n if (_comment) {\n _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment\n }\n mh.copy(outBuffer, dindex);\n\n // Since we update entry and main header offsets,\n // they are no longer valid and we have to reset content\n // (Issue 64)\n\n inBuffer = outBuffer;\n loadedEntries = false;\n\n return outBuffer;\n },\n\n toAsyncBuffer: function (/*Function*/ onSuccess, /*Function*/ onFail, /*Function*/ onItemStart, /*Function*/ onItemEnd) {\n try {\n if (!loadedEntries) {\n readEntries();\n }\n sortEntries();\n\n const dataBlock = [];\n const centralHeaders = [];\n let totalSize = 0;\n let dindex = 0;\n let totalEntries = 0;\n\n mainHeader.size = 0;\n mainHeader.offset = 0;\n\n const compress2Buffer = function (entryLists) {\n if (entryLists.length > 0) {\n const entry = entryLists.shift();\n const name = entry.entryName + entry.extra.toString();\n if (onItemStart) onItemStart(name);\n entry.getCompressedDataAsync(function (compressedData) {\n if (onItemEnd) onItemEnd(name);\n entry.header.offset = dindex;\n\n // 1. construct local header\n const localHeader = entry.packLocalHeader();\n\n // 2. offsets\n const dataLength = localHeader.length + compressedData.length;\n dindex += dataLength;\n\n // 3. store values in sequence\n dataBlock.push(localHeader);\n dataBlock.push(compressedData);\n\n // central header\n const centalHeader = entry.packCentralHeader();\n centralHeaders.push(centalHeader);\n mainHeader.size += centalHeader.length;\n totalSize += dataLength + centalHeader.length;\n totalEntries++;\n\n compress2Buffer(entryLists);\n });\n } else {\n totalSize += mainHeader.mainHeaderSize; // also includes zip file comment length\n // point to end of data and beginning of central directory first record\n mainHeader.offset = dindex;\n mainHeader.totalEntries = totalEntries;\n\n dindex = 0;\n const outBuffer = Buffer.alloc(totalSize);\n dataBlock.forEach(function (content) {\n content.copy(outBuffer, dindex); // write data blocks\n dindex += content.length;\n });\n centralHeaders.forEach(function (content) {\n content.copy(outBuffer, dindex); // write central directory entries\n dindex += content.length;\n });\n\n const mh = mainHeader.toBinary();\n if (_comment) {\n _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file comment\n }\n\n mh.copy(outBuffer, dindex); // write main header\n\n // Since we update entry and main header offsets, they are no\n // longer valid and we have to reset content using our new buffer\n // (Issue 64)\n\n inBuffer = outBuffer;\n loadedEntries = false;\n\n onSuccess(outBuffer);\n }\n };\n\n compress2Buffer(Array.from(this.entries));\n } catch (e) {\n onFail(e);\n }\n }\n };\n};\n",
|
|
20
|
+
"const Utils = require(\"./util\");\nconst pth = require(\"path\");\nconst ZipEntry = require(\"./zipEntry\");\nconst ZipFile = require(\"./zipFile\");\n\nconst get_Bool = (...val) => Utils.findLast(val, (c) => typeof c === \"boolean\");\nconst get_Str = (...val) => Utils.findLast(val, (c) => typeof c === \"string\");\nconst get_Fun = (...val) => Utils.findLast(val, (c) => typeof c === \"function\");\n\nconst defaultOptions = {\n // option \"noSort\" : if true it disables files sorting\n noSort: false,\n // read entries during load (initial loading may be slower)\n readEntries: false,\n // default method is none\n method: Utils.Constants.NONE,\n // file system\n fs: null\n};\n\nmodule.exports = function (/**String*/ input, /** object */ options) {\n let inBuffer = null;\n\n // create object based default options, allowing them to be overwritten\n const opts = Object.assign(Object.create(null), defaultOptions);\n\n // test input variable\n if (input && \"object\" === typeof input) {\n // if value is not buffer we accept it to be object with options\n if (!(input instanceof Uint8Array)) {\n Object.assign(opts, input);\n input = opts.input ? opts.input : undefined;\n if (opts.input) delete opts.input;\n }\n\n // if input is buffer\n if (Buffer.isBuffer(input)) {\n inBuffer = input;\n opts.method = Utils.Constants.BUFFER;\n input = undefined;\n }\n }\n\n // assign options\n Object.assign(opts, options);\n\n // instanciate utils filesystem\n const filetools = new Utils(opts);\n\n if (typeof opts.decoder !== \"object\" || typeof opts.decoder.encode !== \"function\" || typeof opts.decoder.decode !== \"function\") {\n opts.decoder = Utils.decoder;\n }\n\n // if input is file name we retrieve its content\n if (input && \"string\" === typeof input) {\n // load zip file\n if (filetools.fs.existsSync(input)) {\n opts.method = Utils.Constants.FILE;\n opts.filename = input;\n inBuffer = filetools.fs.readFileSync(input);\n } else {\n throw Utils.Errors.INVALID_FILENAME();\n }\n }\n\n // create variable\n const _zip = new ZipFile(inBuffer, opts);\n\n const { canonical, sanitize, zipnamefix } = Utils;\n\n function getEntry(/**Object*/ entry) {\n if (entry && _zip) {\n var item;\n // If entry was given as a file name\n if (typeof entry === \"string\") item = _zip.getEntry(pth.posix.normalize(entry));\n // if entry was given as a ZipEntry object\n if (typeof entry === \"object\" && typeof entry.entryName !== \"undefined\" && typeof entry.header !== \"undefined\") item = _zip.getEntry(entry.entryName);\n\n if (item) {\n return item;\n }\n }\n return null;\n }\n\n function fixPath(zipPath) {\n const { join, normalize, sep } = pth.posix;\n // convert windows file separators and normalize\n return join(pth.isAbsolute(zipPath) ? \"/\": '.', normalize(sep + zipPath.split(\"\\\\\").join(sep) + sep));\n }\n\n function filenameFilter(filterfn) {\n if (filterfn instanceof RegExp) {\n // if filter is RegExp wrap it\n return (function (rx) {\n return function (filename) {\n return rx.test(filename);\n };\n })(filterfn);\n } else if (\"function\" !== typeof filterfn) {\n // if filter is not function we will replace it\n return () => true;\n }\n return filterfn;\n }\n\n // keep last character on folders\n const relativePath = (local, entry) => {\n let lastChar = entry.slice(-1);\n lastChar = lastChar === filetools.sep ? filetools.sep : \"\";\n return pth.relative(local, entry) + lastChar;\n };\n\n return {\n /**\n * Extracts the given entry from the archive and returns the content as a Buffer object\n * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry\n * @param {Buffer|string} [pass] - password\n * @return Buffer or Null in case of error\n */\n readFile: function (entry, pass) {\n var item = getEntry(entry);\n return (item && item.getData(pass)) || null;\n },\n\n /**\n * Returns how many child elements has on entry (directories) on files it is always 0\n * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry\n * @returns {integer}\n */\n childCount: function (entry) {\n const item = getEntry(entry);\n if (item) {\n return _zip.getChildCount(item);\n }\n },\n\n /**\n * Asynchronous readFile\n * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry\n * @param {callback} callback\n *\n * @return Buffer or Null in case of error\n */\n readFileAsync: function (entry, callback) {\n var item = getEntry(entry);\n if (item) {\n item.getDataAsync(callback);\n } else {\n callback(null, \"getEntry failed for:\" + entry);\n }\n },\n\n /**\n * Extracts the given entry from the archive and returns the content as plain text in the given encoding\n * @param {ZipEntry|string} entry - ZipEntry object or String with the full path of the entry\n * @param {string} encoding - Optional. If no encoding is specified utf8 is used\n *\n * @return String\n */\n readAsText: function (entry, encoding) {\n var item = getEntry(entry);\n if (item) {\n var data = item.getData();\n if (data && data.length) {\n return data.toString(encoding || \"utf8\");\n }\n }\n return \"\";\n },\n\n /**\n * Asynchronous readAsText\n * @param {ZipEntry|string} entry ZipEntry object or String with the full path of the entry\n * @param {callback} callback\n * @param {string} [encoding] - Optional. If no encoding is specified utf8 is used\n *\n * @return String\n */\n readAsTextAsync: function (entry, callback, encoding) {\n var item = getEntry(entry);\n if (item) {\n item.getDataAsync(function (data, err) {\n if (err) {\n callback(data, err);\n return;\n }\n\n if (data && data.length) {\n callback(data.toString(encoding || \"utf8\"));\n } else {\n callback(\"\");\n }\n });\n } else {\n callback(\"\");\n }\n },\n\n /**\n * Remove the entry from the file or the entry and all it's nested directories and files if the given entry is a directory\n *\n * @param {ZipEntry|string} entry\n * @returns {void}\n */\n deleteFile: function (entry, withsubfolders = true) {\n // @TODO: test deleteFile\n var item = getEntry(entry);\n if (item) {\n _zip.deleteFile(item.entryName, withsubfolders);\n }\n },\n\n /**\n * Remove the entry from the file or directory without affecting any nested entries\n *\n * @param {ZipEntry|string} entry\n * @returns {void}\n */\n deleteEntry: function (entry) {\n // @TODO: test deleteEntry\n var item = getEntry(entry);\n if (item) {\n _zip.deleteEntry(item.entryName);\n }\n },\n\n /**\n * Adds a comment to the zip. The zip must be rewritten after adding the comment.\n *\n * @param {string} comment\n */\n addZipComment: function (comment) {\n // @TODO: test addZipComment\n _zip.comment = comment;\n },\n\n /**\n * Returns the zip comment\n *\n * @return String\n */\n getZipComment: function () {\n return _zip.comment || \"\";\n },\n\n /**\n * Adds a comment to a specified zipEntry. The zip must be rewritten after adding the comment\n * The comment cannot exceed 65535 characters in length\n *\n * @param {ZipEntry} entry\n * @param {string} comment\n */\n addZipEntryComment: function (entry, comment) {\n var item = getEntry(entry);\n if (item) {\n item.comment = comment;\n }\n },\n\n /**\n * Returns the comment of the specified entry\n *\n * @param {ZipEntry} entry\n * @return String\n */\n getZipEntryComment: function (entry) {\n var item = getEntry(entry);\n if (item) {\n return item.comment || \"\";\n }\n return \"\";\n },\n\n /**\n * Updates the content of an existing entry inside the archive. The zip must be rewritten after updating the content\n *\n * @param {ZipEntry} entry\n * @param {Buffer} content\n */\n updateFile: function (entry, content) {\n var item = getEntry(entry);\n if (item) {\n item.setData(content);\n }\n },\n\n /**\n * Adds a file from the disk to the archive\n *\n * @param {string} localPath File to add to zip\n * @param {string} [zipPath] Optional path inside the zip\n * @param {string} [zipName] Optional name for the file\n * @param {string} [comment] Optional file comment\n */\n addLocalFile: function (localPath, zipPath, zipName, comment) {\n if (filetools.fs.existsSync(localPath)) {\n // fix ZipPath\n zipPath = zipPath ? fixPath(zipPath) : \"\";\n\n // p - local file name\n const p = pth.win32.basename(pth.win32.normalize(localPath));\n\n // add file name into zippath\n zipPath += zipName ? zipName : p;\n\n // read file attributes\n const _attr = filetools.fs.statSync(localPath);\n\n // get file content\n const data = _attr.isFile() ? filetools.fs.readFileSync(localPath) : Buffer.alloc(0);\n\n // if folder\n if (_attr.isDirectory()) zipPath += filetools.sep;\n\n // add file into zip file\n this.addFile(zipPath, data, comment, _attr);\n } else {\n throw Utils.Errors.FILE_NOT_FOUND(localPath);\n }\n },\n\n /**\n * Callback for showing if everything was done.\n *\n * @callback doneCallback\n * @param {Error} err - Error object\n * @param {boolean} done - was request fully completed\n */\n\n /**\n * Adds a file from the disk to the archive\n *\n * @param {(object|string)} options - options object, if it is string it us used as localPath.\n * @param {string} options.localPath - Local path to the file.\n * @param {string} [options.comment] - Optional file comment.\n * @param {string} [options.zipPath] - Optional path inside the zip\n * @param {string} [options.zipName] - Optional name for the file\n * @param {doneCallback} callback - The callback that handles the response.\n */\n addLocalFileAsync: function (options, callback) {\n options = typeof options === \"object\" ? options : { localPath: options };\n const localPath = pth.resolve(options.localPath);\n const { comment } = options;\n let { zipPath, zipName } = options;\n const self = this;\n\n filetools.fs.stat(localPath, function (err, stats) {\n if (err) return callback(err, false);\n // fix ZipPath\n zipPath = zipPath ? fixPath(zipPath) : \"\";\n // p - local file name\n const p = pth.win32.basename(pth.win32.normalize(localPath));\n // add file name into zippath\n zipPath += zipName ? zipName : p;\n\n if (stats.isFile()) {\n filetools.fs.readFile(localPath, function (err, data) {\n if (err) return callback(err, false);\n self.addFile(zipPath, data, comment, stats);\n return setImmediate(callback, undefined, true);\n });\n } else if (stats.isDirectory()) {\n zipPath += filetools.sep;\n self.addFile(zipPath, Buffer.alloc(0), comment, stats);\n return setImmediate(callback, undefined, true);\n }\n });\n },\n\n /**\n * Adds a local directory and all its nested files and directories to the archive\n *\n * @param {string} localPath - local path to the folder\n * @param {string} [zipPath] - optional path inside zip\n * @param {(RegExp|function)} [filter] - optional RegExp or Function if files match will be included.\n */\n addLocalFolder: function (localPath, zipPath, filter) {\n // Prepare filter\n filter = filenameFilter(filter);\n\n // fix ZipPath\n zipPath = zipPath ? fixPath(zipPath) : \"\";\n\n // normalize the path first\n localPath = pth.normalize(localPath);\n\n if (filetools.fs.existsSync(localPath)) {\n const items = filetools.findFiles(localPath);\n const self = this;\n\n if (items.length) {\n for (const filepath of items) {\n const p = pth.join(zipPath, relativePath(localPath, filepath));\n if (filter(p)) {\n self.addLocalFile(filepath, pth.dirname(p));\n }\n }\n }\n } else {\n throw Utils.Errors.FILE_NOT_FOUND(localPath);\n }\n },\n\n /**\n * Asynchronous addLocalFolder\n * @param {string} localPath\n * @param {callback} callback\n * @param {string} [zipPath] optional path inside zip\n * @param {RegExp|function} [filter] optional RegExp or Function if files match will\n * be included.\n */\n addLocalFolderAsync: function (localPath, callback, zipPath, filter) {\n // Prepare filter\n filter = filenameFilter(filter);\n\n // fix ZipPath\n zipPath = zipPath ? fixPath(zipPath) : \"\";\n\n // normalize the path first\n localPath = pth.normalize(localPath);\n\n var self = this;\n filetools.fs.open(localPath, \"r\", function (err) {\n if (err && err.code === \"ENOENT\") {\n callback(undefined, Utils.Errors.FILE_NOT_FOUND(localPath));\n } else if (err) {\n callback(undefined, err);\n } else {\n var items = filetools.findFiles(localPath);\n var i = -1;\n\n var next = function () {\n i += 1;\n if (i < items.length) {\n var filepath = items[i];\n var p = relativePath(localPath, filepath).split(\"\\\\\").join(\"/\"); //windows fix\n p = p\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^\\x20-\\x7E]/g, \"\"); // accent fix\n if (filter(p)) {\n filetools.fs.stat(filepath, function (er0, stats) {\n if (er0) callback(undefined, er0);\n if (stats.isFile()) {\n filetools.fs.readFile(filepath, function (er1, data) {\n if (er1) {\n callback(undefined, er1);\n } else {\n self.addFile(zipPath + p, data, \"\", stats);\n next();\n }\n });\n } else {\n self.addFile(zipPath + p + \"/\", Buffer.alloc(0), \"\", stats);\n next();\n }\n });\n } else {\n process.nextTick(() => {\n next();\n });\n }\n } else {\n callback(true, undefined);\n }\n };\n\n next();\n }\n });\n },\n\n /**\n * Adds a local directory and all its nested files and directories to the archive\n *\n * @param {object | string} options - options object, if it is string it us used as localPath.\n * @param {string} options.localPath - Local path to the folder.\n * @param {string} [options.zipPath] - optional path inside zip.\n * @param {RegExp|function} [options.filter] - optional RegExp or Function if files match will be included.\n * @param {function|string} [options.namefix] - optional function to help fix filename\n * @param {doneCallback} callback - The callback that handles the response.\n *\n */\n addLocalFolderAsync2: function (options, callback) {\n const self = this;\n options = typeof options === \"object\" ? options : { localPath: options };\n localPath = pth.resolve(fixPath(options.localPath));\n let { zipPath, filter, namefix } = options;\n\n if (filter instanceof RegExp) {\n filter = (function (rx) {\n return function (filename) {\n return rx.test(filename);\n };\n })(filter);\n } else if (\"function\" !== typeof filter) {\n filter = function () {\n return true;\n };\n }\n\n // fix ZipPath\n zipPath = zipPath ? fixPath(zipPath) : \"\";\n\n // Check Namefix function\n if (namefix == \"latin1\") {\n namefix = (str) =>\n str\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^\\x20-\\x7E]/g, \"\"); // accent fix (latin1 characers only)\n }\n\n if (typeof namefix !== \"function\") namefix = (str) => str;\n\n // internal, create relative path + fix the name\n const relPathFix = (entry) => pth.join(zipPath, namefix(relativePath(localPath, entry)));\n const fileNameFix = (entry) => pth.win32.basename(pth.win32.normalize(namefix(entry)));\n\n filetools.fs.open(localPath, \"r\", function (err) {\n if (err && err.code === \"ENOENT\") {\n callback(undefined, Utils.Errors.FILE_NOT_FOUND(localPath));\n } else if (err) {\n callback(undefined, err);\n } else {\n filetools.findFilesAsync(localPath, function (err, fileEntries) {\n if (err) return callback(err);\n fileEntries = fileEntries.filter((dir) => filter(relPathFix(dir)));\n if (!fileEntries.length) callback(undefined, false);\n\n setImmediate(\n fileEntries.reverse().reduce(function (next, entry) {\n return function (err, done) {\n if (err || done === false) return setImmediate(next, err, false);\n\n self.addLocalFileAsync(\n {\n localPath: entry,\n zipPath: pth.dirname(relPathFix(entry)),\n zipName: fileNameFix(entry)\n },\n next\n );\n };\n }, callback)\n );\n });\n }\n });\n },\n\n /**\n * Adds a local directory and all its nested files and directories to the archive\n *\n * @param {string} localPath - path where files will be extracted\n * @param {object} props - optional properties\n * @param {string} [props.zipPath] - optional path inside zip\n * @param {RegExp|function} [props.filter] - optional RegExp or Function if files match will be included.\n * @param {function|string} [props.namefix] - optional function to help fix filename\n */\n addLocalFolderPromise: function (localPath, props) {\n return new Promise((resolve, reject) => {\n this.addLocalFolderAsync2(Object.assign({ localPath }, props), (err, done) => {\n if (err) reject(err);\n if (done) resolve(this);\n });\n });\n },\n\n /**\n * Allows you to create a entry (file or directory) in the zip file.\n * If you want to create a directory the entryName must end in / and a null buffer should be provided.\n * Comment and attributes are optional\n *\n * @param {string} entryName\n * @param {Buffer | string} content - file content as buffer or utf8 coded string\n * @param {string} [comment] - file comment\n * @param {number | object} [attr] - number as unix file permissions, object as filesystem Stats object\n */\n addFile: function (entryName, content, comment, attr) {\n entryName = zipnamefix(entryName);\n let entry = getEntry(entryName);\n const update = entry != null;\n\n // prepare new entry\n if (!update) {\n entry = new ZipEntry(opts);\n entry.entryName = entryName;\n }\n entry.comment = comment || \"\";\n\n const isStat = \"object\" === typeof attr && attr instanceof filetools.fs.Stats;\n\n // last modification time from file stats\n if (isStat) {\n entry.header.time = attr.mtime;\n }\n\n // Set file attribute\n var fileattr = entry.isDirectory ? 0x10 : 0; // (MS-DOS directory flag)\n\n // extended attributes field for Unix\n // set file type either S_IFDIR / S_IFREG\n let unix = entry.isDirectory ? 0x4000 : 0x8000;\n\n if (isStat) {\n // File attributes from file stats\n unix |= 0xfff & attr.mode;\n } else if (\"number\" === typeof attr) {\n // attr from given attr values\n unix |= 0xfff & attr;\n } else {\n // Default values:\n unix |= entry.isDirectory ? 0o755 : 0o644; // permissions (drwxr-xr-x) or (-r-wr--r--)\n }\n\n fileattr = (fileattr | (unix << 16)) >>> 0; // add attributes\n\n entry.attr = fileattr;\n\n entry.setData(content);\n if (!update) _zip.setEntry(entry);\n\n return entry;\n },\n\n /**\n * Returns an array of ZipEntry objects representing the files and folders inside the archive\n *\n * @param {string} [password]\n * @returns Array\n */\n getEntries: function (password) {\n _zip.password = password;\n return _zip ? _zip.entries : [];\n },\n\n /**\n * Returns a ZipEntry object representing the file or folder specified by ``name``.\n *\n * @param {string} name\n * @return ZipEntry\n */\n getEntry: function (/**String*/ name) {\n return getEntry(name);\n },\n\n getEntryCount: function () {\n return _zip.getEntryCount();\n },\n\n forEach: function (callback) {\n return _zip.forEach(callback);\n },\n\n /**\n * Extracts the given entry to the given targetPath\n * If the entry is a directory inside the archive, the entire directory and it's subdirectories will be extracted\n *\n * @param {string|ZipEntry} entry - ZipEntry object or String with the full path of the entry\n * @param {string} targetPath - Target folder where to write the file\n * @param {boolean} [maintainEntryPath=true] - If maintainEntryPath is true and the entry is inside a folder, the entry folder will be created in targetPath as well. Default is TRUE\n * @param {boolean} [overwrite=false] - If the file already exists at the target path, the file will be overwriten if this is true.\n * @param {boolean} [keepOriginalPermission=false] - The file will be set as the permission from the entry if this is true.\n * @param {string} [outFileName] - String If set will override the filename of the extracted file (Only works if the entry is a file)\n *\n * @return Boolean\n */\n extractEntryTo: function (entry, targetPath, maintainEntryPath, overwrite, keepOriginalPermission, outFileName) {\n overwrite = get_Bool(false, overwrite);\n keepOriginalPermission = get_Bool(false, keepOriginalPermission);\n maintainEntryPath = get_Bool(true, maintainEntryPath);\n outFileName = get_Str(keepOriginalPermission, outFileName);\n\n var item = getEntry(entry);\n if (!item) {\n throw Utils.Errors.NO_ENTRY();\n }\n\n var entryName = canonical(item.entryName);\n\n var target = sanitize(targetPath, outFileName && !item.isDirectory ? outFileName : maintainEntryPath ? entryName : pth.basename(entryName));\n\n if (item.isDirectory) {\n var children = _zip.getEntryChildren(item);\n children.forEach(function (child) {\n if (child.isDirectory) return;\n var content = child.getData();\n if (!content) {\n throw Utils.Errors.CANT_EXTRACT_FILE();\n }\n var name = canonical(child.entryName);\n var childName = sanitize(targetPath, maintainEntryPath ? name : pth.basename(name));\n // The reverse operation for attr depend on method addFile()\n const fileAttr = keepOriginalPermission ? child.header.fileAttr : undefined;\n filetools.writeFileTo(childName, content, overwrite, fileAttr);\n });\n return true;\n }\n\n var content = item.getData(_zip.password);\n if (!content) throw Utils.Errors.CANT_EXTRACT_FILE();\n\n if (filetools.fs.existsSync(target) && !overwrite) {\n throw Utils.Errors.CANT_OVERRIDE();\n }\n // The reverse operation for attr depend on method addFile()\n const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;\n filetools.writeFileTo(target, content, overwrite, fileAttr);\n\n return true;\n },\n\n /**\n * Test the archive\n * @param {string} [pass]\n */\n test: function (pass) {\n if (!_zip) {\n return false;\n }\n\n for (var entry in _zip.entries) {\n try {\n if (entry.isDirectory) {\n continue;\n }\n var content = _zip.entries[entry].getData(pass);\n if (!content) {\n return false;\n }\n } catch (err) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Extracts the entire archive to the given location\n *\n * @param {string} targetPath Target location\n * @param {boolean} [overwrite=false] If the file already exists at the target path, the file will be overwriten if this is true.\n * Default is FALSE\n * @param {boolean} [keepOriginalPermission=false] The file will be set as the permission from the entry if this is true.\n * Default is FALSE\n * @param {string|Buffer} [pass] password\n */\n extractAllTo: function (targetPath, overwrite, keepOriginalPermission, pass) {\n keepOriginalPermission = get_Bool(false, keepOriginalPermission);\n pass = get_Str(keepOriginalPermission, pass);\n overwrite = get_Bool(false, overwrite);\n if (!_zip) throw Utils.Errors.NO_ZIP();\n\n _zip.entries.forEach(function (entry) {\n var entryName = sanitize(targetPath, canonical(entry.entryName));\n if (entry.isDirectory) {\n filetools.makeDir(entryName);\n return;\n }\n var content = entry.getData(pass);\n if (!content) {\n throw Utils.Errors.CANT_EXTRACT_FILE();\n }\n // The reverse operation for attr depend on method addFile()\n const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;\n filetools.writeFileTo(entryName, content, overwrite, fileAttr);\n try {\n filetools.fs.utimesSync(entryName, entry.header.time, entry.header.time);\n } catch (err) {\n throw Utils.Errors.CANT_EXTRACT_FILE();\n }\n });\n },\n\n /**\n * Asynchronous extractAllTo\n *\n * @param {string} targetPath Target location\n * @param {boolean} [overwrite=false] If the file already exists at the target path, the file will be overwriten if this is true.\n * Default is FALSE\n * @param {boolean} [keepOriginalPermission=false] The file will be set as the permission from the entry if this is true.\n * Default is FALSE\n * @param {function} callback The callback will be executed when all entries are extracted successfully or any error is thrown.\n */\n extractAllToAsync: function (targetPath, overwrite, keepOriginalPermission, callback) {\n callback = get_Fun(overwrite, keepOriginalPermission, callback);\n keepOriginalPermission = get_Bool(false, keepOriginalPermission);\n overwrite = get_Bool(false, overwrite);\n if (!callback) {\n return new Promise((resolve, reject) => {\n this.extractAllToAsync(targetPath, overwrite, keepOriginalPermission, function (err) {\n if (err) {\n reject(err);\n } else {\n resolve(this);\n }\n });\n });\n }\n if (!_zip) {\n callback(Utils.Errors.NO_ZIP());\n return;\n }\n\n targetPath = pth.resolve(targetPath);\n // convert entryName to\n const getPath = (entry) => sanitize(targetPath, pth.normalize(canonical(entry.entryName)));\n const getError = (msg, file) => new Error(msg + ': \"' + file + '\"');\n\n // separate directories from files\n const dirEntries = [];\n const fileEntries = [];\n _zip.entries.forEach((e) => {\n if (e.isDirectory) {\n dirEntries.push(e);\n } else {\n fileEntries.push(e);\n }\n });\n\n // Create directory entries first synchronously\n // this prevents race condition and assures folders are there before writing files\n for (const entry of dirEntries) {\n const dirPath = getPath(entry);\n // The reverse operation for attr depend on method addFile()\n const dirAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;\n try {\n filetools.makeDir(dirPath);\n if (dirAttr) filetools.fs.chmodSync(dirPath, dirAttr);\n // in unix timestamp will change if files are later added to folder, but still\n filetools.fs.utimesSync(dirPath, entry.header.time, entry.header.time);\n } catch (er) {\n callback(getError(\"Unable to create folder\", dirPath));\n }\n }\n\n fileEntries.reverse().reduce(function (next, entry) {\n return function (err) {\n if (err) {\n next(err);\n } else {\n const entryName = pth.normalize(canonical(entry.entryName));\n const filePath = sanitize(targetPath, entryName);\n entry.getDataAsync(function (content, err_1) {\n if (err_1) {\n next(err_1);\n } else if (!content) {\n next(Utils.Errors.CANT_EXTRACT_FILE());\n } else {\n // The reverse operation for attr depend on method addFile()\n const fileAttr = keepOriginalPermission ? entry.header.fileAttr : undefined;\n filetools.writeFileToAsync(filePath, content, overwrite, fileAttr, function (succ) {\n if (!succ) {\n next(getError(\"Unable to write file\", filePath));\n }\n filetools.fs.utimes(filePath, entry.header.time, entry.header.time, function (err_2) {\n if (err_2) {\n next(getError(\"Unable to set times\", filePath));\n } else {\n next();\n }\n });\n });\n }\n });\n }\n };\n }, callback)();\n },\n\n /**\n * Writes the newly created zip file to disk at the specified location or if a zip was opened and no ``targetFileName`` is provided, it will overwrite the opened zip\n *\n * @param {string} targetFileName\n * @param {function} callback\n */\n writeZip: function (targetFileName, callback) {\n if (arguments.length === 1) {\n if (typeof targetFileName === \"function\") {\n callback = targetFileName;\n targetFileName = \"\";\n }\n }\n\n if (!targetFileName && opts.filename) {\n targetFileName = opts.filename;\n }\n if (!targetFileName) return;\n\n var zipData = _zip.compressToBuffer();\n if (zipData) {\n var ok = filetools.writeFileTo(targetFileName, zipData, true);\n if (typeof callback === \"function\") callback(!ok ? new Error(\"failed\") : null, \"\");\n }\n },\n\n /**\n *\n * @param {string} targetFileName\n * @param {object} [props]\n * @param {boolean} [props.overwrite=true] If the file already exists at the target path, the file will be overwriten if this is true.\n * @param {boolean} [props.perm] The file will be set as the permission from the entry if this is true.\n\n * @returns {Promise<void>}\n */\n writeZipPromise: function (/**String*/ targetFileName, /* object */ props) {\n const { overwrite, perm } = Object.assign({ overwrite: true }, props);\n\n return new Promise((resolve, reject) => {\n // find file name\n if (!targetFileName && opts.filename) targetFileName = opts.filename;\n if (!targetFileName) reject(\"ADM-ZIP: ZIP File Name Missing\");\n\n this.toBufferPromise().then((zipData) => {\n const ret = (done) => (done ? resolve(done) : reject(\"ADM-ZIP: Wasn't able to write zip file\"));\n filetools.writeFileToAsync(targetFileName, zipData, overwrite, perm, ret);\n }, reject);\n });\n },\n\n /**\n * @returns {Promise<Buffer>} A promise to the Buffer.\n */\n toBufferPromise: function () {\n return new Promise((resolve, reject) => {\n _zip.toAsyncBuffer(resolve, reject);\n });\n },\n\n /**\n * Returns the content of the entire zip file as a Buffer object\n *\n * @prop {function} [onSuccess]\n * @prop {function} [onFail]\n * @prop {function} [onItemStart]\n * @prop {function} [onItemEnd]\n * @returns {Buffer}\n */\n toBuffer: function (onSuccess, onFail, onItemStart, onItemEnd) {\n if (typeof onSuccess === \"function\") {\n _zip.toAsyncBuffer(onSuccess, onFail, onItemStart, onItemEnd);\n return null;\n }\n return _zip.compressToBuffer();\n }\n };\n};\n",
|
|
21
|
+
"'use strict';\n\nmodule.exports = cliWidth;\n\nfunction normalizeOpts(options) {\n const defaultOpts = {\n defaultWidth: 0,\n output: process.stdout,\n tty: require('tty'),\n };\n\n if (!options) {\n return defaultOpts;\n }\n\n Object.keys(defaultOpts).forEach(function (key) {\n if (!options[key]) {\n options[key] = defaultOpts[key];\n }\n });\n\n return options;\n}\n\nfunction cliWidth(options) {\n const opts = normalizeOpts(options);\n\n if (opts.output.getWindowSize) {\n return opts.output.getWindowSize()[0] || opts.defaultWidth;\n }\n\n if (opts.tty.getWindowSize) {\n return opts.tty.getWindowSize()[1] || opts.defaultWidth;\n }\n\n if (opts.output.columns) {\n return opts.output.columns;\n }\n\n if (process.env.CLI_WIDTH) {\n const width = parseInt(process.env.CLI_WIDTH, 10);\n\n if (!isNaN(width) && width !== 0) {\n return width;\n }\n }\n\n return opts.defaultWidth;\n}\n",
|
|
22
|
+
"const Stream = require('stream')\n\nclass MuteStream extends Stream {\n #isTTY = null\n\n constructor (opts = {}) {\n super(opts)\n this.writable = this.readable = true\n this.muted = false\n this.on('pipe', this._onpipe)\n this.replace = opts.replace\n\n // For readline-type situations\n // This much at the start of a line being redrawn after a ctrl char\n // is seen (such as backspace) won't be redrawn as the replacement\n this._prompt = opts.prompt || null\n this._hadControl = false\n }\n\n #destSrc (key, def) {\n if (this._dest) {\n return this._dest[key]\n }\n if (this._src) {\n return this._src[key]\n }\n return def\n }\n\n #proxy (method, ...args) {\n if (typeof this._dest?.[method] === 'function') {\n this._dest[method](...args)\n }\n if (typeof this._src?.[method] === 'function') {\n this._src[method](...args)\n }\n }\n\n get isTTY () {\n if (this.#isTTY !== null) {\n return this.#isTTY\n }\n return this.#destSrc('isTTY', false)\n }\n\n // basically just get replace the getter/setter with a regular value\n set isTTY (val) {\n this.#isTTY = val\n }\n\n get rows () {\n return this.#destSrc('rows')\n }\n\n get columns () {\n return this.#destSrc('columns')\n }\n\n mute () {\n this.muted = true\n }\n\n unmute () {\n this.muted = false\n }\n\n _onpipe (src) {\n this._src = src\n }\n\n pipe (dest, options) {\n this._dest = dest\n return super.pipe(dest, options)\n }\n\n pause () {\n if (this._src) {\n return this._src.pause()\n }\n }\n\n resume () {\n if (this._src) {\n return this._src.resume()\n }\n }\n\n write (c) {\n if (this.muted) {\n if (!this.replace) {\n return true\n }\n // eslint-disable-next-line no-control-regex\n if (c.match(/^\\u001b/)) {\n if (c.indexOf(this._prompt) === 0) {\n c = c.slice(this._prompt.length)\n c = c.replace(/./g, this.replace)\n c = this._prompt + c\n }\n this._hadControl = true\n return this.emit('data', c)\n } else {\n if (this._prompt && this._hadControl &&\n c.indexOf(this._prompt) === 0) {\n this._hadControl = false\n this.emit('data', this._prompt)\n c = c.slice(this._prompt.length)\n }\n c = c.toString().replace(/./g, this.replace)\n }\n }\n this.emit('data', c)\n }\n\n end (c) {\n if (this.muted) {\n if (c && this.replace) {\n c = c.toString().replace(/./g, this.replace)\n } else {\n c = null\n }\n }\n if (c) {\n this.emit('data', c)\n }\n this.emit('end')\n }\n\n destroy (...args) {\n return this.#proxy('destroy', ...args)\n }\n\n destroySoon (...args) {\n return this.#proxy('destroySoon', ...args)\n }\n\n close (...args) {\n return this.#proxy('close', ...args)\n }\n}\n\nmodule.exports = MuteStream\n",
|
|
23
|
+
"import os from 'node:os';\n\nexport type OS = 'macos' | 'linux' | 'windows';\nexport type Arch = 'arm64' | 'x86_64';\n\nexport interface Platform {\n os: OS;\n arch: Arch;\n gcloudDownloadUrl: string;\n gcloudBinaryName: string;\n isWindows: boolean;\n}\n\n/**\n * Detect the current platform and architecture\n */\nexport function detectPlatform(): Platform {\n const platform = process.platform;\n const arch = process.arch;\n\n const detectedOS: OS = platform === 'win32' ? 'windows' : platform === 'darwin' ? 'macos' : 'linux';\n const detectedArch: Arch = arch === 'arm64' ? 'arm64' : 'x86_64';\n\n return {\n os: detectedOS,\n arch: detectedArch,\n gcloudDownloadUrl: getGcloudDownloadUrl(detectedOS, detectedArch),\n gcloudBinaryName: platform === 'win32' ? 'gcloud.cmd' : 'gcloud',\n isWindows: platform === 'win32',\n };\n}\n\n/**\n * Get the gcloud download URL for the current platform\n */\nfunction getGcloudDownloadUrl(os: OS, arch: Arch): string {\n const baseUrl = 'https://dl.google.com/dl/cloudsdk/channels/rapid/downloads';\n\n if (os === 'macos') {\n if (arch === 'arm64') {\n return `${baseUrl}/google-cloud-cli-darwin-arm.tar.gz`;\n }\n return `${baseUrl}/google-cloud-cli-darwin-x86_64.tar.gz`;\n }\n\n if (os === 'linux') {\n return `${baseUrl}/google-cloud-cli-linux-x86_64.tar.gz`;\n }\n\n if (os === 'windows') {\n return `${baseUrl}/google-cloud-cli-windows-x86_64-bundled-python.zip`;\n }\n\n throw new Error(`Unsupported platform: ${os} ${arch}`);\n}\n\n/**\n * Get the user's home directory\n */\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\n/**\n * Get the Stitch MCP directory path\n */\nexport function getStitchDir(): string {\n return `${getHomeDir()}/.stitch-mcp`;\n}\n\n/**\n * Get the gcloud SDK installation path\n */\nexport function getGcloudSdkPath(): string {\n return `${getStitchDir()}/google-cloud-sdk`;\n}\n\n/**\n * Get the gcloud config directory path\n */\nexport function getGcloudConfigPath(): string {\n return `${getStitchDir()}/config`;\n}\n",
|
|
24
|
+
"import * as childProcess from 'node:child_process';\nimport type { ChildProcess, SpawnOptions } from 'node:child_process';\n\nexport interface ShellResult {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n error?: string;\n}\n\nexport function getSpawnArgs(command: string, args: string[]) {\n if (process.platform === 'win32') {\n return {\n cmd: 'cmd.exe',\n args: ['/d', '/s', '/c', command, ...args]\n };\n }\n return { cmd: command, args };\n}\n\n/**\n * Execute a shell command and return the result\n */\nexport async function execCommand(command: string[], options?: { cwd?: string; env?: Record<string, string>; timeout?: number }): Promise<ShellResult> {\n const cmd = command[0];\n if (!cmd) throw new Error('Command cannot be empty');\n const args = command.slice(1);\n\n return new Promise((resolve) => {\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n const spawnOptions: SpawnOptions = {\n cwd: options?.cwd || process.cwd(),\n env: { ...process.env, ...(options?.env || {}) },\n stdio: 'pipe',\n timeout: options?.timeout,\n shell: false\n };\n\n const { cmd: spawnCmd, args: spawnArgs } = getSpawnArgs(cmd, args);\n const child = childProcess.spawn(spawnCmd, spawnArgs, spawnOptions) as ChildProcess;\n\n if (child.stdout) {\n child.stdout.on('data', (data: Buffer) => {\n stdoutChunks.push(data);\n });\n }\n\n if (child.stderr) {\n child.stderr.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n });\n }\n\n child.on('error', (err: Error) => {\n resolve({\n success: false,\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n exitCode: 1,\n error: err.message\n });\n });\n\n child.on('close', (code: number | null) => {\n resolve({\n success: (code === 0),\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n exitCode: code ?? 1\n });\n });\n });\n}\n\n/**\n * Execute a shell command and stream output\n */\nexport async function execCommandStreaming(\n command: string[],\n onStdout?: (data: string) => void,\n onStderr?: (data: string) => void,\n options?: { cwd?: string; env?: Record<string, string> }\n): Promise<ShellResult> {\n const cmd = command[0];\n if (!cmd) throw new Error('Command cannot be empty');\n const args = command.slice(1);\n\n return new Promise((resolve) => {\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n const spawnOptions: SpawnOptions = {\n cwd: options?.cwd || process.cwd(),\n env: { ...process.env, ...(options?.env || {}) },\n stdio: 'pipe',\n shell: false\n };\n\n const { cmd: spawnCmd, args: spawnArgs } = getSpawnArgs(cmd, args);\n const child = childProcess.spawn(spawnCmd, spawnArgs, spawnOptions) as ChildProcess;\n\n if (child.stdout) {\n child.stdout.on('data', (buffer: Buffer) => {\n stdoutChunks.push(buffer);\n if (onStdout) onStdout(buffer.toString());\n });\n }\n\n if (child.stderr) {\n child.stderr.on('data', (buffer: Buffer) => {\n stderrChunks.push(buffer);\n if (onStderr) onStderr(buffer.toString());\n });\n }\n\n child.on('error', (err: Error) => {\n const msg = err.message;\n if (onStderr) onStderr(msg);\n resolve({\n success: false,\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n exitCode: 1,\n error: msg\n });\n });\n\n child.on('close', (code: number | null) => {\n resolve({\n success: (code === 0),\n stdout: Buffer.concat(stdoutChunks).toString(),\n stderr: Buffer.concat(stderrChunks).toString(),\n exitCode: code ?? 1\n });\n });\n });\n}\n\n/**\n * Check if a command exists in PATH\n */\nexport async function commandExists(command: string): Promise<boolean> {\n const result = await execCommand(process.platform === 'win32' ? ['where', command] : ['which', command]);\n return result.success;\n}\n",
|
|
25
|
+
"import path from 'node:path';\n\n/**\n * Get cross-platform path join\n */\nexport function joinPath(...parts: string[]): string {\n return path.join(...parts);\n}\n\n/**\n * Get the directory name from a path\n */\nexport function dirname(filepath: string): string {\n return path.dirname(filepath);\n}\n\n/**\n * Get the basename from a path\n */\nexport function basename(filepath: string): string {\n return path.basename(filepath);\n}\n\n/**\n * Normalize path separators for the current platform\n */\nexport function normalizePath(filepath: string): string {\n return path.normalize(filepath);\n}\n\n/**\n * Convert a path to use forward slashes (for consistency)\n */\nexport function toUnixPath(filepath: string): string {\n return filepath.split(path.sep).join('/');\n}\n",
|
|
26
|
+
"import { detectPlatform, getGcloudConfigPath, getGcloudSdkPath } from '../../platform/detector.js';\nimport { execCommand, type ShellResult } from '../../platform/shell.js';\nimport { joinPath } from '../../platform/paths.js';\nimport fs from 'node:fs';\n\nexport class GcloudExecutor {\n public platform = detectPlatform();\n private gcloudPath: string | null = null;\n private useSystemGcloud = false;\n\n constructor() {\n // Attempt to locate bundled gcloud or system gcloud on init?\n // No, GcloudHandler does this lazily or via ensureInstalled.\n // We should keep it lazy/configurable.\n }\n\n setGcloudPath(path: string, isSystem: boolean) {\n this.gcloudPath = path;\n this.useSystemGcloud = isSystem;\n this.setupEnvironment();\n }\n\n getGcloudPath(): string | null {\n return this.gcloudPath;\n }\n\n isSystemGcloud(): boolean {\n return this.useSystemGcloud;\n }\n\n private setupEnvironment(): void {\n if (this.gcloudPath && !this.useSystemGcloud && !process.env.STITCH_USE_SYSTEM_GCLOUD) {\n const sdkPath = getGcloudSdkPath();\n const binPath = joinPath(sdkPath, 'bin');\n process.env.PATH = `${binPath}:${process.env.PATH}`;\n\n const configPath = getGcloudConfigPath();\n process.env.CLOUDSDK_CONFIG = configPath;\n process.env.CLOUDSDK_CORE_DISABLE_PROMPTS = '1';\n process.env.CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK = '1';\n process.env.CLOUDSDK_CORE_DISABLE_USAGE_REPORTING = 'true';\n }\n }\n\n getEnvironment(useSystem?: boolean): Record<string, string> {\n // CHECK: If system mode is requested via flag or env var\n if (useSystem || this.useSystemGcloud || process.env.STITCH_USE_SYSTEM_GCLOUD) {\n // Return empty object to use default process.env in execCommand\n return {};\n }\n\n const configPath = getGcloudConfigPath();\n // Return only overrides\n return {\n CLOUDSDK_CONFIG: configPath,\n CLOUDSDK_CORE_DISABLE_PROMPTS: '1',\n CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK: '1',\n CLOUDSDK_CORE_DISABLE_USAGE_REPORTING: 'true',\n };\n }\n\n async getGcloudCommand(): Promise<string> {\n if (this.gcloudPath) {\n return this.gcloudPath;\n }\n\n // If configured to use system gcloud, prefer PATH lookup\n if (this.useSystemGcloud || process.env.STITCH_USE_SYSTEM_GCLOUD) {\n return this.platform.gcloudBinaryName;\n }\n\n // Check if local SDK exists (fallback)\n const sdkPath = getGcloudSdkPath();\n const localBinaryPath = joinPath(sdkPath, 'bin', this.platform.gcloudBinaryName);\n\n try {\n await fs.promises.access(localBinaryPath, fs.constants.F_OK);\n this.gcloudPath = localBinaryPath;\n this.setupEnvironment();\n return localBinaryPath;\n } catch {\n // Fallback to command in PATH\n return this.platform.gcloudBinaryName;\n }\n }\n\n async exec(args: string[], options?: { timeout?: number; env?: Record<string, string> }): Promise<ShellResult> {\n const cmd = await this.getGcloudCommand();\n const env = { ...this.getEnvironment(), ...(options?.env || {}) };\n return execCommand([cmd, ...args], { ...options, env });\n }\n\n async execRaw(command: string[], options?: { timeout?: number; env?: Record<string, string> }): Promise<ShellResult> {\n // Execute a raw command (e.g. 'where', 'which', 'tar') without gcloud prefix\n const env = { ...this.getEnvironment(), ...(options?.env || {}) };\n return execCommand(command, { ...options, env });\n }\n}\n",
|
|
27
|
+
"import fs from 'node:fs';\nimport AdmZip from 'adm-zip';\nimport {\n type EnsureGcloudInput,\n type GcloudResult,\n} from './spec.js';\nimport { getGcloudSdkPath, getStitchDir } from '../../platform/detector.js';\nimport { joinPath } from '../../platform/paths.js';\nimport { GcloudExecutor } from './core.js';\nimport { execCommand, commandExists } from '../../platform/shell.js';\n\nexport class GcloudInstallService {\n constructor(private executor: GcloudExecutor) {}\n\n /**\n * Ensure gcloud is installed and available\n */\n async ensureInstalled(input: EnsureGcloudInput): Promise<GcloudResult> {\n // Priority 1: Check for system gcloud first (unless forced local)\n // This ensures we respect the user's existing environment if available\n if (!input.forceLocal) {\n const globalPath = await this.findGlobalGcloud();\n if (globalPath) {\n const version = await this.getVersionFromPath(globalPath);\n if (version && this.isVersionValid(version, input.minVersion)) {\n this.executor.setGcloudPath(globalPath, true);\n return {\n success: true,\n data: {\n version,\n location: 'system',\n path: globalPath,\n },\n };\n }\n }\n }\n\n // Fast path: Check if local installation already exists (just a file check)\n const localSdkPath = getGcloudSdkPath();\n const localBinaryPath = joinPath(localSdkPath, 'bin', this.executor.platform.gcloudBinaryName);\n\n let localExists = false;\n try {\n await fs.promises.access(localBinaryPath, fs.constants.F_OK);\n localExists = true;\n } catch {\n // file doesn't exist\n }\n\n if (localExists) {\n const version = await this.getVersionFromPath(localBinaryPath);\n if (version) {\n this.executor.setGcloudPath(localBinaryPath, false);\n return {\n success: true,\n data: {\n version,\n location: 'bundled',\n path: localBinaryPath,\n },\n };\n }\n }\n\n // Only check global installation if local doesn't exist and not forced local\n if (!input.forceLocal) {\n const globalPath = await this.findGlobalGcloud();\n if (globalPath) {\n const version = await this.getVersionFromPath(globalPath);\n if (version && this.isVersionValid(version, input.minVersion)) {\n this.executor.setGcloudPath(globalPath, true);\n return {\n success: true,\n data: {\n version,\n location: 'system',\n path: globalPath,\n },\n };\n }\n }\n }\n\n // Install locally to ~/.stitch-mcp\n const localPath = await this.installLocal();\n if (!localPath) {\n return {\n success: false,\n error: {\n code: 'DOWNLOAD_FAILED',\n message: 'Failed to install gcloud locally',\n suggestion: 'Check your internet connection and try again',\n recoverable: true,\n },\n };\n }\n\n const version = await this.getVersionFromPath(localPath);\n if (!version) {\n return {\n success: false,\n error: {\n code: 'VERSION_CHECK_FAILED',\n message: 'Could not determine gcloud version',\n recoverable: false,\n },\n };\n }\n\n this.executor.setGcloudPath(localPath, false);\n\n return {\n success: true,\n data: {\n version,\n location: 'bundled',\n path: localPath,\n },\n };\n }\n\n /**\n * Install beta components\n */\n async installBetaComponents(): Promise<{ success: boolean; error?: { message: string } }> {\n try {\n const result = await this.executor.exec(\n ['components', 'install', 'beta', '--quiet']\n );\n\n if (!result.success) {\n return {\n success: false,\n error: {\n message: `Failed to install beta components: ${result.stderr || result.error || 'Unknown error'}`,\n },\n };\n }\n\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: {\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n private async findGlobalGcloud(): Promise<string | null> {\n const exists = await commandExists(this.executor.platform.gcloudBinaryName);\n if (!exists) {\n return null;\n }\n\n // Get path to gcloud\n const result = await execCommand(\n this.executor.platform.isWindows\n ? ['where', this.executor.platform.gcloudBinaryName]\n : ['which', this.executor.platform.gcloudBinaryName]\n );\n\n if (result.success) {\n return result.stdout.trim().split('\\n')[0] || null;\n }\n\n return null;\n }\n\n private async getVersionFromPath(gcloudPath: string): Promise<string | null> {\n const result = await execCommand([gcloudPath, 'version', '--format=json']);\n\n if (result.success) {\n try {\n const versionData = JSON.parse(result.stdout);\n return versionData['Google Cloud SDK'] || null;\n } catch {\n // Fallback: try to parse from text output\n const match = result.stdout.match(/Google Cloud SDK ([\\d.]+)/);\n return match?.[1] || null;\n }\n }\n\n return null;\n }\n\n private isVersionValid(current: string, minimum: string): boolean {\n const currentParts = current.split('.').map(Number);\n const minimumParts = minimum.split('.').map(Number);\n\n for (let i = 0; i < Math.max(currentParts.length, minimumParts.length); i++) {\n const cur = currentParts[i] || 0;\n const min = minimumParts[i] || 0;\n\n if (cur > min) return true;\n if (cur < min) return false;\n }\n\n return true;\n }\n\n private async installLocal(): Promise<string | null> {\n const sdkPath = getGcloudSdkPath();\n const stitchDir = getStitchDir();\n\n // Create directories\n await fs.promises.mkdir(stitchDir, { recursive: true });\n\n // Download gcloud\n const downloadUrl = this.executor.platform.gcloudDownloadUrl;\n const downloadPath = joinPath(stitchDir, this.executor.platform.isWindows ? 'gcloud.zip' : 'gcloud.tar.gz');\n\n try {\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n return null;\n }\n\n const buffer = await response.arrayBuffer();\n await fs.promises.writeFile(downloadPath, Buffer.from(buffer));\n\n // Extract\n if (this.executor.platform.isWindows) {\n // Extract ZIP\n const zip = new AdmZip(downloadPath);\n await new Promise<void>((resolve, reject) => {\n zip.extractAllToAsync(stitchDir, true, false, (err: Error | null | undefined) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n } else {\n // Extract tar.gz\n await execCommand(['tar', '-xzf', downloadPath, '-C', stitchDir]);\n }\n\n // Clean up download\n await fs.promises.unlink(downloadPath);\n\n // Return path to gcloud binary\n return joinPath(sdkPath, 'bin', this.executor.platform.gcloudBinaryName);\n } catch {\n return null;\n }\n }\n}\n",
|
|
28
|
+
"import fs from 'node:fs';\nimport {\n type AuthenticateInput,\n type AuthResult,\n} from './spec.js';\nimport { getGcloudConfigPath } from '../../platform/detector.js';\nimport { joinPath } from '../../platform/paths.js';\nimport { theme } from '../../ui/theme.js';\nimport { GcloudExecutor } from './core.js';\n\nexport class GcloudAuthService {\n constructor(private executor: GcloudExecutor) {}\n\n /**\n * Authenticate user\n */\n async authenticate(input: AuthenticateInput): Promise<AuthResult> {\n try {\n // Check if already authenticated\n if (input.skipIfActive) {\n const activeAccount = await this.getActiveAccount();\n if (activeAccount) {\n return {\n success: true,\n data: {\n account: activeAccount,\n type: 'user',\n },\n };\n }\n }\n\n // Run gcloud auth login\n const result = await this.runAuthFlow(['auth', 'login']);\n\n if (!result.success) {\n return {\n success: false,\n error: {\n code: 'AUTH_FAILED',\n message: 'Failed to authenticate with gcloud',\n suggestion: 'Complete the browser authentication flow',\n recoverable: true,\n },\n };\n }\n\n const account = await this.getActiveAccount();\n if (!account) {\n return {\n success: false,\n error: {\n code: 'AUTH_FAILED',\n message: 'Authentication appeared to succeed but no active account found',\n recoverable: false,\n },\n };\n }\n\n return {\n success: true,\n data: {\n account,\n type: 'user',\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'AUTH_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n /**\n * Authenticate application default credentials\n */\n async authenticateADC(input: AuthenticateInput): Promise<AuthResult> {\n try {\n // Check if ADC already exists\n if (input.skipIfActive) {\n const hasADC = await this.hasADC();\n if (hasADC) {\n const account = await this.getActiveAccount();\n return {\n success: true,\n data: {\n account: account || 'unknown',\n type: 'adc',\n },\n };\n }\n }\n\n // Run gcloud auth application-default login\n const result = await this.runAuthFlow(['auth', 'application-default', 'login']);\n\n if (!result.success) {\n return {\n success: false,\n error: {\n code: 'ADC_FAILED',\n message: 'Failed to authenticate application default credentials',\n suggestion: 'Complete the browser authentication flow',\n recoverable: true,\n },\n };\n }\n\n const account = await this.getActiveAccount();\n\n return {\n success: true,\n data: {\n account: account || 'unknown',\n type: 'adc',\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'ADC_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n /**\n * Get access token\n */\n async getAccessToken(): Promise<string | null> {\n try {\n const result = await this.executor.exec(['auth', 'application-default', 'print-access-token']);\n\n if (result.success) {\n return result.stdout.trim();\n }\n\n // Build the correct login command with config prefix for bundled gcloud\n const loginCmd = await this.getLoginCommand();\n console.error(`[Gcloud] Token fetch failed. Please run:\\n\\n ${loginCmd}\\n\\nto obtain new credentials.`);\n return null;\n } catch (e) {\n console.error('[Gcloud] Token fetch exception:', e);\n return null;\n }\n }\n\n async getActiveAccount(): Promise<string | null> {\n // Only check bundled stitch config - we need credentials there\n const result = await this.executor.exec(\n ['auth', 'list', '--filter=status:ACTIVE', '--format=value(account)']\n );\n\n if (result.success && result.stdout.trim()) {\n return result.stdout.trim().split('\\n')[0] || null;\n }\n\n return null;\n }\n\n async hasADC(): Promise<boolean> {\n // Actually verify ADC credentials work by attempting to get an access token.\n // Just checking if the file exists is not enough - tokens can be expired or revoked.\n\n // First, quick check if credential file exists\n let fileExists = false;\n if (!this.executor.isSystemGcloud() && !process.env.STITCH_USE_SYSTEM_GCLOUD) {\n const stitchConfigPath = getGcloudConfigPath();\n const stitchAdcPath = joinPath(stitchConfigPath, 'application_default_credentials.json');\n try {\n await fs.promises.access(stitchAdcPath, fs.constants.F_OK);\n fileExists = true;\n } catch {\n fileExists = false;\n }\n } else {\n // For system gcloud, check via gcloud info\n try {\n const result = await this.executor.exec(\n ['info', '--format=value(config.paths.global_config_dir)']\n );\n\n if (result.success && result.stdout.trim()) {\n const configDir = result.stdout.trim();\n const adcPath = joinPath(configDir, 'application_default_credentials.json');\n try {\n await fs.promises.access(adcPath, fs.constants.F_OK);\n fileExists = true;\n } catch {\n fileExists = false;\n }\n }\n } catch {\n // Fallback - file doesn't exist\n }\n }\n\n // If no file, definitely no ADC\n if (!fileExists) {\n return false;\n }\n\n // File exists, but verify the credentials are actually valid by trying to get a token\n try {\n const result = await this.executor.exec(\n ['auth', 'application-default', 'print-access-token']\n );\n\n // Only return true if we successfully got a token\n return result.success && !!result.stdout.trim();\n } catch {\n return false;\n }\n }\n\n // ============================================================================\n // PRIVATE HELPERS\n // ============================================================================\n\n /**\n * Run the gcloud authentication flow (URL extraction followed by actual login)\n */\n private async runAuthFlow(authArgs: string[]) {\n console.log(theme.gray(\" Opening browser for authentication...\"));\n\n // CRITICAL: Always extract and print the URL before attempting browser launch\n // This ensures users can authenticate even if browser opening fails\n // Use a 5-second timeout to prevent hanging\n const noBrowserResult = await this.executor.exec(\n [...authArgs, '--no-launch-browser'],\n { timeout: 5000 }\n );\n\n // Extract URL from both stdout and stderr\n const outputText = noBrowserResult.stderr || noBrowserResult.stdout || '';\n const urlMatch = outputText.match(/https:\\/\\/accounts\\.google\\.com[^\\s]+/);\n\n if (urlMatch) {\n // ALWAYS print the URL to stdout for user visibility\n console.log(theme.gray(` If it doesn't open automatically, visit this URL: ${theme.cyan(urlMatch[0])}\\n`));\n } else {\n // Warn if URL extraction failed, but continue (backward compatibility)\n console.log(theme.gray(\" Note: Could not extract authentication URL from gcloud output\\n\"));\n }\n\n return this.executor.exec([...authArgs, '--quiet']);\n }\n\n /**\n * Get the correct login command with config prefix if using bundled gcloud\n */\n private async getLoginCommand(): Promise<string> {\n const gcloudCmd = await this.executor.getGcloudCommand();\n\n // If using system gcloud, no config prefix needed\n if (this.executor.isSystemGcloud() || process.env.STITCH_USE_SYSTEM_GCLOUD) {\n return `${gcloudCmd} auth application-default login`;\n }\n\n // For bundled gcloud, include the CLOUDSDK_CONFIG prefix\n const configPath = getGcloudConfigPath();\n return `CLOUDSDK_CONFIG=\"${configPath}\" ${gcloudCmd} auth application-default login`;\n }\n}\n",
|
|
29
|
+
"import { z } from 'zod';\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Regex for validating Google Cloud project IDs.\n * - 6 to 30 characters in length.\n * - Contain only lowercase letters, numbers, and hyphens.\n * - Must start with a letter.\n * - Cannot end with a hyphen.\n */\nexport const PROJECT_ID_REGEX = /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/;\n\n// ============================================================================\n// INPUT SCHEMAS\n// ============================================================================\n\nexport const EnsureGcloudInputSchema = z.object({\n minVersion: z.string().default('400.0.0'),\n forceLocal: z.boolean().default(false),\n useSystemGcloud: z.boolean().default(false).optional(),\n});\nexport type EnsureGcloudInput = z.infer<typeof EnsureGcloudInputSchema>;\n\nexport const AuthenticateInputSchema = z.object({\n skipIfActive: z.boolean().default(true),\n});\nexport type AuthenticateInput = z.infer<typeof AuthenticateInputSchema>;\n\nexport const ListProjectsInputSchema = z.object({\n limit: z.number().optional(),\n filter: z.string().optional(),\n sortBy: z.string().optional(),\n});\nexport type ListProjectsInput = z.infer<typeof ListProjectsInputSchema>;\n\nexport const SetProjectInputSchema = z.object({\n projectId: z.string().regex(PROJECT_ID_REGEX, {\n message: 'Invalid project ID format. Project IDs must be 6-30 characters, start with a letter, end with a letter or number, and contain only lowercase letters, numbers, and hyphens.',\n }),\n});\nexport type SetProjectInput = z.infer<typeof SetProjectInputSchema>;\n\n// ============================================================================\n// ERROR CODES\n// ============================================================================\n\nexport const GcloudErrorCode = z.enum([\n 'DOWNLOAD_FAILED',\n 'EXTRACTION_FAILED',\n 'VERSION_CHECK_FAILED',\n 'INVALID_VERSION',\n 'AUTH_FAILED',\n 'ADC_FAILED',\n 'PROJECT_LIST_FAILED',\n 'PROJECT_SET_FAILED',\n 'COMMAND_NOT_FOUND',\n 'UNKNOWN_ERROR',\n]);\nexport type GcloudErrorCodeType = z.infer<typeof GcloudErrorCode>;\n\n// ============================================================================\n// RESULT TYPES\n// ============================================================================\n\n// Ensure gcloud installation\nexport const GcloudInstallDataSchema = z.object({\n version: z.string(),\n location: z.enum(['system', 'bundled']),\n path: z.string(),\n});\n\nexport const GcloudSuccess = z.object({\n success: z.literal(true),\n data: GcloudInstallDataSchema,\n});\n\nexport const GcloudFailure = z.object({\n success: z.literal(false),\n error: z.object({\n code: GcloudErrorCode,\n message: z.string(),\n suggestion: z.string().optional(),\n recoverable: z.boolean(),\n }),\n});\n\nexport type GcloudResult = z.infer<typeof GcloudSuccess> | z.infer<typeof GcloudFailure>;\n\n// Authentication\nexport const AuthDataSchema = z.object({\n account: z.string(),\n type: z.enum(['user', 'adc']),\n});\n\nexport const AuthSuccess = z.object({\n success: z.literal(true),\n data: AuthDataSchema,\n});\n\nexport const AuthFailure = z.object({\n success: z.literal(false),\n error: z.object({\n code: GcloudErrorCode,\n message: z.string(),\n suggestion: z.string().optional(),\n recoverable: z.boolean(),\n }),\n});\n\nexport type AuthResult = z.infer<typeof AuthSuccess> | z.infer<typeof AuthFailure>;\n\n// Project listing\nexport const ProjectSchema = z.object({\n projectId: z.string(),\n name: z.string(),\n projectNumber: z.string().optional(),\n createTime: z.string().optional(),\n});\n\nexport const ProjectListSuccess = z.object({\n success: z.literal(true),\n data: z.object({\n projects: z.array(ProjectSchema),\n }),\n});\n\nexport const ProjectListFailure = z.object({\n success: z.literal(false),\n error: z.object({\n code: GcloudErrorCode,\n message: z.string(),\n suggestion: z.string().optional(),\n recoverable: z.boolean(),\n }),\n});\n\nexport type ProjectListResult = z.infer<typeof ProjectListSuccess> | z.infer<typeof ProjectListFailure>;\n\n// Project set\nexport const ProjectSetSuccess = z.object({\n success: z.literal(true),\n data: z.object({\n projectId: z.string(),\n }),\n});\n\nexport const ProjectSetFailure = z.object({\n success: z.literal(false),\n error: z.object({\n code: GcloudErrorCode,\n message: z.string(),\n suggestion: z.string().optional(),\n recoverable: z.boolean(),\n }),\n});\n\nexport type ProjectSetResult = z.infer<typeof ProjectSetSuccess> | z.infer<typeof ProjectSetFailure>;\n\n// ============================================================================\n// INTERFACE\n// ============================================================================\n\nexport interface GcloudService {\n /**\n * Ensure gcloud is installed and meets minimum version requirements\n */\n ensureInstalled(input: EnsureGcloudInput): Promise<GcloudResult>;\n\n /**\n * Authenticate user with gcloud\n */\n authenticate(input: AuthenticateInput): Promise<AuthResult>;\n\n /**\n * Authenticate application default credentials\n */\n authenticateADC(input: AuthenticateInput): Promise<AuthResult>;\n\n /**\n * List user's projects\n */\n listProjects(input: ListProjectsInput): Promise<ProjectListResult>;\n\n /**\n * Set the active project\n */\n setProject(input: SetProjectInput): Promise<ProjectSetResult>;\n\n /**\n * Get access token for API requests\n */\n getAccessToken(): Promise<string | null>;\n\n /**\n * Install beta components\n */\n installBetaComponents(): Promise<{ success: boolean; error?: { message: string } }>;\n\n /**\n * Check if Application Default Credentials (ADC) exist.\n */\n hasADC(): Promise<boolean>;\n\n /**\n /**\n * Get the active project ID.\n */\n getProjectId(): Promise<string | null>;\n\n /**\n * Get the active user account.\n */\n getActiveAccount(): Promise<string | null>;\n}\n",
|
|
30
|
+
"import {\n type ListProjectsInput,\n type SetProjectInput,\n type ProjectListResult,\n type ProjectSetResult,\n PROJECT_ID_REGEX,\n} from './spec.js';\nimport { GcloudExecutor } from './core.js';\n\nexport class GcloudProjectService {\n constructor(private executor: GcloudExecutor) {}\n\n /**\n * List projects\n */\n async listProjects(input: ListProjectsInput): Promise<ProjectListResult> {\n try {\n const args = ['projects', 'list', '--format=json'];\n\n if (input.limit) {\n args.push(`--limit=${input.limit}`);\n }\n\n if (input.filter) {\n args.push(`--filter=${input.filter}`);\n }\n\n if (input.sortBy) {\n args.push(`--sort-by=${input.sortBy}`);\n }\n\n const result = await this.executor.exec(args);\n\n if (!result.success) {\n return {\n success: false,\n error: {\n code: 'PROJECT_LIST_FAILED',\n message: `Failed to list projects: ${result.stderr}`,\n suggestion: 'Ensure you are authenticated and have access to projects',\n recoverable: true,\n },\n };\n }\n\n const projects = JSON.parse(result.stdout) as Array<{\n projectId: string;\n name: string;\n projectNumber?: string;\n createTime?: string;\n }>;\n\n return {\n success: true,\n data: {\n projects: projects.map((p) => ({\n projectId: p.projectId,\n name: p.name,\n projectNumber: p.projectNumber,\n createTime: p.createTime,\n })),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'PROJECT_LIST_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n /**\n * Set active project\n */\n async setProject(input: SetProjectInput): Promise<ProjectSetResult> {\n // Explicit validation before command execution\n if (!PROJECT_ID_REGEX.test(input.projectId)) {\n return {\n success: false,\n error: {\n code: 'PROJECT_SET_FAILED',\n message: `Invalid project ID: ${input.projectId}. Project IDs must be 6-30 characters, start with a letter, and contain only lowercase letters, numbers, and hyphens.`,\n suggestion: 'Verify the project ID is correct',\n recoverable: false,\n },\n };\n }\n\n try {\n const result = await this.executor.exec(\n ['config', 'set', 'project', input.projectId, '--quiet']\n );\n\n if (!result.success) {\n return {\n success: false,\n error: {\n code: 'PROJECT_SET_FAILED',\n message: `Failed to set project: ${input.projectId}`,\n suggestion: 'Verify the project ID is correct',\n recoverable: true,\n },\n };\n }\n\n return {\n success: true,\n data: {\n projectId: input.projectId,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'PROJECT_SET_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n async getProjectId(): Promise<string | null> {\n // Check environment variables first\n if (process.env.STITCH_PROJECT_ID) {\n return process.env.STITCH_PROJECT_ID;\n }\n if (process.env.GOOGLE_CLOUD_PROJECT) {\n return process.env.GOOGLE_CLOUD_PROJECT;\n }\n\n try {\n const result = await this.executor.exec(['config', 'get-value', 'project']);\n\n if (result.success && result.stdout.trim()) {\n return result.stdout.trim();\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n}\n",
|
|
31
|
+
"import {\n type GcloudService,\n type EnsureGcloudInput,\n type AuthenticateInput,\n type ListProjectsInput,\n type SetProjectInput,\n type GcloudResult,\n type AuthResult,\n type ProjectListResult,\n type ProjectSetResult,\n} from './spec.js';\nimport { GcloudExecutor } from './core.js';\nimport { GcloudInstallService } from './install.js';\nimport { GcloudAuthService } from './auth.js';\nimport { GcloudProjectService } from './projects.js';\n\nexport class GcloudHandler implements GcloudService {\n public executor: GcloudExecutor;\n private installService: GcloudInstallService;\n private authService: GcloudAuthService;\n private projectService: GcloudProjectService;\n\n constructor() {\n this.executor = new GcloudExecutor();\n this.installService = new GcloudInstallService(this.executor);\n this.authService = new GcloudAuthService(this.executor);\n this.projectService = new GcloudProjectService(this.executor);\n }\n\n /**\n * Ensure gcloud is installed and available\n */\n async ensureInstalled(input: EnsureGcloudInput): Promise<GcloudResult> {\n return this.installService.ensureInstalled(input);\n }\n\n /**\n * Authenticate user\n */\n async authenticate(input: AuthenticateInput): Promise<AuthResult> {\n return this.authService.authenticate(input);\n }\n\n /**\n * Authenticate application default credentials\n */\n async authenticateADC(input: AuthenticateInput): Promise<AuthResult> {\n return this.authService.authenticateADC(input);\n }\n\n /**\n * List projects\n */\n async listProjects(input: ListProjectsInput): Promise<ProjectListResult> {\n return this.projectService.listProjects(input);\n }\n\n /**\n * Set active project\n */\n async setProject(input: SetProjectInput): Promise<ProjectSetResult> {\n return this.projectService.setProject(input);\n }\n\n /**\n * Get access token\n */\n async getAccessToken(): Promise<string | null> {\n return this.authService.getAccessToken();\n }\n\n async getProjectId(): Promise<string | null> {\n return this.projectService.getProjectId();\n }\n\n /**\n * Install beta components\n */\n async installBetaComponents(): Promise<{ success: boolean; error?: { message: string } }> {\n return this.installService.installBetaComponents();\n }\n\n async getActiveAccount(): Promise<string | null> {\n return this.authService.getActiveAccount();\n }\n\n async hasADC(): Promise<boolean> {\n return this.authService.hasADC();\n }\n}\n",
|
|
32
|
+
"export const isUpKey = (key, keybindings = []) => \n// The up key\nkey.name === 'up' ||\n // Vim keybinding: hjkl keys map to left/down/up/right\n (keybindings.includes('vim') && key.name === 'k') ||\n // Emacs keybinding: Ctrl+P means \"previous\" in Emacs navigation conventions\n (keybindings.includes('emacs') && key.ctrl && key.name === 'p');\nexport const isDownKey = (key, keybindings = []) => \n// The down key\nkey.name === 'down' ||\n // Vim keybinding: hjkl keys map to left/down/up/right\n (keybindings.includes('vim') && key.name === 'j') ||\n // Emacs keybinding: Ctrl+N means \"next\" in Emacs navigation conventions\n (keybindings.includes('emacs') && key.ctrl && key.name === 'n');\nexport const isSpaceKey = (key) => key.name === 'space';\nexport const isBackspaceKey = (key) => key.name === 'backspace';\nexport const isTabKey = (key) => key.name === 'tab';\nexport const isNumberKey = (key) => '1234567890'.includes(key.name);\nexport const isEnterKey = (key) => key.name === 'enter' || key.name === 'return';\nexport const isShiftKey = (key) => key.shift;\n",
|
|
33
|
+
"export class AbortPromptError extends Error {\n name = 'AbortPromptError';\n message = 'Prompt was aborted';\n constructor(options) {\n super();\n this.cause = options?.cause;\n }\n}\nexport class CancelPromptError extends Error {\n name = 'CancelPromptError';\n message = 'Prompt was canceled';\n}\nexport class ExitPromptError extends Error {\n name = 'ExitPromptError';\n}\nexport class HookError extends Error {\n name = 'HookError';\n}\nexport class ValidationError extends Error {\n name = 'ValidationError';\n}\n",
|
|
34
|
+
"import { AsyncResource } from 'node:async_hooks';\nimport { withPointer, handleChange } from \"./hook-engine.js\";\nfunction isFactory(value) {\n return typeof value === 'function';\n}\nexport function useState(defaultValue) {\n return withPointer((pointer) => {\n const setState = AsyncResource.bind(function setState(newValue) {\n // Noop if the value is still the same.\n if (pointer.get() !== newValue) {\n pointer.set(newValue);\n // Trigger re-render\n handleChange();\n }\n });\n if (pointer.initialized) {\n return [pointer.get(), setState];\n }\n const value = isFactory(defaultValue) ? defaultValue() : defaultValue;\n pointer.set(value);\n return [value, setState];\n });\n}\n",
|
|
35
|
+
"/* eslint @typescript-eslint/no-explicit-any: [\"off\"] */\nimport { AsyncLocalStorage, AsyncResource } from 'node:async_hooks';\nimport { HookError, ValidationError } from \"./errors.js\";\nconst hookStorage = new AsyncLocalStorage();\nfunction createStore(rl) {\n const store = {\n rl,\n hooks: [],\n hooksCleanup: [],\n hooksEffect: [],\n index: 0,\n handleChange() { },\n };\n return store;\n}\n// Run callback in with the hook engine setup.\nexport function withHooks(rl, cb) {\n const store = createStore(rl);\n return hookStorage.run(store, () => {\n function cycle(render) {\n store.handleChange = () => {\n store.index = 0;\n render();\n };\n store.handleChange();\n }\n return cb(cycle);\n });\n}\n// Safe getStore utility that'll return the store or throw if undefined.\nfunction getStore() {\n const store = hookStorage.getStore();\n if (!store) {\n throw new HookError('[Inquirer] Hook functions can only be called from within a prompt');\n }\n return store;\n}\nexport function readline() {\n return getStore().rl;\n}\n// Merge state updates happening within the callback function to avoid multiple renders.\nexport function withUpdates(fn) {\n const wrapped = (...args) => {\n const store = getStore();\n let shouldUpdate = false;\n const oldHandleChange = store.handleChange;\n store.handleChange = () => {\n shouldUpdate = true;\n };\n const returnValue = fn(...args);\n if (shouldUpdate) {\n oldHandleChange();\n }\n store.handleChange = oldHandleChange;\n return returnValue;\n };\n return AsyncResource.bind(wrapped);\n}\nexport function withPointer(cb) {\n const store = getStore();\n const { index } = store;\n const pointer = {\n get() {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n return store.hooks[index];\n },\n set(value) {\n store.hooks[index] = value;\n },\n initialized: index in store.hooks,\n };\n const returnValue = cb(pointer);\n store.index++;\n return returnValue;\n}\nexport function handleChange() {\n getStore().handleChange();\n}\nexport const effectScheduler = {\n queue(cb) {\n const store = getStore();\n const { index } = store;\n store.hooksEffect.push(() => {\n store.hooksCleanup[index]?.();\n const cleanFn = cb(readline());\n if (cleanFn != null && typeof cleanFn !== 'function') {\n throw new ValidationError('useEffect return value must be a cleanup function or nothing.');\n }\n store.hooksCleanup[index] = cleanFn;\n });\n },\n run() {\n const store = getStore();\n withUpdates(() => {\n store.hooksEffect.forEach((effect) => {\n effect();\n });\n // Warning: Clean the hooks before exiting the `withUpdates` block.\n // Failure to do so means an updates would hit the same effects again.\n store.hooksEffect.length = 0;\n })();\n },\n clearAll() {\n const store = getStore();\n store.hooksCleanup.forEach((cleanFn) => {\n cleanFn?.();\n });\n store.hooksEffect.length = 0;\n store.hooksCleanup.length = 0;\n },\n};\n",
|
|
36
|
+
"import { withPointer, effectScheduler } from \"./hook-engine.js\";\nexport function useEffect(cb, depArray) {\n withPointer((pointer) => {\n const oldDeps = pointer.get();\n const hasChanged = !Array.isArray(oldDeps) || depArray.some((dep, i) => !Object.is(dep, oldDeps[i]));\n if (hasChanged) {\n effectScheduler.queue(cb);\n }\n pointer.set(depArray);\n });\n}\n",
|
|
37
|
+
"import { styleText } from 'node:util';\nimport figures from '@inquirer/figures';\nexport const defaultTheme = {\n prefix: {\n idle: styleText('blue', '?'),\n done: styleText('green', figures.tick),\n },\n spinner: {\n interval: 80,\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'].map((frame) => styleText('yellow', frame)),\n },\n style: {\n answer: (text) => styleText('cyan', text),\n message: (text) => styleText('bold', text),\n error: (text) => styleText('red', `> ${text}`),\n defaultAnswer: (text) => styleText('dim', `(${text})`),\n help: (text) => styleText('dim', text),\n highlight: (text) => styleText('cyan', text),\n key: (text) => styleText('cyan', styleText('bold', `<${text}>`)),\n },\n};\n",
|
|
38
|
+
"// process.env dot-notation access prints:\n// Property 'TERM' comes from an index signature, so it must be accessed with ['TERM'].ts(4111)\n/* eslint dot-notation: [\"off\"] */\nimport process from 'node:process';\n// Ported from is-unicode-supported\nfunction isUnicodeSupported() {\n if (!process.platform.startsWith('win')) {\n return process.env['TERM'] !== 'linux'; // Linux console (kernel)\n }\n return (Boolean(process.env['CI']) || // CI environments generally support unicode\n Boolean(process.env['WT_SESSION']) || // Windows Terminal\n Boolean(process.env['TERMINUS_SUBLIME']) || // Terminus (<0.2.27)\n process.env['ConEmuTask'] === '{cmd::Cmder}' || // ConEmu and cmder\n process.env['TERM_PROGRAM'] === 'Terminus-Sublime' ||\n process.env['TERM_PROGRAM'] === 'vscode' ||\n process.env['TERM'] === 'xterm-256color' ||\n process.env['TERM'] === 'alacritty' ||\n process.env['TERMINAL_EMULATOR'] === 'JetBrains-JediTerm');\n}\n// Ported from figures\nconst common = {\n circleQuestionMark: '(?)',\n questionMarkPrefix: '(?)',\n square: '█',\n squareDarkShade: '▓',\n squareMediumShade: '▒',\n squareLightShade: '░',\n squareTop: '▀',\n squareBottom: '▄',\n squareLeft: '▌',\n squareRight: '▐',\n squareCenter: '■',\n bullet: '●',\n dot: '․',\n ellipsis: '…',\n pointerSmall: '›',\n triangleUp: '▲',\n triangleUpSmall: '▴',\n triangleDown: '▼',\n triangleDownSmall: '▾',\n triangleLeftSmall: '◂',\n triangleRightSmall: '▸',\n home: '⌂',\n heart: '♥',\n musicNote: '♪',\n musicNoteBeamed: '♫',\n arrowUp: '↑',\n arrowDown: '↓',\n arrowLeft: '←',\n arrowRight: '→',\n arrowLeftRight: '↔',\n arrowUpDown: '↕',\n almostEqual: '≈',\n notEqual: '≠',\n lessOrEqual: '≤',\n greaterOrEqual: '≥',\n identical: '≡',\n infinity: '∞',\n subscriptZero: '₀',\n subscriptOne: '₁',\n subscriptTwo: '₂',\n subscriptThree: '₃',\n subscriptFour: '₄',\n subscriptFive: '₅',\n subscriptSix: '₆',\n subscriptSeven: '₇',\n subscriptEight: '₈',\n subscriptNine: '₉',\n oneHalf: '½',\n oneThird: '⅓',\n oneQuarter: '¼',\n oneFifth: '⅕',\n oneSixth: '⅙',\n oneEighth: '⅛',\n twoThirds: '⅔',\n twoFifths: '⅖',\n threeQuarters: '¾',\n threeFifths: '⅗',\n threeEighths: '⅜',\n fourFifths: '⅘',\n fiveSixths: '⅚',\n fiveEighths: '⅝',\n sevenEighths: '⅞',\n line: '─',\n lineBold: '━',\n lineDouble: '═',\n lineDashed0: '┄',\n lineDashed1: '┅',\n lineDashed2: '┈',\n lineDashed3: '┉',\n lineDashed4: '╌',\n lineDashed5: '╍',\n lineDashed6: '╴',\n lineDashed7: '╶',\n lineDashed8: '╸',\n lineDashed9: '╺',\n lineDashed10: '╼',\n lineDashed11: '╾',\n lineDashed12: '−',\n lineDashed13: '–',\n lineDashed14: '‐',\n lineDashed15: '⁃',\n lineVertical: '│',\n lineVerticalBold: '┃',\n lineVerticalDouble: '║',\n lineVerticalDashed0: '┆',\n lineVerticalDashed1: '┇',\n lineVerticalDashed2: '┊',\n lineVerticalDashed3: '┋',\n lineVerticalDashed4: '╎',\n lineVerticalDashed5: '╏',\n lineVerticalDashed6: '╵',\n lineVerticalDashed7: '╷',\n lineVerticalDashed8: '╹',\n lineVerticalDashed9: '╻',\n lineVerticalDashed10: '╽',\n lineVerticalDashed11: '╿',\n lineDownLeft: '┐',\n lineDownLeftArc: '╮',\n lineDownBoldLeftBold: '┓',\n lineDownBoldLeft: '┒',\n lineDownLeftBold: '┑',\n lineDownDoubleLeftDouble: '╗',\n lineDownDoubleLeft: '╖',\n lineDownLeftDouble: '╕',\n lineDownRight: '┌',\n lineDownRightArc: '╭',\n lineDownBoldRightBold: '┏',\n lineDownBoldRight: '┎',\n lineDownRightBold: '┍',\n lineDownDoubleRightDouble: '╔',\n lineDownDoubleRight: '╓',\n lineDownRightDouble: '╒',\n lineUpLeft: '┘',\n lineUpLeftArc: '╯',\n lineUpBoldLeftBold: '┛',\n lineUpBoldLeft: '┚',\n lineUpLeftBold: '┙',\n lineUpDoubleLeftDouble: '╝',\n lineUpDoubleLeft: '╜',\n lineUpLeftDouble: '╛',\n lineUpRight: '└',\n lineUpRightArc: '╰',\n lineUpBoldRightBold: '┗',\n lineUpBoldRight: '┖',\n lineUpRightBold: '┕',\n lineUpDoubleRightDouble: '╚',\n lineUpDoubleRight: '╙',\n lineUpRightDouble: '╘',\n lineUpDownLeft: '┤',\n lineUpBoldDownBoldLeftBold: '┫',\n lineUpBoldDownBoldLeft: '┨',\n lineUpDownLeftBold: '┥',\n lineUpBoldDownLeftBold: '┩',\n lineUpDownBoldLeftBold: '┪',\n lineUpDownBoldLeft: '┧',\n lineUpBoldDownLeft: '┦',\n lineUpDoubleDownDoubleLeftDouble: '╣',\n lineUpDoubleDownDoubleLeft: '╢',\n lineUpDownLeftDouble: '╡',\n lineUpDownRight: '├',\n lineUpBoldDownBoldRightBold: '┣',\n lineUpBoldDownBoldRight: '┠',\n lineUpDownRightBold: '┝',\n lineUpBoldDownRightBold: '┡',\n lineUpDownBoldRightBold: '┢',\n lineUpDownBoldRight: '┟',\n lineUpBoldDownRight: '┞',\n lineUpDoubleDownDoubleRightDouble: '╠',\n lineUpDoubleDownDoubleRight: '╟',\n lineUpDownRightDouble: '╞',\n lineDownLeftRight: '┬',\n lineDownBoldLeftBoldRightBold: '┳',\n lineDownLeftBoldRightBold: '┯',\n lineDownBoldLeftRight: '┰',\n lineDownBoldLeftBoldRight: '┱',\n lineDownBoldLeftRightBold: '┲',\n lineDownLeftRightBold: '┮',\n lineDownLeftBoldRight: '┭',\n lineDownDoubleLeftDoubleRightDouble: '╦',\n lineDownDoubleLeftRight: '╥',\n lineDownLeftDoubleRightDouble: '╤',\n lineUpLeftRight: '┴',\n lineUpBoldLeftBoldRightBold: '┻',\n lineUpLeftBoldRightBold: '┷',\n lineUpBoldLeftRight: '┸',\n lineUpBoldLeftBoldRight: '┹',\n lineUpBoldLeftRightBold: '┺',\n lineUpLeftRightBold: '┶',\n lineUpLeftBoldRight: '┵',\n lineUpDoubleLeftDoubleRightDouble: '╩',\n lineUpDoubleLeftRight: '╨',\n lineUpLeftDoubleRightDouble: '╧',\n lineUpDownLeftRight: '┼',\n lineUpBoldDownBoldLeftBoldRightBold: '╋',\n lineUpDownBoldLeftBoldRightBold: '╈',\n lineUpBoldDownLeftBoldRightBold: '╇',\n lineUpBoldDownBoldLeftRightBold: '╊',\n lineUpBoldDownBoldLeftBoldRight: '╉',\n lineUpBoldDownLeftRight: '╀',\n lineUpDownBoldLeftRight: '╁',\n lineUpDownLeftBoldRight: '┽',\n lineUpDownLeftRightBold: '┾',\n lineUpBoldDownBoldLeftRight: '╂',\n lineUpDownLeftBoldRightBold: '┿',\n lineUpBoldDownLeftBoldRight: '╃',\n lineUpBoldDownLeftRightBold: '╄',\n lineUpDownBoldLeftBoldRight: '╅',\n lineUpDownBoldLeftRightBold: '╆',\n lineUpDoubleDownDoubleLeftDoubleRightDouble: '╬',\n lineUpDoubleDownDoubleLeftRight: '╫',\n lineUpDownLeftDoubleRightDouble: '╪',\n lineCross: '╳',\n lineBackslash: '╲',\n lineSlash: '╱',\n};\nconst specialMainSymbols = {\n tick: '✔',\n info: 'ℹ',\n warning: '⚠',\n cross: '✘',\n squareSmall: '◻',\n squareSmallFilled: '◼',\n circle: '◯',\n circleFilled: '◉',\n circleDotted: '◌',\n circleDouble: '◎',\n circleCircle: 'ⓞ',\n circleCross: 'ⓧ',\n circlePipe: 'Ⓘ',\n radioOn: '◉',\n radioOff: '◯',\n checkboxOn: '☒',\n checkboxOff: '☐',\n checkboxCircleOn: 'ⓧ',\n checkboxCircleOff: 'Ⓘ',\n pointer: '❯',\n triangleUpOutline: '△',\n triangleLeft: '◀',\n triangleRight: '▶',\n lozenge: '◆',\n lozengeOutline: '◇',\n hamburger: '☰',\n smiley: '㋡',\n mustache: '෴',\n star: '★',\n play: '▶',\n nodejs: '⬢',\n oneSeventh: '⅐',\n oneNinth: '⅑',\n oneTenth: '⅒',\n};\nconst specialFallbackSymbols = {\n tick: '√',\n info: 'i',\n warning: '‼',\n cross: '×',\n squareSmall: '□',\n squareSmallFilled: '■',\n circle: '( )',\n circleFilled: '(*)',\n circleDotted: '( )',\n circleDouble: '( )',\n circleCircle: '(○)',\n circleCross: '(×)',\n circlePipe: '(│)',\n radioOn: '(*)',\n radioOff: '( )',\n checkboxOn: '[×]',\n checkboxOff: '[ ]',\n checkboxCircleOn: '(×)',\n checkboxCircleOff: '( )',\n pointer: '>',\n triangleUpOutline: '∆',\n triangleLeft: '◄',\n triangleRight: '►',\n lozenge: '♦',\n lozengeOutline: '◊',\n hamburger: '≡',\n smiley: '☺',\n mustache: '┌─┐',\n star: '✶',\n play: '►',\n nodejs: '♦',\n oneSeventh: '1/7',\n oneNinth: '1/9',\n oneTenth: '1/10',\n};\nexport const mainSymbols = {\n ...common,\n ...specialMainSymbols,\n};\nexport const fallbackSymbols = {\n ...common,\n ...specialFallbackSymbols,\n};\nconst shouldUseMain = isUnicodeSupported();\nconst figures = shouldUseMain\n ? mainSymbols\n : fallbackSymbols;\nexport default figures;\nconst replacements = Object.entries(specialMainSymbols);\n// On terminals which do not support Unicode symbols, substitute them to other symbols\nexport const replaceSymbols = (string, { useFallback = !shouldUseMain } = {}) => {\n if (useFallback) {\n for (const [key, mainSymbol] of replacements) {\n const fallbackSymbol = fallbackSymbols[key];\n if (!fallbackSymbol) {\n throw new Error(`Unable to find fallback for ${key}`);\n }\n string = string.replaceAll(mainSymbol, fallbackSymbol);\n }\n }\n return string;\n};\n",
|
|
39
|
+
"import { defaultTheme } from \"./theme.js\";\nfunction isPlainObject(value) {\n if (typeof value !== 'object' || value === null)\n return false;\n let proto = value;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(value) === proto;\n}\nfunction deepMerge(...objects) {\n const output = {};\n for (const obj of objects) {\n for (const [key, value] of Object.entries(obj)) {\n const prevValue = output[key];\n output[key] =\n isPlainObject(prevValue) && isPlainObject(value)\n ? deepMerge(prevValue, value)\n : value;\n }\n }\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n return output;\n}\nexport function makeTheme(...themes) {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n const themesToMerge = [\n defaultTheme,\n ...themes.filter((theme) => theme != null),\n ];\n return deepMerge(...themesToMerge);\n}\n",
|
|
40
|
+
"import { useState } from \"./use-state.js\";\nimport { useEffect } from \"./use-effect.js\";\nimport { makeTheme } from \"./make-theme.js\";\nexport function usePrefix({ status = 'idle', theme, }) {\n const [showLoader, setShowLoader] = useState(false);\n const [tick, setTick] = useState(0);\n const { prefix, spinner } = makeTheme(theme);\n useEffect(() => {\n if (status === 'loading') {\n let tickInterval;\n let inc = -1;\n // Delay displaying spinner by 300ms, to avoid flickering\n const delayTimeout = setTimeout(() => {\n setShowLoader(true);\n tickInterval = setInterval(() => {\n inc = inc + 1;\n setTick(inc % spinner.frames.length);\n }, spinner.interval);\n }, 300);\n return () => {\n clearTimeout(delayTimeout);\n clearInterval(tickInterval);\n };\n }\n else {\n setShowLoader(false);\n }\n }, [status]);\n if (showLoader) {\n return spinner.frames[tick];\n }\n // There's a delay before we show the loader. So we want to ignore `loading` here, and pass idle instead.\n const iconName = status === 'loading' ? 'idle' : status;\n return typeof prefix === 'string' ? prefix : (prefix[iconName] ?? prefix['idle']);\n}\n",
|
|
41
|
+
"import { withPointer } from \"./hook-engine.js\";\nexport function useMemo(fn, dependencies) {\n return withPointer((pointer) => {\n const prev = pointer.get();\n if (!prev ||\n prev.dependencies.length !== dependencies.length ||\n prev.dependencies.some((dep, i) => dep !== dependencies[i])) {\n const value = fn();\n pointer.set({ value, dependencies });\n return value;\n }\n return prev.value;\n });\n}\n",
|
|
42
|
+
"import { useState } from \"./use-state.js\";\nexport function useRef(val) {\n return useState({ current: val })[0];\n}\n",
|
|
43
|
+
"import { useRef } from \"./use-ref.js\";\nimport { useEffect } from \"./use-effect.js\";\nimport { withUpdates } from \"./hook-engine.js\";\nexport function useKeypress(userHandler) {\n const signal = useRef(userHandler);\n signal.current = userHandler;\n useEffect((rl) => {\n let ignore = false;\n const handler = withUpdates((_input, event) => {\n if (ignore)\n return;\n void signal.current(event, rl);\n });\n rl.input.on('keypress', handler);\n return () => {\n ignore = true;\n rl.input.removeListener('keypress', handler);\n };\n }, []);\n}\n",
|
|
44
|
+
"import cliWidth from 'cli-width';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { readline } from \"./hook-engine.js\";\n/**\n * Force line returns at specific width. This function is ANSI code friendly and it'll\n * ignore invisible codes during width calculation.\n * @param {string} content\n * @param {number} width\n * @return {string}\n */\nexport function breakLines(content, width) {\n return content\n .split('\\n')\n .flatMap((line) => wrapAnsi(line, width, { trim: false, hard: true })\n .split('\\n')\n .map((str) => str.trimEnd()))\n .join('\\n');\n}\n/**\n * Returns the width of the active readline, or 80 as default value.\n * @returns {number}\n */\nexport function readlineWidth() {\n return cliWidth({ defaultWidth: 80, output: readline().output });\n}\n",
|
|
45
|
+
"/* MAIN */\nconst getCodePointsLength = (() => {\n const SURROGATE_PAIR_RE = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n return (input) => {\n let surrogatePairsNr = 0;\n SURROGATE_PAIR_RE.lastIndex = 0;\n while (SURROGATE_PAIR_RE.test(input)) {\n surrogatePairsNr += 1;\n }\n return input.length - surrogatePairsNr;\n };\n})();\nconst isFullWidth = (x) => {\n return x === 0x3000 || x >= 0xFF01 && x <= 0xFF60 || x >= 0xFFE0 && x <= 0xFFE6;\n};\nconst isWideNotCJKTNotEmoji = (x) => {\n return x === 0x231B || x === 0x2329 || x >= 0x2FF0 && x <= 0x2FFF || x >= 0x3001 && x <= 0x303E || x >= 0x3099 && x <= 0x30FF || x >= 0x3105 && x <= 0x312F || x >= 0x3131 && x <= 0x318E || x >= 0x3190 && x <= 0x31E3 || x >= 0x31EF && x <= 0x321E || x >= 0x3220 && x <= 0x3247 || x >= 0x3250 && x <= 0x4DBF || x >= 0xFE10 && x <= 0xFE19 || x >= 0xFE30 && x <= 0xFE52 || x >= 0xFE54 && x <= 0xFE66 || x >= 0xFE68 && x <= 0xFE6B || x >= 0x1F200 && x <= 0x1F202 || x >= 0x1F210 && x <= 0x1F23B || x >= 0x1F240 && x <= 0x1F248 || x >= 0x20000 && x <= 0x2FFFD || x >= 0x30000 && x <= 0x3FFFD;\n};\n/* EXPORT */\nexport { getCodePointsLength, isFullWidth, isWideNotCJKTNotEmoji };\n",
|
|
46
|
+
"/* IMPORT */\nimport { getCodePointsLength, isFullWidth, isWideNotCJKTNotEmoji } from './utils.js';\n/* HELPERS */\nconst ANSI_RE = /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\\u001b\\]8;[^;]*;.*?(?:\\u0007|\\u001b\\u005c)/y;\nconst CONTROL_RE = /[\\x00-\\x08\\x0A-\\x1F\\x7F-\\x9F]{1,1000}/y;\nconst CJKT_WIDE_RE = /(?:(?![\\uFF61-\\uFF9F\\uFF00-\\uFFEF])[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}\\p{Script=Tangut}]){1,1000}/yu;\nconst TAB_RE = /\\t{1,1000}/y;\nconst EMOJI_RE = /[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*/yu;\nconst LATIN_RE = /(?:[\\x20-\\x7E\\xA0-\\xFF](?!\\uFE0F)){1,1000}/y;\nconst MODIFIER_RE = /\\p{M}+/gu;\nconst NO_TRUNCATION = { limit: Infinity, ellipsis: '' };\n/* MAIN */\nconst getStringTruncatedWidth = (input, truncationOptions = {}, widthOptions = {}) => {\n /* CONSTANTS */\n const LIMIT = truncationOptions.limit ?? Infinity;\n const ELLIPSIS = truncationOptions.ellipsis ?? '';\n const ELLIPSIS_WIDTH = truncationOptions?.ellipsisWidth ?? (ELLIPSIS ? getStringTruncatedWidth(ELLIPSIS, NO_TRUNCATION, widthOptions).width : 0);\n const ANSI_WIDTH = 0;\n const CONTROL_WIDTH = widthOptions.controlWidth ?? 0;\n const TAB_WIDTH = widthOptions.tabWidth ?? 8;\n const EMOJI_WIDTH = widthOptions.emojiWidth ?? 2;\n const FULL_WIDTH_WIDTH = 2;\n const REGULAR_WIDTH = widthOptions.regularWidth ?? 1;\n const WIDE_WIDTH = widthOptions.wideWidth ?? FULL_WIDTH_WIDTH;\n const PARSE_BLOCKS = [\n [LATIN_RE, REGULAR_WIDTH],\n [ANSI_RE, ANSI_WIDTH],\n [CONTROL_RE, CONTROL_WIDTH],\n [TAB_RE, TAB_WIDTH],\n [EMOJI_RE, EMOJI_WIDTH],\n [CJKT_WIDE_RE, WIDE_WIDTH],\n ];\n /* STATE */\n let indexPrev = 0;\n let index = 0;\n let length = input.length;\n let lengthExtra = 0;\n let truncationEnabled = false;\n let truncationIndex = length;\n let truncationLimit = Math.max(0, LIMIT - ELLIPSIS_WIDTH);\n let unmatchedStart = 0;\n let unmatchedEnd = 0;\n let width = 0;\n let widthExtra = 0;\n /* PARSE LOOP */\n outer: while (true) {\n /* UNMATCHED */\n if ((unmatchedEnd > unmatchedStart) || (index >= length && index > indexPrev)) {\n const unmatched = input.slice(unmatchedStart, unmatchedEnd) || input.slice(indexPrev, index);\n lengthExtra = 0;\n for (const char of unmatched.replaceAll(MODIFIER_RE, '')) {\n const codePoint = char.codePointAt(0) || 0;\n if (isFullWidth(codePoint)) {\n widthExtra = FULL_WIDTH_WIDTH;\n }\n else if (isWideNotCJKTNotEmoji(codePoint)) {\n widthExtra = WIDE_WIDTH;\n }\n else {\n widthExtra = REGULAR_WIDTH;\n }\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, Math.max(unmatchedStart, indexPrev) + lengthExtra);\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break outer;\n }\n lengthExtra += char.length;\n width += widthExtra;\n }\n unmatchedStart = unmatchedEnd = 0;\n }\n /* EXITING */\n if (index >= length) {\n break outer;\n }\n /* PARSE BLOCKS */\n for (let i = 0, l = PARSE_BLOCKS.length; i < l; i++) {\n const [BLOCK_RE, BLOCK_WIDTH] = PARSE_BLOCKS[i];\n BLOCK_RE.lastIndex = index;\n if (BLOCK_RE.test(input)) {\n lengthExtra = BLOCK_RE === CJKT_WIDE_RE ? getCodePointsLength(input.slice(index, BLOCK_RE.lastIndex)) : BLOCK_RE === EMOJI_RE ? 1 : BLOCK_RE.lastIndex - index;\n widthExtra = lengthExtra * BLOCK_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / BLOCK_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break outer;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = BLOCK_RE.lastIndex;\n continue outer;\n }\n }\n /* UNMATCHED INDEX */\n index += 1;\n }\n /* RETURN */\n return {\n width: truncationEnabled ? truncationLimit : width,\n index: truncationEnabled ? truncationIndex : length,\n truncated: truncationEnabled,\n ellipsed: truncationEnabled && LIMIT >= ELLIPSIS_WIDTH\n };\n};\n/* EXPORT */\nexport default getStringTruncatedWidth;\n",
|
|
47
|
+
"/* IMPORT */\nimport fastStringTruncatedWidth from 'fast-string-truncated-width';\n/* HELPERS */\nconst NO_TRUNCATION = {\n limit: Infinity,\n ellipsis: '',\n ellipsisWidth: 0,\n};\n/* MAIN */\nconst fastStringWidth = (input, options = {}) => {\n return fastStringTruncatedWidth(input, NO_TRUNCATION, options).width;\n};\n/* EXPORT */\nexport default fastStringWidth;\n",
|
|
48
|
+
"import stringWidth from 'fast-string-width';\nconst ESC = '\\x1B';\nconst CSI = '\\x9B';\nconst END_CODE = 39;\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;\nconst GROUP_REGEX = new RegExp(`(?:\\\\${ANSI_CSI}(?<code>\\\\d+)m|\\\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`, 'y');\nconst getClosingCode = (openingCode) => {\n if (openingCode >= 30 && openingCode <= 37)\n return 39;\n if (openingCode >= 90 && openingCode <= 97)\n return 39;\n if (openingCode >= 40 && openingCode <= 47)\n return 49;\n if (openingCode >= 100 && openingCode <= 107)\n return 49;\n if (openingCode === 1 || openingCode === 2)\n return 22;\n if (openingCode === 3)\n return 23;\n if (openingCode === 4)\n return 24;\n if (openingCode === 7)\n return 27;\n if (openingCode === 8)\n return 28;\n if (openingCode === 9)\n return 29;\n if (openingCode === 0)\n return 0;\n return undefined;\n};\nconst wrapAnsiCode = (code) => `${ESC}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = (url) => `${ESC}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;\nconst wrapWord = (rows, word, columns) => {\n const characters = word[Symbol.iterator]();\n let isInsideEscape = false;\n let isInsideLinkEscape = false;\n let lastRow = rows.at(-1);\n let visible = lastRow === undefined ? 0 : stringWidth(lastRow);\n let currentCharacter = characters.next();\n let nextCharacter = characters.next();\n let rawCharacterIndex = 0;\n while (!currentCharacter.done) {\n const character = currentCharacter.value;\n const characterLength = stringWidth(character);\n if (visible + characterLength <= columns) {\n rows[rows.length - 1] += character;\n }\n else {\n rows.push(character);\n visible = 0;\n }\n if (character === ESC || character === CSI) {\n isInsideEscape = true;\n isInsideLinkEscape = word.startsWith(ANSI_ESCAPE_LINK, rawCharacterIndex + 1);\n }\n if (isInsideEscape) {\n if (isInsideLinkEscape) {\n if (character === ANSI_ESCAPE_BELL) {\n isInsideEscape = false;\n isInsideLinkEscape = false;\n }\n }\n else if (character === ANSI_SGR_TERMINATOR) {\n isInsideEscape = false;\n }\n }\n else {\n visible += characterLength;\n if (visible === columns && !nextCharacter.done) {\n rows.push('');\n visible = 0;\n }\n }\n currentCharacter = nextCharacter;\n nextCharacter = characters.next();\n rawCharacterIndex += character.length;\n }\n lastRow = rows.at(-1);\n if (!visible && lastRow !== undefined && lastRow.length && rows.length > 1) {\n rows[rows.length - 2] += rows.pop();\n }\n};\nconst stringVisibleTrimSpacesRight = (string) => {\n const words = string.split(' ');\n let last = words.length;\n while (last) {\n if (stringWidth(words[last - 1])) {\n break;\n }\n last--;\n }\n if (last === words.length) {\n return string;\n }\n return words.slice(0, last).join(' ') + words.slice(last).join('');\n};\nconst exec = (string, columns, options = {}) => {\n if (options.trim !== false && string.trim() === '') {\n return '';\n }\n let returnValue = '';\n let escapeCode;\n let escapeUrl;\n const words = string.split(' ');\n let rows = [''];\n let rowLength = 0;\n for (let index = 0; index < words.length; index++) {\n const word = words[index];\n if (options.trim !== false) {\n const row = rows.at(-1) ?? '';\n const trimmed = row.trimStart();\n if (row.length !== trimmed.length) {\n rows[rows.length - 1] = trimmed;\n rowLength = stringWidth(trimmed);\n }\n }\n if (index !== 0) {\n if (rowLength >= columns &&\n (options.wordWrap === false || options.trim === false)) {\n rows.push('');\n rowLength = 0;\n }\n if (rowLength || options.trim === false) {\n rows[rows.length - 1] += ' ';\n rowLength++;\n }\n }\n const wordLength = stringWidth(word);\n if (options.hard && wordLength > columns) {\n const remainingColumns = columns - rowLength;\n const breaksStartingThisLine = 1 + Math.floor((wordLength - remainingColumns - 1) / columns);\n const breaksStartingNextLine = Math.floor((wordLength - 1) / columns);\n if (breaksStartingNextLine < breaksStartingThisLine) {\n rows.push('');\n }\n wrapWord(rows, word, columns);\n rowLength = stringWidth(rows.at(-1) ?? '');\n continue;\n }\n if (rowLength + wordLength > columns && rowLength && wordLength) {\n if (options.wordWrap === false && rowLength < columns) {\n wrapWord(rows, word, columns);\n rowLength = stringWidth(rows.at(-1) ?? '');\n continue;\n }\n rows.push('');\n rowLength = 0;\n }\n if (rowLength + wordLength > columns && options.wordWrap === false) {\n wrapWord(rows, word, columns);\n rowLength = stringWidth(rows.at(-1) ?? '');\n continue;\n }\n rows[rows.length - 1] += word;\n rowLength += wordLength;\n }\n if (options.trim !== false) {\n rows = rows.map((row) => stringVisibleTrimSpacesRight(row));\n }\n const preString = rows.join('\\n');\n let inSurrogate = false;\n for (let i = 0; i < preString.length; i++) {\n const character = preString[i];\n returnValue += character;\n if (!inSurrogate) {\n inSurrogate = character >= '\\ud800' && character <= '\\udbff';\n if (inSurrogate) {\n continue;\n }\n }\n else {\n inSurrogate = false;\n }\n if (character === ESC || character === CSI) {\n GROUP_REGEX.lastIndex = i + 1;\n const groupsResult = GROUP_REGEX.exec(preString);\n const groups = groupsResult?.groups;\n if (groups?.code !== undefined) {\n const code = Number.parseFloat(groups.code);\n escapeCode = code === END_CODE ? undefined : code;\n }\n else if (groups?.uri !== undefined) {\n escapeUrl = groups.uri.length === 0 ? undefined : groups.uri;\n }\n }\n if (preString[i + 1] === '\\n') {\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink('');\n }\n const closingCode = escapeCode ? getClosingCode(escapeCode) : undefined;\n if (escapeCode && closingCode) {\n returnValue += wrapAnsiCode(closingCode);\n }\n }\n else if (character === '\\n') {\n if (escapeCode && getClosingCode(escapeCode)) {\n returnValue += wrapAnsiCode(escapeCode);\n }\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink(escapeUrl);\n }\n }\n }\n return returnValue;\n};\nconst CRLF_OR_LF = /\\r?\\n/;\nexport function wrapAnsi(string, columns, options) {\n return String(string)\n .normalize()\n .split(CRLF_OR_LF)\n .map((line) => exec(line, columns, options))\n .join('\\n');\n}\n//# sourceMappingURL=main.js.map",
|
|
49
|
+
"import { useRef } from \"../use-ref.js\";\nimport { readlineWidth, breakLines } from \"../utils.js\";\nfunction usePointerPosition({ active, renderedItems, pageSize, loop, }) {\n const state = useRef({\n lastPointer: active,\n lastActive: undefined,\n });\n const { lastPointer, lastActive } = state.current;\n const middle = Math.floor(pageSize / 2);\n const renderedLength = renderedItems.reduce((acc, item) => acc + item.length, 0);\n const defaultPointerPosition = renderedItems\n .slice(0, active)\n .reduce((acc, item) => acc + item.length, 0);\n let pointer = defaultPointerPosition;\n if (renderedLength > pageSize) {\n if (loop) {\n /**\n * Creates the next position for the pointer considering an infinitely\n * looping list of items to be rendered on the page.\n *\n * The goal is to progressively move the cursor to the middle position as the user move down, and then keep\n * the cursor there. When the user move up, maintain the cursor position.\n */\n // By default, keep the cursor position as-is.\n pointer = lastPointer;\n if (\n // First render, skip this logic.\n lastActive != null &&\n // Only move the pointer down when the user moves down.\n lastActive < active &&\n // Check user didn't move up across page boundary.\n active - lastActive < pageSize) {\n pointer = Math.min(\n // Furthest allowed position for the pointer is the middle of the list\n middle, Math.abs(active - lastActive) === 1\n ? Math.min(\n // Move the pointer at most the height of the last active item.\n lastPointer + (renderedItems[lastActive]?.length ?? 0), \n // If the user moved by one item, move the pointer to the natural position of the active item as\n // long as it doesn't move the cursor up.\n Math.max(defaultPointerPosition, lastPointer))\n : // Otherwise, move the pointer down by the difference between the active and last active item.\n lastPointer + active - lastActive);\n }\n }\n else {\n /**\n * Creates the next position for the pointer considering a finite list of\n * items to be rendered on a page.\n *\n * The goal is to keep the pointer in the middle of the page whenever possible, until\n * we reach the bounds of the list (top or bottom). In which case, the cursor moves progressively\n * to the bottom or top of the list.\n */\n const spaceUnderActive = renderedItems\n .slice(active)\n .reduce((acc, item) => acc + item.length, 0);\n pointer =\n spaceUnderActive < pageSize - middle\n ? // If the active item is near the end of the list, progressively move the cursor towards the end.\n pageSize - spaceUnderActive\n : // Otherwise, progressively move the pointer to the middle of the list.\n Math.min(defaultPointerPosition, middle);\n }\n }\n // Save state for the next render\n state.current.lastPointer = pointer;\n state.current.lastActive = active;\n return pointer;\n}\nexport function usePagination({ items, active, renderItem, pageSize, loop = true, }) {\n const width = readlineWidth();\n const bound = (num) => ((num % items.length) + items.length) % items.length;\n const renderedItems = items.map((item, index) => {\n if (item == null)\n return [];\n return breakLines(renderItem({ item, index, isActive: index === active }), width).split('\\n');\n });\n const renderedLength = renderedItems.reduce((acc, item) => acc + item.length, 0);\n const renderItemAtIndex = (index) => renderedItems[index] ?? [];\n const pointer = usePointerPosition({ active, renderedItems, pageSize, loop });\n // Render the active item to decide the position.\n // If the active item fits under the pointer, we render it there.\n // Otherwise, we need to render it to fit at the bottom of the page; moving the pointer up.\n const activeItem = renderItemAtIndex(active).slice(0, pageSize);\n const activeItemPosition = pointer + activeItem.length <= pageSize ? pointer : pageSize - activeItem.length;\n // Create an array of lines for the page, and add the lines of the active item into the page\n const pageBuffer = Array.from({ length: pageSize });\n pageBuffer.splice(activeItemPosition, activeItem.length, ...activeItem);\n // Store to prevent rendering the same item twice\n const itemVisited = new Set([active]);\n // Fill the page under the active item\n let bufferPointer = activeItemPosition + activeItem.length;\n let itemPointer = bound(active + 1);\n while (bufferPointer < pageSize &&\n !itemVisited.has(itemPointer) &&\n (loop && renderedLength > pageSize ? itemPointer !== active : itemPointer > active)) {\n const lines = renderItemAtIndex(itemPointer);\n const linesToAdd = lines.slice(0, pageSize - bufferPointer);\n pageBuffer.splice(bufferPointer, linesToAdd.length, ...linesToAdd);\n // Move pointers for next iteration\n itemVisited.add(itemPointer);\n bufferPointer += linesToAdd.length;\n itemPointer = bound(itemPointer + 1);\n }\n // Fill the page over the active item\n bufferPointer = activeItemPosition - 1;\n itemPointer = bound(active - 1);\n while (bufferPointer >= 0 &&\n !itemVisited.has(itemPointer) &&\n (loop && renderedLength > pageSize ? itemPointer !== active : itemPointer < active)) {\n const lines = renderItemAtIndex(itemPointer);\n const linesToAdd = lines.slice(Math.max(0, lines.length - bufferPointer - 1));\n pageBuffer.splice(bufferPointer - linesToAdd.length + 1, linesToAdd.length, ...linesToAdd);\n // Move pointers for next iteration\n itemVisited.add(itemPointer);\n bufferPointer -= linesToAdd.length;\n itemPointer = bound(itemPointer - 1);\n }\n return pageBuffer.filter((line) => typeof line === 'string').join('\\n');\n}\n",
|
|
50
|
+
"import * as readline from 'node:readline';\nimport { AsyncResource } from 'node:async_hooks';\nimport MuteStream from 'mute-stream';\nimport { onExit as onSignalExit } from 'signal-exit';\nimport ScreenManager from \"./screen-manager.js\";\nimport { PromisePolyfill } from \"./promise-polyfill.js\";\nimport { withHooks, effectScheduler } from \"./hook-engine.js\";\nimport { AbortPromptError, CancelPromptError, ExitPromptError } from \"./errors.js\";\nimport path from 'node:path';\n// Capture the real setImmediate at module load time so it works even when test\n// frameworks mock timers with vi.useFakeTimers() or similar.\nconst nativeSetImmediate = globalThis.setImmediate;\nfunction getCallSites() {\n // oxlint-disable-next-line typescript/unbound-method\n const _prepareStackTrace = Error.prepareStackTrace;\n let result = [];\n try {\n Error.prepareStackTrace = (_, callSites) => {\n const callSitesWithoutCurrent = callSites.slice(1);\n result = callSitesWithoutCurrent;\n return callSitesWithoutCurrent;\n };\n // oxlint-disable-next-line no-unused-expressions\n new Error().stack;\n }\n catch {\n // An error will occur if the Node flag --frozen-intrinsics is used.\n // https://nodejs.org/api/cli.html#--frozen-intrinsics\n return result;\n }\n Error.prepareStackTrace = _prepareStackTrace;\n return result;\n}\nexport function createPrompt(view) {\n const callSites = getCallSites();\n const prompt = (config, context = {}) => {\n // Default `input` to stdin\n const { input = process.stdin, signal } = context;\n const cleanups = new Set();\n // Add mute capabilities to the output\n const output = new MuteStream();\n output.pipe(context.output ?? process.stdout);\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion\n const rl = readline.createInterface({\n terminal: true,\n input,\n output,\n });\n // Mute the output after readline has initialized so readline can perform\n // any terminal setup writes (e.g. Windows Console API initialization)\n // before suppressing output. ScreenManager will unmute/mute around each\n // render call as needed.\n output.mute();\n const screen = new ScreenManager(rl);\n const { promise, resolve, reject } = PromisePolyfill.withResolver();\n const cancel = () => reject(new CancelPromptError());\n if (signal) {\n const abort = () => reject(new AbortPromptError({ cause: signal.reason }));\n if (signal.aborted) {\n abort();\n return Object.assign(promise, { cancel });\n }\n signal.addEventListener('abort', abort);\n cleanups.add(() => signal.removeEventListener('abort', abort));\n }\n cleanups.add(onSignalExit((code, signal) => {\n reject(new ExitPromptError(`User force closed the prompt with ${code} ${signal}`));\n }));\n // SIGINT must be explicitly handled by the prompt so the ExitPromptError can be handled.\n // Otherwise, the prompt will stop and in some scenarios never resolve.\n // Ref issue #1741\n const sigint = () => reject(new ExitPromptError(`User force closed the prompt with SIGINT`));\n rl.on('SIGINT', sigint);\n cleanups.add(() => rl.removeListener('SIGINT', sigint));\n return withHooks(rl, (cycle) => {\n // The close event triggers immediately when the user press ctrl+c. SignalExit on the other hand\n // triggers after the process is done (which happens after timeouts are done triggering.)\n // We triggers the hooks cleanup phase on rl `close` so active timeouts can be cleared.\n const hooksCleanup = AsyncResource.bind(() => effectScheduler.clearAll());\n rl.on('close', hooksCleanup);\n cleanups.add(() => rl.removeListener('close', hooksCleanup));\n const startCycle = () => {\n // Re-renders only happen when the state change; but the readline cursor could\n // change position and that also requires a re-render (and a manual one because\n // we mute the streams). We set the listener after the initial workLoop to avoid\n // a double render if render triggered by a state change sets the cursor to the\n // right position.\n const checkCursorPos = () => screen.checkCursorPos();\n rl.input.on('keypress', checkCursorPos);\n cleanups.add(() => rl.input.removeListener('keypress', checkCursorPos));\n let pendingDone = null;\n cycle(() => {\n let effectsSettled = false;\n try {\n const nextView = view(config, (value) => {\n if (effectsSettled) {\n // After the cycle completes (async validation path), the \"done\"\n // render already flushed via setStatus → handleChange, so resolve\n // immediately.\n resolve(value);\n }\n else {\n pendingDone = { value };\n }\n });\n // Typescript won't allow this, but not all users rely on typescript.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (nextView === undefined) {\n let callerFilename = callSites[1]?.getFileName();\n if (callerFilename && !callerFilename.startsWith('file://')) {\n callerFilename = path.resolve(callerFilename);\n }\n throw new Error(`Prompt functions must return a string.\\n at ${callerFilename}`);\n }\n const [content, bottomContent] = typeof nextView === 'string' ? [nextView] : nextView;\n screen.render(content, bottomContent);\n effectScheduler.run();\n }\n catch (error) {\n reject(error);\n }\n effectsSettled = true;\n if (pendingDone !== null) {\n const { value } = pendingDone;\n pendingDone = null;\n resolve(value);\n }\n });\n };\n // Proper Readable streams (like process.stdin) may have OS-level buffered\n // data that arrives in the poll phase when readline resumes the stream.\n // Deferring the first render by one setImmediate tick (check phase, after\n // poll) lets that stale data flow through readline harmlessly—no keypress\n // handlers are registered yet and the output is muted, so the stale\n // keystrokes are silently discarded.\n // Old-style streams (like MuteStream) have no such buffering, so the\n // render cycle starts immediately.\n //\n // @see https://github.com/SBoudrias/Inquirer.js/issues/1303\n if ('readableFlowing' in input) {\n nativeSetImmediate(startCycle);\n }\n else {\n startCycle();\n }\n return Object.assign(promise\n .then((answer) => {\n effectScheduler.clearAll();\n return answer;\n }, (error) => {\n effectScheduler.clearAll();\n throw error;\n })\n // Wait for the promise to settle, then cleanup.\n .finally(() => {\n cleanups.forEach((cleanup) => cleanup());\n screen.done({ clearContent: Boolean(context.clearPromptOnDone) });\n output.end();\n })\n // Once cleanup is done, let the expose promise resolve/reject to the internal one.\n .then(() => promise), { cancel });\n });\n };\n return prompt;\n}\n",
|
|
51
|
+
"/**\n * This is not the set of all possible signals.\n *\n * It IS, however, the set of all signals that trigger\n * an exit on either Linux or BSD systems. Linux is a\n * superset of the signal names supported on BSD, and\n * the unknown signals just fail to register, so we can\n * catch that easily enough.\n *\n * Windows signals are a different set, since there are\n * signals that terminate Windows processes, but don't\n * terminate (or don't even exist) on Posix systems.\n *\n * Don't bother with SIGKILL. It's uncatchable, which\n * means that we can't fire any callbacks anyway.\n *\n * If a user does happen to register a handler on a non-\n * fatal signal like SIGWINCH or something, and then\n * exit, it'll end up firing `process.emit('exit')`, so\n * the handler will be fired anyway.\n *\n * SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised\n * artificially, inherently leave the process in a\n * state from which it is not safe to try and enter JS\n * listeners.\n */\nexport const signals = [];\nsignals.push('SIGHUP', 'SIGINT', 'SIGTERM');\nif (process.platform !== 'win32') {\n signals.push('SIGALRM', 'SIGABRT', 'SIGVTALRM', 'SIGXCPU', 'SIGXFSZ', 'SIGUSR2', 'SIGTRAP', 'SIGSYS', 'SIGQUIT', 'SIGIOT'\n // should detect profiler and enable/disable accordingly.\n // see #21\n // 'SIGPROF'\n );\n}\nif (process.platform === 'linux') {\n signals.push('SIGIO', 'SIGPOLL', 'SIGPWR', 'SIGSTKFLT');\n}\n//# sourceMappingURL=signals.js.map",
|
|
52
|
+
"// Note: since nyc uses this module to output coverage, any lines\n// that are in the direct sync flow of nyc's outputCoverage are\n// ignored, since we can never get coverage for them.\n// grab a reference to node's real process object right away\nimport { signals } from './signals.js';\nexport { signals };\nconst processOk = (process) => !!process &&\n typeof process === 'object' &&\n typeof process.removeListener === 'function' &&\n typeof process.emit === 'function' &&\n typeof process.reallyExit === 'function' &&\n typeof process.listeners === 'function' &&\n typeof process.kill === 'function' &&\n typeof process.pid === 'number' &&\n typeof process.on === 'function';\nconst kExitEmitter = Symbol.for('signal-exit emitter');\nconst global = globalThis;\nconst ObjectDefineProperty = Object.defineProperty.bind(Object);\n// teeny special purpose ee\nclass Emitter {\n emitted = {\n afterExit: false,\n exit: false,\n };\n listeners = {\n afterExit: [],\n exit: [],\n };\n count = 0;\n id = Math.random();\n constructor() {\n if (global[kExitEmitter]) {\n return global[kExitEmitter];\n }\n ObjectDefineProperty(global, kExitEmitter, {\n value: this,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n }\n on(ev, fn) {\n this.listeners[ev].push(fn);\n }\n removeListener(ev, fn) {\n const list = this.listeners[ev];\n const i = list.indexOf(fn);\n /* c8 ignore start */\n if (i === -1) {\n return;\n }\n /* c8 ignore stop */\n if (i === 0 && list.length === 1) {\n list.length = 0;\n }\n else {\n list.splice(i, 1);\n }\n }\n emit(ev, code, signal) {\n if (this.emitted[ev]) {\n return false;\n }\n this.emitted[ev] = true;\n let ret = false;\n for (const fn of this.listeners[ev]) {\n ret = fn(code, signal) === true || ret;\n }\n if (ev === 'exit') {\n ret = this.emit('afterExit', code, signal) || ret;\n }\n return ret;\n }\n}\nclass SignalExitBase {\n}\nconst signalExitWrap = (handler) => {\n return {\n onExit(cb, opts) {\n return handler.onExit(cb, opts);\n },\n load() {\n return handler.load();\n },\n unload() {\n return handler.unload();\n },\n };\n};\nclass SignalExitFallback extends SignalExitBase {\n onExit() {\n return () => { };\n }\n load() { }\n unload() { }\n}\nclass SignalExit extends SignalExitBase {\n // \"SIGHUP\" throws an `ENOSYS` error on Windows,\n // so use a supported signal instead\n /* c8 ignore start */\n #hupSig = process.platform === 'win32' ? 'SIGINT' : 'SIGHUP';\n /* c8 ignore stop */\n #emitter = new Emitter();\n #process;\n #originalProcessEmit;\n #originalProcessReallyExit;\n #sigListeners = {};\n #loaded = false;\n constructor(process) {\n super();\n this.#process = process;\n // { <signal>: <listener fn>, ... }\n this.#sigListeners = {};\n for (const sig of signals) {\n this.#sigListeners[sig] = () => {\n // If there are no other listeners, an exit is coming!\n // Simplest way: remove us and then re-send the signal.\n // We know that this will kill the process, so we can\n // safely emit now.\n const listeners = this.#process.listeners(sig);\n let { count } = this.#emitter;\n // This is a workaround for the fact that signal-exit v3 and signal\n // exit v4 are not aware of each other, and each will attempt to let\n // the other handle it, so neither of them do. To correct this, we\n // detect if we're the only handler *except* for previous versions\n // of signal-exit, and increment by the count of listeners it has\n // created.\n /* c8 ignore start */\n const p = process;\n if (typeof p.__signal_exit_emitter__ === 'object' &&\n typeof p.__signal_exit_emitter__.count === 'number') {\n count += p.__signal_exit_emitter__.count;\n }\n /* c8 ignore stop */\n if (listeners.length === count) {\n this.unload();\n const ret = this.#emitter.emit('exit', null, sig);\n /* c8 ignore start */\n const s = sig === 'SIGHUP' ? this.#hupSig : sig;\n if (!ret)\n process.kill(process.pid, s);\n /* c8 ignore stop */\n }\n };\n }\n this.#originalProcessReallyExit = process.reallyExit;\n this.#originalProcessEmit = process.emit;\n }\n onExit(cb, opts) {\n /* c8 ignore start */\n if (!processOk(this.#process)) {\n return () => { };\n }\n /* c8 ignore stop */\n if (this.#loaded === false) {\n this.load();\n }\n const ev = opts?.alwaysLast ? 'afterExit' : 'exit';\n this.#emitter.on(ev, cb);\n return () => {\n this.#emitter.removeListener(ev, cb);\n if (this.#emitter.listeners['exit'].length === 0 &&\n this.#emitter.listeners['afterExit'].length === 0) {\n this.unload();\n }\n };\n }\n load() {\n if (this.#loaded) {\n return;\n }\n this.#loaded = true;\n // This is the number of onSignalExit's that are in play.\n // It's important so that we can count the correct number of\n // listeners on signals, and don't wait for the other one to\n // handle it instead of us.\n this.#emitter.count += 1;\n for (const sig of signals) {\n try {\n const fn = this.#sigListeners[sig];\n if (fn)\n this.#process.on(sig, fn);\n }\n catch (_) { }\n }\n this.#process.emit = (ev, ...a) => {\n return this.#processEmit(ev, ...a);\n };\n this.#process.reallyExit = (code) => {\n return this.#processReallyExit(code);\n };\n }\n unload() {\n if (!this.#loaded) {\n return;\n }\n this.#loaded = false;\n signals.forEach(sig => {\n const listener = this.#sigListeners[sig];\n /* c8 ignore start */\n if (!listener) {\n throw new Error('Listener not defined for signal: ' + sig);\n }\n /* c8 ignore stop */\n try {\n this.#process.removeListener(sig, listener);\n /* c8 ignore start */\n }\n catch (_) { }\n /* c8 ignore stop */\n });\n this.#process.emit = this.#originalProcessEmit;\n this.#process.reallyExit = this.#originalProcessReallyExit;\n this.#emitter.count -= 1;\n }\n #processReallyExit(code) {\n /* c8 ignore start */\n if (!processOk(this.#process)) {\n return 0;\n }\n this.#process.exitCode = code || 0;\n /* c8 ignore stop */\n this.#emitter.emit('exit', this.#process.exitCode, null);\n return this.#originalProcessReallyExit.call(this.#process, this.#process.exitCode);\n }\n #processEmit(ev, ...args) {\n const og = this.#originalProcessEmit;\n if (ev === 'exit' && processOk(this.#process)) {\n if (typeof args[0] === 'number') {\n this.#process.exitCode = args[0];\n /* c8 ignore start */\n }\n /* c8 ignore start */\n const ret = og.call(this.#process, ev, ...args);\n /* c8 ignore start */\n this.#emitter.emit('exit', this.#process.exitCode, null);\n /* c8 ignore stop */\n return ret;\n }\n else {\n return og.call(this.#process, ev, ...args);\n }\n }\n}\nconst process = globalThis.process;\n// wrap so that we call the method on the actual handler, without\n// exporting it directly.\nexport const { \n/**\n * Called when the process is exiting, whether via signal, explicit\n * exit, or running out of stuff to do.\n *\n * If the global process object is not suitable for instrumentation,\n * then this will be a no-op.\n *\n * Returns a function that may be used to unload signal-exit.\n */\nonExit, \n/**\n * Load the listeners. Likely you never need to call this, unless\n * doing a rather deep integration with signal-exit functionality.\n * Mostly exposed for the benefit of testing.\n *\n * @internal\n */\nload, \n/**\n * Unload the listeners. Likely you never need to call this, unless\n * doing a rather deep integration with signal-exit functionality.\n * Mostly exposed for the benefit of testing.\n *\n * @internal\n */\nunload, } = signalExitWrap(processOk(process) ? new SignalExit(process) : new SignalExitFallback());\n//# sourceMappingURL=index.js.map",
|
|
53
|
+
"import { stripVTControlCharacters } from 'node:util';\nimport { breakLines, readlineWidth } from \"./utils.js\";\nimport { cursorDown, cursorUp, cursorTo, cursorShow, eraseLines } from '@inquirer/ansi';\nconst height = (content) => content.split('\\n').length;\nconst lastLine = (content) => content.split('\\n').pop() ?? '';\nexport default class ScreenManager {\n // These variables are keeping information to allow correct prompt re-rendering\n height = 0;\n extraLinesUnderPrompt = 0;\n cursorPos;\n rl;\n constructor(rl) {\n this.rl = rl;\n this.cursorPos = rl.getCursorPos();\n }\n write(content) {\n this.rl.output.unmute();\n this.rl.output.write(content);\n this.rl.output.mute();\n }\n render(content, bottomContent = '') {\n // Write message to screen and setPrompt to control backspace\n const promptLine = lastLine(content);\n const rawPromptLine = stripVTControlCharacters(promptLine);\n // Remove the rl.line from our prompt. We can't rely on the content of\n // rl.line (mainly because of the password prompt), so just rely on it's\n // length.\n let prompt = rawPromptLine;\n if (this.rl.line.length > 0) {\n prompt = prompt.slice(0, -this.rl.line.length);\n }\n this.rl.setPrompt(prompt);\n // SetPrompt will change cursor position, now we can get correct value\n this.cursorPos = this.rl.getCursorPos();\n const width = readlineWidth();\n content = breakLines(content, width);\n bottomContent = breakLines(bottomContent, width);\n // Manually insert an extra line if we're at the end of the line.\n // This prevent the cursor from appearing at the beginning of the\n // current line.\n if (rawPromptLine.length % width === 0) {\n content += '\\n';\n }\n let output = content + (bottomContent ? '\\n' + bottomContent : '');\n /**\n * Re-adjust the cursor at the correct position.\n */\n // We need to consider parts of the prompt under the cursor as part of the bottom\n // content in order to correctly cleanup and re-render.\n const promptLineUpDiff = Math.floor(rawPromptLine.length / width) - this.cursorPos.rows;\n const bottomContentHeight = promptLineUpDiff + (bottomContent ? height(bottomContent) : 0);\n // Return cursor to the input position (on top of the bottomContent)\n if (bottomContentHeight > 0)\n output += cursorUp(bottomContentHeight);\n // Return cursor to the initial left offset.\n output += cursorTo(this.cursorPos.cols);\n /**\n * Render and store state for future re-rendering\n */\n this.write(cursorDown(this.extraLinesUnderPrompt) + eraseLines(this.height) + output);\n this.extraLinesUnderPrompt = bottomContentHeight;\n this.height = height(output);\n }\n checkCursorPos() {\n const cursorPos = this.rl.getCursorPos();\n if (cursorPos.cols !== this.cursorPos.cols) {\n this.write(cursorTo(cursorPos.cols));\n this.cursorPos = cursorPos;\n }\n }\n done({ clearContent }) {\n this.rl.setPrompt('');\n let output = cursorDown(this.extraLinesUnderPrompt);\n output += clearContent ? eraseLines(this.height) : '\\n';\n output += cursorShow;\n this.write(output);\n this.rl.close();\n }\n}\n",
|
|
54
|
+
"const ESC = '\\u001B[';\n/** Move cursor to first column */\nexport const cursorLeft = ESC + 'G';\n/** Hide the cursor */\nexport const cursorHide = ESC + '?25l';\n/** Show the cursor */\nexport const cursorShow = ESC + '?25h';\n/** Move cursor up by count rows */\nexport const cursorUp = (rows = 1) => (rows > 0 ? `${ESC}${rows}A` : '');\n/** Move cursor down by count rows */\nexport const cursorDown = (rows = 1) => rows > 0 ? `${ESC}${rows}B` : '';\n/** Move cursor to position (x, y) */\nexport const cursorTo = (x, y) => {\n if (typeof y === 'number' && !Number.isNaN(y)) {\n return `${ESC}${y + 1};${x + 1}H`;\n }\n return `${ESC}${x + 1}G`;\n};\nconst eraseLine = ESC + '2K';\n/** Erase the specified number of lines above the cursor */\nexport const eraseLines = (lines) => lines > 0 ? (eraseLine + cursorUp(1)).repeat(lines - 1) + eraseLine + cursorLeft : '';\n",
|
|
55
|
+
"// TODO: Remove this class once Node 22 becomes the minimum supported version.\nexport class PromisePolyfill extends Promise {\n // Available starting from Node 22\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers\n static withResolver() {\n let resolve;\n let reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve, reject: reject };\n }\n}\n",
|
|
56
|
+
"import { styleText } from 'node:util';\nimport figures from '@inquirer/figures';\n/**\n * Separator object\n * Used to space/separate choices group\n */\nexport class Separator {\n separator = styleText('dim', Array.from({ length: 15 }).join(figures.line));\n type = 'separator';\n constructor(separator) {\n if (separator) {\n this.separator = separator;\n }\n }\n static isSeparator(choice) {\n return Boolean(choice &&\n typeof choice === 'object' &&\n 'type' in choice &&\n choice.type === 'separator');\n }\n}\n",
|
|
57
|
+
"import { createPrompt, useState, useKeypress, isEnterKey, isTabKey, usePrefix, makeTheme, } from '@inquirer/core';\nfunction getBooleanValue(value, defaultValue) {\n let answer = defaultValue !== false;\n if (/^(y|yes)/i.test(value))\n answer = true;\n else if (/^(n|no)/i.test(value))\n answer = false;\n return answer;\n}\nfunction boolToString(value) {\n return value ? 'Yes' : 'No';\n}\nexport default createPrompt((config, done) => {\n const { transformer = boolToString } = config;\n const [status, setStatus] = useState('idle');\n const [value, setValue] = useState('');\n const theme = makeTheme(config.theme);\n const prefix = usePrefix({ status, theme });\n useKeypress((key, rl) => {\n if (status !== 'idle')\n return;\n if (isEnterKey(key)) {\n const answer = getBooleanValue(value, config.default);\n setValue(transformer(answer));\n setStatus('done');\n done(answer);\n }\n else if (isTabKey(key)) {\n const answer = boolToString(!getBooleanValue(value, config.default));\n rl.clearLine(0); // Remove the tab character.\n rl.write(answer);\n setValue(answer);\n }\n else {\n setValue(rl.line);\n }\n });\n let formattedValue = value;\n let defaultValue = '';\n if (status === 'done') {\n formattedValue = theme.style.answer(value);\n }\n else {\n defaultValue = ` ${theme.style.defaultAnswer(config.default === false ? 'y/N' : 'Y/n')}`;\n }\n const message = theme.style.message(config.message, status);\n return `${prefix} ${message}${defaultValue} ${formattedValue}`;\n});\n",
|
|
58
|
+
"import { createPrompt, useState, useKeypress, useEffect, usePrefix, isBackspaceKey, isEnterKey, isTabKey, makeTheme, } from '@inquirer/core';\nconst inputTheme = {\n validationFailureMode: 'keep',\n};\nexport default createPrompt((config, done) => {\n const { prefill = 'tab' } = config;\n const theme = makeTheme(inputTheme, config.theme);\n const [status, setStatus] = useState('idle');\n // Coerce to string to handle runtime values that may be numbers despite TypeScript types\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-conversion\n const [defaultValue, setDefaultValue] = useState(String(config.default ?? ''));\n const [errorMsg, setError] = useState();\n const [value, setValue] = useState('');\n const prefix = usePrefix({ status, theme });\n async function validate(value) {\n const { required, pattern, patternError = 'Invalid input' } = config;\n if (required && !value) {\n return 'You must provide a value';\n }\n if (pattern && !pattern.test(value)) {\n return patternError;\n }\n if (typeof config.validate === 'function') {\n return (await config.validate(value)) || 'You must provide a valid value';\n }\n return true;\n }\n useKeypress(async (key, rl) => {\n // Ignore keypress while our prompt is doing other processing.\n if (status !== 'idle') {\n return;\n }\n if (isEnterKey(key)) {\n const answer = value || defaultValue;\n setStatus('loading');\n const isValid = await validate(answer);\n if (isValid === true) {\n setValue(answer);\n setStatus('done');\n done(answer);\n }\n else {\n if (theme.validationFailureMode === 'clear') {\n setValue('');\n }\n else {\n // Reset the readline line value to the previous value. On line event, the value\n // get cleared, forcing the user to re-enter the value instead of fixing it.\n rl.write(value);\n }\n setError(isValid);\n setStatus('idle');\n }\n }\n else if (isBackspaceKey(key) && !value) {\n setDefaultValue('');\n }\n else if (isTabKey(key) && !value) {\n setDefaultValue('');\n rl.clearLine(0); // Remove the tab character.\n rl.write(defaultValue);\n setValue(defaultValue);\n }\n else {\n setValue(rl.line);\n setError(undefined);\n }\n });\n // If prefill is set to 'editable' cut out the default value and paste into current state and the user's cli buffer\n // They can edit the value immediately instead of needing to press 'tab'\n useEffect((rl) => {\n if (prefill === 'editable' && defaultValue) {\n rl.write(defaultValue);\n setValue(defaultValue);\n }\n }, []);\n const message = theme.style.message(config.message, status);\n let formattedValue = value;\n if (typeof config.transformer === 'function') {\n formattedValue = config.transformer(value, { isFinal: status === 'done' });\n }\n else if (status === 'done') {\n formattedValue = theme.style.answer(value);\n }\n let defaultStr;\n if (defaultValue && status !== 'done' && !value) {\n defaultStr = theme.style.defaultAnswer(defaultValue);\n }\n let error = '';\n if (errorMsg) {\n error = theme.style.error(errorMsg);\n }\n return [\n [prefix, message, defaultStr, formattedValue]\n .filter((v) => v !== undefined)\n .join(' '),\n error,\n ];\n});\n",
|
|
59
|
+
"import { createPrompt, useState, useKeypress, usePrefix, isEnterKey, makeTheme, } from '@inquirer/core';\nimport { cursorHide } from '@inquirer/ansi';\nconst passwordTheme = {\n style: {\n maskedText: '[input is masked]',\n },\n};\nexport default createPrompt((config, done) => {\n const { validate = () => true } = config;\n const theme = makeTheme(passwordTheme, config.theme);\n const [status, setStatus] = useState('idle');\n const [errorMsg, setError] = useState();\n const [value, setValue] = useState('');\n const prefix = usePrefix({ status, theme });\n useKeypress(async (key, rl) => {\n // Ignore keypress while our prompt is doing other processing.\n if (status !== 'idle') {\n return;\n }\n if (isEnterKey(key)) {\n const answer = value;\n setStatus('loading');\n const isValid = await validate(answer);\n if (isValid === true) {\n setValue(answer);\n setStatus('done');\n done(answer);\n }\n else {\n // Reset the readline line value to the previous value. On line event, the value\n // get cleared, forcing the user to re-enter the value instead of fixing it.\n rl.write(value);\n setError(isValid || 'You must provide a valid value');\n setStatus('idle');\n }\n }\n else {\n setValue(rl.line);\n setError(undefined);\n }\n });\n const message = theme.style.message(config.message, status);\n let formattedValue = '';\n let helpTip;\n if (config.mask) {\n const maskChar = typeof config.mask === 'string' ? config.mask : '*';\n formattedValue = maskChar.repeat(value.length);\n }\n else if (status !== 'done') {\n helpTip = `${theme.style.help(theme.style.maskedText)}${cursorHide}`;\n }\n if (status === 'done') {\n formattedValue = theme.style.answer(formattedValue);\n }\n let error = '';\n if (errorMsg) {\n error = theme.style.error(errorMsg);\n }\n return [[prefix, message, config.mask ? formattedValue : helpTip].join(' '), error];\n});\n",
|
|
60
|
+
"import { createPrompt, useState, useKeypress, usePrefix, usePagination, useRef, useMemo, useEffect, isBackspaceKey, isEnterKey, isUpKey, isDownKey, isNumberKey, Separator, ValidationError, makeTheme, } from '@inquirer/core';\nimport { cursorHide } from '@inquirer/ansi';\nimport { styleText } from 'node:util';\nimport figures from '@inquirer/figures';\nconst selectTheme = {\n icon: { cursor: figures.pointer },\n style: {\n disabled: (text) => styleText('dim', text),\n description: (text) => styleText('cyan', text),\n keysHelpTip: (keys) => keys\n .map(([key, action]) => `${styleText('bold', key)} ${styleText('dim', action)}`)\n .join(styleText('dim', ' • ')),\n },\n i18n: { disabledError: 'This option is disabled and cannot be selected.' },\n indexMode: 'hidden',\n keybindings: [],\n};\nfunction isSelectable(item) {\n return !Separator.isSeparator(item) && !item.disabled;\n}\nfunction isNavigable(item) {\n return !Separator.isSeparator(item);\n}\nfunction normalizeChoices(choices) {\n return choices.map((choice) => {\n if (Separator.isSeparator(choice))\n return choice;\n if (typeof choice !== 'object' || choice === null || !('value' in choice)) {\n // It's a raw value (string, number, etc.)\n const name = String(choice);\n return {\n value: choice,\n name,\n short: name,\n disabled: false,\n };\n }\n const name = choice.name ?? String(choice.value);\n const normalizedChoice = {\n value: choice.value,\n name,\n short: choice.short ?? name,\n disabled: choice.disabled ?? false,\n };\n if (choice.description) {\n normalizedChoice.description = choice.description;\n }\n return normalizedChoice;\n });\n}\nexport default createPrompt((config, done) => {\n const { loop = true, pageSize = 7 } = config;\n const theme = makeTheme(selectTheme, config.theme);\n const { keybindings } = theme;\n const [status, setStatus] = useState('idle');\n const prefix = usePrefix({ status, theme });\n const searchTimeoutRef = useRef();\n // Vim keybindings (j/k) conflict with typing those letters in search,\n // so search must be disabled when vim bindings are enabled\n const searchEnabled = !keybindings.includes('vim');\n const items = useMemo(() => normalizeChoices(config.choices), [config.choices]);\n const bounds = useMemo(() => {\n const first = items.findIndex(isNavigable);\n const last = items.findLastIndex(isNavigable);\n if (first === -1) {\n throw new ValidationError('[select prompt] No selectable choices. All choices are disabled.');\n }\n return { first, last };\n }, [items]);\n const defaultItemIndex = useMemo(() => {\n if (!('default' in config))\n return -1;\n return items.findIndex((item) => isSelectable(item) && item.value === config.default);\n }, [config.default, items]);\n const [active, setActive] = useState(defaultItemIndex === -1 ? bounds.first : defaultItemIndex);\n const selectedChoice = items[active];\n if (selectedChoice == null || Separator.isSeparator(selectedChoice)) {\n throw new Error('Active index does not point to a choice');\n }\n const [errorMsg, setError] = useState();\n useKeypress((key, rl) => {\n clearTimeout(searchTimeoutRef.current);\n if (errorMsg) {\n setError(undefined);\n }\n if (isEnterKey(key)) {\n if (selectedChoice.disabled) {\n setError(theme.i18n.disabledError);\n }\n else {\n setStatus('done');\n done(selectedChoice.value);\n }\n }\n else if (isUpKey(key, keybindings) || isDownKey(key, keybindings)) {\n rl.clearLine(0);\n if (loop ||\n (isUpKey(key, keybindings) && active !== bounds.first) ||\n (isDownKey(key, keybindings) && active !== bounds.last)) {\n const offset = isUpKey(key, keybindings) ? -1 : 1;\n let next = active;\n do {\n next = (next + offset + items.length) % items.length;\n } while (!isNavigable(items[next]));\n setActive(next);\n }\n }\n else if (isNumberKey(key) && !Number.isNaN(Number(rl.line))) {\n const selectedIndex = Number(rl.line) - 1;\n // Find the nth item (ignoring separators)\n let selectableIndex = -1;\n const position = items.findIndex((item) => {\n if (Separator.isSeparator(item))\n return false;\n selectableIndex++;\n return selectableIndex === selectedIndex;\n });\n const item = items[position];\n if (item != null && isSelectable(item)) {\n setActive(position);\n }\n searchTimeoutRef.current = setTimeout(() => {\n rl.clearLine(0);\n }, 700);\n }\n else if (isBackspaceKey(key)) {\n rl.clearLine(0);\n }\n else if (searchEnabled) {\n const searchTerm = rl.line.toLowerCase();\n const matchIndex = items.findIndex((item) => {\n if (Separator.isSeparator(item) || !isSelectable(item))\n return false;\n return item.name.toLowerCase().startsWith(searchTerm);\n });\n if (matchIndex !== -1) {\n setActive(matchIndex);\n }\n searchTimeoutRef.current = setTimeout(() => {\n rl.clearLine(0);\n }, 700);\n }\n });\n useEffect(() => () => {\n clearTimeout(searchTimeoutRef.current);\n }, []);\n const message = theme.style.message(config.message, status);\n const helpLine = theme.style.keysHelpTip([\n ['↑↓', 'navigate'],\n ['⏎', 'select'],\n ]);\n let separatorCount = 0;\n const page = usePagination({\n items,\n active,\n renderItem({ item, isActive, index }) {\n if (Separator.isSeparator(item)) {\n separatorCount++;\n return ` ${item.separator}`;\n }\n const cursor = isActive ? theme.icon.cursor : ' ';\n const indexLabel = theme.indexMode === 'number' ? `${index + 1 - separatorCount}. ` : '';\n if (item.disabled) {\n const disabledLabel = typeof item.disabled === 'string' ? item.disabled : '(disabled)';\n const disabledCursor = isActive ? theme.icon.cursor : '-';\n return theme.style.disabled(`${disabledCursor} ${indexLabel}${item.name} ${disabledLabel}`);\n }\n const color = isActive ? theme.style.highlight : (x) => x;\n return color(`${cursor} ${indexLabel}${item.name}`);\n },\n pageSize,\n loop,\n });\n if (status === 'done') {\n return [prefix, message, theme.style.answer(selectedChoice.short)]\n .filter(Boolean)\n .join(' ');\n }\n const { description } = selectedChoice;\n const lines = [\n [prefix, message].filter(Boolean).join(' '),\n page,\n ' ',\n description ? theme.style.description(description) : '',\n errorMsg ? theme.style.error(errorMsg) : '',\n helpLine,\n ]\n .filter(Boolean)\n .join('\\n')\n .trimEnd();\n return `${lines}${cursorHide}`;\n});\nexport { Separator } from '@inquirer/core';\n",
|
|
61
|
+
"import { select, input, confirm, password } from '@inquirer/prompts';\n\nexport type McpClient = 'antigravity' | 'vscode' | 'cursor' | 'claude-code' | 'gemini-cli' | 'codex' | 'opencode';\n\n/**\n * Prompt user to select their MCP client\n */\nexport async function promptMcpClient(): Promise<McpClient> {\n return await select({\n message: 'Which MCP client are you using?',\n choices: [\n { name: 'Antigravity', value: 'antigravity' as McpClient },\n { name: 'VSCode', value: 'vscode' as McpClient },\n { name: 'Cursor', value: 'cursor' as McpClient },\n { name: 'Claude Code', value: 'claude-code' as McpClient },\n { name: 'Gemini CLI', value: 'gemini-cli' as McpClient },\n { name: 'Codex CLI', value: 'codex' as McpClient },\n { name: 'OpenCode', value: 'opencode' as McpClient },\n ],\n });\n}\n\n/**\n * Prompt user to select Authentication Mode\n */\nexport async function promptAuthMode(): Promise<'apiKey' | 'oauth'> {\n return await select({\n message: 'Select Authentication Mode:',\n choices: [\n {\n name: 'API Key',\n value: 'apiKey' as const,\n description: 'Persistent keys generated in the Stitch Settings page.',\n },\n {\n name: 'OAuth',\n value: 'oauth' as const,\n description: 'A browser-based authentication flow required by specific AI clients that do not support manual key entry, or for environments where storing persistent secrets on disk is restricted.',\n },\n ],\n });\n}\n\n/**\n * Prompt user to select API Key storage\n */\nexport async function promptApiKeyStorage(): Promise<'.env' | 'config' | 'skip'> {\n return await select({\n message: 'Where would you like to store your API Key?',\n choices: [\n {\n name: '.env file',\n value: '.env' as const,\n description: 'Use the current working directory. Append if existing, create if not.',\n },\n {\n name: 'MCP config',\n value: 'config' as const,\n description: 'Add it to the final MCP config to copy and paste.',\n },\n {\n name: 'Skip',\n value: 'skip' as const,\n description: 'Use a placeholder in the final config.',\n },\n ],\n });\n}\n\n/**\n * Prompt user to enter API Key\n */\nexport async function promptApiKey(): Promise<string> {\n return await password({\n message: 'Enter your Stitch API Key:',\n mask: '*',\n });\n}\n\n/**\n * Prompt user to select from a list of options\n */\nexport async function promptSelect<T extends string>(\n message: string,\n choices: Array<{ name: string; value: T }>\n): Promise<T> {\n return await select({ message, choices });\n}\n\n/**\n * Prompt user to enter text\n */\nexport async function promptInput(message: string, defaultValue?: string): Promise<string> {\n return await input({ message, default: defaultValue });\n}\n\n/**\n * Prompt user for confirmation\n */\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return await confirm({ message, default: defaultValue });\n}\n\n/**\n * Prompt user to select transport type\n */\nexport async function promptTransportType(authMode: 'apiKey' | 'oauth' = 'oauth'): Promise<'http' | 'stdio'> {\n const isApiKey = authMode === 'apiKey';\n return await select({\n message: 'How would you like to connect to Stitch?',\n choices: [\n {\n name: 'Direct (Standard)',\n value: 'http' as const,\n description: isApiKey\n ? 'You or the IDE/CLI handles the loading of the API key.'\n : 'Standard HTTP. Production-ready. Requires manual OAuth token management.',\n },\n {\n name: 'Proxy (Recommended for Dev)',\n value: 'stdio' as const,\n description: isApiKey\n ? 'stitch-mcp will manage the loading of the API key.'\n : 'Zero-config. Uses a local bridge to auto-refresh gcloud credentials.',\n },\n ],\n });\n}\n",
|
|
62
|
+
"import { type UserInterface } from './UserInterface.js';\nimport * as wizard from '../ui/wizard.js';\nimport { theme } from '../ui/theme.js';\nimport type { McpClient } from '../ui/wizard.js';\n\nexport class ConsoleUI implements UserInterface {\n async promptMcpClient(): Promise<McpClient> {\n return wizard.promptMcpClient();\n }\n async promptAuthMode(): Promise<'apiKey' | 'oauth'> {\n return wizard.promptAuthMode();\n }\n async promptTransportType(authMode?: 'apiKey' | 'oauth'): Promise<'http' | 'stdio'> {\n return wizard.promptTransportType(authMode);\n }\n async promptApiKeyStorage(): Promise<'config' | 'skip' | '.env'> {\n return wizard.promptApiKeyStorage();\n }\n async promptApiKey(): Promise<string> {\n return wizard.promptApiKey();\n }\n async promptConfirm(message: string, defaultYes?: boolean): Promise<boolean> {\n return wizard.promptConfirm(message, defaultYes);\n }\n log(message: string): void {\n console.log(message);\n }\n warn(message: string): void {\n console.log(theme.yellow(message));\n }\n error(message: string): void {\n console.error(theme.red(message));\n }\n success(message: string): void {\n console.log(theme.green(message));\n }\n}\n"
|
|
63
|
+
],
|
|
64
|
+
"mappings": "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",
|
|
65
|
+
"debugId": "FBC869530F24E37464756E2164756E21",
|
|
66
|
+
"names": []
|
|
67
|
+
}
|