diff --git a/.gitignore b/.gitignore index 6704566..adb2c19 100644 --- a/.gitignore +++ b/.gitignore @@ -80,7 +80,6 @@ typings/ # Nuxt.js build / generate output .nuxt -dist # Gatsby files .cache/ diff --git a/dist/FileFinder.js b/dist/FileFinder.js new file mode 100644 index 0000000..b5d1a76 --- /dev/null +++ b/dist/FileFinder.js @@ -0,0 +1,151 @@ +"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.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileFinder = void 0; +const glob = __importStar(require("@actions/glob")); +const fs_1 = require("fs"); +const core_1 = require("@actions/core"); +const path = __importStar(require("path")); +const util_1 = require("util"); +const stats = util_1.promisify(fs_1.stat); +class FileFinder { + constructor(searchPath, globOptions) { + this.searchPath = searchPath; + this.globOptions = globOptions || FileFinder.DefaultGlobOptions; + } + findFiles() { + return __awaiter(this, void 0, void 0, function* () { + const searchResults = []; + const globber = yield glob.create(this.searchPath, this.globOptions); + const rawSearchResults = yield globber.glob(); + /* + Files are saved with case insensitivity. Uploading both a.txt and A.txt will files to be overwritten + Detect any files that could be overwritten for user awareness + */ + const set = new Set(); + /* + Directories will be rejected if attempted to be uploaded. This includes just empty + directories so filter any directories out from the raw search results + */ + for (const searchResult of rawSearchResults) { + const fileStats = yield stats(searchResult); + // isDirectory() returns false for symlinks if using fs.lstat(), make sure to use fs.stat() instead + if (!fileStats.isDirectory()) { + core_1.debug(`File:${searchResult} was found using the provided searchPath`); + searchResults.push(searchResult); + // detect any files that would be overwritten because of case insensitivity + if (set.has(searchResult.toLowerCase())) { + core_1.info(`Uploads are case insensitive: ${searchResult} was detected that it will be overwritten by another file with the same path`); + } + else { + set.add(searchResult.toLowerCase()); + } + } + else { + core_1.debug(`Removing ${searchResult} from rawSearchResults because it is a directory`); + } + } + // Calculate the root directory for the artifact using the search paths that were utilized + const searchPaths = globber.getSearchPaths(); + if (searchPaths.length > 1) { + core_1.info(`Multiple search paths detected. Calculating the least common ancestor of all paths`); + const lcaSearchPath = this.getMultiPathLCA(searchPaths); + core_1.info(`The least common ancestor is ${lcaSearchPath}. This will be the root directory of the artifact`); + return { + filesToUpload: searchResults, + rootDirectory: lcaSearchPath + }; + } + /* + Special case for a single file artifact that is uploaded without a directory or wildcard pattern. The directory structure is + not preserved and the root directory will be the single files parent directory + */ + if (searchResults.length === 1 && searchPaths[0] === searchResults[0]) { + return { + filesToUpload: searchResults, + rootDirectory: path.dirname(searchResults[0]) + }; + } + return { + filesToUpload: searchResults, + rootDirectory: searchPaths[0] + }; + }); + } + getMultiPathLCA(searchPaths) { + if (searchPaths.length < 2) { + throw new Error('At least two search paths must be provided'); + } + const commonPaths = new Array(); + const splitPaths = new Array(); + let smallestPathLength = Number.MAX_SAFE_INTEGER; + // split each of the search paths using the platform specific separator + for (const searchPath of searchPaths) { + core_1.debug(`Using search path ${searchPath}`); + const splitSearchPath = path.normalize(searchPath).split(path.sep); + // keep track of the smallest path length so that we don't accidentally later go out of bounds + smallestPathLength = Math.min(smallestPathLength, splitSearchPath.length); + splitPaths.push(splitSearchPath); + } + // on Unix-like file systems, the file separator exists at the beginning of the file path, make sure to preserve it + if (searchPaths[0].startsWith(path.sep)) { + commonPaths.push(path.sep); + } + let splitIndex = 0; + // function to check if the paths are the same at a specific index + function isPathTheSame() { + const compare = splitPaths[0][splitIndex]; + for (let i = 1; i < splitPaths.length; i++) { + if (compare !== splitPaths[i][splitIndex]) { + // a non-common index has been reached + return false; + } + } + return true; + } + // loop over all the search paths until there is a non-common ancestor or we go out of bounds + while (splitIndex < smallestPathLength) { + if (!isPathTheSame()) { + break; + } + // if all are the same, add to the end result & increment the index + commonPaths.push(splitPaths[0][splitIndex]); + splitIndex++; + } + return path.join(...commonPaths); + } +} +exports.FileFinder = FileFinder; +FileFinder.DefaultGlobOptions = { + followSymbolicLinks: true, + implicitDescendants: true, + omitBrokenSymbolicLinks: true +}; +//# sourceMappingURL=FileFinder.js.map \ No newline at end of file diff --git a/dist/FileFinder.js.map b/dist/FileFinder.js.map new file mode 100644 index 0000000..54c5c92 --- /dev/null +++ b/dist/FileFinder.js.map @@ -0,0 +1 @@ +{"version":3,"file":"FileFinder.js","sourceRoot":"","sources":["../src/FileFinder.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/Inputs.js b/dist/Inputs.js new file mode 100644 index 0000000..611c86d --- /dev/null +++ b/dist/Inputs.js @@ -0,0 +1,38 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Inputs = void 0; +const core_1 = __importDefault(require("@actions/core")); +const NoFileOption_1 = require("./NoFileOption"); +class Inputs { + static get ArtifactName() { + return core_1.default.getInput("name"); + } + static get ArtifactPath() { + return core_1.default.getInput("path"); + } + static get Retention() { + return core_1.default.getInput("retention-days"); + } + static get Endpoint() { + return core_1.default.getInput("nextcloud-url"); + } + static get Username() { + return core_1.default.getInput("nextcloud-username"); + } + static get Password() { + return core_1.default.getInput("nextcloud-password"); + } + static get NoFileBehvaior() { + const notFoundAction = core_1.default.getInput("if-no-files-found"); + const noFileBehavior = NoFileOption_1.NoFileOption[notFoundAction]; + if (!noFileBehavior) { + core_1.default.setFailed(`Unrecognized ${"ifNoFilesFound"} input. Provided: ${notFoundAction}. Available options: ${Object.keys(NoFileOption_1.NoFileOption)}`); + } + return noFileBehavior; + } +} +exports.Inputs = Inputs; +//# sourceMappingURL=Inputs.js.map \ No newline at end of file diff --git a/dist/Inputs.js.map b/dist/Inputs.js.map new file mode 100644 index 0000000..ebacdf3 --- /dev/null +++ b/dist/Inputs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Inputs.js","sourceRoot":"","sources":["../src/Inputs.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAiC;AACjC,iDAA8C;AAE9C,MAAa,MAAM;IACf,MAAM,KAAK,YAAY;QACnB,OAAO,cAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,YAAY;QACnB,OAAO,cAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,SAAS;QAChB,OAAO,cAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,QAAQ;QACf,OAAO,cAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,KAAK,QAAQ;QACf,OAAO,cAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,QAAQ;QACf,OAAO,cAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,cAAc;QACrB,MAAM,cAAc,GAAG,cAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAC1D,MAAM,cAAc,GAAiB,2BAAY,CAAC,cAA2C,CAAC,CAAC;QAE/F,IAAI,CAAC,cAAc,EAAE;YACjB,cAAI,CAAC,SAAS,CACV,gBAAgB,gBAAgB,qBAAqB,cAAc,wBAAwB,MAAM,CAAC,IAAI,CAClG,2BAAY,CACf,EAAE,CACN,CAAC;SACL;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;CACJ;AAvCD,wBAuCC"} \ No newline at end of file diff --git a/dist/NextcloudArtifact.js b/dist/NextcloudArtifact.js new file mode 100644 index 0000000..2b387e8 --- /dev/null +++ b/dist/NextcloudArtifact.js @@ -0,0 +1,73 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NextcloudArtifact = void 0; +const core_1 = __importDefault(require("@actions/core")); +const FileFinder_1 = require("./FileFinder"); +const Inputs_1 = require("./Inputs"); +const NextcloudClient_1 = require("./nextcloud/NextcloudClient"); +const NoFileOption_1 = require("./NoFileOption"); +class NextcloudArtifact { + constructor(name, path, errorBehavior) { + this.name = name; + this.path = path; + this.errorBehavior = errorBehavior; + } + run() { + return __awaiter(this, void 0, void 0, function* () { + const fileFinder = new FileFinder_1.FileFinder(this.path); + const files = yield fileFinder.findFiles(); + if (files.filesToUpload.length > 0) { + yield this.uploadFiles(files); + } + else { + this.logNoFilesFound(); + } + }); + } + uploadFiles(files) { + return __awaiter(this, void 0, void 0, function* () { + this.logUpload(files.filesToUpload.length, files.rootDirectory); + const client = new NextcloudClient_1.NextcloudClient(Inputs_1.Inputs.endpoint, this.name, files.rootDirectory); + yield client.uploadFiles(files.filesToUpload); + }); + } + logUpload(fileCount, rootDirectory) { + const s = fileCount === 1 ? '' : 's'; + core_1.default.info(`With the provided path, there will be ${fileCount} file${s} uploaded`); + core_1.default.debug(`Root artifact directory is ${rootDirectory}`); + if (fileCount > 10000) { + core_1.default.warning(`There are over 10,000 files in this artifact, consider create an archive before upload to improve the upload performance.`); + } + } + logNoFilesFound() { + const errorMessage = `No files were found with the provided path: ${this.path}. No artifacts will be uploaded.`; + switch (this.errorBehavior) { + case NoFileOption_1.NoFileOption.warn: { + core_1.default.warning(errorMessage); + break; + } + case NoFileOption_1.NoFileOption.error: { + core_1.default.setFailed(errorMessage); + break; + } + case NoFileOption_1.NoFileOption.ignore: { + core_1.default.info(errorMessage); + break; + } + } + } +} +exports.NextcloudArtifact = NextcloudArtifact; +//# sourceMappingURL=NextcloudArtifact.js.map \ No newline at end of file diff --git a/dist/NextcloudArtifact.js.map b/dist/NextcloudArtifact.js.map new file mode 100644 index 0000000..cd52943 --- /dev/null +++ b/dist/NextcloudArtifact.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NextcloudArtifact.js","sourceRoot":"","sources":["../src/NextcloudArtifact.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yDAAiC;AACjC,6CAA0C;AAC1C,qCAAkC;AAClC,iEAA8D;AAC9D,iDAA8C;AAE9C,MAAa,iBAAiB;IAC1B,YACY,IAAY,EACZ,IAAY,EACZ,aAA2B;QAF3B,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAc;IAAI,CAAC;IAE/B,GAAG;;YACZ,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;YAE3C,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACjC;iBACI;gBACD,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;QACL,CAAC;KAAA;IAEa,WAAW,CAAC,KAA0D;;YAChF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,IAAI,iCAAe,CAAC,eAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAEpF,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC;KAAA;IAEO,SAAS,CAAC,SAAiB,EAAE,aAAqB;QACtD,MAAM,CAAC,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACrC,cAAI,CAAC,IAAI,CACL,yCAAyC,SAAS,QAAQ,CAAC,WAAW,CACzE,CAAC;QACF,cAAI,CAAC,KAAK,CAAC,8BAA8B,aAAa,EAAE,CAAC,CAAC;QAE1D,IAAI,SAAS,GAAG,KAAK,EAAE;YACnB,cAAI,CAAC,OAAO,CACR,2HAA2H,CAC9H,CAAC;SACL;IACL,CAAC;IAEO,eAAe;QACnB,MAAM,YAAY,GAAG,+CAA+C,IAAI,CAAC,IAAI,kCAAkC,CAAC;QAChH,QAAQ,IAAI,CAAC,aAAa,EAAE;YACxB,KAAK,2BAAY,CAAC,IAAI,CAAC,CAAC;gBACpB,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,2BAAY,CAAC,KAAK,CAAC,CAAC;gBACrB,cAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC7B,MAAM;aACT;YACD,KAAK,2BAAY,CAAC,MAAM,CAAC,CAAC;gBACtB,cAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxB,MAAM;aACT;SACJ;IACL,CAAC;CACJ;AAzDD,8CAyDC"} \ No newline at end of file diff --git a/dist/NoFileOption.js b/dist/NoFileOption.js new file mode 100644 index 0000000..9a2e42f --- /dev/null +++ b/dist/NoFileOption.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NoFileOption = void 0; +var NoFileOption; +(function (NoFileOption) { + /** + * Default. Output a warning but do not fail the action + */ + NoFileOption["warn"] = "warn"; + /** + * Fail the action with an error message + */ + NoFileOption["error"] = "error"; + /** + * Do not output any warnings or errors, the action does not fail + */ + NoFileOption["ignore"] = "ignore"; +})(NoFileOption = exports.NoFileOption || (exports.NoFileOption = {})); +//# sourceMappingURL=NoFileOption.js.map \ No newline at end of file diff --git a/dist/NoFileOption.js.map b/dist/NoFileOption.js.map new file mode 100644 index 0000000..9f27ce6 --- /dev/null +++ b/dist/NoFileOption.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NoFileOption.js","sourceRoot":"","sources":["../src/NoFileOption.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAeT;AAfH,WAAY,YAAY;IACpB;;OAEG;IACH,6BAAa,CAAA;IAEb;;OAEG;IACH,+BAAe,CAAA;IAEf;;OAEG;IACH,iCAAiB,CAAA;AACnB,CAAC,EAfS,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAerB"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..2bba9de --- /dev/null +++ b/dist/index.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Inputs_1 = require("./Inputs"); +const NextcloudArtifact_1 = require("./nextcloud/NextcloudArtifact"); +var artifact = new NextcloudArtifact_1.NextcloudArtifact(Inputs_1.Inputs.ArtifactName, Inputs_1.Inputs.ArtifactPath, Inputs_1.Inputs.NoFileBehvaior); +artifact.run(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..bd10bd2 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qCAAkC;AAClC,qEAAkE;AAElE,IAAI,QAAQ,GAAG,IAAI,qCAAiB,CAAC,eAAM,CAAC,YAAY,EAAE,eAAM,CAAC,YAAY,EAAE,eAAM,CAAC,cAAc,CAAC,CAAC;AACtG,QAAQ,CAAC,GAAG,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/input-helper.js b/dist/input-helper.js new file mode 100644 index 0000000..4831c83 --- /dev/null +++ b/dist/input-helper.js @@ -0,0 +1,51 @@ +"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.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getInputs = void 0; +const core = __importStar(require("@actions/core")); +const constants_1 = require("./constants"); +/** + * Helper to get all the inputs for the action + */ +function getInputs() { + const name = core.getInput(constants_1.Inputs.Name); + const path = core.getInput(constants_1.Inputs.Path, { required: true }); + const ifNoFilesFound = core.getInput(constants_1.Inputs.IfNoFilesFound); + const noFileBehavior = constants_1.NoFileOptions[ifNoFilesFound]; + if (!noFileBehavior) { + core.setFailed(`Unrecognized ${constants_1.Inputs.IfNoFilesFound} input. Provided: ${ifNoFilesFound}. Available options: ${Object.keys(constants_1.NoFileOptions)}`); + } + const inputs = { + artifactName: name, + searchPath: path, + ifNoFilesFound: noFileBehavior + }; + const retentionDaysStr = core.getInput(constants_1.Inputs.RetentionDays); + if (retentionDaysStr) { + inputs.retentionDays = parseInt(retentionDaysStr); + if (isNaN(inputs.retentionDays)) { + core.setFailed('Invalid retention-days'); + } + } + return inputs; +} +exports.getInputs = getInputs; +//# sourceMappingURL=input-helper.js.map \ No newline at end of file diff --git a/dist/input-helper.js.map b/dist/input-helper.js.map new file mode 100644 index 0000000..4793446 --- /dev/null +++ b/dist/input-helper.js.map @@ -0,0 +1 @@ +{"version":3,"file":"input-helper.js","sourceRoot":"","sources":["../src/input-helper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAqC;AACrC,2CAAiD;AAGjD;;GAEG;AACH,SAAgB,SAAS;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAM,CAAC,IAAI,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAM,CAAC,IAAI,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAA;IAEzD,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAM,CAAC,cAAc,CAAC,CAAA;IAC3D,MAAM,cAAc,GAAkB,yBAAa,CAAC,cAAc,CAAC,CAAA;IAEnE,IAAI,CAAC,cAAc,EAAE;QACnB,IAAI,CAAC,SAAS,CACZ,gBACE,kBAAM,CAAC,cACT,qBAAqB,cAAc,wBAAwB,MAAM,CAAC,IAAI,CACpE,yBAAa,CACd,EAAE,CACJ,CAAA;KACF;IAED,MAAM,MAAM,GAAG;QACb,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,cAAc;KACf,CAAA;IAEjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAM,CAAC,aAAa,CAAC,CAAA;IAC5D,IAAI,gBAAgB,EAAE;QACpB,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QACjD,IAAI,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;SACzC;KACF;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAhCD,8BAgCC"} \ No newline at end of file diff --git a/dist/nextcloud/NextcloudArtifact.js b/dist/nextcloud/NextcloudArtifact.js new file mode 100644 index 0000000..e760ff2 --- /dev/null +++ b/dist/nextcloud/NextcloudArtifact.js @@ -0,0 +1,73 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NextcloudArtifact = void 0; +const core_1 = __importDefault(require("@actions/core")); +const FileFinder_1 = require("../FileFinder"); +const Inputs_1 = require("../Inputs"); +const NextcloudClient_1 = require("./NextcloudClient"); +const NoFileOption_1 = require("../NoFileOption"); +class NextcloudArtifact { + constructor(name, path, errorBehavior) { + this.name = name; + this.path = path; + this.errorBehavior = errorBehavior; + } + run() { + return __awaiter(this, void 0, void 0, function* () { + const fileFinder = new FileFinder_1.FileFinder(this.path); + const files = yield fileFinder.findFiles(); + if (files.filesToUpload.length > 0) { + yield this.uploadFiles(files); + } + else { + this.logNoFilesFound(); + } + }); + } + uploadFiles(files) { + return __awaiter(this, void 0, void 0, function* () { + this.logUpload(files.filesToUpload.length, files.rootDirectory); + const client = new NextcloudClient_1.NextcloudClient(Inputs_1.Inputs.Endpoint, this.name, files.rootDirectory); + yield client.uploadFiles(files.filesToUpload); + }); + } + logUpload(fileCount, rootDirectory) { + const s = fileCount === 1 ? '' : 's'; + core_1.default.info(`With the provided path, there will be ${fileCount} file${s} uploaded`); + core_1.default.debug(`Root artifact directory is ${rootDirectory}`); + if (fileCount > 10000) { + core_1.default.warning(`There are over 10,000 files in this artifact, consider create an archive before upload to improve the upload performance.`); + } + } + logNoFilesFound() { + const errorMessage = `No files were found with the provided path: ${this.path}. No artifacts will be uploaded.`; + switch (this.errorBehavior) { + case NoFileOption_1.NoFileOption.warn: { + core_1.default.warning(errorMessage); + break; + } + case NoFileOption_1.NoFileOption.error: { + core_1.default.setFailed(errorMessage); + break; + } + case NoFileOption_1.NoFileOption.ignore: { + core_1.default.info(errorMessage); + break; + } + } + } +} +exports.NextcloudArtifact = NextcloudArtifact; +//# sourceMappingURL=NextcloudArtifact.js.map \ No newline at end of file diff --git a/dist/nextcloud/NextcloudArtifact.js.map b/dist/nextcloud/NextcloudArtifact.js.map new file mode 100644 index 0000000..3cc247c --- /dev/null +++ b/dist/nextcloud/NextcloudArtifact.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NextcloudArtifact.js","sourceRoot":"","sources":["../../src/nextcloud/NextcloudArtifact.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yDAAiC;AACjC,8CAA2C;AAC3C,sCAAmC;AACnC,uDAAoD;AACpD,kDAA+C;AAE/C,MAAa,iBAAiB;IAC1B,YACY,IAAY,EACZ,IAAY,EACZ,aAA2B;QAF3B,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAc;IAAI,CAAC;IAE/B,GAAG;;YACZ,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC;YAE3C,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACjC;iBACI;gBACD,IAAI,CAAC,eAAe,EAAE,CAAC;aAC1B;QACL,CAAC;KAAA;IAEa,WAAW,CAAC,KAA0D;;YAChF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,IAAI,iCAAe,CAAC,eAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;YAEpF,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,CAAC;KAAA;IAEO,SAAS,CAAC,SAAiB,EAAE,aAAqB;QACtD,MAAM,CAAC,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACrC,cAAI,CAAC,IAAI,CACL,yCAAyC,SAAS,QAAQ,CAAC,WAAW,CACzE,CAAC;QACF,cAAI,CAAC,KAAK,CAAC,8BAA8B,aAAa,EAAE,CAAC,CAAC;QAE1D,IAAI,SAAS,GAAG,KAAK,EAAE;YACnB,cAAI,CAAC,OAAO,CACR,2HAA2H,CAC9H,CAAC;SACL;IACL,CAAC;IAEO,eAAe;QACnB,MAAM,YAAY,GAAG,+CAA+C,IAAI,CAAC,IAAI,kCAAkC,CAAC;QAChH,QAAQ,IAAI,CAAC,aAAa,EAAE;YACxB,KAAK,2BAAY,CAAC,IAAI,CAAC,CAAC;gBACpB,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC3B,MAAM;aACT;YACD,KAAK,2BAAY,CAAC,KAAK,CAAC,CAAC;gBACrB,cAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC7B,MAAM;aACT;YACD,KAAK,2BAAY,CAAC,MAAM,CAAC,CAAC;gBACtB,cAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxB,MAAM;aACT;SACJ;IACL,CAAC;CACJ;AAzDD,8CAyDC"} \ No newline at end of file diff --git a/dist/nextcloud/NextcloudClient.js b/dist/nextcloud/NextcloudClient.js new file mode 100644 index 0000000..d72bdb1 --- /dev/null +++ b/dist/nextcloud/NextcloudClient.js @@ -0,0 +1,183 @@ +"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.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NextcloudClient = void 0; +const fsSync = __importStar(require("fs")); +const fs = __importStar(require("fs/promises")); +const path = __importStar(require("path")); +const core_1 = __importDefault(require("@actions/core")); +const os = __importStar(require("os")); +const crypto_1 = require("crypto"); +const archiver = __importStar(require("archiver")); +const node_fetch_1 = __importDefault(require("node-fetch")); +const Inputs_1 = require("../Inputs"); +const btoa_1 = __importDefault(require("btoa")); +class NextcloudClient { + constructor(endpoint, artifact, rootDirectory) { + this.endpoint = endpoint; + this.artifact = artifact; + this.rootDirectory = rootDirectory; + this.guid = crypto_1.randomUUID(); + this.headers = { 'Authorization': 'Basic ' + btoa_1.default(`${Inputs_1.Inputs.Username}:${Inputs_1.Inputs.Password}`) }; + } + uploadFiles(files) { + return __awaiter(this, void 0, void 0, function* () { + const spec = this.uploadSpec(files); + var zip = yield this.zipFiles(spec); + const path = yield this.upload(zip); + yield this.shareFile(path); + }); + } + uploadSpec(files) { + const specifications = []; + if (!fsSync.existsSync(this.rootDirectory)) { + throw new Error(`this.rootDirectory ${this.rootDirectory} does not exist`); + } + if (!fsSync.lstatSync(this.rootDirectory).isDirectory()) { + throw new Error(`this.rootDirectory ${this.rootDirectory} is not a valid directory`); + } + // Normalize and resolve, this allows for either absolute or relative paths to be used + let root = path.normalize(this.rootDirectory); + root = path.resolve(root); + /* + 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 files) { + if (!fsSync.existsSync(file)) { + throw new Error(`File ${file} does not exist`); + } + if (!fsSync.lstatSync(file).isDirectory()) { + // Normalize and resolve, this allows for either absolute or relative paths to be used + file = path.normalize(file); + file = path.resolve(file); + if (!file.startsWith(root)) { + throw new Error(`The rootDirectory: ${root} 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(root, ''); + /* + 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({ + absolutePath: file, + uploadPath: path.join(this.artifact, uploadPath) + }); + } + else { + // Directories are rejected by the server during upload + core_1.default.debug(`Removing ${file} from rawSearchResults because it is a directory`); + } + } + return specifications; + } + zipFiles(specs) { + return __awaiter(this, void 0, void 0, function* () { + const tempArtifactDir = path.join(os.tmpdir(), this.guid); + const artifactPath = path.join(tempArtifactDir, `artifact-${this.artifact}`); + yield fs.mkdir(artifactPath, { recursive: true }); + for (let spec of specs) { + yield fs.copyFile(spec.absolutePath, path.join(artifactPath, spec.uploadPath)); + } + const archivePath = path.join(artifactPath, `${this.artifact}.zip`); + yield this.zip(path.join(artifactPath, this.artifact), archivePath); + return archivePath; + }); + } + zip(dirpath, destpath) { + return __awaiter(this, void 0, void 0, function* () { + const archive = archiver.create('zip', { zlib: { level: 9 } }); + const stream = fsSync.createWriteStream(destpath); + archive.directory(dirpath, false) + .on('error', e => Promise.reject()) + .on('close', () => Promise.resolve()) + .pipe(stream); + return archive.finalize(); + }); + } + upload(file) { + return __awaiter(this, void 0, void 0, function* () { + const filePath = `/artifacts/${this.guid}/${this.artifact}`; + const url = this.endpoint + `/remote.php/dav/files/${Inputs_1.Inputs.Username}` + filePath; + const stream = fsSync.createReadStream(file); + const res = yield node_fetch_1.default(url, { + method: 'PUT', + body: stream, + headers: this.headers + }); + core_1.default.debug(yield res.json()); + return filePath; + }); + } + shareFile(nextcloudPath) { + return __awaiter(this, void 0, void 0, function* () { + const url = this.endpoint + `/ocs/v2.php/apps/files_sharing/api/v1/shares`; + const body = { + path: nextcloudPath, + shareType: 3, + publicUpload: "false", + permissions: 1, + }; + const res = yield node_fetch_1.default(url, { + method: 'PUT', + headers: this.headers, + body: JSON.stringify(body), + }); + core_1.default.debug(yield res.json()); + }); + } +} +exports.NextcloudClient = NextcloudClient; +//# sourceMappingURL=NextcloudClient.js.map \ No newline at end of file diff --git a/dist/nextcloud/NextcloudClient.js.map b/dist/nextcloud/NextcloudClient.js.map new file mode 100644 index 0000000..7b058a5 --- /dev/null +++ b/dist/nextcloud/NextcloudClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NextcloudClient.js","sourceRoot":"","sources":["../../src/nextcloud/NextcloudClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAC5B,gDAAiC;AACjC,2CAA4B;AAC5B,yDAAiC;AACjC,uCAAyB;AACzB,mCAAoC;AACpC,mDAAqC;AAErC,4DAAgD;AAChD,sCAAmC;AACnC,gDAAwB;AAOxB,MAAa,eAAe;IAIxB,YACY,QAAgB,EAChB,QAAgB,EAChB,aAAqB;QAFrB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,kBAAa,GAAb,aAAa,CAAQ;QACzB,IAAI,CAAC,IAAI,GAAG,mBAAU,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,EAAC,eAAe,EAAE,QAAQ,GAAG,cAAI,CAAC,GAAG,eAAM,CAAC,QAAQ,IAAI,eAAM,CAAC,QAAQ,EAAE,CAAC,EAAC,CAAC;IACnG,CAAC;IAEY,WAAW,CAAC,KAAe;;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;KAAA;IAEO,UAAU,CAAC,KAAe;QAC9B,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,aAAa,iBAAiB,CAAC,CAAC;SAC9E;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,EAAE;YACrD,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,aAAa,2BAA2B,CAAC,CAAC;SACxF;QACD,sFAAsF;QACtF,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B;;;;;;;;;;;;;;;;;;UAkBE;QACF,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;YACpB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;aAClD;YACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;gBACvC,sFAAsF;gBACtF,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;oBACxB,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,2CAA2C,IAAI,EAAE,CAAC,CAAC;iBAChG;gBACD,mFAAmF;gBACnF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1C;;;;;;;;;kBASE;gBACF,cAAc,CAAC,IAAI,CAAC;oBAChB,YAAY,EAAE,IAAI;oBAClB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;iBACnD,CAAC,CAAC;aACN;iBACI;gBACD,uDAAuD;gBACvD,cAAI,CAAC,KAAK,CAAC,YAAY,IAAI,kDAAkD,CAAC,CAAC;aAClF;SACJ;QACD,OAAO,cAAc,CAAC;IAC1B,CAAC;IAGa,QAAQ,CAAC,KAAiB;;YACpC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7E,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;gBACpB,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;aAClF;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAC,CAAC;YACpE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;YAEpE,OAAO,WAAW,CAAC;QACvB,CAAC;KAAA;IAEa,GAAG,CAAC,OAAe,EAAE,QAAgB;;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAClD,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;iBAC5B,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;iBAClC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;iBACpC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElB,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC;KAAA;IAEa,MAAM,CAAC,IAAY;;YAC7B,MAAM,QAAQ,GAAG,cAAc,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,yBAAyB,eAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC;YAClF,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,oBAAK,CAAC,GAAG,EAAE;gBACzB,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,cAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YAE5B,OAAO,QAAQ,CAAC;QACpB,CAAC;KAAA;IAEa,SAAS,CAAC,aAAqB;;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,8CAA8C,CAAC;YAC3E,MAAM,IAAI,GAAG;gBACT,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,CAAC;gBACZ,YAAY,EAAE,OAAO;gBACrB,WAAW,EAAE,CAAC;aACjB,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,oBAAK,CAAC,GAAG,EAAE;gBACzB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC7B,CAAC,CAAC;YAEH,cAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAChC,CAAC;KAAA;CACJ;AA9ID,0CA8IC"} \ No newline at end of file diff --git a/dist/upload-inputs.js b/dist/upload-inputs.js new file mode 100644 index 0000000..30a03a3 --- /dev/null +++ b/dist/upload-inputs.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=upload-inputs.js.map \ No newline at end of file diff --git a/dist/upload-inputs.js.map b/dist/upload-inputs.js.map new file mode 100644 index 0000000..8fead9b --- /dev/null +++ b/dist/upload-inputs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"upload-inputs.js","sourceRoot":"","sources":["../src/upload-inputs.ts"],"names":[],"mappings":""} \ No newline at end of file