Skip to content
Snippets Groups Projects
Select Git revision
  • c711fb4cea68058ad7f45cb18d27f2926542067a
  • master default
2 results

artifacts.js

Blame
  • extract.js 2.27 KiB
    const { XmlDocument } = require('xmldoc');
    const { isVersion } = require('../../versioning/maven');
    
    function parsePom(raw) {
      let project;
      try {
        project = new XmlDocument(raw);
      } catch (e) {
        return null;
      }
      const { name, attr } = project;
      if (name !== 'project') return null;
      if (attr.xmlns !== 'http://maven.apache.org/POM/4.0.0') return null;
      return project;
    }
    
    function containsPlaceholder(str) {
      return /\${.*?}/g.test(str);
    }
    
    function depFromNode(node) {
      if (!node.valueWithPath) return null;
      const groupId = node.valueWithPath('groupId');
      const artifactId = node.valueWithPath('artifactId');
      const currentValue = node.valueWithPath('version');
      if (groupId && artifactId && currentValue) {
        const depName = `${groupId}:${artifactId}`;
        const result = {
          depName,
          currentValue,
        };
        if (containsPlaceholder(depName)) {
          result.skipReason = 'name-placeholder';
        } else if (containsPlaceholder(currentValue)) {
          result.skipReason = 'version-placeholder';
        } else if (!isVersion(currentValue)) {
          result.skipReason = 'not-a-version';
        } else {
          const versionNode = node.descendantWithPath('version');
          const offset = '<version>'.length - 1;
          result.fileReplacePosition = versionNode.startTagPosition + offset;
          result.datasource = 'maven';
          result.registryUrls = ['https://repo.maven.apache.org/maven2'];
        }
        return result;
      }
      return null;
    }
    
    function deepExtract(node, result = [], isRoot = true) {
      const dep = depFromNode(node);
      if (dep && !isRoot) {
        result.push(dep);
      }
      if (node.children) {
        for (const child of node.children) {
          deepExtract(child, result, false);
        }
      }
      return result;
    }
    
    function extractDependencies(raw) {
      if (!raw) return null;
    
      const project = parsePom(raw);
      if (!project) return null;
    
      const result = { datasource: 'maven' };
    
      const homepage = project.valueWithPath('url');
      if (homepage && !containsPlaceholder(homepage)) {
        result.homepage = homepage;
      }
    
      const sourceUrl = project.valueWithPath('scm.url');
      if (sourceUrl && !containsPlaceholder(sourceUrl)) {
        result.sourceUrl = sourceUrl;
      }
    
      result.deps = deepExtract(project);
    
      return result;
    }
    
    module.exports = {
      containsPlaceholder,
      parsePom,
      extractDependencies,
    };