diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-15 18:08:26 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-15 18:08:26 +0300 |
commit | 4279dbc29c63f614e6439e104204165ff0517a59 (patch) | |
tree | a2a2dc637398f9c66eeda39ee9e3e209370a84c4 /app/assets/javascripts/vue_shared/components/source_viewer | |
parent | 7912017a137da35c48071a048c99d27737c29f0f (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/vue_shared/components/source_viewer')
2 files changed, 51 insertions, 0 deletions
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js index dec2ef1a63a..fca2616f069 100644 --- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js +++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js @@ -3,6 +3,7 @@ import gemspecLinker from './utils/gemspec_linker'; import godepsJsonLinker from './utils/godeps_json_linker'; import gemfileLinker from './utils/gemfile_linker'; import podspecJsonLinker from './utils/podspec_json_linker'; +import composerJsonLinker from './utils/composer_json_linker'; const DEPENDENCY_LINKERS = { package_json: packageJsonLinker, @@ -10,6 +11,7 @@ const DEPENDENCY_LINKERS = { godeps_json: godepsJsonLinker, gemfile: gemfileLinker, podspec_json: podspecJsonLinker, + composer_json: composerJsonLinker, }; /** diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/composer_json_linker.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/composer_json_linker.js new file mode 100644 index 00000000000..f5c4c886546 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/composer_json_linker.js @@ -0,0 +1,49 @@ +import { createLink, generateHLJSOpenTag } from './dependency_linker_util'; + +const PACKAGIST_URL = 'https://packagist.org/packages/'; +const DRUPAL_URL = 'https://www.drupal.org/project/'; + +const attrOpenTag = generateHLJSOpenTag('attr'); +const stringOpenTag = generateHLJSOpenTag('string'); +const closeTag = '"</span>'; +const DRUPAL_PROJECT_SEPARATOR = 'drupal/'; +const DEPENDENCY_REGEX = new RegExp( + /* + * Detects dependencies inside of content that is highlighted by Highlight.js + * Example: <span class="hljs-attr">"composer/installers"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"^1.2"</span> + * Group 1: composer/installers + * Group 2: ^1.2 + */ + `${attrOpenTag}([^/]+/[^/]+.)${closeTag}.*${stringOpenTag}(.*[0-9].*)(${closeTag})`, + 'gm', +); + +const handleReplace = (original, packageName, version, dependenciesToLink) => { + const isDrupalDependency = packageName.includes(DRUPAL_PROJECT_SEPARATOR); + const href = isDrupalDependency + ? `${DRUPAL_URL}${packageName.split(DRUPAL_PROJECT_SEPARATOR)[1]}` + : `${PACKAGIST_URL}${packageName}`; + const packageLink = createLink(href, packageName); + const versionLink = createLink(href, version); + const closeAndOpenTag = `${closeTag}: ${attrOpenTag}`; + const dependencyToLink = dependenciesToLink[packageName]; + + if (dependencyToLink && dependencyToLink === version) { + return `${attrOpenTag}${packageLink}${closeAndOpenTag}${versionLink}${closeTag}`; + } + + return original; +}; + +export default (result, raw) => { + const rawParsed = JSON.parse(raw); + + const dependenciesToLink = { + ...rawParsed.require, + ...rawParsed['require-dev'], + }; + + return result.value.replace(DEPENDENCY_REGEX, (original, packageName, version) => + handleReplace(original, packageName, version, dependenciesToLink), + ); +}; |