import * as core from '@actions/core'; import {Globber, FileGlobber} from "./Globber"; import {Artifact} from "./Artifact"; import untildify from "untildify"; import {ArtifactPathValidator} from "./ArtifactPathValidator"; import {PathNormalizer} from "./PathNormalizer"; export interface ArtifactGlobber { globArtifactString(artifact: string, contentType: string, errorsFailBuild: boolean): Artifact[] } export class FileArtifactGlobber implements ArtifactGlobber { private globber: Globber constructor(globber: Globber = new FileGlobber()) { this.globber = globber } globArtifactString(artifact: string, contentType: string, errorsFailBuild: boolean): Artifact[] { const split = /[,\n]/ return artifact.split(split) .map(path => path.trimStart()) .map(path => PathNormalizer.normalizePath(path)) .map(path => FileArtifactGlobber.expandPath(path)) .map(pattern => this.globPattern(pattern, errorsFailBuild)) .map((globResult) => FileArtifactGlobber.validatePattern(errorsFailBuild, globResult[1], globResult[0])) .reduce((accumulated, current) => accumulated.concat(current)) .map(path => new Artifact(path, contentType)) } private globPattern(pattern: string, errorsFailBuild: boolean): [string, string[]] { const paths = this.globber.glob(pattern) if (paths.length == 0) { if (errorsFailBuild) { FileArtifactGlobber.throwGlobError(pattern) } else { FileArtifactGlobber.reportGlobWarning(pattern) } } return [pattern, paths] } private static validatePattern(errorsFailBuild: boolean, paths: string[], pattern: string): string[] { const validator = new ArtifactPathValidator(errorsFailBuild, paths, pattern) return validator.validate() } private static reportGlobWarning(pattern: string) { core.warning(`Artifact pattern :${pattern} did not match any files`) } private static throwGlobError(pattern: string) { throw Error(`Artifact pattern :${pattern} did not match any files`) } private static expandPath(path: string): string { return untildify(path) } }