🏡 index : github.com/captn3m0/which-electron.git

author Nemo <me@captnemo.in> 2021-07-15 20:56:36.0 +05:30:00
committer Nemo <me@captnemo.in> 2021-07-15 20:56:36.0 +05:30:00
commit
a57a42b09225e4f645e59d8a02a3cf45cc915477 [patch]
tree
9c76379a311094e53dcdbca0425124c5a70dc11d
download
a57a42b09225e4f645e59d8a02a3cf45cc915477.tar.gz

Initial commit



Diff

 .editorconfig     |   9 +++++++++
 .gitignore        |   1 +
 LICENSE           |   7 +++++++
 README.md         |  13 +++++++++++++
 finder.js         |  51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 index.js          |  36 ++++++++++++++++++++++++++++++++++++
 os.js             |  40 ++++++++++++++++++++++++++++++++++++++++
 package-lock.json | 458 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 package.json      |  32 ++++++++++++++++++++++++++++++++
 supported.json    |   1 +
 utils.js          |   5 +++++
 11 files changed, 653 insertions(+)

diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..c6c8b36 100644
--- /dev/null
+++ a/.editorconfig
@@ -1,0 +1,9 @@
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..b512c09 100644
--- /dev/null
+++ a/.gitignore
@@ -1,0 +1,1 @@
node_modules
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..b248ac6 100644
--- /dev/null
+++ a/LICENSE
@@ -1,0 +1,7 @@
Copyright 2021 Abhay Rana

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..be2052b 100644
--- /dev/null
+++ a/README.md
@@ -1,0 +1,13 @@
# which-electron

Try to find out which Electron version is bundled in an application file.

## how

The script attempts to extract the `app.asar` file and get the electron version from the manifest there.

## supported files

Currently supports:

1. Zip Files
diff --git a/finder.js b/finder.js
new file mode 100644
index 0000000..4f1031f 100644
--- /dev/null
+++ a/finder.js
@@ -1,0 +1,51 @@
// finds specific files from a list
const path = require("path");
const isDirectory = require('./utils').isDirectory;

module.exports = {
  // Finds the electron asar file, if we can
  asar: function(entries) {
    return Object.values(entries)
      .filter((e) => {
        return (
          isDirectory(e.attributes) == false &&
          path.extname(e.file) == ".asar" &&
          path.basename(e.file) != "app.asar"
        );
      })
      .map((e) => e.file);
  },
  binary: function(entries) {
    entries = Object.values(entries).sort((a, b) => b.size - a.size);
    for (const entry of Object.values(entries)) {
      if (isDirectory(entry.attributes)) {
        continue;
      }
      let ext = path.extname(entry.file);
      let size = entry.size;
      // Return the first exe file
      if (ext == ".exe") {
        return entry.file;
      } else if (ext == "") {
        // or the largest file with no extension
        return entry.file;
      }
    }
  },

  version: function(entries) {
    return Object.values(entries)
      .filter((e) => {
        return isDirectory(e.attributes) == false && path.basename(e.file) == "version";
      })
      .map((e) => e.file);
  },

  findElectronPackageInsideNodeModules: function(entries) {
    return Object.values(entries)
      .filter((e) => {
        return isDirectory(e.attributes) == false && e.file.match(/node_modules\/electron\/package\.json$/);
      })
      .map((e) => e.file);
  }
};
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..efe8885 100644
--- /dev/null
+++ a/index.js
@@ -1,0 +1,36 @@
const Seven = require("node-7z");
const path = require("path");
const osguess = require("./os");
const finder = require("./finder");
// Input file comes from process.argv[2]

const FILENAME = process.argv[2];
console.log(FILENAME)
const zip = Seven.list(FILENAME);
entries = [];
zip.on("data", (data) => {
  entries.push(data);
});

zip.on("end", () => {
  let asar = finder.asar(entries);
  let binary = finder.binary(entries);
  let versionFiles = finder.version(entries);
  let enm = finder.findElectronPackageInsideNodeModules(entries);
  if (asar.length > 0) {
    asar.forEach((a) => {
      console.log(`${process.argv[2]}:${a}`);
    });
  }
  if (binary) {
    console.log(`${process.argv[2]}:${binary}`);
  }
  if (versionFiles.length > 0) {
    versionFiles.forEach((a) => {
      console.log(`${process.argv[2]}:${a}`);
    });
  }
  if (enm) {
    enm.forEach((a) => console.log(`${process.argv[2]}:${a}`));
  }
});
diff --git a/os.js b/os.js
new file mode 100644
index 0000000..eaf78ac 100644
--- /dev/null
+++ a/os.js
@@ -1,0 +1,40 @@
// Guess the OS

const path = require('path')

module.exports = {
	guessFromFilename(inputFile) {
		let fn = path.baseName(inputFile)
		if (fn.match(/linux/)) {
			return 'linux'
		} else if (fn.match(/mac/)) {
			return 'darwin'
    } else if (fn.match(/darwin/)) {
      return 'darwin'
		} else if (fn.match(/win/)) {
			return 'win32'
		} else {
			ext = path.extname(inputFile)
			if (ext.match(/dmg/)) {
				return 'darwin'
			} else if (ext.match('/exe/')) {
				return 'win32'
			}
		}
		return null;
	},
	guessFromContents(entries) {
		for (i in entries) {
      let entry = entries[i]
			if (path.extname(entry.file) == ".so") {
				return 'linux'
			} else if (path.extname(entry.file) == '.dll') {
				return 'win32'
			} else if (path.extname(entry.file) == '.dylib') {
				return 'darwin'
			} else if (path.extname(entry.file) == '.plist') {
				return 'darwin'
			}
		}
	}
}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..b81ac90 100644
--- /dev/null
+++ a/package-lock.json
@@ -1,0 +1,458 @@
{
  "name": "which-electron",
  "version": "1.0.0",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "version": "1.0.0",
      "license": "MIT",
      "dependencies": {
        "asar": "^3.0.3",
        "elfinfo": "*",
        "node-7z": "^3.0.0",
        "node-stream-zip": "^1.13.6"
      }

    },

    "node_modules/@types/glob": {
      "version": "7.1.4",
      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz",
      "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==",
      "optional": true,
      "dependencies": {
        "@types/minimatch": "*",
        "@types/node": "*"
      }

    },

    "node_modules/@types/minimatch": {
      "version": "3.0.5",
      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
      "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
      "optional": true
    },

    "node_modules/@types/node": {
      "version": "16.3.2",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.2.tgz",
      "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==",
      "optional": true
    },

    "node_modules/asar": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz",
      "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==",
      "dependencies": {
        "chromium-pickle-js": "^0.2.0",
        "commander": "^5.0.0",
        "glob": "^7.1.6",
        "minimatch": "^3.0.4"
      },

      "bin": {
        "asar": "bin/asar.js"
      },

      "engines": {
        "node": ">=10.12.0"
      },

      "optionalDependencies": {
        "@types/glob": "^7.1.1"
      }

    },

    "node_modules/balanced-match": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    },

    "node_modules/brace-expansion": {
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "dependencies": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
      }

    },

    "node_modules/chromium-pickle-js": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
      "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU="
    },

    "node_modules/commander": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
      "engines": {
        "node": ">= 6"
      }

    },

    "node_modules/concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    },

    "node_modules/debug": {
      "version": "4.3.2",
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
      "dependencies": {
        "ms": "2.1.2"
      },

      "engines": {
        "node": ">=6.0"
      },

      "peerDependenciesMeta": {
        "supports-color": {
          "optional": true
        }

      }

    },

    "node_modules/elfinfo": {
      "version": "0.2.0-beta",
      "resolved": "https://registry.npmjs.org/elfinfo/-/elfinfo-0.2.0-beta.tgz",
      "integrity": "sha512-wIKg6MhAzNbzZug0/ppz+dfWYvNvgpbLGn+1OBUsB7+S0kgVC+ASNBYduhkKanQO0u7GcJUVd3AQYTmAi7FAIQ==",
      "dependencies": {
        "@types/node": "^14.14.22"
      }

    },

    "node_modules/elfinfo/node_modules/@types/node": {
      "version": "14.17.5",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz",
      "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA=="
    },

    "node_modules/fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    },

    "node_modules/glob": {
      "version": "7.1.7",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
      "dependencies": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^3.0.4",
        "once": "^1.3.0",
        "path-is-absolute": "^1.0.0"
      },

      "engines": {
        "node": "*"
      },

      "funding": {
        "url": "https://github.com/sponsors/isaacs"
      }

    },

    "node_modules/inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
      "dependencies": {
        "once": "^1.3.0",
        "wrappy": "1"
      }

    },

    "node_modules/inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },

    "node_modules/lodash.defaultsdeep": {
      "version": "4.6.1",
      "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA=="
    },

    "node_modules/lodash.defaultto": {
      "version": "4.14.0",
      "resolved": "https://registry.npmjs.org/lodash.defaultto/-/lodash.defaultto-4.14.0.tgz",
      "integrity": "sha1-OL09QlrO5zPg4ru9TkspcRzC7hE="
    },

    "node_modules/lodash.flattendeep": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI="
    },

    "node_modules/lodash.isempty": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
      "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4="
    },

    "node_modules/lodash.negate": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/lodash.negate/-/lodash.negate-3.0.2.tgz",
      "integrity": "sha1-nIl7C/YQAZ4LQ7j/Pwr+89e2bzQ="
    },

    "node_modules/minimatch": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
      "dependencies": {
        "brace-expansion": "^1.1.7"
      },

      "engines": {
        "node": "*"
      }

    },

    "node_modules/ms": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
    },

    "node_modules/node-7z": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/node-7z/-/node-7z-3.0.0.tgz",
      "integrity": "sha512-KIznWSxIkOYO/vOgKQfJEaXd7rgoFYKZbaurainCEdMhYc7V7mRHX+qdf2HgbpQFcdJL/Q6/XOPrDLoBeTfuZA==",
      "dependencies": {
        "debug": "^4.3.2",
        "lodash.defaultsdeep": "^4.6.1",
        "lodash.defaultto": "^4.14.0",
        "lodash.flattendeep": "^4.4.0",
        "lodash.isempty": "^4.4.0",
        "lodash.negate": "^3.0.2",
        "normalize-path": "^3.0.0"
      },

      "engines": {
        "node": ">=10"
      }

    },

    "node_modules/node-stream-zip": {
      "version": "1.13.6",
      "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.6.tgz",
      "integrity": "sha512-c7tRSVkLNOHvasWgmZ2d86cDgTWEygnkuuHNOY9c0mR3yLZtQTTrGvMaJ/fPs6+LOJn3240y30l5sjLaXFtcvw==",
      "engines": {
        "node": ">=0.10.0"
      },

      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/antelle"
      }

    },

    "node_modules/normalize-path": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
      "engines": {
        "node": ">=0.10.0"
      }

    },

    "node_modules/once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
      "dependencies": {
        "wrappy": "1"
      }

    },

    "node_modules/path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
      "engines": {
        "node": ">=0.10.0"
      }

    },

    "node_modules/wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    }

  },

  "dependencies": {
    "@types/glob": {
      "version": "7.1.4",
      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz",
      "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==",
      "optional": true,
      "requires": {
        "@types/minimatch": "*",
        "@types/node": "*"
      }

    },

    "@types/minimatch": {
      "version": "3.0.5",
      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
      "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
      "optional": true
    },

    "@types/node": {
      "version": "16.3.2",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.2.tgz",
      "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==",
      "optional": true
    },

    "asar": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz",
      "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==",
      "requires": {
        "@types/glob": "^7.1.1",
        "chromium-pickle-js": "^0.2.0",
        "commander": "^5.0.0",
        "glob": "^7.1.6",
        "minimatch": "^3.0.4"
      }

    },

    "balanced-match": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    },

    "brace-expansion": {
      "version": "1.1.11",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
      "requires": {
        "balanced-match": "^1.0.0",
        "concat-map": "0.0.1"
      }

    },

    "chromium-pickle-js": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
      "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU="
    },

    "commander": {
      "version": "5.1.0",
      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
    },

    "concat-map": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
    },

    "debug": {
      "version": "4.3.2",
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
      "requires": {
        "ms": "2.1.2"
      }

    },

    "elfinfo": {
      "version": "0.2.0-beta",
      "resolved": "https://registry.npmjs.org/elfinfo/-/elfinfo-0.2.0-beta.tgz",
      "integrity": "sha512-wIKg6MhAzNbzZug0/ppz+dfWYvNvgpbLGn+1OBUsB7+S0kgVC+ASNBYduhkKanQO0u7GcJUVd3AQYTmAi7FAIQ==",
      "requires": {
        "@types/node": "^14.14.22"
      },

      "dependencies": {
        "@types/node": {
          "version": "14.17.5",
          "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.5.tgz",
          "integrity": "sha512-bjqH2cX/O33jXT/UmReo2pM7DIJREPMnarixbQ57DOOzzFaI6D2+IcwaJQaJpv0M1E9TIhPCYVxrkcityLjlqA=="
        }

      }

    },

    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
    },

    "glob": {
      "version": "7.1.7",
      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
      "requires": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^3.0.4",
        "once": "^1.3.0",
        "path-is-absolute": "^1.0.0"
      }

    },

    "inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
      }

    },

    "inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },

    "lodash.defaultsdeep": {
      "version": "4.6.1",
      "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA=="
    },

    "lodash.defaultto": {
      "version": "4.14.0",
      "resolved": "https://registry.npmjs.org/lodash.defaultto/-/lodash.defaultto-4.14.0.tgz",
      "integrity": "sha1-OL09QlrO5zPg4ru9TkspcRzC7hE="
    },

    "lodash.flattendeep": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI="
    },

    "lodash.isempty": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
      "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4="
    },

    "lodash.negate": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/lodash.negate/-/lodash.negate-3.0.2.tgz",
      "integrity": "sha1-nIl7C/YQAZ4LQ7j/Pwr+89e2bzQ="
    },

    "minimatch": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
      "requires": {
        "brace-expansion": "^1.1.7"
      }

    },

    "ms": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
    },

    "node-7z": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/node-7z/-/node-7z-3.0.0.tgz",
      "integrity": "sha512-KIznWSxIkOYO/vOgKQfJEaXd7rgoFYKZbaurainCEdMhYc7V7mRHX+qdf2HgbpQFcdJL/Q6/XOPrDLoBeTfuZA==",
      "requires": {
        "debug": "^4.3.2",
        "lodash.defaultsdeep": "^4.6.1",
        "lodash.defaultto": "^4.14.0",
        "lodash.flattendeep": "^4.4.0",
        "lodash.isempty": "^4.4.0",
        "lodash.negate": "^3.0.2",
        "normalize-path": "^3.0.0"
      }

    },

    "node-stream-zip": {
      "version": "1.13.6",
      "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.6.tgz",
      "integrity": "sha512-c7tRSVkLNOHvasWgmZ2d86cDgTWEygnkuuHNOY9c0mR3yLZtQTTrGvMaJ/fPs6+LOJn3240y30l5sjLaXFtcvw=="
    },

    "normalize-path": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
    },

    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
      "requires": {
        "wrappy": "1"
      }

    },

    "path-is-absolute": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
    },

    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
    }

  }

}

diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d8397d3 100644
--- /dev/null
+++ a/package.json
@@ -1,0 +1,32 @@
{
  "name": "which-electron",
  "version": "1.0.0",
  "description": "Guess which electron version is bundled in an application",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },

  "repository": {
    "type": "git",
    "url": "git+https://github.com/captn3m0/which-electron.git"
  },

  "keywords": [
    "find",
    "electron",
    "version",
    "electron",
    "audit"
  ],

  "author": "Nemo <npm@captnemo.in>",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/captn3m0/which-electron/issues"
  },

  "homepage": "https://github.com/captn3m0/which-electron#readme",
  "dependencies": {
    "asar": "^3.0.3",
    "elfinfo": "*",
    "node-7z": "^3.0.0",
    "node-stream-zip": "^1.13.6"
  }

}

diff --git a/supported.json b/supported.json
new file mode 100644
index 0000000..b900809 100644
--- /dev/null
+++ a/supported.json
@@ -1,0 +1,1 @@
["13.1.6", "12.0.14", "11.4.10"]
diff --git a/utils.js b/utils.js
new file mode 100644
index 0000000..c74d212 100644
--- /dev/null
+++ a/utils.js
@@ -1,0 +1,5 @@
module.exports = {
  isDirectory: function(a) {
     return (a? a[0] == "D" : null)
  },
};