mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-22 18:00:18 +01:00
3732c5f71e
ESLint rules have been added to enforce our JSDoc conventions. These rules were introduced by updating `@metamask/eslint-config` to v9. Some of the rules have been disabled because the effort to fix all lint errors was too high. It might be easiest to enable these rules one directory at a time, or one rule at a time. Most of the changes in this PR were a result of running `yarn lint:fix`. There were a handful of manual changes that seemed obvious and simple to make. Anything beyond that and the rule was left disabled.
92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
const path = require('path');
|
|
const { promisify } = require('util');
|
|
const exec = promisify(require('child_process').exec);
|
|
const dependencyTree = require('dependency-tree');
|
|
|
|
const cwd = process.cwd();
|
|
const resolutionCache = {};
|
|
|
|
// 1. load stories
|
|
// 2. load list per story
|
|
// 3. filter against files
|
|
module.exports = {
|
|
getHighlights,
|
|
getHighlightAnnouncement,
|
|
};
|
|
|
|
async function getHighlightAnnouncement({ changedFiles, artifactBase }) {
|
|
const highlights = await getHighlights({ changedFiles });
|
|
if (!highlights.length) {
|
|
return null;
|
|
}
|
|
const highlightsBody = highlights
|
|
.map((entry) => `\n- [${entry}](${urlForStoryFile(entry, artifactBase)})`)
|
|
.join('');
|
|
const announcement = `<details>
|
|
<summary>storybook</summary>
|
|
${highlightsBody}
|
|
</details>\n\n`;
|
|
return announcement;
|
|
}
|
|
|
|
async function getHighlights({ changedFiles }) {
|
|
const highlights = [];
|
|
const storyFiles = await getAllStories();
|
|
// check each story file for dep graph overlap with changed files
|
|
for (const storyFile of storyFiles) {
|
|
const list = await getLocalDependencyList(storyFile);
|
|
if (list.some((entry) => changedFiles.includes(entry))) {
|
|
highlights.push(storyFile);
|
|
}
|
|
}
|
|
return highlights;
|
|
}
|
|
|
|
async function getAllStories() {
|
|
const { stdout } = await exec('find ui -name "*.stories.js"');
|
|
const matches = stdout.split('\n').slice(0, -1);
|
|
return matches;
|
|
}
|
|
|
|
async function getLocalDependencyList(filename) {
|
|
const list = dependencyTree
|
|
.toList({
|
|
filename,
|
|
// not sure what this does but its mandatory
|
|
directory: cwd,
|
|
webpackConfig: `.storybook/main.js`,
|
|
// skip all dependencies
|
|
filter: (entry) => !entry.includes('node_modules'),
|
|
// for memoization across trees: 30s -> 5s
|
|
visited: resolutionCache,
|
|
})
|
|
.map((entry) => path.relative(cwd, entry));
|
|
return list;
|
|
}
|
|
|
|
function urlForStoryFile(filename, artifactBase) {
|
|
const storyId = sanitize(filename);
|
|
return `${artifactBase}/storybook/index.html?path=/story/${storyId}`;
|
|
}
|
|
|
|
/**
|
|
* Remove punctuation and illegal characters from a story ID.
|
|
* See:
|
|
* https://gist.github.com/davidjrice/9d2af51100e41c6c4b4a
|
|
* https://github.com/ComponentDriven/csf/blame/7ac941eee85816a4c567ca85460731acb5360f50/src/index.ts
|
|
*
|
|
* @param {string} string - The string to sanitize.
|
|
* @returns The sanitized string.
|
|
*/
|
|
function sanitize(string) {
|
|
return (
|
|
string
|
|
.toLowerCase()
|
|
// eslint-disable-next-line no-useless-escape
|
|
.replace(/[ ’–—―′¿'`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/giu, '-')
|
|
.replace(/-+/gu, '-')
|
|
.replace(/^-+/u, '')
|
|
.replace(/-+$/u, '')
|
|
);
|
|
}
|