diff --git a/.changeset/nine-steaks-accept.md b/.changeset/nine-steaks-accept.md new file mode 100644 index 0000000..82cbb22 --- /dev/null +++ b/.changeset/nine-steaks-accept.md @@ -0,0 +1,5 @@ +--- +"app-builder-bin": patch +--- + +fix: Incorrect 'node_modules' path for the dependencies. diff --git a/pkg/node-modules/nodeModuleCollector.go b/pkg/node-modules/nodeModuleCollector.go index ea16332..e72d439 100644 --- a/pkg/node-modules/nodeModuleCollector.go +++ b/pkg/node-modules/nodeModuleCollector.go @@ -55,6 +55,8 @@ func (t *Collector) readDependencyTree(dependency *Dependency) error { return nil } + nodeModuleDir = fixNodeModuleDir(nodeModuleDir, dependency.Dependencies) + // process direct children first queue := make([]*Dependency, maxQueueSize) queueIndex := 0 @@ -255,6 +257,51 @@ func findNearestNodeModuleDir(dir string) (string, error) { } } +func fixNodeModuleDir(nodeModuleDir string, dependencies map[string]string) string { + result := nodeModuleDir + pathList := strings.Split(nodeModuleDir, string(os.PathSeparator)) + + check := false + missedDeps := make([]string, 0) + for i := 0; i < len(pathList); i++ { + if check { + break + } + + path := nodeModuleDir + for j := 0; j < i; j++ { + path = filepath.Join(path, "..") + } + + // check if all dependencies are present + for k := range dependencies { + fileInfo, err := os.Stat(filepath.Join(path, k)) + if err != nil || !fileInfo.IsDir() { + if !slices.Contains(missedDeps, k) { + missedDeps = append(missedDeps, k) + } + check = false + } else { + // remove from failed deps if dependency is present + for i, v := range missedDeps { + if v == k { + missedDeps = append(missedDeps[:i], missedDeps[i+1:]...) + break + } + } + check = true + result = path + } + } + } + + if (len(result) != len(nodeModuleDir)) && len(missedDeps) != 0 && log.IsDebugEnabled() { + log.Debug("fixed node_module dir", zap.String("old", nodeModuleDir), zap.String("new", result), zap.Strings("missedDeps", missedDeps)) + } + + return result +} + func getParentDir(file string) string { if len(file) == 0 { return file