@semantic-release/github
Version:
semantic-release plugin to publish a GitHub release and comment on released Pull Requests/Issues
76 lines (65 loc) • 3.04 kB
JavaScript
import { basename, resolve } from "node:path";
import { isPlainObject, castArray, uniqWith, uniq } from "lodash-es";
import dirGlob from "dir-glob";
import { globby } from "globby";
import debugFactory from "debug";
const debug = debugFactory("semantic-release:github");
export default async function globAssets({ cwd }, assets) {
return uniqWith(
(
await Promise.all(
assets.map(async (asset) => {
// Wrap single glob definition in Array
let glob = castArray(isPlainObject(asset) ? asset.path : asset);
// TODO Temporary workaround for https://github.com/mrmlnc/fast-glob/issues/47
glob = uniq([...(await dirGlob(glob, { cwd })), ...glob]);
// Skip solo negated pattern (avoid to include every non js file with `!**/*.js`)
if (glob.length <= 1 && glob[0].startsWith("!")) {
debug(
"skipping the negated glob %o as its alone in its group and would retrieve a large amount of files",
glob[0],
);
return [];
}
const globbed = await globby(glob, {
cwd,
expandDirectories: false, // TODO Temporary workaround for https://github.com/mrmlnc/fast-glob/issues/47
dot: true,
onlyFiles: false,
});
if (isPlainObject(asset)) {
if (globbed.length > 1) {
// If asset is an Object with a glob the `path` property that resolve to multiple files,
// Output an Object definition for each file matched and set each one with:
// - `path` of the matched file
// - `name` based on the actual file name (to avoid assets with duplicate `name`)
// - other properties of the original asset definition
return globbed.map((file) => ({
...asset,
path: file,
name: basename(file),
}));
}
// If asset is an Object, output an Object definition with:
// - `path` of the matched file if there is one, or the original `path` definition (will be considered as a missing file)
// - other properties of the original asset definition
return { ...asset, path: globbed[0] || asset.path };
}
if (globbed.length > 0) {
// If asset is a String definition, output each files matched
return globbed;
}
// If asset is a String definition but no match is found, output the elements of the original glob (each one will be considered as a missing file)
return glob;
}),
// Sort with Object first, to prioritize Object definition over Strings in dedup
)
)
.flat()
.sort((asset) => (isPlainObject(asset) ? -1 : 1)),
// Compare `path` property if Object definition, value itself if String
(a, b) =>
resolve(cwd, isPlainObject(a) ? a.path : a) ===
resolve(cwd, isPlainObject(b) ? b.path : b),
);
}