Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-11-14 15:08:03 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-11-14 15:08:03 +0300
commit61a82b8ec062d6f122dadd38783c7754cef7ce2b (patch)
tree071d1ded4f507d77bac97156aa1fa85c95c0cba5 /app/assets/javascripts/vue_shared/components/source_viewer
parent3ed578edf525bce3167860b84f6b43bab5065cf5 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/vue_shared/components/source_viewer')
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js18
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js32
3 files changed, 52 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 62036056700..dec2ef1a63a 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
@@ -2,12 +2,14 @@ import packageJsonLinker from './utils/package_json_linker';
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';
const DEPENDENCY_LINKERS = {
package_json: packageJsonLinker,
gemspec: gemspecLinker,
godeps_json: godepsJsonLinker,
gemfile: gemfileLinker,
+ podspec_json: podspecJsonLinker,
};
/**
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js
index 299059f62f7..c1a1101afad 100644
--- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js
@@ -7,3 +7,21 @@ export const createLink = (href, innerText) =>
export const generateHLJSOpenTag = (type, delimiter = '&quot;') =>
`<span class="hljs-${escape(type)}">${delimiter}`;
+
+export const getObjectKeysByKeyName = (obj, keyName, acc) => {
+ if (obj instanceof Array) {
+ obj.map((subObj) => getObjectKeysByKeyName(subObj, keyName, acc));
+ } else {
+ for (const key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ if (key === keyName) {
+ acc.push(...Object.keys(obj[key]));
+ }
+ if (obj[key] instanceof Object || obj[key] instanceof Array) {
+ getObjectKeysByKeyName(obj[key], keyName, acc);
+ }
+ }
+ }
+ }
+ return acc;
+};
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js
new file mode 100644
index 00000000000..e2007fe408b
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js
@@ -0,0 +1,32 @@
+import { createLink, generateHLJSOpenTag, getObjectKeysByKeyName } from './dependency_linker_util';
+
+const COCOAPODS_URL = 'https://cocoapods.org/pods/';
+const beginString = generateHLJSOpenTag('attr');
+const endString =
+ '&quot;</span><span class="hljs-punctuation">:</span><span class=""> </span><span class="hljs-punctuation">\\[';
+
+const DEPENDENCY_REGEX = new RegExp(
+ /*
+ * Detects dependencies inside of content that is highlighted by Highlight.js
+ * Example: <span class="hljs-attr">&quot;AFNetworking/Security&quot;</span><span class="hljs-punctuation">:</span><span class=""> </span><span class="hljs-punctuation"> [
+ * Group 1: AFNetworking/Serialization
+ */
+ `${beginString}([^/]+/?[^/]+.)${endString}`,
+ 'gm',
+);
+
+const handleReplace = (original, dependency, dependenciesToLink) => {
+ if (dependenciesToLink.includes(dependency)) {
+ const href = `${COCOAPODS_URL}${dependency.split('/')[0]}`;
+ const link = createLink(href, dependency);
+ return `${beginString}${link}${endString.replace('\\', '')}`;
+ }
+ return original;
+};
+
+export default (result, raw) => {
+ const dependenciesToLink = getObjectKeysByKeyName(JSON.parse(raw), 'dependencies', []);
+ return result.value.replace(DEPENDENCY_REGEX, (original, dependency) =>
+ handleReplace(original, dependency, dependenciesToLink),
+ );
+};