"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getUploadSpecification = void 0; const fs = __importStar(require("fs")); const core_1 = require("@actions/core"); const path_1 = require("path"); const path_and_artifact_name_validation_1 = require("./path-and-artifact-name-validation"); /** * Creates a specification that describes how each file that is part of the artifact will be uploaded * @param artifactName the name of the artifact being uploaded. Used during upload to denote where the artifact is stored on the server * @param rootDirectory an absolute file path that denotes the path that should be removed from the beginning of each artifact file * @param artifactFiles a list of absolute file paths that denote what should be uploaded as part of the artifact */ function getUploadSpecification(artifactName, rootDirectory, artifactFiles) { // artifact name was checked earlier on, no need to check again const specifications = []; if (!fs.existsSync(rootDirectory)) { throw new Error(`Provided rootDirectory ${rootDirectory} does not exist`); } if (!fs.lstatSync(rootDirectory).isDirectory()) { throw new Error(`Provided rootDirectory ${rootDirectory} is not a valid directory`); } // Normalize and resolve, this allows for either absolute or relative paths to be used rootDirectory = path_1.normalize(rootDirectory); rootDirectory = path_1.resolve(rootDirectory); /* Example to demonstrate behavior Input: artifactName: my-artifact rootDirectory: '/home/user/files/plz-upload' artifactFiles: [ '/home/user/files/plz-upload/file1.txt', '/home/user/files/plz-upload/file2.txt', '/home/user/files/plz-upload/dir/file3.txt' ] Output: specifications: [ ['/home/user/files/plz-upload/file1.txt', 'my-artifact/file1.txt'], ['/home/user/files/plz-upload/file1.txt', 'my-artifact/file2.txt'], ['/home/user/files/plz-upload/file1.txt', 'my-artifact/dir/file3.txt'] ] */ for (let file of artifactFiles) { if (!fs.existsSync(file)) { throw new Error(`File ${file} does not exist`); } if (!fs.lstatSync(file).isDirectory()) { // Normalize and resolve, this allows for either absolute or relative paths to be used file = path_1.normalize(file); file = path_1.resolve(file); if (!file.startsWith(rootDirectory)) { throw new Error(`The rootDirectory: ${rootDirectory} is not a parent directory of the file: ${file}`); } // Check for forbidden characters in file paths that will be rejected during upload const uploadPath = file.replace(rootDirectory, ''); path_and_artifact_name_validation_1.checkArtifactFilePath(uploadPath); /* uploadFilePath denotes where the file will be uploaded in the file container on the server. During a run, if multiple artifacts are uploaded, they will all be saved in the same container. The artifact name is used as the root directory in the container to separate and distinguish uploaded artifacts path.join handles all the following cases and would return 'artifact-name/file-to-upload.txt join('artifact-name/', 'file-to-upload.txt') join('artifact-name/', '/file-to-upload.txt') join('artifact-name', 'file-to-upload.txt') join('artifact-name', '/file-to-upload.txt') */ specifications.push({ absoluteFilePath: file, uploadFilePath: path_1.join(artifactName, uploadPath) }); } else { // Directories are rejected by the server during upload core_1.debug(`Removing ${file} from rawSearchResults because it is a directory`); } } return specifications; } exports.getUploadSpecification = getUploadSpecification; //# sourceMappingURL=upload-specification.js.map