From 301fbaf78d14cbc27ac23e9a778213942924ebde Mon Sep 17 00:00:00 2001 From: Webber Date: Sun, 3 Apr 2022 17:11:46 +0200 Subject: [PATCH] feat: upgrade to images of version 1 (rolling tag) --- dist/index.js | 3560 +++++++++++++++++------------------ src/index.ts | 11 +- src/model/docker.ts | 10 +- src/model/image-tag.test.ts | 53 +- src/model/image-tag.ts | 76 +- src/model/input.ts | 8 +- 6 files changed, 1868 insertions(+), 1850 deletions(-) diff --git a/dist/index.js b/dist/index.js index 70e1ea1..3cebc06 100644 --- a/dist/index.js +++ b/dist/index.js @@ -43,7 +43,7 @@ function run() { model_1.Action.checkCompatibility(); const { workspace, actionFolder } = model_1.Action; const { unityVersion, customImage, projectPath, customParameters, testMode, artifactsPath, useHostNetwork, sshAgent, gitPrivateToken, githubToken, checkName, } = model_1.Input.getFromUser(); - const baseImage = new model_1.ImageTag({ version: unityVersion, customImage }); + const baseImage = new model_1.ImageTag({ editorVersion: unityVersion, customImage }); const runnerTempPath = process.env.RUNNER_TEMP; try { // Build docker image @@ -307,7 +307,7 @@ class ImageTag { } } get tag() { - return `${this.version}-${this.builderPlatform}`.replace(/-+$/, ''); + return `${this.editorVersion}-${this.targetPlatformSuffix}`.replace(/-+$/, ''); } get image() { return `${this.repository}/${this.name}`.replace(/^\/+/, ''); @@ -1507,8 +1507,8 @@ class OidcClient { const res = yield httpclient .getJson(id_token_url) .catch(error => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n + throw new Error(`Failed to get ID Token. \n + Error Code : ${error.statusCode}\n Error Message: ${error.result.message}`); }); const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; @@ -14063,1303 +14063,1303 @@ exports.parseURL = __nccwpck_require__(33).parseURL; /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; - -const punycode = __nccwpck_require__(5477); -const tr46 = __nccwpck_require__(2299); - -const specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -const failure = Symbol("failure"); - -function countSymbols(str) { - return punycode.ucs2.decode(str).length; -} - -function at(input, idx) { - const c = input[idx]; - return isNaN(c) ? undefined : String.fromCodePoint(c); -} - -function isASCIIDigit(c) { - return c >= 0x30 && c <= 0x39; -} - -function isASCIIAlpha(c) { - return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); -} - -function isASCIIAlphanumeric(c) { - return isASCIIAlpha(c) || isASCIIDigit(c); -} - -function isASCIIHex(c) { - return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); -} - -function isSingleDot(buffer) { - return buffer === "." || buffer.toLowerCase() === "%2e"; -} - -function isDoubleDot(buffer) { - buffer = buffer.toLowerCase(); - return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; -} - -function isWindowsDriveLetterCodePoints(cp1, cp2) { - return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); -} - -function isWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); -} - -function isNormalizedWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; -} - -function containsForbiddenHostCodePoint(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function containsForbiddenHostCodePointExcludingPercent(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function isSpecialScheme(scheme) { - return specialSchemes[scheme] !== undefined; -} - -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} - -function defaultPort(scheme) { - return specialSchemes[scheme]; -} - -function percentEncode(c) { - let hex = c.toString(16).toUpperCase(); - if (hex.length === 1) { - hex = "0" + hex; - } - - return "%" + hex; -} - -function utf8PercentEncode(c) { - const buf = new Buffer(c); - - let str = ""; - - for (let i = 0; i < buf.length; ++i) { - str += percentEncode(buf[i]); - } - - return str; -} - -function utf8PercentDecode(str) { - const input = new Buffer(str); - const output = []; - for (let i = 0; i < input.length; ++i) { - if (input[i] !== 37) { - output.push(input[i]); - } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { - output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); - i += 2; - } else { - output.push(input[i]); - } - } - return new Buffer(output).toString(); -} - -function isC0ControlPercentEncode(c) { - return c <= 0x1F || c > 0x7E; -} - -const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); -function isPathPercentEncode(c) { - return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); -} - -const extraUserinfoPercentEncodeSet = - new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); -function isUserinfoPercentEncode(c) { - return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); -} - -function percentEncodeChar(c, encodeSetPredicate) { - const cStr = String.fromCodePoint(c); - - if (encodeSetPredicate(c)) { - return utf8PercentEncode(cStr); - } - - return cStr; -} - -function parseIPv4Number(input) { - let R = 10; - - if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { - input = input.substring(2); - R = 16; - } else if (input.length >= 2 && input.charAt(0) === "0") { - input = input.substring(1); - R = 8; - } - - if (input === "") { - return 0; - } - - const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); - if (regex.test(input)) { - return failure; - } - - return parseInt(input, R); -} - -function parseIPv4(input) { - const parts = input.split("."); - if (parts[parts.length - 1] === "") { - if (parts.length > 1) { - parts.pop(); - } - } - - if (parts.length > 4) { - return input; - } - - const numbers = []; - for (const part of parts) { - if (part === "") { - return input; - } - const n = parseIPv4Number(part); - if (n === failure) { - return input; - } - - numbers.push(n); - } - - for (let i = 0; i < numbers.length - 1; ++i) { - if (numbers[i] > 255) { - return failure; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - return failure; - } - - let ipv4 = numbers.pop(); - let counter = 0; - - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - ++counter; - } - - return ipv4; -} - -function serializeIPv4(address) { - let output = ""; - let n = address; - - for (let i = 1; i <= 4; ++i) { - output = String(n % 256) + output; - if (i !== 4) { - output = "." + output; - } - n = Math.floor(n / 256); - } - - return output; -} - -function parseIPv6(input) { - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - let pointer = 0; - - input = punycode.ucs2.decode(input); - - if (input[pointer] === 58) { - if (input[pointer + 1] !== 58) { - return failure; - } - - pointer += 2; - ++pieceIndex; - compress = pieceIndex; - } - - while (pointer < input.length) { - if (pieceIndex === 8) { - return failure; - } - - if (input[pointer] === 58) { - if (compress !== null) { - return failure; - } - ++pointer; - ++pieceIndex; - compress = pieceIndex; - continue; - } - - let value = 0; - let length = 0; - - while (length < 4 && isASCIIHex(input[pointer])) { - value = value * 0x10 + parseInt(at(input, pointer), 16); - ++pointer; - ++length; - } - - if (input[pointer] === 46) { - if (length === 0) { - return failure; - } - - pointer -= length; - - if (pieceIndex > 6) { - return failure; - } - - let numbersSeen = 0; - - while (input[pointer] !== undefined) { - let ipv4Piece = null; - - if (numbersSeen > 0) { - if (input[pointer] === 46 && numbersSeen < 4) { - ++pointer; - } else { - return failure; - } - } - - if (!isASCIIDigit(input[pointer])) { - return failure; - } - - while (isASCIIDigit(input[pointer])) { - const number = parseInt(at(input, pointer)); - if (ipv4Piece === null) { - ipv4Piece = number; - } else if (ipv4Piece === 0) { - return failure; - } else { - ipv4Piece = ipv4Piece * 10 + number; - } - if (ipv4Piece > 255) { - return failure; - } - ++pointer; - } - - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - - ++numbersSeen; - - if (numbersSeen === 2 || numbersSeen === 4) { - ++pieceIndex; - } - } - - if (numbersSeen !== 4) { - return failure; - } - - break; - } else if (input[pointer] === 58) { - ++pointer; - if (input[pointer] === undefined) { - return failure; - } - } else if (input[pointer] !== undefined) { - return failure; - } - - address[pieceIndex] = value; - ++pieceIndex; - } - - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - const temp = address[compress + swaps - 1]; - address[compress + swaps - 1] = address[pieceIndex]; - address[pieceIndex] = temp; - --pieceIndex; - --swaps; - } - } else if (compress === null && pieceIndex !== 8) { - return failure; - } - - return address; -} - -function serializeIPv6(address) { - let output = ""; - const seqResult = findLongestZeroSequence(address); - const compress = seqResult.idx; - let ignore0 = false; - - for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { - if (ignore0 && address[pieceIndex] === 0) { - continue; - } else if (ignore0) { - ignore0 = false; - } - - if (compress === pieceIndex) { - const separator = pieceIndex === 0 ? "::" : ":"; - output += separator; - ignore0 = true; - continue; - } - - output += address[pieceIndex].toString(16); - - if (pieceIndex !== 7) { - output += ":"; - } - } - - return output; -} - -function parseHost(input, isSpecialArg) { - if (input[0] === "[") { - if (input[input.length - 1] !== "]") { - return failure; - } - - return parseIPv6(input.substring(1, input.length - 1)); - } - - if (!isSpecialArg) { - return parseOpaqueHost(input); - } - - const domain = utf8PercentDecode(input); - const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); - if (asciiDomain === null) { - return failure; - } - - if (containsForbiddenHostCodePoint(asciiDomain)) { - return failure; - } - - const ipv4Host = parseIPv4(asciiDomain); - if (typeof ipv4Host === "number" || ipv4Host === failure) { - return ipv4Host; - } - - return asciiDomain; -} - -function parseOpaqueHost(input) { - if (containsForbiddenHostCodePointExcludingPercent(input)) { - return failure; - } - - let output = ""; - const decoded = punycode.ucs2.decode(input); - for (let i = 0; i < decoded.length; ++i) { - output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); - } - return output; -} - -function findLongestZeroSequence(arr) { - let maxIdx = null; - let maxLen = 1; // only find elements > 1 - let currStart = null; - let currLen = 0; - - for (let i = 0; i < arr.length; ++i) { - if (arr[i] !== 0) { - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - currStart = null; - currLen = 0; - } else { - if (currStart === null) { - currStart = i; - } - ++currLen; - } - } - - // if trailing zeros - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - return { - idx: maxIdx, - len: maxLen - }; -} - -function serializeHost(host) { - if (typeof host === "number") { - return serializeIPv4(host); - } - - // IPv6 serializer - if (host instanceof Array) { - return "[" + serializeIPv6(host) + "]"; - } - - return host; -} - -function trimControlChars(url) { - return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); -} - -function trimTabAndNewline(url) { - return url.replace(/\u0009|\u000A|\u000D/g, ""); -} - -function shortenPath(url) { - const path = url.path; - if (path.length === 0) { - return; - } - if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { - return; - } - - path.pop(); -} - -function includesCredentials(url) { - return url.username !== "" || url.password !== ""; -} - -function cannotHaveAUsernamePasswordPort(url) { - return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; -} - -function isNormalizedWindowsDriveLetter(string) { - return /^[A-Za-z]:$/.test(string); -} - -function URLStateMachine(input, base, encodingOverride, url, stateOverride) { - this.pointer = 0; - this.input = input; - this.base = base || null; - this.encodingOverride = encodingOverride || "utf-8"; - this.stateOverride = stateOverride; - this.url = url; - this.failure = false; - this.parseError = false; - - if (!this.url) { - this.url = { - scheme: "", - username: "", - password: "", - host: null, - port: null, - path: [], - query: null, - fragment: null, - - cannotBeABaseURL: false - }; - - const res = trimControlChars(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - } - - const res = trimTabAndNewline(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - - this.state = stateOverride || "scheme start"; - - this.buffer = ""; - this.atFlag = false; - this.arrFlag = false; - this.passwordTokenSeenFlag = false; - - this.input = punycode.ucs2.decode(this.input); - - for (; this.pointer <= this.input.length; ++this.pointer) { - const c = this.input[this.pointer]; - const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); - - // exec state machine - const ret = this["parse " + this.state](c, cStr); - if (!ret) { - break; // terminate algorithm - } else if (ret === failure) { - this.failure = true; - break; - } - } -} - -URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { - if (isASCIIAlpha(c)) { - this.buffer += cStr.toLowerCase(); - this.state = "scheme"; - } else if (!this.stateOverride) { - this.state = "no scheme"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { - if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { - this.buffer += cStr.toLowerCase(); - } else if (c === 58) { - if (this.stateOverride) { - if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { - return false; - } - - if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { - return false; - } - - if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { - return false; - } - - if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { - return false; - } - } - this.url.scheme = this.buffer; - this.buffer = ""; - if (this.stateOverride) { - return false; - } - if (this.url.scheme === "file") { - if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { - this.parseError = true; - } - this.state = "file"; - } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { - this.state = "special relative or authority"; - } else if (isSpecial(this.url)) { - this.state = "special authority slashes"; - } else if (this.input[this.pointer + 1] === 47) { - this.state = "path or authority"; - ++this.pointer; - } else { - this.url.cannotBeABaseURL = true; - this.url.path.push(""); - this.state = "cannot-be-a-base-URL path"; - } - } else if (!this.stateOverride) { - this.buffer = ""; - this.state = "no scheme"; - this.pointer = -1; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { - if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { - return failure; - } else if (this.base.cannotBeABaseURL && c === 35) { - this.url.scheme = this.base.scheme; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.url.cannotBeABaseURL = true; - this.state = "fragment"; - } else if (this.base.scheme === "file") { - this.state = "file"; - --this.pointer; - } else { - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { - if (c === 47) { - this.state = "authority"; - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative"] = function parseRelative(c) { - this.url.scheme = this.base.scheme; - if (isNaN(c)) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 47) { - this.state = "relative slash"; - } else if (c === 63) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else if (isSpecial(this.url) && c === 92) { - this.parseError = true; - this.state = "relative slash"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(0, this.base.path.length - 1); - - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { - if (isSpecial(this.url) && (c === 47 || c === 92)) { - if (c === 92) { - this.parseError = true; - } - this.state = "special authority ignore slashes"; - } else if (c === 47) { - this.state = "authority"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "special authority ignore slashes"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { - if (c !== 47 && c !== 92) { - this.state = "authority"; - --this.pointer; - } else { - this.parseError = true; - } - - return true; -}; - -URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { - if (c === 64) { - this.parseError = true; - if (this.atFlag) { - this.buffer = "%40" + this.buffer; - } - this.atFlag = true; - - // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars - const len = countSymbols(this.buffer); - for (let pointer = 0; pointer < len; ++pointer) { - const codePoint = this.buffer.codePointAt(pointer); - - if (codePoint === 58 && !this.passwordTokenSeenFlag) { - this.passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); - if (this.passwordTokenSeenFlag) { - this.url.password += encodedCodePoints; - } else { - this.url.username += encodedCodePoints; - } - } - this.buffer = ""; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - if (this.atFlag && this.buffer === "") { - this.parseError = true; - return failure; - } - this.pointer -= countSymbols(this.buffer) + 1; - this.buffer = ""; - this.state = "host"; - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse hostname"] = -URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { - if (this.stateOverride && this.url.scheme === "file") { - --this.pointer; - this.state = "file host"; - } else if (c === 58 && !this.arrFlag) { - if (this.buffer === "") { - this.parseError = true; - return failure; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "port"; - if (this.stateOverride === "hostname") { - return false; - } - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - --this.pointer; - if (isSpecial(this.url) && this.buffer === "") { - this.parseError = true; - return failure; - } else if (this.stateOverride && this.buffer === "" && - (includesCredentials(this.url) || this.url.port !== null)) { - this.parseError = true; - return false; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "path start"; - if (this.stateOverride) { - return false; - } - } else { - if (c === 91) { - this.arrFlag = true; - } else if (c === 93) { - this.arrFlag = false; - } - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { - if (isASCIIDigit(c)) { - this.buffer += cStr; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92) || - this.stateOverride) { - if (this.buffer !== "") { - const port = parseInt(this.buffer); - if (port > Math.pow(2, 16) - 1) { - this.parseError = true; - return failure; - } - this.url.port = port === defaultPort(this.url.scheme) ? null : port; - this.buffer = ""; - } - if (this.stateOverride) { - return false; - } - this.state = "path start"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); - -URLStateMachine.prototype["parse file"] = function parseFile(c) { - this.url.scheme = "file"; - - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file slash"; - } else if (this.base !== null && this.base.scheme === "file") { - if (isNaN(c)) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 63) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else { - if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points - !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || - (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points - !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - shortenPath(this.url); - } else { - this.parseError = true; - } - - this.state = "path"; - --this.pointer; - } - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file host"; - } else { - if (this.base !== null && this.base.scheme === "file") { - if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { - this.url.path.push(this.base.path[0]); - } else { - this.url.host = this.base.host; - } - } - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { - if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { - --this.pointer; - if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { - this.parseError = true; - this.state = "path"; - } else if (this.buffer === "") { - this.url.host = ""; - if (this.stateOverride) { - return false; - } - this.state = "path start"; - } else { - let host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - if (host === "localhost") { - host = ""; - } - this.url.host = host; - - if (this.stateOverride) { - return false; - } - - this.buffer = ""; - this.state = "path start"; - } - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { - if (isSpecial(this.url)) { - if (c === 92) { - this.parseError = true; - } - this.state = "path"; - - if (c !== 47 && c !== 92) { - --this.pointer; - } - } else if (!this.stateOverride && c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (!this.stateOverride && c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else if (c !== undefined) { - this.state = "path"; - if (c !== 47) { - --this.pointer; - } - } - - return true; -}; - -URLStateMachine.prototype["parse path"] = function parsePath(c) { - if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || - (!this.stateOverride && (c === 63 || c === 35))) { - if (isSpecial(this.url) && c === 92) { - this.parseError = true; - } - - if (isDoubleDot(this.buffer)) { - shortenPath(this.url); - if (c !== 47 && !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } - } else if (isSingleDot(this.buffer) && c !== 47 && - !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } else if (!isSingleDot(this.buffer)) { - if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { - if (this.url.host !== "" && this.url.host !== null) { - this.parseError = true; - this.url.host = ""; - } - this.buffer = this.buffer[0] + ":"; - } - this.url.path.push(this.buffer); - } - this.buffer = ""; - if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { - while (this.url.path.length > 1 && this.url.path[0] === "") { - this.parseError = true; - this.url.path.shift(); - } - } - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += percentEncodeChar(c, isPathPercentEncode); - } - - return true; -}; - -URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else { - // TODO: Add: not a URL code point - if (!isNaN(c) && c !== 37) { - this.parseError = true; - } - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - if (!isNaN(c)) { - this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); - } - } - - return true; -}; - -URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { - if (isNaN(c) || (!this.stateOverride && c === 35)) { - if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { - this.encodingOverride = "utf-8"; - } - - const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || - buffer[i] === 0x3C || buffer[i] === 0x3E) { - this.url.query += percentEncode(buffer[i]); - } else { - this.url.query += String.fromCodePoint(buffer[i]); - } - } - - this.buffer = ""; - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { - if (isNaN(c)) { // do nothing - } else if (c === 0x0) { - this.parseError = true; - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); - } - - return true; -}; - -function serializeURL(url, excludeFragment) { - let output = url.scheme + ":"; - if (url.host !== null) { - output += "//"; - - if (url.username !== "" || url.password !== "") { - output += url.username; - if (url.password !== "") { - output += ":" + url.password; - } - output += "@"; - } - - output += serializeHost(url.host); - - if (url.port !== null) { - output += ":" + url.port; - } - } else if (url.host === null && url.scheme === "file") { - output += "//"; - } - - if (url.cannotBeABaseURL) { - output += url.path[0]; - } else { - for (const string of url.path) { - output += "/" + string; - } - } - - if (url.query !== null) { - output += "?" + url.query; - } - - if (!excludeFragment && url.fragment !== null) { - output += "#" + url.fragment; - } - - return output; -} - -function serializeOrigin(tuple) { - let result = tuple.scheme + "://"; - result += serializeHost(tuple.host); - - if (tuple.port !== null) { - result += ":" + tuple.port; - } - - return result; -} - -module.exports.serializeURL = serializeURL; - -module.exports.serializeURLOrigin = function (url) { - // https://url.spec.whatwg.org/#concept-url-origin - switch (url.scheme) { - case "blob": - try { - return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); - } catch (e) { - // serializing an opaque origin returns "null" - return "null"; - } - case "ftp": - case "gopher": - case "http": - case "https": - case "ws": - case "wss": - return serializeOrigin({ - scheme: url.scheme, - host: url.host, - port: url.port - }); - case "file": - // spec says "exercise to the reader", chrome says "file://" - return "file://"; - default: - // serializing an opaque origin returns "null" - return "null"; - } -}; - -module.exports.basicURLParse = function (input, options) { - if (options === undefined) { - options = {}; - } - - const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); - if (usm.failure) { - return "failure"; - } - - return usm.url; -}; - -module.exports.setTheUsername = function (url, username) { - url.username = ""; - const decoded = punycode.ucs2.decode(username); - for (let i = 0; i < decoded.length; ++i) { - url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.setThePassword = function (url, password) { - url.password = ""; - const decoded = punycode.ucs2.decode(password); - for (let i = 0; i < decoded.length; ++i) { - url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.serializeHost = serializeHost; - -module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; - -module.exports.serializeInteger = function (integer) { - return String(integer); -}; - -module.exports.parseURL = function (input, options) { - if (options === undefined) { - options = {}; - } - - // We don't handle blobs, so this just delegates: - return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); -}; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; /***/ }), @@ -18746,7 +18746,7 @@ IndexedSourceMapConsumer.prototype.sourceContentFor = * and an object is returned with the following properties: * * - line: The line number in the generated source, or null. The - * line number is 1-based. + * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ @@ -20551,17 +20551,17 @@ function wrappy (fn, cb) { /***/ 1709: /***/ ((module) => { -module.exports = { - - isArray: function(value) { - if (Array.isArray) { - return Array.isArray(value); - } - // fallback for older browsers like IE 8 - return Object.prototype.toString.call( value ) === '[object Array]'; - } - -}; +module.exports = { + + isArray: function(value) { + if (Array.isArray) { + return Array.isArray(value); + } + // fallback for older browsers like IE 8 + return Object.prototype.toString.call( value ) === '[object Array]'; + } + +}; /***/ }), @@ -20569,19 +20569,19 @@ module.exports = { /***/ 8821: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -/*jslint node:true */ - -var xml2js = __nccwpck_require__(2903); -var xml2json = __nccwpck_require__(8919); -var js2xml = __nccwpck_require__(4453); -var json2xml = __nccwpck_require__(1900); - -module.exports = { - xml2js: xml2js, - xml2json: xml2json, - js2xml: js2xml, - json2xml: json2xml -}; +/*jslint node:true */ + +var xml2js = __nccwpck_require__(2903); +var xml2json = __nccwpck_require__(8919); +var js2xml = __nccwpck_require__(4453); +var json2xml = __nccwpck_require__(1900); + +module.exports = { + xml2js: xml2js, + xml2json: xml2json, + js2xml: js2xml, + json2xml: json2xml +}; /***/ }), @@ -20916,24 +20916,24 @@ module.exports = function (js, options) { /***/ 1900: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -var js2xml = __nccwpck_require__(4453); - -module.exports = function (json, options) { - if (json instanceof Buffer) { - json = json.toString(); - } - var js = null; - if (typeof (json) === 'string') { - try { - js = JSON.parse(json); - } catch (e) { - throw new Error('The JSON structure is invalid'); - } - } else { - js = json; - } - return js2xml(js, options); -}; +var js2xml = __nccwpck_require__(4453); + +module.exports = function (json, options) { + if (json instanceof Buffer) { + json = json.toString(); + } + var js = null; + if (typeof (json) === 'string') { + try { + js = JSON.parse(json); + } catch (e) { + throw new Error('The JSON structure is invalid'); + } + } else { + js = json; + } + return js2xml(js, options); +}; /***/ }), @@ -20941,49 +20941,49 @@ module.exports = function (json, options) { /***/ 6717: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -var isArray = (__nccwpck_require__(1709).isArray); - -module.exports = { - - copyOptions: function (options) { - var key, copy = {}; - for (key in options) { - if (options.hasOwnProperty(key)) { - copy[key] = options[key]; - } - } - return copy; - }, - - ensureFlagExists: function (item, options) { - if (!(item in options) || typeof options[item] !== 'boolean') { - options[item] = false; - } - }, - - ensureSpacesExists: function (options) { - if (!('spaces' in options) || (typeof options.spaces !== 'number' && typeof options.spaces !== 'string')) { - options.spaces = 0; - } - }, - - ensureAlwaysArrayExists: function (options) { - if (!('alwaysArray' in options) || (typeof options.alwaysArray !== 'boolean' && !isArray(options.alwaysArray))) { - options.alwaysArray = false; - } - }, - - ensureKeyExists: function (key, options) { - if (!(key + 'Key' in options) || typeof options[key + 'Key'] !== 'string') { - options[key + 'Key'] = options.compact ? '_' + key : key; - } - }, - - checkFnExists: function (key, options) { - return key + 'Fn' in options; - } - -}; +var isArray = (__nccwpck_require__(1709).isArray); + +module.exports = { + + copyOptions: function (options) { + var key, copy = {}; + for (key in options) { + if (options.hasOwnProperty(key)) { + copy[key] = options[key]; + } + } + return copy; + }, + + ensureFlagExists: function (item, options) { + if (!(item in options) || typeof options[item] !== 'boolean') { + options[item] = false; + } + }, + + ensureSpacesExists: function (options) { + if (!('spaces' in options) || (typeof options.spaces !== 'number' && typeof options.spaces !== 'string')) { + options.spaces = 0; + } + }, + + ensureAlwaysArrayExists: function (options) { + if (!('alwaysArray' in options) || (typeof options.alwaysArray !== 'boolean' && !isArray(options.alwaysArray))) { + options.alwaysArray = false; + } + }, + + ensureKeyExists: function (key, options) { + if (!(key + 'Key' in options) || typeof options[key + 'Key'] !== 'string') { + options[key + 'Key'] = options.compact ? '_' + key : key; + } + }, + + checkFnExists: function (key, options) { + return key + 'Fn' in options; + } + +}; /***/ }), @@ -20991,368 +20991,368 @@ module.exports = { /***/ 2903: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -var sax = __nccwpck_require__(2043); -var expat /*= require('node-expat');*/ = { on: function () { }, parse: function () { } }; -var helper = __nccwpck_require__(6717); -var isArray = (__nccwpck_require__(1709).isArray); - -var options; -var pureJsParser = true; -var currentElement; - -function validateOptions(userOptions) { - options = helper.copyOptions(userOptions); - helper.ensureFlagExists('ignoreDeclaration', options); - helper.ensureFlagExists('ignoreInstruction', options); - helper.ensureFlagExists('ignoreAttributes', options); - helper.ensureFlagExists('ignoreText', options); - helper.ensureFlagExists('ignoreComment', options); - helper.ensureFlagExists('ignoreCdata', options); - helper.ensureFlagExists('ignoreDoctype', options); - helper.ensureFlagExists('compact', options); - helper.ensureFlagExists('alwaysChildren', options); - helper.ensureFlagExists('addParent', options); - helper.ensureFlagExists('trim', options); - helper.ensureFlagExists('nativeType', options); - helper.ensureFlagExists('nativeTypeAttributes', options); - helper.ensureFlagExists('sanitize', options); - helper.ensureFlagExists('instructionHasAttributes', options); - helper.ensureFlagExists('captureSpacesBetweenElements', options); - helper.ensureAlwaysArrayExists(options); - helper.ensureKeyExists('declaration', options); - helper.ensureKeyExists('instruction', options); - helper.ensureKeyExists('attributes', options); - helper.ensureKeyExists('text', options); - helper.ensureKeyExists('comment', options); - helper.ensureKeyExists('cdata', options); - helper.ensureKeyExists('doctype', options); - helper.ensureKeyExists('type', options); - helper.ensureKeyExists('name', options); - helper.ensureKeyExists('elements', options); - helper.ensureKeyExists('parent', options); - helper.checkFnExists('doctype', options); - helper.checkFnExists('instruction', options); - helper.checkFnExists('cdata', options); - helper.checkFnExists('comment', options); - helper.checkFnExists('text', options); - helper.checkFnExists('instructionName', options); - helper.checkFnExists('elementName', options); - helper.checkFnExists('attributeName', options); - helper.checkFnExists('attributeValue', options); - helper.checkFnExists('attributes', options); - return options; -} - -function nativeType(value) { - var nValue = Number(value); - if (!isNaN(nValue)) { - return nValue; - } - var bValue = value.toLowerCase(); - if (bValue === 'true') { - return true; - } else if (bValue === 'false') { - return false; - } - return value; -} - -function addField(type, value) { - var key; - if (options.compact) { - if ( - !currentElement[options[type + 'Key']] && - (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(options[type + 'Key']) !== -1 : options.alwaysArray) - ) { - currentElement[options[type + 'Key']] = []; - } - if (currentElement[options[type + 'Key']] && !isArray(currentElement[options[type + 'Key']])) { - currentElement[options[type + 'Key']] = [currentElement[options[type + 'Key']]]; - } - if (type + 'Fn' in options && typeof value === 'string') { - value = options[type + 'Fn'](value, currentElement); - } - if (type === 'instruction' && ('instructionFn' in options || 'instructionNameFn' in options)) { - for (key in value) { - if (value.hasOwnProperty(key)) { - if ('instructionFn' in options) { - value[key] = options.instructionFn(value[key], key, currentElement); - } else { - var temp = value[key]; - delete value[key]; - value[options.instructionNameFn(key, temp, currentElement)] = temp; - } - } - } - } - if (isArray(currentElement[options[type + 'Key']])) { - currentElement[options[type + 'Key']].push(value); - } else { - currentElement[options[type + 'Key']] = value; - } - } else { - if (!currentElement[options.elementsKey]) { - currentElement[options.elementsKey] = []; - } - var element = {}; - element[options.typeKey] = type; - if (type === 'instruction') { - for (key in value) { - if (value.hasOwnProperty(key)) { - break; - } - } - element[options.nameKey] = 'instructionNameFn' in options ? options.instructionNameFn(key, value, currentElement) : key; - if (options.instructionHasAttributes) { - element[options.attributesKey] = value[key][options.attributesKey]; - if ('instructionFn' in options) { - element[options.attributesKey] = options.instructionFn(element[options.attributesKey], key, currentElement); - } - } else { - if ('instructionFn' in options) { - value[key] = options.instructionFn(value[key], key, currentElement); - } - element[options.instructionKey] = value[key]; - } - } else { - if (type + 'Fn' in options) { - value = options[type + 'Fn'](value, currentElement); - } - element[options[type + 'Key']] = value; - } - if (options.addParent) { - element[options.parentKey] = currentElement; - } - currentElement[options.elementsKey].push(element); - } -} - -function manipulateAttributes(attributes) { - if ('attributesFn' in options && attributes) { - attributes = options.attributesFn(attributes, currentElement); - } - if ((options.trim || 'attributeValueFn' in options || 'attributeNameFn' in options || options.nativeTypeAttributes) && attributes) { - var key; - for (key in attributes) { - if (attributes.hasOwnProperty(key)) { - if (options.trim) attributes[key] = attributes[key].trim(); - if (options.nativeTypeAttributes) { - attributes[key] = nativeType(attributes[key]); - } - if ('attributeValueFn' in options) attributes[key] = options.attributeValueFn(attributes[key], key, currentElement); - if ('attributeNameFn' in options) { - var temp = attributes[key]; - delete attributes[key]; - attributes[options.attributeNameFn(key, attributes[key], currentElement)] = temp; - } - } - } - } - return attributes; -} - -function onInstruction(instruction) { - var attributes = {}; - if (instruction.body && (instruction.name.toLowerCase() === 'xml' || options.instructionHasAttributes)) { - var attrsRegExp = /([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g; - var match; - while ((match = attrsRegExp.exec(instruction.body)) !== null) { - attributes[match[1]] = match[2] || match[3] || match[4]; - } - attributes = manipulateAttributes(attributes); - } - if (instruction.name.toLowerCase() === 'xml') { - if (options.ignoreDeclaration) { - return; - } - currentElement[options.declarationKey] = {}; - if (Object.keys(attributes).length) { - currentElement[options.declarationKey][options.attributesKey] = attributes; - } - if (options.addParent) { - currentElement[options.declarationKey][options.parentKey] = currentElement; - } - } else { - if (options.ignoreInstruction) { - return; - } - if (options.trim) { - instruction.body = instruction.body.trim(); - } - var value = {}; - if (options.instructionHasAttributes && Object.keys(attributes).length) { - value[instruction.name] = {}; - value[instruction.name][options.attributesKey] = attributes; - } else { - value[instruction.name] = instruction.body; - } - addField('instruction', value); - } -} - -function onStartElement(name, attributes) { - var element; - if (typeof name === 'object') { - attributes = name.attributes; - name = name.name; - } - attributes = manipulateAttributes(attributes); - if ('elementNameFn' in options) { - name = options.elementNameFn(name, currentElement); - } - if (options.compact) { - element = {}; - if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) { - element[options.attributesKey] = {}; - var key; - for (key in attributes) { - if (attributes.hasOwnProperty(key)) { - element[options.attributesKey][key] = attributes[key]; - } - } - } - if ( - !(name in currentElement) && - (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(name) !== -1 : options.alwaysArray) - ) { - currentElement[name] = []; - } - if (currentElement[name] && !isArray(currentElement[name])) { - currentElement[name] = [currentElement[name]]; - } - if (isArray(currentElement[name])) { - currentElement[name].push(element); - } else { - currentElement[name] = element; - } - } else { - if (!currentElement[options.elementsKey]) { - currentElement[options.elementsKey] = []; - } - element = {}; - element[options.typeKey] = 'element'; - element[options.nameKey] = name; - if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) { - element[options.attributesKey] = attributes; - } - if (options.alwaysChildren) { - element[options.elementsKey] = []; - } - currentElement[options.elementsKey].push(element); - } - element[options.parentKey] = currentElement; // will be deleted in onEndElement() if !options.addParent - currentElement = element; -} - -function onText(text) { - if (options.ignoreText) { - return; - } - if (!text.trim() && !options.captureSpacesBetweenElements) { - return; - } - if (options.trim) { - text = text.trim(); - } - if (options.nativeType) { - text = nativeType(text); - } - if (options.sanitize) { - text = text.replace(/&/g, '&').replace(//g, '>'); - } - addField('text', text); -} - -function onComment(comment) { - if (options.ignoreComment) { - return; - } - if (options.trim) { - comment = comment.trim(); - } - addField('comment', comment); -} - -function onEndElement(name) { - var parentElement = currentElement[options.parentKey]; - if (!options.addParent) { - delete currentElement[options.parentKey]; - } - currentElement = parentElement; -} - -function onCdata(cdata) { - if (options.ignoreCdata) { - return; - } - if (options.trim) { - cdata = cdata.trim(); - } - addField('cdata', cdata); -} - -function onDoctype(doctype) { - if (options.ignoreDoctype) { - return; - } - doctype = doctype.replace(/^ /, ''); - if (options.trim) { - doctype = doctype.trim(); - } - addField('doctype', doctype); -} - -function onError(error) { - error.note = error; //console.error(error); -} - -module.exports = function (xml, userOptions) { - - var parser = pureJsParser ? sax.parser(true, {}) : parser = new expat.Parser('UTF-8'); - var result = {}; - currentElement = result; - - options = validateOptions(userOptions); - - if (pureJsParser) { - parser.opt = {strictEntities: true}; - parser.onopentag = onStartElement; - parser.ontext = onText; - parser.oncomment = onComment; - parser.onclosetag = onEndElement; - parser.onerror = onError; - parser.oncdata = onCdata; - parser.ondoctype = onDoctype; - parser.onprocessinginstruction = onInstruction; - } else { - parser.on('startElement', onStartElement); - parser.on('text', onText); - parser.on('comment', onComment); - parser.on('endElement', onEndElement); - parser.on('error', onError); - //parser.on('startCdata', onStartCdata); - //parser.on('endCdata', onEndCdata); - //parser.on('entityDecl', onEntityDecl); - } - - if (pureJsParser) { - parser.write(xml).close(); - } else { - if (!parser.parse(xml)) { - throw new Error('XML parsing error: ' + parser.getError()); - } - } - - if (result[options.elementsKey]) { - var temp = result[options.elementsKey]; - delete result[options.elementsKey]; - result[options.elementsKey] = temp; - delete result.text; - } - - return result; - -}; +var sax = __nccwpck_require__(2043); +var expat /*= require('node-expat');*/ = { on: function () { }, parse: function () { } }; +var helper = __nccwpck_require__(6717); +var isArray = (__nccwpck_require__(1709).isArray); + +var options; +var pureJsParser = true; +var currentElement; + +function validateOptions(userOptions) { + options = helper.copyOptions(userOptions); + helper.ensureFlagExists('ignoreDeclaration', options); + helper.ensureFlagExists('ignoreInstruction', options); + helper.ensureFlagExists('ignoreAttributes', options); + helper.ensureFlagExists('ignoreText', options); + helper.ensureFlagExists('ignoreComment', options); + helper.ensureFlagExists('ignoreCdata', options); + helper.ensureFlagExists('ignoreDoctype', options); + helper.ensureFlagExists('compact', options); + helper.ensureFlagExists('alwaysChildren', options); + helper.ensureFlagExists('addParent', options); + helper.ensureFlagExists('trim', options); + helper.ensureFlagExists('nativeType', options); + helper.ensureFlagExists('nativeTypeAttributes', options); + helper.ensureFlagExists('sanitize', options); + helper.ensureFlagExists('instructionHasAttributes', options); + helper.ensureFlagExists('captureSpacesBetweenElements', options); + helper.ensureAlwaysArrayExists(options); + helper.ensureKeyExists('declaration', options); + helper.ensureKeyExists('instruction', options); + helper.ensureKeyExists('attributes', options); + helper.ensureKeyExists('text', options); + helper.ensureKeyExists('comment', options); + helper.ensureKeyExists('cdata', options); + helper.ensureKeyExists('doctype', options); + helper.ensureKeyExists('type', options); + helper.ensureKeyExists('name', options); + helper.ensureKeyExists('elements', options); + helper.ensureKeyExists('parent', options); + helper.checkFnExists('doctype', options); + helper.checkFnExists('instruction', options); + helper.checkFnExists('cdata', options); + helper.checkFnExists('comment', options); + helper.checkFnExists('text', options); + helper.checkFnExists('instructionName', options); + helper.checkFnExists('elementName', options); + helper.checkFnExists('attributeName', options); + helper.checkFnExists('attributeValue', options); + helper.checkFnExists('attributes', options); + return options; +} + +function nativeType(value) { + var nValue = Number(value); + if (!isNaN(nValue)) { + return nValue; + } + var bValue = value.toLowerCase(); + if (bValue === 'true') { + return true; + } else if (bValue === 'false') { + return false; + } + return value; +} + +function addField(type, value) { + var key; + if (options.compact) { + if ( + !currentElement[options[type + 'Key']] && + (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(options[type + 'Key']) !== -1 : options.alwaysArray) + ) { + currentElement[options[type + 'Key']] = []; + } + if (currentElement[options[type + 'Key']] && !isArray(currentElement[options[type + 'Key']])) { + currentElement[options[type + 'Key']] = [currentElement[options[type + 'Key']]]; + } + if (type + 'Fn' in options && typeof value === 'string') { + value = options[type + 'Fn'](value, currentElement); + } + if (type === 'instruction' && ('instructionFn' in options || 'instructionNameFn' in options)) { + for (key in value) { + if (value.hasOwnProperty(key)) { + if ('instructionFn' in options) { + value[key] = options.instructionFn(value[key], key, currentElement); + } else { + var temp = value[key]; + delete value[key]; + value[options.instructionNameFn(key, temp, currentElement)] = temp; + } + } + } + } + if (isArray(currentElement[options[type + 'Key']])) { + currentElement[options[type + 'Key']].push(value); + } else { + currentElement[options[type + 'Key']] = value; + } + } else { + if (!currentElement[options.elementsKey]) { + currentElement[options.elementsKey] = []; + } + var element = {}; + element[options.typeKey] = type; + if (type === 'instruction') { + for (key in value) { + if (value.hasOwnProperty(key)) { + break; + } + } + element[options.nameKey] = 'instructionNameFn' in options ? options.instructionNameFn(key, value, currentElement) : key; + if (options.instructionHasAttributes) { + element[options.attributesKey] = value[key][options.attributesKey]; + if ('instructionFn' in options) { + element[options.attributesKey] = options.instructionFn(element[options.attributesKey], key, currentElement); + } + } else { + if ('instructionFn' in options) { + value[key] = options.instructionFn(value[key], key, currentElement); + } + element[options.instructionKey] = value[key]; + } + } else { + if (type + 'Fn' in options) { + value = options[type + 'Fn'](value, currentElement); + } + element[options[type + 'Key']] = value; + } + if (options.addParent) { + element[options.parentKey] = currentElement; + } + currentElement[options.elementsKey].push(element); + } +} + +function manipulateAttributes(attributes) { + if ('attributesFn' in options && attributes) { + attributes = options.attributesFn(attributes, currentElement); + } + if ((options.trim || 'attributeValueFn' in options || 'attributeNameFn' in options || options.nativeTypeAttributes) && attributes) { + var key; + for (key in attributes) { + if (attributes.hasOwnProperty(key)) { + if (options.trim) attributes[key] = attributes[key].trim(); + if (options.nativeTypeAttributes) { + attributes[key] = nativeType(attributes[key]); + } + if ('attributeValueFn' in options) attributes[key] = options.attributeValueFn(attributes[key], key, currentElement); + if ('attributeNameFn' in options) { + var temp = attributes[key]; + delete attributes[key]; + attributes[options.attributeNameFn(key, attributes[key], currentElement)] = temp; + } + } + } + } + return attributes; +} + +function onInstruction(instruction) { + var attributes = {}; + if (instruction.body && (instruction.name.toLowerCase() === 'xml' || options.instructionHasAttributes)) { + var attrsRegExp = /([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g; + var match; + while ((match = attrsRegExp.exec(instruction.body)) !== null) { + attributes[match[1]] = match[2] || match[3] || match[4]; + } + attributes = manipulateAttributes(attributes); + } + if (instruction.name.toLowerCase() === 'xml') { + if (options.ignoreDeclaration) { + return; + } + currentElement[options.declarationKey] = {}; + if (Object.keys(attributes).length) { + currentElement[options.declarationKey][options.attributesKey] = attributes; + } + if (options.addParent) { + currentElement[options.declarationKey][options.parentKey] = currentElement; + } + } else { + if (options.ignoreInstruction) { + return; + } + if (options.trim) { + instruction.body = instruction.body.trim(); + } + var value = {}; + if (options.instructionHasAttributes && Object.keys(attributes).length) { + value[instruction.name] = {}; + value[instruction.name][options.attributesKey] = attributes; + } else { + value[instruction.name] = instruction.body; + } + addField('instruction', value); + } +} + +function onStartElement(name, attributes) { + var element; + if (typeof name === 'object') { + attributes = name.attributes; + name = name.name; + } + attributes = manipulateAttributes(attributes); + if ('elementNameFn' in options) { + name = options.elementNameFn(name, currentElement); + } + if (options.compact) { + element = {}; + if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) { + element[options.attributesKey] = {}; + var key; + for (key in attributes) { + if (attributes.hasOwnProperty(key)) { + element[options.attributesKey][key] = attributes[key]; + } + } + } + if ( + !(name in currentElement) && + (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(name) !== -1 : options.alwaysArray) + ) { + currentElement[name] = []; + } + if (currentElement[name] && !isArray(currentElement[name])) { + currentElement[name] = [currentElement[name]]; + } + if (isArray(currentElement[name])) { + currentElement[name].push(element); + } else { + currentElement[name] = element; + } + } else { + if (!currentElement[options.elementsKey]) { + currentElement[options.elementsKey] = []; + } + element = {}; + element[options.typeKey] = 'element'; + element[options.nameKey] = name; + if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) { + element[options.attributesKey] = attributes; + } + if (options.alwaysChildren) { + element[options.elementsKey] = []; + } + currentElement[options.elementsKey].push(element); + } + element[options.parentKey] = currentElement; // will be deleted in onEndElement() if !options.addParent + currentElement = element; +} + +function onText(text) { + if (options.ignoreText) { + return; + } + if (!text.trim() && !options.captureSpacesBetweenElements) { + return; + } + if (options.trim) { + text = text.trim(); + } + if (options.nativeType) { + text = nativeType(text); + } + if (options.sanitize) { + text = text.replace(/&/g, '&').replace(//g, '>'); + } + addField('text', text); +} + +function onComment(comment) { + if (options.ignoreComment) { + return; + } + if (options.trim) { + comment = comment.trim(); + } + addField('comment', comment); +} + +function onEndElement(name) { + var parentElement = currentElement[options.parentKey]; + if (!options.addParent) { + delete currentElement[options.parentKey]; + } + currentElement = parentElement; +} + +function onCdata(cdata) { + if (options.ignoreCdata) { + return; + } + if (options.trim) { + cdata = cdata.trim(); + } + addField('cdata', cdata); +} + +function onDoctype(doctype) { + if (options.ignoreDoctype) { + return; + } + doctype = doctype.replace(/^ /, ''); + if (options.trim) { + doctype = doctype.trim(); + } + addField('doctype', doctype); +} + +function onError(error) { + error.note = error; //console.error(error); +} + +module.exports = function (xml, userOptions) { + + var parser = pureJsParser ? sax.parser(true, {}) : parser = new expat.Parser('UTF-8'); + var result = {}; + currentElement = result; + + options = validateOptions(userOptions); + + if (pureJsParser) { + parser.opt = {strictEntities: true}; + parser.onopentag = onStartElement; + parser.ontext = onText; + parser.oncomment = onComment; + parser.onclosetag = onEndElement; + parser.onerror = onError; + parser.oncdata = onCdata; + parser.ondoctype = onDoctype; + parser.onprocessinginstruction = onInstruction; + } else { + parser.on('startElement', onStartElement); + parser.on('text', onText); + parser.on('comment', onComment); + parser.on('endElement', onEndElement); + parser.on('error', onError); + //parser.on('startCdata', onStartCdata); + //parser.on('endCdata', onEndCdata); + //parser.on('entityDecl', onEntityDecl); + } + + if (pureJsParser) { + parser.write(xml).close(); + } else { + if (!parser.parse(xml)) { + throw new Error('XML parsing error: ' + parser.getError()); + } + } + + if (result[options.elementsKey]) { + var temp = result[options.elementsKey]; + delete result[options.elementsKey]; + result[options.elementsKey] = temp; + delete result.text; + } + + return result; + +}; /***/ }), @@ -21360,28 +21360,28 @@ module.exports = function (xml, userOptions) { /***/ 8919: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -var helper = __nccwpck_require__(6717); -var xml2js = __nccwpck_require__(2903); - -function validateOptions (userOptions) { - var options = helper.copyOptions(userOptions); - helper.ensureSpacesExists(options); - return options; -} - -module.exports = function(xml, userOptions) { - var options, js, json, parentKey; - options = validateOptions(userOptions); - js = xml2js(xml, options); - parentKey = 'compact' in options && options.compact ? '_parent' : 'parent'; - // parentKey = ptions.compact ? '_parent' : 'parent'; // consider this - if ('addParent' in options && options.addParent) { - json = JSON.stringify(js, function (k, v) { return k === parentKey? '_' : v; }, options.spaces); - } else { - json = JSON.stringify(js, null, options.spaces); - } - return json.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029'); -}; +var helper = __nccwpck_require__(6717); +var xml2js = __nccwpck_require__(2903); + +function validateOptions (userOptions) { + var options = helper.copyOptions(userOptions); + helper.ensureSpacesExists(options); + return options; +} + +module.exports = function(xml, userOptions) { + var options, js, json, parentKey; + options = validateOptions(userOptions); + js = xml2js(xml, options); + parentKey = 'compact' in options && options.compact ? '_parent' : 'parent'; + // parentKey = ptions.compact ? '_parent' : 'parent'; // consider this + if ('addParent' in options && options.addParent) { + json = JSON.stringify(js, function (k, v) { return k === parentKey? '_' : v; }, options.spaces); + } else { + json = JSON.stringify(js, null, options.spaces); + } + return json.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029'); +}; /***/ }), @@ -21542,7 +21542,7 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"] /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; -/******/ +/******/ /******/ // The require function /******/ function __nccwpck_require__(moduleId) { /******/ // Check if module is in cache @@ -21556,7 +21556,7 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"] /******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function /******/ var threw = true; /******/ try { @@ -21565,24 +21565,24 @@ module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"] /******/ } finally { /******/ if(threw) delete __webpack_module_cache__[moduleId]; /******/ } -/******/ +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ +/******/ /************************************************************************/ /******/ /* webpack/runtime/compat */ -/******/ +/******/ /******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; -/******/ +/******/ /************************************************************************/ -/******/ +/******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __webpack_exports__ = __nccwpck_require__(4822); /******/ module.exports = __webpack_exports__; -/******/ +/******/ /******/ })() ; -//# sourceMappingURL=index.js.map \ No newline at end of file +//# sourceMappingURL=index.js.map diff --git a/src/index.ts b/src/index.ts index 7a15552..2fce0b4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ async function run() { const { workspace, actionFolder } = Action; const { - unityVersion, + editorVersion, customImage, projectPath, customParameters, @@ -19,13 +19,13 @@ async function run() { githubToken, checkName, } = Input.getFromUser(); - const baseImage = new ImageTag({ version: unityVersion, customImage }); - const runnerTempPath = process.env.RUNNER_TEMP; + const baseImage = new ImageTag({ editorVersion, customImage }); + const runnerTemporaryPath = process.env.RUNNER_TEMP; try { await Docker.run(baseImage, { actionFolder, - unityVersion, + editorVersion, workspace, projectPath, customParameters, @@ -35,10 +35,9 @@ async function run() { sshAgent, gitPrivateToken, githubToken, - runnerTempPath, + runnerTemporaryPath, }); } finally { - // Set output await Output.setArtifactsPath(artifactsPath); } diff --git a/src/model/docker.ts b/src/model/docker.ts index 64f6ccc..a3e1d8a 100644 --- a/src/model/docker.ts +++ b/src/model/docker.ts @@ -6,7 +6,7 @@ const Docker = { async run(image, parameters, silent = false) { const { actionFolder, - unityVersion, + editorVersion, workspace, projectPath, customParameters, @@ -16,12 +16,12 @@ const Docker = { sshAgent, gitPrivateToken, githubToken, - runnerTempPath, + runnerTemporaryPath, } = parameters; - const githubHome = path.join(runnerTempPath, '_github_home'); + const githubHome = path.join(runnerTemporaryPath, '_github_home'); if (!existsSync(githubHome)) mkdirSync(githubHome); - const githubWorkflow = path.join(runnerTempPath, '_github_workflow'); + const githubWorkflow = path.join(runnerTemporaryPath, '_github_workflow'); if (!existsSync(githubWorkflow)) mkdirSync(githubWorkflow); const command = `docker run \ @@ -32,7 +32,7 @@ const Docker = { --env UNITY_EMAIL \ --env UNITY_PASSWORD \ --env UNITY_SERIAL \ - --env UNITY_VERSION="${unityVersion}" \ + --env UNITY_VERSION="${editorVersion}" \ --env PROJECT_PATH="${projectPath}" \ --env CUSTOM_PARAMETERS="${customParameters}" \ --env TEST_MODE="${testMode}" \ diff --git a/src/model/image-tag.test.ts b/src/model/image-tag.test.ts index 0b5deed..87018d1 100644 --- a/src/model/image-tag.test.ts +++ b/src/model/image-tag.test.ts @@ -1,11 +1,11 @@ import ImageTag from './image-tag'; +jest.spyOn(ImageTag, 'getImagePlatformPrefix').mockReturnValue('ubuntu'); + describe('ImageTag', () => { const some = { - repository: 'test1', - name: 'test2', - version: '2099.9.f9f9', - platform: 'Test', + editorVersion: '2099.9.f9f9', + targetPlatform: 'Test', builderPlatform: '', }; @@ -17,40 +17,45 @@ describe('ImageTag', () => { describe('constructor', () => { it('can be called', () => { - const { platform } = some; - expect(() => new ImageTag({ platform })).not.toThrow(); + const { targetPlatform } = some; + expect(() => new ImageTag({ platform: targetPlatform })).not.toThrow(); }); it('accepts parameters and sets the right properties', () => { const image = new ImageTag(some); - expect(image.repository).toStrictEqual(some.repository); - expect(image.name).toStrictEqual(some.name); - expect(image.version).toStrictEqual(some.version); - expect(image.platform).toStrictEqual(some.platform); - expect(image.builderPlatform).toStrictEqual(some.builderPlatform); + expect(image.repository).toStrictEqual('unityci'); + expect(image.name).toStrictEqual('editor'); + expect(image.editorVersion).toStrictEqual(some.editorVersion); + expect(image.targetPlatform).toStrictEqual(some.targetPlatform); + expect(image.targetPlatformSuffix).toStrictEqual(some.builderPlatform); }); - test.each(['2000.0.0f0', '2011.1.11f1'])('accepts %p version format', version => { - expect(() => new ImageTag({ version, platform: some.platform })).not.toThrow(); + test.each(['2000.0.0f0', '2011.1.11f1'])('accepts %p version format', editorVersion => { + expect( + () => new ImageTag({ editorVersion, targetPlatform: some.targetPlatform }), + ).not.toThrow(); }); - test.each(['some version', '', 1])('throws for incorrect versions %p', version => { - const { platform } = some; - expect(() => new ImageTag({ version, platform })).toThrow(); + test.each(['some version', '', 1])('throws for incorrect versions %p', editorVersion => { + const { targetPlatform } = some; + expect(() => new ImageTag({ editorVersion, targetPlatform })).toThrow(); }); }); describe('toString', () => { it('returns the correct version', () => { - const image = new ImageTag({ version: '2099.1.1111', platform: some.platform }); + const image = new ImageTag({ + editorVersion: '2099.1.1111', + targetPlatform: some.targetPlatform, + }); - expect(image.toString()).toStrictEqual(`${defaults.image}:2099.1.1111-0`); + expect(image.toString()).toStrictEqual(`${defaults.image}:ubuntu-2099.1.1111-1`); }); it('returns customImage if given', () => { const image = new ImageTag({ - version: '2099.1.1111', - platform: some.platform, + editorVersion: '2099.1.1111', + targetPlatform: some.targetPlatform, customImage: `${defaults.image}:2099.1.1111@347598437689743986`, }); @@ -58,15 +63,15 @@ describe('ImageTag', () => { }); it('returns the specific build platform', () => { - const image = new ImageTag({ version: '2019.2.11f1', platform: 'WebGL' }); + const image = new ImageTag({ editorVersion: '2019.2.11f1', targetPlatform: 'WebGL' }); - expect(image.toString()).toStrictEqual(`${defaults.image}:2019.2.11f1-webgl-0`); + expect(image.toString()).toStrictEqual(`${defaults.image}:ubuntu-2019.2.11f1-webgl-1`); }); it('returns no specific build platform for generic targetPlatforms', () => { - const image = new ImageTag({ platform: 'NoTarget' }); + const image = new ImageTag({ targetPlatform: 'NoTarget' }); - expect(image.toString()).toStrictEqual(`${defaults.image}:2019.2.11f1-0`); + expect(image.toString()).toStrictEqual(`${defaults.image}:ubuntu-2019.2.11f1-1`); }); }); }); diff --git a/src/model/image-tag.ts b/src/model/image-tag.ts index 332beab..8cbded9 100644 --- a/src/model/image-tag.ts +++ b/src/model/image-tag.ts @@ -1,41 +1,44 @@ import Platform from './platform'; class ImageTag { + public customImage?: string; public repository: string; public name: string; - public version: string; - public platform: any; - public builderPlatform: string; - public customImage: any; + public editorVersion: string; + public targetPlatform: string; + public targetPlatformSuffix: string; + public imagePlatformPrefix: string; + public imageRollingVersion: number; constructor(imageProperties) { const { - repository = 'unityci', - name = 'editor', - version = '2019.2.11f1', - platform = Platform.types.StandaloneLinux64, + editorVersion = '2019.2.11f1', + targetPlatform = Platform.types.StandaloneLinux64, customImage, } = imageProperties; - if (!ImageTag.versionPattern.test(version)) { - throw new Error(`Invalid version "${version}".`); + if (!ImageTag.versionPattern.test(editorVersion)) { + throw new Error(`Invalid version "${editorVersion}".`); } - const builderPlatform = ImageTag.getTargetPlatformToImageSuffixMap(platform, version); - - this.repository = repository; - this.name = name; - this.version = version; - this.platform = platform; - this.builderPlatform = builderPlatform; + // Either this.customImage = customImage; + + // Or + this.repository = 'unityci'; + this.name = 'editor'; + this.editorVersion = editorVersion; + this.targetPlatform = targetPlatform; + this.targetPlatformSuffix = ImageTag.getTargetPlatformSuffix(targetPlatform, editorVersion); + this.imagePlatformPrefix = ImageTag.getImagePlatformPrefix(process.platform); + this.imageRollingVersion = 1; } static get versionPattern() { return /^20\d{2}\.\d\.\w{3,4}|3$/; } - static get imageSuffixes() { + static get targetPlatformSuffixes() { return { generic: '', webgl: 'webgl', @@ -49,13 +52,22 @@ class ImageTag { }; } - static getTargetPlatformToImageSuffixMap(platform, version) { - const { generic, webgl, mac, windows, linux, linuxIl2cpp, android, ios, facebook } = - ImageTag.imageSuffixes; - - const [major, minor] = version.split('.').map(digit => Number(digit)); - // @see: https://docs.unity3d.com/ScriptReference/BuildTarget.html + static getImagePlatformPrefix(platform) { switch (platform) { + case 'linux': + return 'ubuntu'; + default: + throw new Error('The Operating System of this runner is not yet supported.'); + } + } + + static getTargetPlatformSuffix(targetPlatform, editorVersion) { + const { generic, webgl, mac, windows, linux, linuxIl2cpp, android, ios, facebook } = + ImageTag.targetPlatformSuffixes; + + const [major, minor] = editorVersion.split('.').map(digit => Number(digit)); + // @see: https://docs.unity3d.com/ScriptReference/BuildTarget.html + switch (targetPlatform) { case Platform.types.StandaloneOSX: return mac; case Platform.types.StandaloneWindows: @@ -103,12 +115,17 @@ class ImageTag { default: throw new Error(` Platform must be one of the ones described in the documentation. - "${platform}" is currently not supported.`); + "${targetPlatform}" is currently not supported.`); } } get tag() { - return `${this.version}-${this.builderPlatform}`.replace(/-+$/, ''); + const versionAndTarget = `${this.editorVersion}-${this.targetPlatformSuffix}`.replace( + /-+$/, + '', + ); + + return `${this.imagePlatformPrefix}-${versionAndTarget}-${this.imageRollingVersion}`; } get image() { @@ -118,12 +135,9 @@ class ImageTag { toString() { const { image, tag, customImage } = this; - if (customImage && customImage !== '') { - return customImage; - } + if (customImage) return customImage; - const dockerRepoVersion = 0; - return `${image}:${tag}-${dockerRepoVersion}`; + return `${image}:${tag}`; } } diff --git a/src/model/input.ts b/src/model/input.ts index 6a84e1f..91c278c 100644 --- a/src/model/input.ts +++ b/src/model/input.ts @@ -14,7 +14,7 @@ const Input = { getFromUser() { // Input variables specified in workflow using "with" prop. - const rawUnityVersion = getInput('unityVersion') || 'auto'; + const unityVersion = getInput('unityVersion') || 'auto'; const customImage = getInput('customImage') || ''; const rawProjectPath = getInput('projectPath') || '.'; const customParameters = getInput('customParameters') || ''; @@ -47,12 +47,12 @@ const Input = { const projectPath = rawProjectPath.replace(/\/$/, ''); const artifactsPath = rawArtifactsPath.replace(/\/$/, ''); const useHostNetwork = rawUseHostNetwork === 'true'; - const unityVersion = - rawUnityVersion === 'auto' ? UnityVersionParser.read(projectPath) : rawUnityVersion; + const editorVersion = + unityVersion === 'auto' ? UnityVersionParser.read(projectPath) : unityVersion; // Return sanitised input return { - unityVersion, + editorVersion, customImage, projectPath, customParameters,