summaryrefslogtreecommitdiff
path: root/desktop/node_modules/flora-colossus/lib/Walker.js
diff options
context:
space:
mode:
authorRaindropsSys <raindrops@equestria.dev>2023-10-24 17:43:37 +0200
committerRaindropsSys <raindrops@equestria.dev>2023-10-24 17:43:37 +0200
commitae187b6d75c8079da0be1dc288613bad8466fe61 (patch)
tree5ea0d34185a2270f29ffaa65e1f5258028d7d5d0 /desktop/node_modules/flora-colossus/lib/Walker.js
downloadmist-ae187b6d75c8079da0be1dc288613bad8466fe61.tar.gz
mist-ae187b6d75c8079da0be1dc288613bad8466fe61.tar.bz2
mist-ae187b6d75c8079da0be1dc288613bad8466fe61.zip
Initial commit
Diffstat (limited to 'desktop/node_modules/flora-colossus/lib/Walker.js')
-rw-r--r--desktop/node_modules/flora-colossus/lib/Walker.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/desktop/node_modules/flora-colossus/lib/Walker.js b/desktop/node_modules/flora-colossus/lib/Walker.js
new file mode 100644
index 0000000..084dd69
--- /dev/null
+++ b/desktop/node_modules/flora-colossus/lib/Walker.js
@@ -0,0 +1,152 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Walker = void 0;
+const debug = require("debug");
+const fs = require("fs-extra");
+const path = require("path");
+const depTypes_1 = require("./depTypes");
+const nativeModuleTypes_1 = require("./nativeModuleTypes");
+const d = debug('flora-colossus');
+class Walker {
+ constructor(modulePath) {
+ this.modules = [];
+ this.walkHistory = new Set();
+ this.cache = null;
+ if (!modulePath || typeof modulePath !== 'string') {
+ throw new Error('modulePath must be provided as a string');
+ }
+ d(`creating walker with rootModule=${modulePath}`);
+ this.rootModule = modulePath;
+ }
+ relativeModule(rootPath, moduleName) {
+ return path.resolve(rootPath, 'node_modules', moduleName);
+ }
+ async loadPackageJSON(modulePath) {
+ const pJPath = path.resolve(modulePath, 'package.json');
+ if (await fs.pathExists(pJPath)) {
+ const pJ = await fs.readJson(pJPath);
+ if (!pJ.dependencies)
+ pJ.dependencies = {};
+ if (!pJ.devDependencies)
+ pJ.devDependencies = {};
+ if (!pJ.optionalDependencies)
+ pJ.optionalDependencies = {};
+ return pJ;
+ }
+ return null;
+ }
+ async walkDependenciesForModuleInModule(moduleName, modulePath, depType) {
+ let testPath = modulePath;
+ let discoveredPath = null;
+ let lastRelative = null;
+ // Try find it while searching recursively up the tree
+ while (!discoveredPath && this.relativeModule(testPath, moduleName) !== lastRelative) {
+ lastRelative = this.relativeModule(testPath, moduleName);
+ if (await fs.pathExists(lastRelative)) {
+ discoveredPath = lastRelative;
+ }
+ else {
+ if (path.basename(path.dirname(testPath)) !== 'node_modules') {
+ testPath = path.dirname(testPath);
+ }
+ testPath = path.dirname(path.dirname(testPath));
+ }
+ }
+ // If we can't find it the install is probably buggered
+ if (!discoveredPath && depType !== depTypes_1.DepType.OPTIONAL && depType !== depTypes_1.DepType.DEV_OPTIONAL) {
+ throw new Error(`Failed to locate module "${moduleName}" from "${modulePath}"
+
+ This normally means that either you have deleted this package already somehow (check your ignore settings if using electron-packager). Or your module installation failed.`);
+ }
+ // If we can find it let's do the same thing for that module
+ if (discoveredPath) {
+ await this.walkDependenciesForModule(discoveredPath, depType);
+ }
+ }
+ async detectNativeModuleType(modulePath, pJ) {
+ if (pJ.dependencies['prebuild-install']) {
+ return nativeModuleTypes_1.NativeModuleType.PREBUILD;
+ }
+ else if (await fs.pathExists(path.join(modulePath, 'binding.gyp'))) {
+ return nativeModuleTypes_1.NativeModuleType.NODE_GYP;
+ }
+ return nativeModuleTypes_1.NativeModuleType.NONE;
+ }
+ async walkDependenciesForModule(modulePath, depType) {
+ d('walk reached:', modulePath, ' Type is:', depTypes_1.DepType[depType]);
+ // We have already traversed this module
+ if (this.walkHistory.has(modulePath)) {
+ d('already walked this route');
+ // Find the existing module reference
+ const existingModule = this.modules.find(module => module.path === modulePath);
+ // If the depType we are traversing with now is higher than the
+ // last traversal then update it (prod superseeds dev for instance)
+ if ((0, depTypes_1.depTypeGreater)(depType, existingModule.depType)) {
+ d(`existing module has a type of "${existingModule.depType}", new module type would be "${depType}" therefore updating`);
+ existingModule.depType = depType;
+ }
+ return;
+ }
+ const pJ = await this.loadPackageJSON(modulePath);
+ // If the module doesn't have a package.json file it is probably a
+ // dead install from yarn (they dont clean up for some reason)
+ if (!pJ) {
+ d('walk hit a dead end, this module is incomplete');
+ return;
+ }
+ // Record this module as being traversed
+ this.walkHistory.add(modulePath);
+ this.modules.push({
+ depType,
+ nativeModuleType: await this.detectNativeModuleType(modulePath, pJ),
+ path: modulePath,
+ name: pJ.name,
+ });
+ // For every prod dep
+ for (const moduleName in pJ.dependencies) {
+ // npm decides it's a funny thing to put optional dependencies in the "dependencies" section
+ // after install, because that makes perfect sense
+ if (moduleName in pJ.optionalDependencies) {
+ d(`found ${moduleName} in prod deps of ${modulePath} but it is also marked optional`);
+ continue;
+ }
+ await this.walkDependenciesForModuleInModule(moduleName, modulePath, (0, depTypes_1.childDepType)(depType, depTypes_1.DepType.PROD));
+ }
+ // For every optional dep
+ for (const moduleName in pJ.optionalDependencies) {
+ await this.walkDependenciesForModuleInModule(moduleName, modulePath, (0, depTypes_1.childDepType)(depType, depTypes_1.DepType.OPTIONAL));
+ }
+ // For every dev dep, but only if we are in the root module
+ if (depType === depTypes_1.DepType.ROOT) {
+ d('we\'re still at the beginning, walking down the dev route');
+ for (const moduleName in pJ.devDependencies) {
+ await this.walkDependenciesForModuleInModule(moduleName, modulePath, (0, depTypes_1.childDepType)(depType, depTypes_1.DepType.DEV));
+ }
+ }
+ }
+ async walkTree() {
+ d('starting tree walk');
+ if (!this.cache) {
+ this.cache = new Promise(async (resolve, reject) => {
+ this.modules = [];
+ try {
+ await this.walkDependenciesForModule(this.rootModule, depTypes_1.DepType.ROOT);
+ }
+ catch (err) {
+ reject(err);
+ return;
+ }
+ resolve(this.modules);
+ });
+ }
+ else {
+ d('tree walk in progress / completed already, waiting for existing walk to complete');
+ }
+ return await this.cache;
+ }
+ getRootModule() {
+ return this.rootModule;
+ }
+}
+exports.Walker = Walker;
+//# sourceMappingURL=Walker.js.map \ No newline at end of file