From 42bf2a1efea4fe102527bbd94c830bbf2a607cdf Mon Sep 17 00:00:00 2001 From: Utkarsh Shigihalli Date: Sat, 19 Oct 2019 06:46:28 +0100 Subject: [PATCH] using jszip --- images/dark/svg.svg | 1 + images/light/svg.svg | 1 + package-lock.json | 66 ++++++++++++++++++++++++++------------ package.json | 3 +- src/vsixOutlineProvider.ts | 49 +++++++++++++--------------- types/node-stream-zip.d.ts | 28 ---------------- 6 files changed, 71 insertions(+), 77 deletions(-) create mode 100644 images/dark/svg.svg create mode 100644 images/light/svg.svg delete mode 100644 types/node-stream-zip.d.ts diff --git a/images/dark/svg.svg b/images/dark/svg.svg new file mode 100644 index 0000000..03f2749 --- /dev/null +++ b/images/dark/svg.svg @@ -0,0 +1 @@ +file_type_svg diff --git a/images/light/svg.svg b/images/light/svg.svg new file mode 100644 index 0000000..03f2749 --- /dev/null +++ b/images/light/svg.svg @@ -0,0 +1 @@ +file_type_svg diff --git a/package-lock.json b/package-lock.json index e192699..da51305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,15 @@ "@types/node": "*" } }, + "@types/jszip": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.1.6.tgz", + "integrity": "sha512-m8uFcI+O2EupCfbEVQWsBM/4nhbegjOHL7cQgBpM95FeF98kdFJXzy9/8yhx4b3lCRl/gMBhcvyh30Qt3X+XPQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1036,8 +1045,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { "version": "4.0.3", @@ -2653,6 +2661,11 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -2688,8 +2701,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -2908,8 +2920,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -2968,6 +2979,17 @@ } } }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -2983,6 +3005,14 @@ "invert-kv": "^2.0.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", @@ -3412,11 +3442,6 @@ } } }, - "node-stream-zip": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.8.2.tgz", - "integrity": "sha512-zwP2F/R28Oqtl0gOLItk5QjJ6jEU8XO4kaUMgeqvCyXPgdCZlm8T/5qLMiNy+moJCBCiMQAaX7aVMRhT0t2vkQ==" - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3635,8 +3660,7 @@ "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" }, "parallel-transform": { "version": "1.2.0", @@ -3784,8 +3808,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -3896,7 +3919,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4048,8 +4070,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -4088,6 +4109,11 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -4453,7 +4479,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -4915,8 +4940,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "v8-compile-cache": { "version": "2.0.3", diff --git a/package.json b/package.json index 54bd52a..e95e67a 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ }, "devDependencies": { "@types/glob": "^7.1.1", + "@types/jszip": "~3.1.6", "@types/mocha": "^5.2.7", "@types/node": "^10.14.22", "@types/vscode": "^1.25.0", @@ -93,7 +94,7 @@ "webpack-cli": "~3.3.9" }, "dependencies": { - "node-stream-zip": "~1.8.2", + "jszip": "~3.2.2", "vscode-extension-telemetry": "~0.1.2" } } diff --git a/src/vsixOutlineProvider.ts b/src/vsixOutlineProvider.ts index 3ddc312..3a385dd 100644 --- a/src/vsixOutlineProvider.ts +++ b/src/vsixOutlineProvider.ts @@ -1,12 +1,11 @@ -/// import * as vscode from 'vscode'; -import * as streamzip from "node-stream-zip"; import Util from "./util"; import { TreeItemCollapsibleState } from "vscode"; import * as path from "path"; import { VsixItem } from "./vsixItem"; import * as fs from "fs"; import TelemetryClient from './telemetryClient'; +import * as jszip from "jszip"; export class VsixOutlineProvider implements vscode.TreeDataProvider{ @@ -99,6 +98,7 @@ export class VsixOutlineProvider implements vscode.TreeDataProvider{ } async parseVsix(selectedItem: string): Promise { + let that = this; let fileName = path.basename(this._vsixPath); return vscode.window.withProgress({ @@ -106,42 +106,37 @@ export class VsixOutlineProvider implements vscode.TreeDataProvider{ title: `Scanning ${fileName}`, }, (progress, token) => { Util.instance.log(`Selected item: ${selectedItem}`); - const zip = new streamzip({ - file: selectedItem, - storeEntries: true - }); - let root = new VsixItem(fileName, TreeItemCollapsibleState.Expanded); root.tooltip = this._vsixPath; root.iconType = "vsix"; root.iconPath = this.getIcon(root.iconType); return new Promise((resolve, reject) => { - zip.on("ready", () => { - try { + fs.readFile(this._vsixPath, function (err, data) { + if (err) { + Util.instance.log('Error occurred while reading VSIX'); + Util.instance.log(err.message); + TelemetryClient.instance.sendError(err); + reject(err); + } + jszip.loadAsync(data, { + createFolders: true + }).then(zip => { + let files = Object.keys(zip.files); let startTime = Date.now(); - Util.instance.log('Entries read: ' + zip.entriesCount); - let entries = zip.entries(); - for (const entry of Object.values(entries)) { - Util.instance.log(`Entry ${entry.name}`); - let path = entry.name.split("/").filter(v => { + Util.instance.log(`Entries read: ${files.length}`); + files.forEach(entry => { + let file = zip.files[entry]; + Util.instance.log(`Entry ${file}`); + let path = file.name.split("/").filter(v => { return v && v.length > 0; }); - this.buildTree(root, path, entry.isDirectory, 0); - } - zip.close(); - - TelemetryClient.instance.sendEvent("vsixParsedTime", { + that.buildTree(root, path, file.dir, 0); + }); + TelemetryClient.instance.sendEvent("vsixParsingTime", { ["totalSecondsParsing"]: ((Date.now() - startTime) / 1000).toString() }); - resolve(root); - } - catch (err) { - Util.instance.log('Error occurred'); - Util.instance.log(err); - TelemetryClient.instance.sendError(err); - reject(err); - } + }); }); }); }); diff --git a/types/node-stream-zip.d.ts b/types/node-stream-zip.d.ts deleted file mode 100644 index 82131fb..0000000 --- a/types/node-stream-zip.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -declare module 'node-stream-zip' { - export = main; -} - -declare const main: NodeStreamZip; - -interface NSZOpitons { - file: string; - storeEntries?: boolean; - skipEntryNameValidation?: boolean -} - -interface NSZEntry { - isDirectory: boolean; - size: number; - name: string; -} - -interface NodeStreamZip { - new(options: NSZOpitons): NodeStreamZip; - on(name: 'ready' | 'extract', callback: () => void): void; - entries(): NSZEntry[]; - entry(name: string): NSZEntry; - stream(entry: string, cb: (err: Error, stm: any) => void): void; - entryDataSync(entry: string): any; - close(): void; - entriesCount: number; -} \ No newline at end of file