Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: refactor hyperlinks and metadata #154

Merged
merged 1 commit into from
Mar 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
57 changes: 21 additions & 36 deletions src/extensions/hyperlinks.js
Original file line number Diff line number Diff line change
@@ -1,54 +1,39 @@
const { STATUS, HOOK } = require("../helpers/constants");
const { getLinks } = require('../helpers/helper');
const { addChatExtension, addSlackExtension, addTeamsExtension } = require('../helpers/extension.helper');
const { getTeamsMetaDataText, getSlackMetaDataText, getChatMetaDataText } = require("../helpers/metadata.helper");

async function run({ target, extension, payload, result }) {
const raw_links = await getLinks({ target, extension, result, links: extension.inputs.links, default_options })
const elements = get_elements(extension.inputs.links);
if (target.name === 'teams') {
extension.inputs = Object.assign({}, default_inputs_teams, extension.inputs);
attachLinksToTeams({ extension, payload, raw_links });
const text = await getTeamsMetaDataText({ elements, target, extension, result, default_condition: default_options.condition });
if (text) {
addTeamsExtension({ payload, extension, text });
}
} else if (target.name === 'slack') {
extension.inputs = Object.assign({}, default_inputs_slack, extension.inputs);
attachLinksToSLack({ extension, payload, raw_links });
extension.inputs.block_type = 'context';
const text = await getSlackMetaDataText({ elements, target, extension, result, default_condition: default_options.condition });
if (text) {
addSlackExtension({ payload, extension, text });
}
} else if (target.name === 'chat') {
extension.inputs = Object.assign({}, default_inputs_chat, extension.inputs);
attachLinksToChat({ extension, payload, raw_links });
}
}

function attachLinksToTeams({ extension, payload, raw_links }) {
const links = [];
for (const link of raw_links) {
links.push(`[${link.text}](${link.url})`);
}
if (links.length) {
addTeamsExtension({ payload, extension, text: links.join(' | ') });
}
}

function attachLinksToSLack({ extension, payload, raw_links }) {
const links = [];
for (const link of raw_links) {
links.push(`<${link.url}|${link.text}>`);
}
if (links.length) {
extension.inputs.block_type = 'context';
addSlackExtension({ payload, extension, text: links.join(' | ') });
const text = await getChatMetaDataText({ elements, target, extension, result, default_condition: default_options.condition });
if (text) {
addChatExtension({ payload, extension, text });
}
}
}

function attachLinksToChat({ extension, payload, raw_links }) {
const links = [];
for (const link of raw_links) {
links.push(`<a href="${link.url}">${link.text}</a>`);
}
if (links.length) {
addChatExtension({ payload, extension, text: links.join(' | ') });
}
/**
*
* @param {import("..").Link[]} links
*/
function get_elements(links) {
return links.map(_ => { return { key: _.text, value: _.url, type: 'hyperlink', condition: _.condition } });
}



const default_options = {
hook: HOOK.END,
condition: STATUS.PASS_OR_FAIL,
Expand Down
96 changes: 34 additions & 62 deletions src/extensions/metadata.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const { HOOK, STATUS } = require('../helpers/constants');
const { addChatExtension, addSlackExtension, addTeamsExtension } = require('../helpers/extension.helper');
const { checkCondition } = require('../helpers/helper');
const { getTeamsMetaDataText, getSlackMetaDataText, getChatMetaDataText } = require('../helpers/metadata.helper');

/**
* @param {object} param0
Expand All @@ -10,87 +10,59 @@ const { checkCondition } = require('../helpers/helper');
async function run({ target, extension, result, payload, root_payload }) {
if (target.name === 'teams') {
extension.inputs = Object.assign({}, default_inputs_teams, extension.inputs);
await attachForTeams({ extension, payload, result });
await attachForTeams({ target, extension, payload, result });
} else if (target.name === 'slack') {
extension.inputs = Object.assign({}, default_inputs_slack, extension.inputs);
await attachForSlack({ extension, payload, result });
await attachForSlack({ target, extension, payload, result });
} else if (target.name === 'chat') {
extension.inputs = Object.assign({}, default_inputs_chat, extension.inputs);
await attachForChat({ extension, payload, result });
await attachForChat({ target, extension, payload, result });
}
}

/**
* @param {object} param0
* @param {import('..').MetadataExtension} param0.extension
*/
async function attachForTeams({ extension, payload, result }) {
const valid_data = await getValidData({ extension, result });
if (valid_data.length > 0) {
const data = [];
for (const current of valid_data) {
if (current.type === 'hyperlink') {
data.push(`[${current.key}](${current.value})`);
} else if (current.key) {
data.push(`**${current.key}:** ${current.value}`);
} else {
data.push(current.value);
}
}
addTeamsExtension({ payload, extension, text: data.join(' | ') });
async function attachForTeams({ target, extension, payload, result }) {
const text = await getTeamsMetaDataText({
elements: extension.inputs.data,
target,
extension,
result,
default_condition: default_options.condition
});
if (text) {
addTeamsExtension({ payload, extension, text });
}
}

async function attachForSlack({ extension, payload, result }) {
const valid_data = await getValidData({ extension, result });
if (valid_data.length > 0) {
const data = [];
for (const current of valid_data) {
if (current.type === 'hyperlink') {
data.push(`<${current.value}|${current.key}>`);
} else if (current.key) {
data.push(`*${current.key}:* ${current.value}`);
} else {
data.push(current.value);
}
}
addSlackExtension({ payload, extension, text: data.join(' | ') });
async function attachForSlack({ target, extension, payload, result }) {
const text = await getSlackMetaDataText({
elements: extension.inputs.data,
target,
extension,
result,
default_condition: default_options.condition
});
if (text) {
addSlackExtension({ payload, extension, text });
}
}

async function attachForChat({ extension, payload, result }) {
const valid_data = await getValidData({ extension, result });
if (valid_data.length > 0) {
const data = [];
for (const current of valid_data) {
if (current.type === 'hyperlink') {
data.push(`<a href="${current.value}">${current.key}</a>`);
} else if (current.key) {
data.push(`<b>${current.key}:</b> ${current.value}`);
} else {
data.push(current.value);
}
}
addChatExtension({ payload, extension, text: data.join(' | ') });
async function attachForChat({ target, extension, payload, result }) {
const text = await getChatMetaDataText({
elements: extension.inputs.data,
target,
extension,
result,
default_condition: default_options.condition
});
if (text) {
addChatExtension({ payload, extension, text });
}
}

/**
* @param {object} param0
* @param {import('..').MetadataExtension} param0.extension
*/
async function getValidData({ extension, result }) {
const valid_data = [];
for (const current of extension.inputs.data) {
const condition = current.condition || default_options.condition;
if (await checkCondition({ condition, result })) {
valid_data.push(current);
}
}
return valid_data;
}


const default_options = {
hook: HOOK.END,
condition: STATUS.PASS_OR_FAIL
Expand Down
3 changes: 2 additions & 1 deletion src/helpers/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ const EXTENSION = Object.freeze({
QUICK_CHART_TEST_SUMMARY: 'quick-chart-test-summary',
PERCY_ANALYSIS: 'percy-analysis',
CUSTOM: 'custom',
METADATA: 'metadata'
METADATA: 'metadata',
CI_INFO: 'ci-info',
});

const URLS = Object.freeze({
Expand Down
23 changes: 0 additions & 23 deletions src/helpers/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,28 +71,6 @@ function getResultText({ result }) {
return `${result.passed} / ${result.total} Passed (${percentage}%)`;
}

async function getLinks({ target, result, extension, links, default_options }) {
const raw_valid_links = await getValidLinks(links, result, default_options);
for (let i = 0; i < raw_valid_links.length; i++) {
const url_function = raw_valid_links[i].url;
if (typeof url_function === 'function') {
raw_valid_links[i].url = await raw_valid_links[i].url({target, extension, result});
}
}
return raw_valid_links;
}

async function getValidLinks(links, result, default_options) {
const valid_links = [];
for (const link of links) {
const condition = link.condition || default_options.condition;
if (await checkCondition({ condition, result })) {
valid_links.push(link);
}
}
return valid_links;
}

/**
*
* @param {object} param0
Expand Down Expand Up @@ -121,5 +99,4 @@ module.exports = {
getTitleText,
getResultText,
checkCondition,
getLinks
}
103 changes: 103 additions & 0 deletions src/helpers/metadata.helper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
const { checkCondition } = require('./helper')

/**
* Asynchronously generates metadata text for slack.
*
* @param {object} param0 - the payload object
* @param {Object} param0.elements - The elements to generate metadata text from
* @param {import('..').Target} param0.target - The result object
* @param {import('..').Extension} param0.extension - The result object
* @param {Object} param0.result - The result object
* @param {string} param0.default_condition - The default condition object
* @return {string} The generated metadata text
*/
async function getSlackMetaDataText({ elements, target, extension, result, default_condition }) {
const items = [];
for (const element of elements) {
if (await is_valid({ element, result, default_condition })) {
if (element.type === 'hyperlink') {
const url = await get_url({ url: element.value, target, result, extension });
items.push(`<${url}|${element.key}>`);
} else if (element.key) {
items.push(`*${element.key}:* ${element.value}`);
} else {
items.push(element.value);
}
}
}
return items.join(' | ');
}

/**
* Asynchronously generates metadata text for teams.
*
* @param {object} param0 - the payload object
* @param {Object} param0.elements - The elements to generate metadata text from
* @param {import('..').Target} param0.target - The result object
* @param {import('..').Extension} param0.extension - The result object
* @param {Object} param0.result - The result object
* @param {string} param0.default_condition - The default condition object
* @return {string} The generated metadata text
*/
async function getTeamsMetaDataText({ elements, target, extension, result, default_condition }) {
const items = [];
for (const element of elements) {
if (await is_valid({ element, result, default_condition })) {
if (element.type === 'hyperlink') {
const url = await get_url({ url: element.value, target, result, extension });
items.push(`[${element.key}](${url})`);
} else if (element.key) {
items.push(`**${element.key}:** ${element.value}`);
} else {
items.push(element.value);
}
}
}
return items.join(' | ');
}

/**
* Asynchronously generates metadata text for chat.
*
* @param {object} param0 - the payload object
* @param {Object} param0.elements - The elements to generate metadata text from
* @param {import('..').Target} param0.target - The result object
* @param {import('..').Extension} param0.extension - The result object
* @param {Object} param0.result - The result object
* @param {string} param0.default_condition - The default condition object
* @return {string} The generated metadata text
*/
async function getChatMetaDataText({ elements, target, extension, result, default_condition }) {
const items = [];
for (const element of elements) {
if (await is_valid({ element, result, default_condition })) {
if (element.type === 'hyperlink') {
const url = await get_url({ url: element.value, target, result, extension });
items.push(`<a href="${url}">${element.key}</a>`);
} else if (element.key) {
items.push(`<b>${element.key}:</b> ${element.value}`);
} else {
items.push(element.value);
}
}
}
return items.join(' | ');
}

function is_valid({ element, result, default_condition }) {
const condition = element.condition || default_condition;
return checkCondition({ condition, result });
}

function get_url({ url, target, extension, result}) {
if (typeof url === 'function') {
return url({target, extension, result});
}
return url;
}

module.exports = {
getSlackMetaDataText,
getTeamsMetaDataText,
getChatMetaDataText
}