diff --git a/spec/fixtures/packages/package-with-cached-incompatible-native-module/main.js b/spec/fixtures/packages/package-with-cached-incompatible-native-module/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json b/spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json new file mode 100644 index 000000000..1db0a0a9d --- /dev/null +++ b/spec/fixtures/packages/package-with-cached-incompatible-native-module/package.json @@ -0,0 +1,12 @@ +{ + "name": "package-with-cached-incompatible-native-module", + "version": "1.0.0", + "main": "./main.js", + "_atomModuleCache": { + "extensions": { + ".node": [ + "node_modules/native-module/build/Release/native.node" + ] + } + } +} diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/main.js b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/build/Release/native.node b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/build/Release/native.node new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/main.js b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/main.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/package.json new file mode 100644 index 000000000..77068f680 --- /dev/null +++ b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/compatible-native-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "compatible-native-module", + "main": "./main.js" +} diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/build/Release/native.node b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/build/Release/native.node new file mode 100644 index 000000000..e69de29bb diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/main.js b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/main.js new file mode 100644 index 000000000..97f5c264e --- /dev/null +++ b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/main.js @@ -0,0 +1 @@ +throw new Error("this simulates a native module's failure to load") diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/package.json new file mode 100644 index 000000000..cac262cba --- /dev/null +++ b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/node_modules/native-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "native-module", + "main": "./main.js" +} diff --git a/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json new file mode 100644 index 000000000..4f6206828 --- /dev/null +++ b/spec/fixtures/packages/package-with-ignored-incompatible-native-module/package.json @@ -0,0 +1,12 @@ +{ + "name": "package-with-ignored-incompatible-native-module", + "version": "1.0.0", + "main": "./main.js", + "_atomModuleCache": { + "extensions": { + ".node": [ + "node_modules/compatible-native-module/build/Release/native.node" + ] + } + } +} diff --git a/spec/package-spec.coffee b/spec/package-spec.coffee index ef5f5a4c3..e73782219 100644 --- a/spec/package-spec.coffee +++ b/spec/package-spec.coffee @@ -19,6 +19,16 @@ describe "Package", -> expect(pack.incompatibleModules[0].name).toBe 'native-module' expect(pack.incompatibleModules[0].path).toBe path.join(packagePath, 'node_modules', 'native-module') + it "utilizes _atomModuleCache if present to determine the package's native dependencies", -> + packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-ignored-incompatible-native-module') + pack = new Package(packagePath) + expect(pack.getNativeModuleDependencyPaths().length).toBe(1) # doesn't see the incompatible module + expect(pack.isCompatible()).toBe true + + packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-cached-incompatible-native-module') + pack = new Package(packagePath) + expect(pack.isCompatible()).toBe false + it "caches the incompatible native modules in local storage", -> packagePath = atom.project.getDirectories()[0]?.resolve('packages/package-with-incompatible-native-module') diff --git a/src/package.coffee b/src/package.coffee index f3f5cf4a2..6170a645e 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -590,10 +590,20 @@ class Package false # Get an array of all the native modules that this package depends on. - # This will recurse through all dependencies. + # + # First try to get this information from + # @metadata._atomModuleCache.extensions. If @metadata._atomModuleCache doesn't + # exist, recurse through all dependencies. getNativeModuleDependencyPaths: -> nativeModulePaths = [] + if @metadata._atomModuleCache? + relativeNativeModuleBindingPaths = @metadata._atomModuleCache.extensions?['.node'] ? [] + for relativeNativeModuleBindingPath in relativeNativeModuleBindingPaths + nativeModulePath = path.join(@path, relativeNativeModuleBindingPath, '..', '..', '..') + nativeModulePaths.push(nativeModulePath) + return nativeModulePaths + traversePath = (nodeModulesPath) => try for modulePath in fs.listSync(nodeModulesPath)