diff --git a/dist/index.js b/dist/index.js index 52fee43..1b6528e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -6174,103 +6174,109 @@ function gte(i, y) { function expand(str, max, isTop) { var expansions = []; - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,(?!,).*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str, max, true); + // The `{a},b}` rewrite below restarts expansion on a rewritten string with + // the same `max` and `isTop = true`. Loop instead of recursing so a long run + // of non-expanding `{}` groups can't exhaust the call stack. + for (;;) { + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,(?!,).*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + isTop = true + continue + } + return [str]; } - return [str]; - } - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], max, false).map(embrace); + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); if (n.length === 1) { - var post = m.post.length - ? expand(m.post, max, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], max, false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, max, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } } } - } - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, max, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.max(Math.abs(numeric(n[2])), 1) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y) && N.length < max; i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, max, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.max(Math.abs(numeric(n[2])), 1) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y) && N.length < max; i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } } } + N.push(c); } - N.push(c); + } else { + N = concatMap(n, function(el) { return expand(el, max, false) }); } - } else { - N = concatMap(n, function(el) { return expand(el, max, false) }); - } - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length && expansions.length < max; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length && expansions.length < max; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } } - } - return expansions; + return expansions; + } } @@ -12784,6 +12790,10 @@ const replaceTildes = (comp, options) => { const replaceTilde = (comp, options) => { const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + // if we're including prereleases in the match, then the lower bound is + // -0, the lowest possible prerelease value, just like x-ranges and carets. + // this keeps `~1.2` equivalent to the `1.2.x` x-range it's documented as. + const z = options.includePrerelease ? '-0' : '' return comp.replace(r, (_, M, m, p, pr) => { debug('tilde', comp, _, M, m, p, pr) let ret @@ -12791,10 +12801,10 @@ const replaceTilde = (comp, options) => { if (isX(M)) { ret = '' } else if (isX(m)) { - ret = `>=${M}.0.0 <${+M + 1}.0.0-0` + ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` } else if (isX(p)) { // ~1.2 == >=1.2.0 <1.3.0-0 - ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` + ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` } else if (pr) { debug('replaceTilde pr', pr) ret = `>=${M}.${m}.${p}-${pr @@ -43362,7 +43372,7 @@ exports.w = { /***/ }), -/***/ 8914: +/***/ 9437: /***/ ((__unused_webpack_module, exports) => { var __webpack_unused_export__; @@ -43379,7 +43389,7 @@ exports.w = void 0; exports.w = { instrumenterImplementation: undefined, }; -//# sourceMappingURL=state-cjs.cjs.map +//# sourceMappingURL=state-cjs.js.map /***/ }), @@ -43577,7 +43587,7 @@ module.exports = { version: packageJson.version } /***/ 4012: /***/ ((module) => { -module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"6.1.0","description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","type":"module","main":"lib/cache.js","types":"lib/cache.d.ts","exports":{".":{"types":"./lib/cache.d.ts","import":"./lib/cache.js"}},"directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc && cp src/internal/shared/package-version.cjs lib/internal/shared/"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^3.0.1","@actions/exec":"^3.0.0","@actions/glob":"^0.6.1","@actions/http-client":"^4.0.1","@actions/io":"^3.0.2","@azure/core-rest-pipeline":"^1.23.0","@azure/storage-blob":"^12.31.0","@protobuf-ts/runtime-rpc":"^2.11.1","semver":"^7.7.4"},"devDependencies":{"@protobuf-ts/plugin":"^2.11.1","@types/node":"^25.6.0","@types/semver":"^7.7.1","typescript":"^5.9.3"},"overrides":{"uri-js":"npm:uri-js-replace@^1.0.1","node-fetch":"^3.3.2"}}'); +module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"6.2.0","description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","type":"module","main":"lib/cache.js","types":"lib/cache.d.ts","exports":{".":{"types":"./lib/cache.d.ts","import":"./lib/cache.js"}},"directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc && cp src/internal/shared/package-version.cjs lib/internal/shared/"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^3.0.1","@actions/exec":"^3.0.0","@actions/glob":"^0.6.1","@actions/http-client":"^4.0.1","@actions/io":"^3.0.2","@azure/core-rest-pipeline":"^1.23.0","@azure/storage-blob":"^12.31.0","@protobuf-ts/runtime-rpc":"^2.11.1","semver":"^7.7.4"},"devDependencies":{"@protobuf-ts/plugin":"^2.11.1","@types/node":"^25.6.0","@types/semver":"^7.7.1","typescript":"^5.9.3"},"overrides":{"uri-js":"npm:uri-js-replace@^1.0.1","node-fetch":"^3.3.2"}}'); /***/ }) @@ -47434,15 +47444,270 @@ const originalStringify = JSON.stringify; const originalParse = JSON.parse; const customFormat = /^-?\d+n$/; -const bigIntsStringify = /([\[:])?"(-?\d+)n"($|([\\n]|\s)*(\s|[\\n])*[,\}\]])/g; -const noiseStringify = - /([\[:])?("-?\d+n+)n("$|"([\\n]|\s)*(\s|[\\n])*[,\}\]])/g; +const bigIntsStringify = /([\[:])?"(-?\d+)n"($|\s*[,\}\]])/g; +const noiseStringify = /([\[:])?("-?\d+n+)n("$|"\s*[,\}\]])/g; /** * @typedef {(this: any, key: string | number | undefined, value: any) => any} Replacer * @typedef {(key: string | number | undefined, value: any, context?: { source: string }) => any} Reviver */ +/** + * Checks if a value is unstringifiable according to native JSON.stringify rules. + * + * @param {any} val The value to check. + * @returns {boolean} True if the value is undefined, a function, or a symbol. + */ +const isUnstringifiable = (val) => + val === undefined || typeof val === "function" || typeof val === "symbol"; + +/** + * Checks if a value is a native JSON.rawJSON object (Node.js 22+). + * + * @param {any} val The value to check. + * @returns {boolean} True if the value is a RawJSON instance. + */ +const isRawJSON = (val) => + val !== null && + typeof val === "object" && + val.constructor && + val.constructor.name === "RawJSON"; + +/** + * Iteratively converts a JS value to a JSON string. + * Used as a fallback when the native JSON.stringify hits the Maximum Call Stack size. + * Fully compliant with JSON formatting (space), replacers, and toJSON behaviors. + * + * @param {any} rootValue The value to stringify. + * @param {Replacer | Array | null} [replacer] User's custom replacer function. + * @param {string | number} [spaceParam] Indentation for pretty-printing. + * @returns {string | undefined} The generated JSON string. + */ +const stringifyIteratively = (rootValue, replacer, spaceParam) => { + let space = ""; + + if (typeof spaceParam === "number") { + space = " ".repeat(Math.min(10, Math.max(0, Math.floor(spaceParam)))); + } else if (typeof spaceParam === "string") { + space = spaceParam.slice(0, 10); + } + + const isFunctionReplacer = typeof replacer === "function"; + const propertyList = Array.isArray(replacer) + ? new Set(replacer.map(String)) + : null; + + /** + * Prepares a value for stringification by resolving toJSON, handling BigInts, + * applying custom replacers, and unwrapping primitive objects. + * + * @param {object|Array} parent The parent object or array holding the value. + * @param {string} key The key associated with the value. + * @param {any} val The raw value to process. + * @returns {any} The processed value ready for stringification. + */ + const prepareVal = (parent, key, val) => { + const isObject = val !== null && typeof val === "object"; + const hasToJSON = isObject && typeof val.toJSON === "function"; + + if (hasToJSON) { + val = val.toJSON(key); + } + + const isNoise = typeof val === "string" && noiseValue.test(val); + + if (isNoise) return val + "n"; + + const isBigInt = typeof val === "bigint"; + + if (isBigInt) { + const supportsRawJSON = "rawJSON" in JSON; + + if (supportsRawJSON) return JSON.rawJSON(val.toString()); + + return val.toString() + "n"; + } + + if (isFunctionReplacer) { + val = replacer.call(parent, key, val); + } + + const isPostReplacerObject = val !== null && typeof val === "object"; + + if (isPostReplacerObject) { + const isPrimitiveWrapper = + val instanceof Number || + val instanceof String || + val instanceof Boolean; + + if (isPrimitiveWrapper) { + val = val.valueOf(); + } + } + + return val; + }; + + const rootProcessed = prepareVal({ "": rootValue }, "", rootValue); + + if (isUnstringifiable(rootProcessed)) { + return undefined; + } + + const isRootPrimitive = + rootProcessed === null || typeof rootProcessed !== "object"; + const isRootNativeRawJSON = isRawJSON(rootProcessed); + + if (isRootPrimitive || isRootNativeRawJSON) { + return originalStringify(rootProcessed); + } + + const chunks = []; + let level = 0; + + const stack = [ + { + parent: { "": rootProcessed }, + key: "", + val: rootProcessed, + isArray: Array.isArray(rootProcessed), + keys: Array.isArray(rootProcessed) ? null : Object.keys(rootProcessed), + index: 0, + first: true, + }, + ]; + + const visited = new WeakSet([rootProcessed]); + + while (stack.length > 0) { + const node = stack[stack.length - 1]; + + if (node.index === 0) { + chunks.push(node.isArray ? "[" : "{"); + level++; + } + + let isDone = false; + + if (node.isArray) { + if (node.index < node.val.length) { + if (!node.first) chunks.push(","); + + if (space) chunks.push("\n" + space.repeat(level)); + + const childRaw = node.val[node.index]; + const childVal = prepareVal(node.val, String(node.index), childRaw); + + if (isUnstringifiable(childVal)) { + chunks.push("null"); + node.first = false; + node.index++; + } else { + const isComplexObject = + childVal !== null && typeof childVal === "object"; + const isNativeRaw = isRawJSON(childVal); + + if (isComplexObject && !isNativeRaw) { + if (visited.has(childVal)) { + throw new TypeError("Converting circular structure to JSON"); + } + + visited.add(childVal); + + stack.push({ + parent: node.val, + key: String(node.index), + val: childVal, + isArray: Array.isArray(childVal), + keys: Array.isArray(childVal) ? null : Object.keys(childVal), + index: 0, + first: true, + }); + + node.first = false; + node.index++; + } else { + chunks.push(originalStringify(childVal)); + node.first = false; + node.index++; + } + } + } else { + isDone = true; + } + } else { + while (node.index < node.keys.length) { + const k = node.keys[node.index++]; + + const isFilteredOutByArray = propertyList && !propertyList.has(k); + + if (isFilteredOutByArray) continue; + + const childRaw = node.val[k]; + const childVal = prepareVal(node.val, k, childRaw); + + if (isUnstringifiable(childVal)) continue; + + if (!node.first) chunks.push(","); + + if (space) { + chunks.push("\n" + space.repeat(level) + originalStringify(k) + ": "); + } else { + chunks.push(originalStringify(k) + ":"); + } + + const isComplexObject = + childVal !== null && typeof childVal === "object"; + const isNativeRaw = isRawJSON(childVal); + + if (isComplexObject && !isNativeRaw) { + if (visited.has(childVal)) { + throw new TypeError("Converting circular structure to JSON"); + } + + visited.add(childVal); + + stack.push({ + parent: node.val, + key: k, + val: childVal, + isArray: Array.isArray(childVal), + keys: Array.isArray(childVal) ? null : Object.keys(childVal), + index: 0, + first: true, + }); + + node.first = false; + + break; // Stop current loop level to process the newly pushed stack node + } else { + chunks.push(originalStringify(childVal)); + node.first = false; + } + } + + const isNodeFullyProcessed = + node.index >= node.keys.length && stack[stack.length - 1] === node; + + if (isNodeFullyProcessed) { + isDone = true; + } + } + + if (isDone) { + level--; + + if (!node.first && space) chunks.push("\n" + space.repeat(level)); + + chunks.push(node.isArray ? "]" : "}"); + visited.delete(node.val); + stack.pop(); + } + } + + return chunks.join(""); +}; + /** * Converts a JavaScript value to a JSON string. * @@ -47454,55 +47719,87 @@ const noiseStringify = * * @param {*} value The value to convert to a JSON string. * @param {Replacer | Array | null} [replacer] - * A function that alters the behavior of the stringification process, - * or an array of strings/numbers to indicate properties to exclude. + * A function that alters the behavior of the stringification process, + * or an array of strings/numbers to indicate properties to exclude. * @param {string | number} [space] - * A string or number to specify indentation or pretty-printing. + * A string or number to specify indentation or pretty-printing. * @returns {string} The JSON string representation. */ const JSONStringify = (value, replacer, space) => { - if ("rawJSON" in JSON) { - return originalStringify( + try { + const supportsRawJSON = "rawJSON" in JSON; + + if (supportsRawJSON) { + return originalStringify( + value, + (key, val) => { + if (typeof val === "bigint") return JSON.rawJSON(val.toString()); + + const hasFunctionReplacer = typeof replacer === "function"; + + if (hasFunctionReplacer) return replacer(key, val); + + const isKeyInArrayReplacer = + Array.isArray(replacer) && replacer.includes(key); + + if (isKeyInArrayReplacer) return val; + + return val; + }, + space, + ); + } + + if (!value) return originalStringify(value, replacer, space); + + const convertedToCustomJSON = originalStringify( value, - (key, value) => { - if (typeof value === "bigint") return JSON.rawJSON(value.toString()); + (key, val) => { + const isNoise = typeof val === "string" && noiseValue.test(val); - if (typeof replacer === "function") return replacer(key, value); + if (isNoise) return val.toString() + "n"; // Mark noise values with additional "n" to offset the deletion of one "n" during the processing - if (Array.isArray(replacer) && replacer.includes(key)) return value; + if (typeof val === "bigint") return val.toString() + "n"; - return value; + const hasFunctionReplacer = typeof replacer === "function"; + + if (hasFunctionReplacer) return replacer(key, val); + + const isKeyInArrayReplacer = + Array.isArray(replacer) && replacer.includes(key); + + if (isKeyInArrayReplacer) return val; + + return val; }, space, ); - } - if (!value) return originalStringify(value, replacer, space); + const processedJSON = convertedToCustomJSON.replace( + bigIntsStringify, + "$1$2$3", + ); // Delete one "n" off the end of every BigInt value - const convertedToCustomJSON = originalStringify( - value, - (key, value) => { - const isNoise = typeof value === "string" && noiseValue.test(value); + const denoisedJSON = processedJSON.replace(noiseStringify, "$1$2$3"); // Remove one "n" off the end of every noisy string - if (isNoise) return value.toString() + "n"; // Mark noise values with additional "n" to offset the deletion of one "n" during the processing + return denoisedJSON; + } catch (error) { + if (error instanceof RangeError) { + const convertedJSON = stringifyIteratively(value, replacer, space); - if (typeof value === "bigint") return value.toString() + "n"; + if (convertedJSON === undefined) return undefined; - if (typeof replacer === "function") return replacer(key, value); + const supportsRawJSON = "rawJSON" in JSON; - if (Array.isArray(replacer) && replacer.includes(key)) return value; + if (supportsRawJSON) return convertedJSON; - return value; - }, - space, - ); - const processedJSON = convertedToCustomJSON.replace( - bigIntsStringify, - "$1$2$3", - ); // Delete one "n" off the end of every BigInt value - const denoisedJSON = processedJSON.replace(noiseStringify, "$1$2$3"); // Remove one "n" off the end of every noisy string + const processedJSON = convertedJSON.replace(bigIntsStringify, "$1$2$3"); + + return processedJSON.replace(noiseStringify, "$1$2$3"); + } - return denoisedJSON; + throw error; + } }; const featureCache = new Map(); @@ -47550,12 +47847,15 @@ const isContextSourceSupported = () => { const convertMarkedBigIntsReviver = (key, value, context, userReviver) => { const isCustomFormatBigInt = typeof value === "string" && customFormat.test(value); + if (isCustomFormatBigInt) return BigInt(value.slice(0, -1)); const isNoiseValue = typeof value === "string" && noiseValue.test(value); if (isNoiseValue) return value.slice(0, -1); - if (typeof userReviver !== "function") return value; + const hasUserReviver = typeof userReviver === "function"; + + if (!hasUserReviver) return value; return userReviver(key, value, context); }; @@ -47573,15 +47873,18 @@ const convertMarkedBigIntsReviver = (key, value, context, userReviver) => { */ const JSONParseV2 = (text, reviver) => { return JSON.parse(text, (key, value, context) => { - const isBigNumber = - typeof value === "number" && - (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER); + const isNumber = typeof value === "number"; + const isOutOfBounds = + value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER; + const isBigNumber = isNumber && isOutOfBounds; const isInt = context && intRegex.test(context.source); const isBigInt = isBigNumber && isInt; if (isBigInt) return BigInt(context.source); - if (typeof reviver !== "function") return value; + const hasCustomReviver = typeof reviver === "function"; + + if (!hasCustomReviver) return value; return reviver(key, value, context); }); @@ -47593,6 +47896,105 @@ const stringsOrLargeNumbers = /"(?:\\.|[^"])*"|-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?/g; const noiseValueWithQuotes = /^"-?\d+n+"$/; // Noise - strings that match the custom format before being converted to it +/** + * Iteratively traverses the parsed object bottom-up (post-order), + * emulating the native JSON.parse reviver behavior. + * This avoids Call Stack overflows (RangeError) on deeply nested structures. + * + * @param {any} parsed The natively parsed JSON object. + * @param {Reviver} [userReviver] User's custom reviver function. + * @returns {any} The fully processed object. + */ +const applyReviverIteratively = (parsed, userReviver) => { + const rootHolder = { "": parsed }; + const stack = [{ parent: rootHolder, key: "", visited: false }]; + + while (stack.length > 0) { + const node = stack[stack.length - 1]; + + if (!node.visited) { + node.visited = true; + + const value = node.parent[node.key]; + const isComplexObject = value !== null && typeof value === "object"; + + if (isComplexObject) { + const keys = Object.keys(value); + + for (let i = keys.length - 1; i >= 0; i--) { + stack.push({ parent: value, key: keys[i], visited: false }); + } + } + } else { + const { parent, key } = node; + let value = parent[key]; + + if (typeof value === "string") { + const isCustomFormatBigInt = customFormat.test(value); + + if (isCustomFormatBigInt) { + value = BigInt(value.slice(0, -1)); + } else { + const isNoise = noiseValue.test(value); + + if (isNoise) value = value.slice(0, -1); + } + } + + const hasUserReviver = typeof userReviver === "function"; + + if (hasUserReviver) { + value = userReviver.call(parent, key, value); + } + + const isDeleted = value === undefined; + + if (isDeleted) { + delete parent[key]; + } else { + parent[key] = value; + } + + stack.pop(); + } + } + + return rootHolder[""]; +}; + +/** + * Pre-processes the JSON string to mark large numbers with an 'n' suffix. + * + * @param {string} text The raw JSON string. + * @returns {string} The serialized string with marked BigInts. + */ +const serializeBigInts = (text) => { + return text.replace( + stringsOrLargeNumbers, + (match, digits, fractional, exponential) => { + const isString = match[0] === '"'; + const isNoise = isString && noiseValueWithQuotes.test(match); + + if (isNoise) return match.substring(0, match.length - 1) + 'n"'; // Mark noise values with additional "n" to offset the deletion of one "n" during the processing + + const hasFractionalOrExponential = fractional || exponential; + + // With a fixed number of digits, we can correctly use lexicographical comparison to do a numeric comparison + const isLessThanMaxSafeInt = + digits && + (digits.length < MAX_DIGITS || + (digits.length === MAX_DIGITS && digits <= MAX_INT)); + + const isStandardValue = + isString || hasFractionalOrExponential || isLessThanMaxSafeInt; + + if (isStandardValue) return match; + + return '"' + match + 'n"'; + }, + ); +}; + /** * Converts a JSON string into a JavaScript value. * @@ -47604,42 +48006,34 @@ const noiseValueWithQuotes = /^"-?\d+n+"$/; // Noise - strings that match the cu * * @param {string} text A valid JSON string. * @param {Reviver} [reviver] - * A function that transforms the results. This function is called for each member - * of the object. If a member contains nested objects, the nested objects are - * transformed before the parent object is. + * A function that transforms the results. This function is called for each member + * of the object. If a member contains nested objects, the nested objects are + * transformed before the parent object is. * @returns {any} The parsed JavaScript value. * @throws {SyntaxError} If text is not valid JSON. */ const JSONParse = (text, reviver) => { if (!text) return originalParse(text, reviver); - if (isContextSourceSupported()) return JSONParseV2(text, reviver); // Shortcut to a faster (2x) and simpler version - - // Find and mark big numbers with "n" - const serializedData = text.replace( - stringsOrLargeNumbers, - (text, digits, fractional, exponential) => { - const isString = text[0] === '"'; - const isNoise = isString && noiseValueWithQuotes.test(text); - - if (isNoise) return text.substring(0, text.length - 1) + 'n"'; // Mark noise values with additional "n" to offset the deletion of one "n" during the processing + try { + if (isContextSourceSupported()) return JSONParseV2(text, reviver); // Shortcut to a faster (2x) and simpler version - const isFractionalOrExponential = fractional || exponential; - const isLessThanMaxSafeInt = - digits && - (digits.length < MAX_DIGITS || - (digits.length === MAX_DIGITS && digits <= MAX_INT)); // With a fixed number of digits, we can correctly use lexicographical comparison to do a numeric comparison + // Find and mark big numbers with "n" + const serializedData = serializeBigInts(text); - if (isString || isFractionalOrExponential || isLessThanMaxSafeInt) - return text; + return originalParse(serializedData, (key, value, context) => + convertMarkedBigIntsReviver(key, value, context, reviver), + ); + } catch (error) { + if (error instanceof RangeError) { + const serializedData = serializeBigInts(text); + const parsed = originalParse(serializedData); - return '"' + text + 'n"'; - }, - ); + return applyReviverIteratively(parsed, reviver); + } - return originalParse(serializedData, (key, value, context) => - convertMarkedBigIntsReviver(key, value, context, reviver), - ); + throw error; + } }; @@ -47693,7 +48087,7 @@ class RequestError extends Error { // pkg/dist-src/version.js -var dist_bundle_VERSION = "10.0.10"; +var dist_bundle_VERSION = "10.0.11"; // pkg/dist-src/defaults.js var defaults_default = { @@ -47850,9 +48244,10 @@ function toErrorMessage(data) { if (data instanceof ArrayBuffer) { return "Unknown error"; } - if ("message" in data) { - const suffix = "documentation_url" in data ? ` - ${data.documentation_url}` : ""; - return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` : `${data.message}${suffix}`; + if (typeof data === "object" && data !== null && "message" in data) { + const objectData = data; + const suffix = "documentation_url" in objectData ? ` - ${objectData.documentation_url}` : ""; + return Array.isArray(objectData.errors) ? `${objectData.message}: ${objectData.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` : `${objectData.message}${suffix}`; } return `Unknown error: ${JSON.stringify(data)}`; } @@ -61285,6 +61680,10 @@ const SystemTarPathOnWindows = `${process.env['SYSTEMDRIVE']}\\Windows\\System32 const TarFilename = 'cache.tar'; const ManifestFilename = 'manifest.txt'; const CacheFileSizeLimit = 10 * Math.pow(1024, 3); // 10GiB per repository +// Prefix the cache backend embeds in a read-denial message (v2 twirp +// GetCacheEntryDownloadURL error or the GHES v1 `_apis/artifactcache` 403 body). +// Shared so cache.ts and cacheHttpClient.ts match the same contract value. +const CacheReadDeniedMessagePrefix = 'cache read denied:'; //# sourceMappingURL=constants.js.map ;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/cacheUtils.js var cacheUtils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { @@ -61988,7 +62387,7 @@ function httpHeaders_createHttpHeaders(rawHeaders) { * @returns RFC4122 v4 UUID. */ function randomUUID() { - return crypto.randomUUID(); + return globalThis.crypto.randomUUID(); } //# sourceMappingURL=uuidUtils.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/pipelineRequest.js @@ -62989,7 +63388,7 @@ function logPolicy_logPolicy(options = {}) { logger(`Request: ${sanitizer.sanitize(request)}`); const response = await next(request); logger(`Response status code: ${response.status}`); - logger(`Headers: ${sanitizer.sanitize(response.headers)}`); + logger(`Headers: ${sanitizer.sanitize({ headers: response.headers })}`); return response; }, }; @@ -63094,7 +63493,7 @@ function userAgentPolicy_userAgentPolicy(options = {}) { * @param min - The smallest integer value allowed. * @param max - The largest integer value allowed. */ -function random_getRandomIntegerInclusive(min, max) { +function getRandomIntegerInclusive(min, max) { // Make sure inputs are integers. min = Math.ceil(min); max = Math.floor(max); @@ -63122,7 +63521,7 @@ function delay_calculateRetryDelay(retryAttempt, config) { const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay); // Allow the final value to have some "jitter" (within 50% of the delay size) so // that retries across multiple clients don't occur simultaneously. - const retryAfterInMs = clampedDelay / 2 + random_getRandomIntegerInclusive(0, clampedDelay / 2); + const retryAfterInMs = clampedDelay / 2 + getRandomIntegerInclusive(0, clampedDelay / 2); return { retryAfterInMs }; } //# sourceMappingURL=delay.js.map @@ -63327,7 +63726,7 @@ function isSystemError(err) { ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/constants.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -const constants_SDK_VERSION = "0.3.6"; +const constants_SDK_VERSION = "0.3.7"; const constants_DEFAULT_RETRY_POLICY_COUNT = 3; //# sourceMappingURL=constants.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/retryPolicy.js @@ -65118,7 +65517,7 @@ async function util_userAgentPlatform_setPlatformSpecificData(map) { ;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/constants.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -const esm_constants_SDK_VERSION = "1.24.0"; +const esm_constants_SDK_VERSION = "1.25.0"; const esm_constants_DEFAULT_RETRY_POLICY_COUNT = 3; //# sourceMappingURL=constants.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/util/userAgent.js @@ -65441,20 +65840,30 @@ async function computeSha256Hash(content, encoding) { //# sourceMappingURL=internal.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist/esm/AbortError.js // Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. +// Licensed under the MIT License. /** * This error is thrown when an asynchronous operation has been aborted. * Check for this error by testing the `name` that the name property of the * error matches `"AbortError"`. * * @example - * ```ts + * ```ts snippet:AbortErrorSample + * import { AbortError } from "@azure/abort-controller"; + * + * async function doAsyncWork(options: { abortSignal: AbortSignal }): Promise { + * if (options.abortSignal.aborted) { + * throw new AbortError(); + * } + * + * // do async work + * } + * * const controller = new AbortController(); * controller.abort(); * try { - * doAsyncWork(controller.signal) + * doAsyncWork({ abortSignal: controller.signal }); * } catch (e) { - * if (e.name === 'AbortError') { + * if (e instanceof Error && e.name === "AbortError") { * // handle abort error here. * } * } @@ -65469,7 +65878,7 @@ class esm_AbortError_AbortError extends Error { //# sourceMappingURL=AbortError.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/abort-controller/dist/esm/index.js // Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. +// Licensed under the MIT License. //# sourceMappingURL=index.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/createAbortablePromise.js @@ -65519,7 +65928,6 @@ function createAbortablePromise(buildPromise, options) { // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. - const delay_StandardAbortMessage = "The delay was aborted."; /** * A wrapper for setTimeout that resolves a promise after timeInMs milliseconds. @@ -65538,22 +65946,6 @@ function delay_delay(timeInMs, options) { abortErrorMsg: abortErrorMsg ?? delay_StandardAbortMessage, }); } -/** - * Calculates the delay interval for retry attempts using exponential delay with jitter. - * @param retryAttempt - The current retry attempt number. - * @param config - The exponential retry configuration. - * @returns An object containing the calculated retry delay. - */ -function esm_delay_calculateRetryDelay(retryAttempt, config) { - // Exponentially increase the delay each time - const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt); - // Don't let the delay exceed the maximum - const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay); - // Allow the final value to have some "jitter" (within 50% of the delay size) so - // that retries across multiple clients don't occur simultaneously. - const retryAfterInMs = clampedDelay / 2 + getRandomIntegerInclusive(0, clampedDelay / 2); - return { retryAfterInMs }; -} //# sourceMappingURL=delay.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-util/dist/esm/error.js // Copyright (c) Microsoft Corporation. @@ -65851,8 +66243,8 @@ class TracingContextImpl { } } //# sourceMappingURL=tracingContext.js.map -// EXTERNAL MODULE: ./node_modules/@azure/core-tracing/dist/commonjs/state.js -var commonjs_state = __nccwpck_require__(8914); +// EXTERNAL MODULE: ./node_modules/@azure/core-tracing/dist/commonjs/state-cjs.js +var state_cjs = __nccwpck_require__(9437); ;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/state.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. @@ -65862,7 +66254,7 @@ var commonjs_state = __nccwpck_require__(8914); /** * Defines the shared state between CJS and ESM by re-exporting the CJS state. */ -const state_state = commonjs_state/* state */.w; +const state_state = state_cjs/* state */.w; //# sourceMappingURL=state.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-tracing/dist/esm/instrumenter.js // Copyright (c) Microsoft Corporation. @@ -65944,8 +66336,8 @@ function createTracingClient(options) { function startSpan(name, operationOptions, spanOptions) { const startSpanResult = getInstrumenter().startSpan(name, { ...spanOptions, - packageName: packageName, - packageVersion: packageVersion, + packageName, + packageVersion, tracingContext: operationOptions?.tracingOptions?.tracingContext, }); let tracingContext = startSpanResult.tracingContext; @@ -65965,7 +66357,7 @@ function createTracingClient(options) { async function withSpan(name, operationOptions, callback, spanOptions) { const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions); try { - const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => Promise.resolve(callback(updatedOptions, span))); + const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => callback(updatedOptions, span)); span.setStatus({ status: "success" }); return result; } @@ -67042,22 +67434,6 @@ function isSASCredential(credential) { ;// CONCATENATED MODULE: ./node_modules/@azure/core-auth/dist/esm/tokenCredential.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -/** - * @internal - * @param accessToken - Access token - * @returns Whether a token is bearer type or not - */ -function isBearerToken(accessToken) { - return !accessToken.tokenType || accessToken.tokenType === "Bearer"; -} -/** - * @internal - * @param accessToken - Access token - * @returns Whether a token is Pop token or not - */ -function isPopToken(accessToken) { - return accessToken.tokenType === "pop"; -} /** * Tests an object to determine whether it implements TokenCredential. * @@ -67089,7 +67465,7 @@ const disableKeepAlivePolicyName = "DisableKeepAlivePolicy"; function createDisableKeepAlivePolicy() { return { name: disableKeepAlivePolicyName, - async sendRequest(request, next) { + sendRequest(request, next) { request.disableKeepAlive = true; return next(request); }, @@ -68224,7 +68600,7 @@ const MapperTypeNames = { }; //# sourceMappingURL=serializer.js.map // EXTERNAL MODULE: ./node_modules/@azure/core-client/dist/commonjs/state-cjs.js -var state_cjs = __nccwpck_require__(30); +var commonjs_state_cjs = __nccwpck_require__(30); ;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/state.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. @@ -68234,7 +68610,7 @@ var state_cjs = __nccwpck_require__(30); /** * Defines the shared state between CJS and ESM by re-exporting the CJS state. */ -const esm_state_state = state_cjs/* state */.w; +const esm_state_state = commonjs_state_cjs/* state */.w; //# sourceMappingURL=state.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-client/dist/esm/operationHelpers.js // Copyright (c) Microsoft Corporation. @@ -69423,6 +69799,22 @@ const util_originalRequestSymbol = Symbol("Original PipelineRequest"); // cloned but we need to retrieve the OperationSpec and OperationArguments from the // original request. const originalClientRequestSymbol = Symbol.for("@azure/core-client original request"); +const passThroughProps = new Set([ + "url", + "method", + "withCredentials", + "timeout", + "requestId", + "abortSignal", + "body", + "formData", + "onDownloadProgress", + "onUploadProgress", + "proxySettings", + "streamResponseStatusCodes", + "agent", + "requestOverrides", +]); function toPipelineRequest(webResource, options = {}) { const compatWebResource = webResource; const request = compatWebResource[util_originalRequestSymbol]; @@ -69506,23 +69898,7 @@ function toWebResourceLike(request, options) { if (prop === "keepAlive") { request.disableKeepAlive = !value; } - const passThroughProps = [ - "url", - "method", - "withCredentials", - "timeout", - "requestId", - "abortSignal", - "body", - "formData", - "onDownloadProgress", - "onUploadProgress", - "proxySettings", - "streamResponseStatusCodes", - "agent", - "requestOverrides", - ]; - if (typeof prop === "string" && passThroughProps.includes(prop)) { + if (typeof prop === "string" && passThroughProps.has(prop)) { request[prop] = value; } return Reflect.set(target, prop, value, receiver); @@ -70193,6 +70569,26 @@ class MatcherView { return current.values !== undefined && attrName in current.values; } + /** + * Get the value of a "kept" attribute from the nearest ancestor (or + * current node) that declared it via `push(tag, attrs, ns, { keep: [...] })`. + * @param {string} attrName + * @returns {*} + */ + getAnyParentAttr(attrName) { + return this._matcher.getAnyParentAttr(attrName); + } + + /** + * Check whether any ancestor (or the current node) kept the given + * attribute via `push(tag, attrs, ns, { keep: [...] })`. + * @param {string} attrName + * @returns {boolean} + */ + hasAnyParentAttr(attrName) { + return this._matcher.hasAnyParentAttr(attrName); + } + /** * Get current node's sibling position (child index in parent). * @returns {number} @@ -70301,6 +70697,9 @@ class Matcher { // Each siblingStacks entry: Map tracking occurrences at each level this._pathStringCache = null; this._view = new MatcherView(this); + + // Kept-attribute stack: only populated when push() is called with options.keep. + this._keptAttrs = []; } /** @@ -70308,8 +70707,10 @@ class Matcher { * @param {string} tagName * @param {Object|null} [attrValues=null] * @param {string|null} [namespace=null] + * @param {Object|null} [options=null] + * @param {string[]} [options.keep] - Names of attributes (from attrValues) */ - push(tagName, attrValues = null, namespace = null) { + push(tagName, attrValues = null, namespace = null, options = null) { this._pathStringCache = null; // Remove values from previous current node (now becoming ancestor) @@ -70319,26 +70720,29 @@ class Matcher { // Get or create sibling tracking for current level const currentLevel = this.path.length; - if (!this.siblingStacks[currentLevel]) { - this.siblingStacks[currentLevel] = new Map(); + let level = this.siblingStacks[currentLevel]; + if (!level) { + // `counts` tells same-name siblings apart (the "counter" — nth + // among other s). `total` is every child seen at this level so + // far, kept as a running number instead of re-added from `counts` on + // every push — a parent with many differently-named children would + // otherwise cost more per child the more distinct names it has. + level = { counts: new Map(), total: 0 }; + this.siblingStacks[currentLevel] = level; } - const siblings = this.siblingStacks[currentLevel]; - // Create a unique key for sibling tracking that includes namespace const siblingKey = namespace ? `${namespace}:${tagName}` : tagName; // Calculate counter (how many times this tag appeared at this level) - const counter = siblings.get(siblingKey) || 0; + const counter = level.counts.get(siblingKey) || 0; - // Calculate position (total children at this level so far) - let position = 0; - for (const count of siblings.values()) { - position += count; - } + // Position = total children at this level seen before this one. + const position = level.total; - // Update sibling count for this tag - siblings.set(siblingKey, counter + 1); + // Update sibling count for this tag, and the level's running total. + level.counts.set(siblingKey, counter + 1); + level.total++; // Create new node const node = { @@ -70356,6 +70760,24 @@ class Matcher { } this.path.push(node); + + // Depth of the node we just pushed (1-based, matches this.path.length) + const depth = this.path.length; + + // Copy only the requested attributes into the kept-attrs stack. This is + // the one part of push() whose cost scales with input (O(keep.length)) + // rather than being O(1) — by design, since the caller is explicitly + // opting in for specific attribute names. No options/keep => zero added + // cost beyond the two property reads below. + const keep = options !== null ? options.keep : null; + if (keep !== null && keep !== undefined && keep.length > 0 && attrValues) { + for (let i = 0; i < keep.length; i++) { + const name = keep[i]; + if (attrValues[name] !== undefined) { + this._keptAttrs.push({ depth, name, value: attrValues[name] }); + } + } + } } /** @@ -70372,6 +70794,18 @@ class Matcher { this.siblingStacks.length = this.path.length + 1; } + // Drop any kept attributes that belonged to the popped node (or deeper). + // _keptAttrs is depth-ordered (push only ever appends increasing depths), + // so this is a backward scan that stops at the first surviving entry — + // typically O(1) since kept attrs are rare by design. + const poppedDepth = this.path.length + 1; + while ( + this._keptAttrs.length > 0 && + this._keptAttrs[this._keptAttrs.length - 1].depth >= poppedDepth + ) { + this._keptAttrs.pop(); + } + return node; } @@ -70426,6 +70860,38 @@ class Matcher { return current.values !== undefined && attrName in current.values; } + /** + * Get the value of a "kept" attribute from the nearest ancestor (or + * current node) that declared it via `push(tag, attrs, ns, { keep: [...] })`. + * Unlike getAttrValue(), this works regardless of how deep the path has + * gone since the attribute was pushed — but only for attribute names that + * were explicitly marked with `keep` at push time. Cost is proportional to + * the number of currently-kept attributes (typically 0-3), not path depth. + * @param {string} attrName + * @returns {*} the value, or undefined if no ancestor kept this attribute + */ + getAnyParentAttr(attrName) { + const kept = this._keptAttrs; + for (let i = kept.length - 1; i >= 0; i--) { + if (kept[i].name === attrName) return kept[i].value; + } + return undefined; + } + + /** + * Check whether any ancestor (or the current node) kept the given + * attribute via `push(tag, attrs, ns, { keep: [...] })`. + * @param {string} attrName + * @returns {boolean} + */ + hasAnyParentAttr(attrName) { + const kept = this._keptAttrs; + for (let i = kept.length - 1; i >= 0; i--) { + if (kept[i].name === attrName) return true; + } + return false; + } + /** * Get current node's sibling position (child index in parent). * @returns {number} @@ -70502,6 +70968,7 @@ class Matcher { this._pathStringCache = null; this.path = []; this.siblingStacks = []; + this._keptAttrs = []; } /** @@ -70651,7 +71118,8 @@ class Matcher { snapshot() { return { path: this.path.map(node => ({ ...node })), - siblingStacks: this.siblingStacks.map(map => new Map(map)) + siblingStacks: this.siblingStacks.map(level => level ? { counts: new Map(level.counts), total: level.total } : level), + keptAttrs: this._keptAttrs.map(entry => ({ ...entry })) }; } @@ -70662,7 +71130,8 @@ class Matcher { restore(snapshot) { this._pathStringCache = null; this.path = snapshot.path.map(node => ({ ...node })); - this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map)); + this.siblingStacks = snapshot.siblingStacks.map(level => level ? { counts: new Map(level.counts), total: level.total } : level); + this._keptAttrs = (snapshot.keptAttrs || []).map(entry => ({ ...entry })); } /** @@ -70685,6 +71154,7 @@ class Matcher { return this._view; } } + ;// CONCATENATED MODULE: ./node_modules/fast-xml-builder/src/util.js @@ -70815,8 +71285,36 @@ const buildRegexes = (startChar, char, flags = '') => { const regexes10 = buildRegexes(nameStartChar10, nameChar10); // no /u — BMP only const regexes11 = buildRegexes(nameStartChar11, nameChar11, 'u'); // /u — enables \u{10000}-\u{EFFFF} -const getRegexes = (xmlVersion = '1.0') => - xmlVersion === '1.1' ? regexes11 : regexes10; +// --------------------------------------------------------------------------- +// ASCII-only fast path (opt-in, off by default) +// +// The XML 1.0 vs 1.1 NameStartChar/NameChar productions differ *only* in +// their non-ASCII ranges (merged vs split Latin-1 ranges, \u0487, and +// supplementary planes). Restricted to ASCII, both versions collapse to the +// same character classes, so a single regex pair covers both xmlVersion +// values — no /u flag needed. +// +// Rationale: unicode-aware regexes (the /u flag, required for XML 1.1's +// supplementary-plane range) are measurably slower in V8 than plain +// non-unicode regexes on the same input, even when the input is pure ASCII. +// For the common case — HTML/SVG ids, XML tags — names are ASCII, so callers +// who know this can opt in to skip the unicode-aware matching path entirely. +// This is a real but *conditional* win: mainly for XML 1.1 input (avoids /u), +// or at scale where the larger unicode character classes add engine +// overhead. It also changes behaviour (rejects legitimate non-ASCII XML +// 1.0/1.1 names), so it must never be silently enabled — hence off by +// default. +// --------------------------------------------------------------------------- + +const nameStartCharAscii = ':A-Za-z_'; +const nameCharAscii = nameStartCharAscii + '\\-\\.\\d'; + +const regexesAscii = buildRegexes(nameStartCharAscii, nameCharAscii); // no /u — ASCII only + +const getRegexes = (xmlVersion = '1.0', asciiOnly = false) => { + if (asciiOnly) return regexesAscii; + return xmlVersion === '1.1' ? regexes11 : regexes10; +}; // --------------------------------------------------------------------------- // Boolean validators @@ -70826,57 +71324,131 @@ const getRegexes = (xmlVersion = '1.0') => * Returns true if the string is a valid XML Name. * Colons are allowed anywhere (Name production). * Used for: DOCTYPE entity names, notation names, DTD element declarations. + * + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] + * asciiOnly: skip unicode-aware matching, ASCII names only (default false). */ -const src_name = (str, { xmlVersion = '1.0' } = {}) => - getRegexes(xmlVersion).name.test(str); +const src_name = (str, { xmlVersion = '1.0', asciiOnly = false } = {}) => + getRegexes(xmlVersion, asciiOnly).name.test(str); /** * Returns true if the string is a valid NCName (Non-Colonized Name). * Colons are not permitted. * Used for: namespace prefixes, local names, SVG id attributes. + * + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] + * asciiOnly: skip unicode-aware matching, ASCII names only (default false). */ -const ncName = (str, { xmlVersion = '1.0' } = {}) => - getRegexes(xmlVersion).ncName.test(str); +const ncName = (str, { xmlVersion = '1.0', asciiOnly = false } = {}) => + getRegexes(xmlVersion, asciiOnly).ncName.test(str); /** * Returns true if the string is a valid QName (Qualified Name). * Allows exactly one colon as a prefix separator: prefix:localName. * Used for: element and attribute names in namespace-aware XML/SVG. + * + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] + * asciiOnly: skip unicode-aware matching, ASCII names only (default false). */ -const qName = (str, { xmlVersion = '1.0' } = {}) => - getRegexes(xmlVersion).qName.test(str); +const qName = (str, { xmlVersion = '1.0', asciiOnly = false } = {}) => + getRegexes(xmlVersion, asciiOnly).qName.test(str); /** * Returns true if the string is a valid NMToken. * Like Name but no restriction on the first character. * Used for: DTD NMTOKEN attribute values. + * + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] + * asciiOnly: skip unicode-aware matching, ASCII names only (default false). */ -const nmToken = (str, { xmlVersion = '1.0' } = {}) => - getRegexes(xmlVersion).nmToken.test(str); +const nmToken = (str, { xmlVersion = '1.0', asciiOnly = false } = {}) => + getRegexes(xmlVersion, asciiOnly).nmToken.test(str); /** * Returns true if the string is a valid NMTokens value. * A whitespace-separated list of NMToken values. * Used for: DTD NMTOKENS attribute values. + * + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] + * asciiOnly: skip unicode-aware matching, ASCII names only (default false). */ -const nmTokens = (str, { xmlVersion = '1.0' } = {}) => - getRegexes(xmlVersion).nmTokens.test(str); +const nmTokens = (str, { xmlVersion = '1.0', asciiOnly = false } = {}) => + getRegexes(xmlVersion, asciiOnly).nmTokens.test(str); // --------------------------------------------------------------------------- -// Diagnostic validator +// Memoized validator factory +// +// Real documents reuse a small vocabulary of tag/attribute names across many +// siblings (e.g. `id`, `class`, `href` repeated across hundreds of elements). +// The plain boolean validators above re-run the regex on every call +// regardless of repeats. `createValidator` returns a closure with a private +// string -> boolean cache, so repeated names after the first become O(1) +// lookups instead of regex tests. +// +// - opts (xmlVersion, asciiOnly) are fixed at creation time, so the regex is +// resolved once, not on every call. +// - The cache is private to the returned closure — no shared/global state, +// no cross-caller pollution. +// - `maxCacheSize` bounds memory: once the cache reaches this many entries, +// it stops accepting new ones (existing entries keep serving hits; new +// misses just fall through to the regex, uncached). This avoids unbounded +// growth against adversarial/high-cardinality input (e.g. validating +// attacker-supplied names with no repeats) without the cost/complexity of +// a full LRU, and without the perf cliff of reset-and-refill thrashing. +// - Call `.reset()` on the returned function to clear the cache manually +// (e.g. between unrelated parse calls). // --------------------------------------------------------------------------- -const PRODUCTIONS = (/* unused pure expression or super */ null && (['name', 'ncName', 'qName', 'nmToken', 'nmTokens'])); +const PRODUCTIONS = ['name', 'ncName', 'qName', 'nmToken', 'nmTokens']; + +/** + * Returns a memoized boolean validator function for a single production, + * with opts fixed at creation time. + * + * @param {'name'|'ncName'|'qName'|'nmToken'|'nmTokens'} production + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean, maxCacheSize?: number }} [opts] + * maxCacheSize: max number of distinct strings to cache (default 2048). + * Once reached, new strings are validated but not cached; existing cached + * entries keep being served. + * @returns {((str: string) => boolean) & { reset: () => void }} + */ +const createValidator = (production, { xmlVersion = '1.0', asciiOnly = false, maxCacheSize = 2048 } = {}) => { + if (!PRODUCTIONS.includes(production)) { + throw new TypeError( + `Unknown production "${production}". Must be one of: ${PRODUCTIONS.join(', ')}` + ); + } + + const regex = getRegexes(xmlVersion, asciiOnly)[production]; + let cache = new Map(); + + const validator = (str) => { + const cached = cache.get(str); + if (cached !== undefined) return cached; + + const result = regex.test(str); + if (cache.size < maxCacheSize) cache.set(str, result); + return result; + }; + + validator.reset = () => { cache = new Map(); }; + + return validator; +}; + +// --------------------------------------------------------------------------- +// Diagnostic validator +// --------------------------------------------------------------------------- /** * Validates a string against a named production and returns a detailed result. * * @param {string} str * @param {'name'|'ncName'|'qName'|'nmToken'|'nmTokens'} production - * @param {{ xmlVersion?: '1.0'|'1.1' }} [opts] + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] * @returns {{ valid: boolean, production: string, input: string, reason?: string, position?: number }} */ -const validate = (str, production, { xmlVersion = '1.0' } = {}) => { +const validate = (str, production, { xmlVersion = '1.0', asciiOnly = false } = {}) => { if (!PRODUCTIONS.includes(production)) { throw new TypeError( `Unknown production "${production}". Must be one of: ${PRODUCTIONS.join(', ')}` @@ -70884,13 +71456,20 @@ const validate = (str, production, { xmlVersion = '1.0' } = {}) => { } const validators = { name: src_name, ncName, qName, nmToken, nmTokens }; - const isValid = validators[production](str, { xmlVersion }); + const isValid = validators[production](str, { xmlVersion, asciiOnly }); if (isValid) return { valid: true, production, input: str }; let reason = 'Does not match the production rules'; let position; + // Diagnostic fallback char checks must mirror the same character set the + // boolean validator above used, or the reported reason/position could + // contradict the `valid: false` result (e.g. flagging a char as illegal + // that the unicode-aware check would have accepted). + const startCharPattern = asciiOnly ? /^[:A-Za-z_]/ : /^[:A-Za-z_\u00C0-\uFFFD]/; + const namePattern = asciiOnly ? /[\w\-\\.:]/ : /[\w\-\\.:\u00B7\u00C0-\uFFFD]/; + if (str.length === 0) { reason = 'Input is empty'; } else if (production === 'ncName' && str.includes(':')) { @@ -70907,13 +71486,13 @@ const validate = (str, production, { xmlVersion = '1.0' } = {}) => { position = str.lastIndexOf(':'); } else if ( ['name', 'ncName', 'qName'].includes(production) && - !/^[:A-Za-z_\u00C0-\uFFFD]/.test(str[0]) + !startCharPattern.test(str[0]) ) { reason = `First character "${str[0]}" is not a valid NameStartChar`; position = 0; } else { for (let i = 0; i < str.length; i++) { - if (!/[\w\-\\.:\u00B7\u00C0-\uFFFD]/.test(str[i])) { + if (!namePattern.test(str[i])) { reason = `Character "${str[i]}" at position ${i} is not a valid NameChar`; position = i; break; @@ -70933,7 +71512,7 @@ const validate = (str, production, { xmlVersion = '1.0' } = {}) => { * * @param {string[]} strings * @param {'name'|'ncName'|'qName'|'nmToken'|'nmTokens'} production - * @param {{ xmlVersion?: '1.0'|'1.1' }} [opts] + * @param {{ xmlVersion?: '1.0'|'1.1', asciiOnly?: boolean }} [opts] * @returns {Array<{ valid: boolean, production: string, input: string, reason?: string, position?: number }>} */ const validateAll = (strings, production, opts = {}) => @@ -70948,10 +71527,12 @@ const validateAll = (strings, production, opts = {}) => * * @param {string} str * @param {'name'|'ncName'|'qName'|'nmToken'|'nmTokens'} production - * @param {{ replacement?: string }} [opts] + * @param {{ replacement?: string, asciiOnly?: boolean }} [opts] + * asciiOnly: also replace any non-ASCII character, not just XML-illegal + * ones (default false). * @returns {string} */ -const sanitize = (str, production = 'name', { replacement = '_' } = {}) => { +const sanitize = (str, production = 'name', { replacement = '_', asciiOnly = false } = {}) => { if (!str) return replacement; let result = str; @@ -70962,7 +71543,8 @@ const sanitize = (str, production = 'name', { replacement = '_' } = {}) => { } // Replace illegal characters - result = result.replace(/[^\w\-\.:\u00B7\u00C0-\uFFFD]/g, replacement); + const allowedCharPattern = asciiOnly ? /[^\w\-\.:]/g : /[^\w\-\.:\u00B7\u00C0-\uFFFD]/g; + result = result.replace(allowedCharPattern, replacement); // Fix invalid start character for Name / NCName / QName if (production !== 'nmToken' && production !== 'nmTokens') { @@ -71012,11 +71594,11 @@ function detectXmlVersionFromArray(jArray, options) { * @param {boolean} isAttribute - true when resolving an attribute name * @param {object} options * @param {Matcher} matcher - current matcher state (readonly from callback perspective) - * @param {string} xmlVersion - '1.0' or '1.1', forwarded to xml-naming + * @param {function} qNameValidator - function to validate tag names */ -function resolveTagName(name, isAttribute, options, matcher, xmlVersion) { +function resolveTagName(name, isAttribute, options, matcher, qNameValidator) { if (!options.sanitizeName) return name; - if (qName(name, { xmlVersion })) return name; + if (qNameValidator(name)) return name; return options.sanitizeName(name, { isAttribute, matcher: matcher.readOnly() }); } @@ -71046,14 +71628,14 @@ function toXml(jArray, options) { // Detect XML version for use in name validation const xmlVersion = detectXmlVersionFromArray(jArray, options); - + const qNameValidator = createValidator('qName', { xmlVersion }); // Initialize matcher for path tracking const matcher = new Matcher(); - return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions, xmlVersion); + return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions, qNameValidator); } -function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, xmlVersion) { +function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, qNameValidator) { let xmlStr = ""; let isPreviousElementTag = false; @@ -71086,7 +71668,7 @@ function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, xmlVe // Resolve tag name (may transform it; may throw for invalid names) const tagName = isSpecialName ? rawTagName - : resolveTagName(rawTagName, false, options, matcher, xmlVersion); + : resolveTagName(rawTagName, false, options, matcher, qNameValidator); // Extract attributes from ":@" property const attrValues = extractAttributeValues(tagObj[":@"], options); @@ -71128,7 +71710,7 @@ function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, xmlVe matcher.pop(); continue; } else if (tagName[0] === "?") { - const attStr = attr_to_str(tagObj[":@"], options, isStopNode, matcher, xmlVersion); + const attStr = attr_to_str(tagObj[":@"], options, isStopNode, matcher, qNameValidator); const tempInd = tagName === "?xml" ? "" : indentation; // Text node content on PI/XML declaration tags is intentionally ignored. // Only attributes are valid on these tags per the XML spec. @@ -71144,7 +71726,7 @@ function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, xmlVe } // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes - const attStr = attr_to_str(tagObj[":@"], options, isStopNode, matcher, xmlVersion); + const attStr = attr_to_str(tagObj[":@"], options, isStopNode, matcher, qNameValidator); const tagStart = indentation + `<${tagName}${attStr}`; // If this is a stopNode, get raw content without processing @@ -71152,7 +71734,7 @@ function arrToStr(arr, options, indentation, matcher, stopNodeExpressions, xmlVe if (isStopNode) { tagValue = orderedJs2Xml_getRawContent(tagObj[rawTagName], options); } else { - tagValue = arrToStr(tagObj[rawTagName], options, newIdentation, matcher, stopNodeExpressions, xmlVersion); + tagValue = arrToStr(tagObj[rawTagName], options, newIdentation, matcher, stopNodeExpressions, qNameValidator); } if (options.unpairedTags.indexOf(tagName) !== -1) { @@ -71281,7 +71863,7 @@ function propName(obj) { * Build attribute string, resolving attribute names through sanitizeName when configured. * Accepts matcher so the callback has path context. */ -function attr_to_str(attrMap, options, isStopNode, matcher, xmlVersion) { +function attr_to_str(attrMap, options, isStopNode, matcher, qNameValidator) { let attrStr = ""; if (attrMap && !options.ignoreAttributes) { for (let attr in attrMap) { @@ -71291,7 +71873,7 @@ function attr_to_str(attrMap, options, isStopNode, matcher, xmlVersion) { const cleanAttrName = attr.substr(options.attributeNamePrefix.length); const resolvedAttrName = isStopNode ? cleanAttrName // stopNodes are raw — skip sanitizeName for attr names too - : resolveTagName(cleanAttrName, true, options, matcher, xmlVersion); + : resolveTagName(cleanAttrName, true, options, matcher, qNameValidator); let attrVal; if (isStopNode) { @@ -71485,11 +72067,11 @@ function detectXmlVersionFromObj(jObj, options) { * @param {boolean} isAttribute - true when resolving an attribute name * @param {object} options * @param {Matcher} matcher - current matcher state (readonly from callback perspective) - * @param {string} xmlVersion - '1.0' or '1.1', forwarded to xml-naming + * @param {function} qNameValidator - function to validate tag names */ -function fxb_resolveTagName(name, isAttribute, options, matcher, xmlVersion) { +function fxb_resolveTagName(name, isAttribute, options, matcher, qNameValidator) { if (!options.sanitizeName) return name; - if (qName(name, { xmlVersion })) return name; + if (qNameValidator(name)) return name; return options.sanitizeName(name, { isAttribute, matcher: matcher.readOnly() }); } @@ -71505,11 +72087,12 @@ Builder.prototype.build = function (jObj) { // Initialize matcher for path tracking const matcher = new Matcher(); const xmlVersion = detectXmlVersionFromObj(jObj, this.options); - return this.j2x(jObj, 0, matcher, xmlVersion).val; + const qNameValidator = createValidator('qName', { xmlVersion }); + return this.j2x(jObj, 0, matcher, qNameValidator).val; } }; -Builder.prototype.j2x = function (jObj, level, matcher, xmlVersion) { +Builder.prototype.j2x = function (jObj, level, matcher, qNameValidator) { let attrStr = ''; let val = ''; if (this.options.maxNestedTags && matcher.getDepth() >= this.options.maxNestedTags) { @@ -71537,7 +72120,7 @@ Builder.prototype.j2x = function (jObj, level, matcher, xmlVersion) { const resolvedKey = isSpecialKey ? key - : fxb_resolveTagName(key, false, this.options, matcher, xmlVersion); + : fxb_resolveTagName(key, false, this.options, matcher, qNameValidator); if (typeof jObj[key] === 'undefined') { // supress undefined node only if it is not an attribute @@ -71562,7 +72145,7 @@ Builder.prototype.j2x = function (jObj, level, matcher, xmlVersion) { const attr = this.isAttribute(key); if (attr && !this.ignoreAttributesFn(attr, jPath)) { // Resolve the attribute name through sanitizeName - const resolvedAttr = fxb_resolveTagName(attr, true, this.options, matcher, xmlVersion); + const resolvedAttr = fxb_resolveTagName(attr, true, this.options, matcher, qNameValidator); attrStr += this.buildAttrPairStr(resolvedAttr, '' + jObj[key], isCurrentStopNode); } else if (!attr) { //tag value @@ -71604,7 +72187,7 @@ Builder.prototype.j2x = function (jObj, level, matcher, xmlVersion) { if (this.options.oneListGroup) { // Push tag to matcher before recursive call matcher.push(resolvedKey); - const result = this.j2x(item, level + 1, matcher, xmlVersion); + const result = this.j2x(item, level + 1, matcher, qNameValidator); // Pop tag from matcher after recursive call matcher.pop(); @@ -71613,7 +72196,7 @@ Builder.prototype.j2x = function (jObj, level, matcher, xmlVersion) { listTagAttr += result.attrStr } } else { - listTagVal += this.processTextOrObjNode(item, resolvedKey, level, matcher, xmlVersion) + listTagVal += this.processTextOrObjNode(item, resolvedKey, level, matcher, qNameValidator) } } else { if (this.options.oneListGroup) { @@ -71651,11 +72234,11 @@ Builder.prototype.j2x = function (jObj, level, matcher, xmlVersion) { const L = Ks.length; for (let j = 0; j < L; j++) { // Resolve attribute names inside attributesGroupName - const resolvedAttr = fxb_resolveTagName(Ks[j], true, this.options, matcher, xmlVersion); + const resolvedAttr = fxb_resolveTagName(Ks[j], true, this.options, matcher, qNameValidator); attrStr += this.buildAttrPairStr(resolvedAttr, '' + jObj[key][Ks[j]], isCurrentStopNode); } } else { - val += this.processTextOrObjNode(jObj[key], resolvedKey, level, matcher, xmlVersion) + val += this.processTextOrObjNode(jObj[key], resolvedKey, level, matcher, qNameValidator) } } } @@ -71672,7 +72255,7 @@ Builder.prototype.buildAttrPairStr = function (attrName, val, isStopNode) { } else return ' ' + attrName + '="' + escapeAttribute(val) + '"'; } -function processTextOrObjNode(object, key, level, matcher, xmlVersion) { +function processTextOrObjNode(object, key, level, matcher, qNameValidator) { // Extract attributes to pass to matcher const attrValues = this.extractAttributes(object); @@ -71690,7 +72273,7 @@ function processTextOrObjNode(object, key, level, matcher, xmlVersion) { return this.buildObjectNode(rawContent, key, attrStr, level); } - const result = this.j2x(object, level + 1, matcher, xmlVersion); + const result = this.j2x(object, level + 1, matcher, qNameValidator); // Pop tag from matcher after recursion matcher.pop(); @@ -71819,7 +72402,9 @@ Builder.prototype.buildAttributesForStopNode = function (obj) { if (val === true && this.options.suppressBooleanAttributes) { attrStr += ' ' + cleanKey; } else { - attrStr += ' ' + cleanKey + '="' + val + '"'; // No encoding for stopNode + // stopNode content is raw, but the quote delimiter is always escaped + // so a quote in the value cannot break out of the attribute (see orderedJs2Xml attr_to_str) + attrStr += ' ' + cleanKey + '="' + escapeAttribute(val) + '"'; } } } else { @@ -71832,7 +72417,9 @@ Builder.prototype.buildAttributesForStopNode = function (obj) { if (val === true && this.options.suppressBooleanAttributes) { attrStr += ' ' + attr; } else { - attrStr += ' ' + attr + '="' + val + '"'; // No encoding for stopNode + // stopNode content is raw, but the quote delimiter is always escaped + // so a quote in the value cannot break out of the attribute (see orderedJs2Xml attr_to_str) + attrStr += ' ' + attr + '="' + escapeAttribute(val) + '"'; } } } @@ -71863,7 +72450,7 @@ Builder.prototype.buildObjectNode = function (val, key, attrStr, level) { if ((attrStr || attrStr === '') && val.indexOf('<') === -1) { return (this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp); } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) { - return this.indentate(level) + `` + this.newLine; + return this.indentate(level) + `` + this.newLine; } else { return ( this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar + @@ -73560,6 +74147,9 @@ class ExpressionSet { /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */ this._deepWildcards = []; + /** @type {Map} terminalTag → deep wildcard expressions */ + this._deepByTerminalTag = new Map(); + /** @type {Set} pattern strings already added — used for deduplication */ this._patterns = new Set(); @@ -73591,7 +74181,14 @@ class ExpressionSet { this._patterns.add(expression.pattern); if (expression.hasDeepWildcard()) { - this._deepWildcards.push(expression); + const lastSeg = expression.segments[expression.segments.length - 1]; + if (lastSeg && lastSeg.type !== 'deep-wildcard' && lastSeg.tag !== '*') { + const tag = lastSeg.tag; + if (!this._deepByTerminalTag.has(tag)) this._deepByTerminalTag.set(tag, []); + this._deepByTerminalTag.get(tag).push(expression); + } else { + this._deepWildcards.push(expression); + } return this; } @@ -73725,7 +74322,13 @@ class ExpressionSet { } } - // 3. Deep wildcards — cannot be pre-filtered by depth or tag + // 3. Deep wildcards — indexed by terminal tag, then unindexed fallback + const deepBucket = this._deepByTerminalTag.get(tag); + if (deepBucket) { + for (let i = 0; i < deepBucket.length; i++) { + if (matcher.matches(deepBucket[i])) return deepBucket[i]; + } + } for (let i = 0; i < this._deepWildcards.length; i++) { if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i]; } @@ -75539,6 +76142,152 @@ class EntityDecoder { return this._applyNCRAction(effective, token, cp); } } +;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/contexts/sql.js +/** + * SQL context patterns — high-precision rules only. + * + * These rules have very low false-positive risk and are safe to apply to + * general user text (names, descriptions, search queries, etc.). + * All patterns are ReDoS-safe — unlike the `sql-injection` npm package + * which has an active CVE on its own detection regexes. + * + * For exhaustive coverage including noisier heuristics (comment sequences, + * hex literals, stacked queries with semicolons), use 'SQL-STRICT' instead. + * Apply 'SQL-STRICT' only to strings that are specifically SQL fragments, + * not to general free-text fields. + */ + +const SQL_PATTERNS = [ + { + id: 'sql-block-comment-open', + description: 'SQL block comment open: /* ... */ — unusual in legitimate user text', + pattern: /\/\*/, + }, + { + id: 'sql-union-select', + description: 'UNION SELECT — most common SQL injection aggregation attack', + pattern: /\bUNION\s{1,20}(?:ALL\s{1,20})?SELECT\b/i, + }, + { + id: 'sql-drop-table', + description: 'DROP TABLE — destructive DDL injection', + pattern: /\bDROP\s{1,20}TABLE\b/i, + }, + { + id: 'sql-drop-database', + description: 'DROP DATABASE — destructive DDL injection', + pattern: /\bDROP\s{1,20}DATABASE\b/i, + }, + { + id: 'sql-insert-into', + description: 'INSERT INTO — data injection', + pattern: /\bINSERT\s{1,20}INTO\b/i, + }, + { + id: 'sql-delete-from', + description: 'DELETE FROM — data deletion injection', + pattern: /\bDELETE\s{1,20}FROM\b/i, + }, + { + id: 'sql-update-set', + description: 'UPDATE ... SET — data modification injection', + // Allows arbitrary content between UPDATE and SET (table name, alias, etc.) + pattern: /\bUPDATE\b[\s\S]{1,60}\bSET\b/i, + }, + { + id: 'sql-exec-xp', + description: 'EXEC xp_ — MSSQL extended stored procedure execution', + pattern: /\bEXEC(?:UTE)?\s{1,20}xp_/i, + }, + { + id: 'sql-tautology-string', + description: "Classic string tautology: ' OR '1'='1 or \" OR \"1\"=\"1\"", + // Last quote is optional — injection may truncate it: ' OR '1'='1-- + pattern: /'\s{0,10}OR\s{0,10}'[^']{0,20}'\s*=\s*'[^']{0,20}/i, + }, + { + id: 'sql-tautology-numeric', + description: 'Numeric tautology: OR 1=1', + pattern: /\bOR\s{1,10}1\s*=\s*1\b/i, + }, + { + id: 'sql-always-true-zero', + description: 'Numeric tautology: OR 0=0', + pattern: /\bOR\s{1,10}0\s*=\s*0\b/i, + }, + { + id: 'sql-sleep-benchmark', + description: 'Time-based blind injection: SLEEP() or BENCHMARK()', + pattern: /\b(?:SLEEP|BENCHMARK)\s*\(/i, + }, + { + id: 'sql-waitfor-delay', + description: 'MSSQL time-based blind injection: WAITFOR DELAY', + pattern: /\bWAITFOR\s{1,20}DELAY\b/i, + }, + { + id: 'sql-char-function', + description: 'CHAR() function — used to obfuscate injected strings', + pattern: /\bCHAR\s*\(\s*\d{1,3}/i, + }, + { + id: 'sql-information-schema', + description: 'INFORMATION_SCHEMA — reconnaissance query for table/column enumeration', + pattern: /\bINFORMATION_SCHEMA\b/i, + }, +]; + +/* harmony default export */ const sql = (SQL_PATTERNS); + +;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/contexts/sql-strict.js +/** + * SQL-STRICT context patterns. + * + * Extends the base 'SQL' context with three additional rules that are + * effective at detecting real injections but carry a higher false-positive + * risk on general free-text input. + * + * Use 'SQL-STRICT' when: + * - The string is specifically a SQL fragment or database identifier + * - You control the input domain (e.g. a dedicated SQL search field) + * - You can tolerate occasional false positives in exchange for broader coverage + * + * Use 'SQL' (not STRICT) when: + * - The field is general user text (names, descriptions, comments) + * - False positives would block legitimate content (e.g. "see note -- above") + * + * Rules moved here from 'SQL' due to false-positive risk: + * + * sql-line-comment — "--" fires on "see note -- above", "value--", CSS var(--primary) + * sql-stacked-query — "; SELECT" fires on legitimate prose with semicolons + SQL words + * sql-hex-encoding — "0xDEAD" fires on hex values in technical docs and log output + */ + + + +const SQL_STRICT_EXTRA = [ + { + id: 'sql-line-comment', + description: 'SQL line comment: -- followed by whitespace or end of string', + pattern: /--(?:\s|$)/, + }, + { + id: 'sql-stacked-query', + description: 'Stacked queries: semicolon immediately followed by a SQL keyword', + pattern: /;\s{0,10}(?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC)\b/i, + }, + { + id: 'sql-hex-encoding', + description: 'Hex-encoded string injection: 0x41414141 style (MySQL)', + pattern: /\b0x[0-9a-f]{4,}/i, + }, +]; + +// SQL-STRICT = all base SQL rules + the three noisy extras +const SQL_STRICT_PATTERNS = [...sql, ...SQL_STRICT_EXTRA]; + +/* harmony default export */ const sql_strict = (SQL_STRICT_PATTERNS); + ;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/contexts/html.js /** * HTML context patterns. @@ -75806,152 +76555,6 @@ const SVG_PATTERNS = [ /* harmony default export */ const svg = (SVG_PATTERNS); -;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/contexts/sql.js -/** - * SQL context patterns — high-precision rules only. - * - * These rules have very low false-positive risk and are safe to apply to - * general user text (names, descriptions, search queries, etc.). - * All patterns are ReDoS-safe — unlike the `sql-injection` npm package - * which has an active CVE on its own detection regexes. - * - * For exhaustive coverage including noisier heuristics (comment sequences, - * hex literals, stacked queries with semicolons), use 'SQL-STRICT' instead. - * Apply 'SQL-STRICT' only to strings that are specifically SQL fragments, - * not to general free-text fields. - */ - -const SQL_PATTERNS = [ - { - id: 'sql-block-comment-open', - description: 'SQL block comment open: /* ... */ — unusual in legitimate user text', - pattern: /\/\*/, - }, - { - id: 'sql-union-select', - description: 'UNION SELECT — most common SQL injection aggregation attack', - pattern: /\bUNION\s{1,20}(?:ALL\s{1,20})?SELECT\b/i, - }, - { - id: 'sql-drop-table', - description: 'DROP TABLE — destructive DDL injection', - pattern: /\bDROP\s{1,20}TABLE\b/i, - }, - { - id: 'sql-drop-database', - description: 'DROP DATABASE — destructive DDL injection', - pattern: /\bDROP\s{1,20}DATABASE\b/i, - }, - { - id: 'sql-insert-into', - description: 'INSERT INTO — data injection', - pattern: /\bINSERT\s{1,20}INTO\b/i, - }, - { - id: 'sql-delete-from', - description: 'DELETE FROM — data deletion injection', - pattern: /\bDELETE\s{1,20}FROM\b/i, - }, - { - id: 'sql-update-set', - description: 'UPDATE ... SET — data modification injection', - // Allows arbitrary content between UPDATE and SET (table name, alias, etc.) - pattern: /\bUPDATE\b[\s\S]{1,60}\bSET\b/i, - }, - { - id: 'sql-exec-xp', - description: 'EXEC xp_ — MSSQL extended stored procedure execution', - pattern: /\bEXEC(?:UTE)?\s{1,20}xp_/i, - }, - { - id: 'sql-tautology-string', - description: "Classic string tautology: ' OR '1'='1 or \" OR \"1\"=\"1\"", - // Last quote is optional — injection may truncate it: ' OR '1'='1-- - pattern: /'\s{0,10}OR\s{0,10}'[^']{0,20}'\s*=\s*'[^']{0,20}/i, - }, - { - id: 'sql-tautology-numeric', - description: 'Numeric tautology: OR 1=1', - pattern: /\bOR\s{1,10}1\s*=\s*1\b/i, - }, - { - id: 'sql-always-true-zero', - description: 'Numeric tautology: OR 0=0', - pattern: /\bOR\s{1,10}0\s*=\s*0\b/i, - }, - { - id: 'sql-sleep-benchmark', - description: 'Time-based blind injection: SLEEP() or BENCHMARK()', - pattern: /\b(?:SLEEP|BENCHMARK)\s*\(/i, - }, - { - id: 'sql-waitfor-delay', - description: 'MSSQL time-based blind injection: WAITFOR DELAY', - pattern: /\bWAITFOR\s{1,20}DELAY\b/i, - }, - { - id: 'sql-char-function', - description: 'CHAR() function — used to obfuscate injected strings', - pattern: /\bCHAR\s*\(\s*\d{1,3}/i, - }, - { - id: 'sql-information-schema', - description: 'INFORMATION_SCHEMA — reconnaissance query for table/column enumeration', - pattern: /\bINFORMATION_SCHEMA\b/i, - }, -]; - -/* harmony default export */ const sql = (SQL_PATTERNS); - -;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/contexts/sql-strict.js -/** - * SQL-STRICT context patterns. - * - * Extends the base 'SQL' context with three additional rules that are - * effective at detecting real injections but carry a higher false-positive - * risk on general free-text input. - * - * Use 'SQL-STRICT' when: - * - The string is specifically a SQL fragment or database identifier - * - You control the input domain (e.g. a dedicated SQL search field) - * - You can tolerate occasional false positives in exchange for broader coverage - * - * Use 'SQL' (not STRICT) when: - * - The field is general user text (names, descriptions, comments) - * - False positives would block legitimate content (e.g. "see note -- above") - * - * Rules moved here from 'SQL' due to false-positive risk: - * - * sql-line-comment — "--" fires on "see note -- above", "value--", CSS var(--primary) - * sql-stacked-query — "; SELECT" fires on legitimate prose with semicolons + SQL words - * sql-hex-encoding — "0xDEAD" fires on hex values in technical docs and log output - */ - - - -const SQL_STRICT_EXTRA = [ - { - id: 'sql-line-comment', - description: 'SQL line comment: -- followed by whitespace or end of string', - pattern: /--(?:\s|$)/, - }, - { - id: 'sql-stacked-query', - description: 'Stacked queries: semicolon immediately followed by a SQL keyword', - pattern: /;\s{0,10}(?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC)\b/i, - }, - { - id: 'sql-hex-encoding', - description: 'Hex-encoded string injection: 0x41414141 style (MySQL)', - pattern: /\b0x[0-9a-f]{4,}/i, - }, -]; - -// SQL-STRICT = all base SQL rules + the three noisy extras -const SQL_STRICT_PATTERNS = [...sql, ...SQL_STRICT_EXTRA]; - -/* harmony default export */ const sql_strict = (SQL_STRICT_PATTERNS); - ;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/contexts/shell.js /** * SHELL context patterns. @@ -76337,32 +76940,66 @@ const LOG_PATTERNS = [ /* harmony default export */ const contexts_log = (LOG_PATTERNS); -;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/registry.js +;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/index.js /** - * Context registry — maps context name strings to their pattern arrays. + * is-unsafe v2 + * + * Zero-dependency, DOM-free, pure predicate for detecting unsafe strings + * across HTML, XML, SVG, SQL, SQL-STRICT, SHELL, REDOS, NOSQL, and LOG contexts. * - * Adding a new context: create a file in ./contexts/, export a default array - * of pattern objects, and register it here. + * v2 change: contexts are imported as named pattern arrays rather than resolved + * via a string-keyed registry. This makes each context independently + * tree-shakeable — bundlers can drop any context you never import. * - * Context name guide: - * SQL — high-precision rules; safe for general text fields - * SQL-STRICT — SQL + three noisier rules (line comments, stacked queries, hex); - * use only for SQL-specific inputs - * REDOS — detects ReDoS-prone patterns when string will be compiled as RegExp + * @module is-unsafe */ +// ─── Context pattern arrays (named exports) ──────────────────────────────── +// Import only the ones you need. Each is independently tree-shakeable. + + + + + + + +// SQL-STRICT needs a quoted identifier because of the hyphen +// ─── VALID_CONTEXTS convenience re-export ───────────────────────────────── +// Importing this pulls in ALL contexts. Use it only when you need all of them +// (e.g. for validation UI, tooling, or exhaustive audits). +// If you only need a subset, import the named contexts directly instead. -/** @type {Record>} */ -const registry_CONTEXT_REGISTRY = { + + + + + + +// ─── Attach labels to named contexts ────────────────────────────────────── +// Each built-in PatternList carries its canonical name so matchList can read +// list.label directly — no registry lookup needed at match time. +// Custom PatternLists default to 'CUSTOM' unless the caller sets list.label. + +html.label = 'HTML'; +xml.label = 'XML'; +svg.label = 'SVG'; +sql.label = 'SQL'; +sql_strict.label = 'SQL-STRICT'; +shell.label = 'SHELL'; +redos.label = 'REDOS'; +nosql.label = 'NOSQL'; +contexts_log.label = 'LOG'; + +const VALID_CONTEXTS = Object.freeze({ HTML: html, XML: xml, SVG: svg, @@ -76372,45 +77009,29 @@ const registry_CONTEXT_REGISTRY = { REDOS: redos, NOSQL: nosql, LOG: contexts_log, -}; +}); -/* harmony default export */ const registry = (registry_CONTEXT_REGISTRY); +// ─── Types ──────────────────────────────────────────────────────────────── /** - * Enum of valid context names — e.g. `VALID_CONTEXTS.HTML === 'HTML'`. - * @type {Record} - */ -const VALID_CONTEXTS = Object.freeze( - Object.fromEntries(Object.keys(registry_CONTEXT_REGISTRY).map((k) => [k, k])) -); -;// CONCATENATED MODULE: ./node_modules/is-unsafe/src/index.js -/** - * is-unsafe - * - * Zero-dependency, DOM-free, pure predicate for detecting unsafe strings - * across HTML, XML, SVG, SQL, SQL-STRICT, SHELL, REDOS, NOSQL, and LOG contexts. - * - * @module is-unsafe + * @typedef {{ id: string, description: string, pattern: RegExp }} Rule */ - - /** - * @typedef {'HTML'|'XML'|'SVG'|'SQL'|'SQL-STRICT'|'SHELL'|'REDOS'|'NOSQL'|'LOG'} ContextName + * @typedef {Rule[]} PatternList */ /** * @typedef {Object} MatchResult - * @property {string} context - The context in which the match was found - * @property {string} id - Rule identifier + * @property {string} context - Label identifying which context matched ('HTML', 'CUSTOM', etc.) + * @property {string} id - Rule identifier * @property {string} description - Human-readable description of what was matched - * @property {RegExp} pattern - The pattern that matched + * @property {RegExp} pattern - The pattern that matched */ -// ─── Validation helpers ──────────────────────────────────────────────────── +// ─── Internal helpers ────────────────────────────────────────────────────── /** - * Validate that `value` is a string. Throws TypeError if not. * @param {unknown} value */ function src_assertString(value) { @@ -76422,56 +77043,61 @@ function src_assertString(value) { } /** - * Validate that `context` is a recognised context name, an array of them, - * or a RegExp instance. Throws TypeError if not. - * @param {ContextName|ContextName[]|RegExp} context + * @param {unknown} context */ function assertContext(context) { if (context instanceof RegExp) return; - if (typeof context === 'string') { - if (!registry[context]) { - throw new TypeError( - `is-unsafe: unknown context "${context}". Valid contexts: ${Object.keys(VALID_CONTEXTS).join(', ')}` - ); - } - return; - } - if (Array.isArray(context)) { if (context.length === 0) { - throw new TypeError('is-unsafe: context array must not be empty'); + throw new TypeError('is-unsafe: context must not be an empty array'); } - for (const c of context) { - if (typeof c !== 'string' || !registry[c]) { - throw new TypeError( - `is-unsafe: unknown context "${c}" in array. Valid contexts: ${Object.keys(VALID_CONTEXTS).join(', ')}` - ); + // Detect array-of-arrays vs flat pattern list + if (Array.isArray(context[0])) { + // Array of PatternLists + for (const list of context) { + if (!Array.isArray(list) || list.length === 0) { + throw new TypeError( + 'is-unsafe: each context in the array must be a non-empty pattern array (PatternList)' + ); + } } } + // else: flat PatternList — trust it, no deep validation needed return; } throw new TypeError( - `is-unsafe: second argument must be a context string, array of context strings, or RegExp. Got: ${typeof context}` + `is-unsafe: second argument must be a PatternList (e.g. HTML), ` + + `an array of PatternLists (e.g. [HTML, XML]), or a RegExp. Got: ${typeof context}` ); } -// ─── Core matching logic ─────────────────────────────────────────────────── +/** + * Normalise any valid context arg into an array of PatternLists. + * + * @param {Rule[]|Rule[][]|RegExp} context + * @returns {{ lists: Rule[][]|null, regex: RegExp|null }} + */ +function normalise(context) { + if (context instanceof RegExp) return { lists: null, regex: context }; + // Distinguish PatternList (array of rule objects) from array of PatternLists + if (Array.isArray(context[0])) return { lists: context, regex: null }; + return { lists: [context], regex: null }; +} /** - * Test a single value against one named context's patterns. - * Returns the first matching MatchResult, or null if nothing matched. + * Test value against a single PatternList. Returns the first MatchResult or null. * * @param {string} value - * @param {string} contextName + * @param {Rule[]} list * @returns {MatchResult|null} */ -function matchContext(value, contextName) { - const patterns = registry[contextName]; - for (const rule of patterns) { +function matchList(value, list) { + const label = list.label ?? 'CUSTOM'; + for (const rule of list) { if (rule.pattern.test(value)) { - return { context: contextName, id: rule.id, description: rule.description, pattern: rule.pattern }; + return { context: label, id: rule.id, description: rule.description, pattern: rule.pattern }; } } return null; @@ -76482,103 +77108,95 @@ function matchContext(value, contextName) { /** * Returns `true` if `value` is unsafe in the given context(s), `false` otherwise. * - * @param {string} value - The string to test - * @param {ContextName|ContextName[]|RegExp} context - * - A named context ('HTML', 'XML', 'SVG', 'SQL', 'SQL-STRICT', 'SHELL', 'REDOS', 'NOSQL', 'LOG') - * - An array of named contexts — returns true if unsafe in **any** of them + * @param {string} value - The string to test + * @param {PatternList | PatternList[] | RegExp} context + * - A PatternList imported from is-unsafe (e.g. `HTML`, `XML`) + * - An array of PatternLists — returns true if unsafe in **any** of them * - A custom RegExp — returns true if the pattern matches * @returns {boolean} * * @example - * isUnsafe('', 'HTML') // true - * isUnsafe('hello world', 'HTML') // false - * isUnsafe('value', ['HTML', 'SQL']) // false - * isUnsafe('value', /my-pattern/i) // false + * import { isUnsafe, HTML, SQL } from 'is-unsafe'; + * + * isUnsafe('', HTML) // true + * isUnsafe('hello world', HTML) // false + * isUnsafe('value', [HTML, SQL]) // false + * isUnsafe('value', /my-pattern/i) // false */ function isUnsafe(value, context) { src_assertString(value); assertContext(context); - // Custom RegExp — caller-supplied pattern - if (context instanceof RegExp) { - return context.test(value); - } + const { lists, regex } = normalise(context); - // Single named context - if (typeof context === 'string') { - return matchContext(value, context) !== null; - } + if (regex) return regex.test(value); - // Array of named contexts — unsafe if ANY context matches - for (const c of context) { - if (matchContext(value, c) !== null) return true; + for (const list of lists) { + if (matchList(value, list) !== null) return true; } return false; } /** - * Like `isUnsafe`, but instead of a boolean returns the first `MatchResult` - * describing **why** the value was flagged, or `null` if it is safe. - * - * Useful for logging, error messages, or policy reporting. + * Like `isUnsafe`, but returns the first `MatchResult` describing **why** + * the value was flagged, or `null` if it is safe. * * @param {string} value - * @param {ContextName|ContextName[]|RegExp} context + * @param {PatternList | PatternList[] | RegExp} context * @returns {MatchResult|null} * * @example - * whyUnsafe('', 'HTML') + * import { whyUnsafe, HTML } from 'is-unsafe'; + * + * whyUnsafe('', HTML) * // { context: 'HTML', id: 'html-script-open', description: '...', pattern: /.../ } */ function whyUnsafe(value, context) { src_assertString(value); assertContext(context); - if (context instanceof RegExp) { - return context.test(value) - ? { context: 'CUSTOM', id: 'custom-regex', description: 'Matched caller-supplied pattern', pattern: context } - : null; - } + const { lists, regex } = normalise(context); - if (typeof context === 'string') { - return matchContext(value, context); + if (regex) { + return regex.test(value) + ? { context: 'CUSTOM', id: 'custom-regex', description: 'Matched caller-supplied pattern', pattern: regex } + : null; } - for (const c of context) { - const result = matchContext(value, c); + for (const list of lists) { + const result = matchList(value, list); if (result !== null) return result; } return null; } /** - * Returns all matching rules across the given context(s), or an empty array - * if the value is safe. Useful for comprehensive auditing. + * Returns **all** matching rules across the given context(s), or an empty + * array if the value is safe. Useful for comprehensive auditing. * * @param {string} value - * @param {ContextName|ContextName[]|RegExp} context + * @param {PatternList | PatternList[] | RegExp} context * @returns {MatchResult[]} */ function allUnsafe(value, context) { src_assertString(value); assertContext(context); + const { lists, regex } = normalise(context); const results = []; - if (context instanceof RegExp) { - if (context.test(value)) { - results.push({ context: 'CUSTOM', id: 'custom-regex', description: 'Matched caller-supplied pattern', pattern: context }); + if (regex) { + if (regex.test(value)) { + results.push({ context: 'CUSTOM', id: 'custom-regex', description: 'Matched caller-supplied pattern', pattern: regex }); } return results; } - const contexts = typeof context === 'string' ? [context] : context; - - for (const c of contexts) { - const patterns = CONTEXT_REGISTRY[c]; - for (const rule of patterns) { + for (const list of lists) { + const label = list.label ?? 'CUSTOM'; + for (const rule of list) { if (rule.pattern.test(value)) { - results.push({ context: c, id: rule.id, description: rule.description, pattern: rule.pattern }); + results.push({ context: label, id: rule.id, description: rule.description, pattern: rule.pattern }); } } } @@ -76588,6 +77206,7 @@ function allUnsafe(value, context) { /* harmony default export */ const src = ((/* unused pure expression or super */ null && (isUnsafe))); + ;// CONCATENATED MODULE: ./node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js ///@ts-check @@ -76695,8 +77314,7 @@ class OrderedObjParser { // onExternalEntity: (name, value) => isUnsafe(value) ? 'block' : 'allow', onInputEntity: (name, value) => //TODO: VALID_CONTEXTS.HTML should be set only if this.options.htmlEntities - isUnsafe(value, [VALID_CONTEXTS.HTML, VALID_CONTEXTS.XML]) - ? ENTITY_ACTION.BLOCK : ENTITY_ACTION.ALLOW, + isUnsafe(value, [html, xml]) ? ENTITY_ACTION.BLOCK : ENTITY_ACTION.ALLOW, //postCheck: resolved => resolved }); @@ -77767,7 +78385,8 @@ async function parseXML(str, opts = {}) { delete parsedXml["?xml"]; } if (!opts.includeRoot) { - for (const key of Object.keys(parsedXml)) { + const key = Object.keys(parsedXml)[0]; + if (key !== undefined) { const value = parsedXml[key]; return typeof value === "object" ? { ...value } : value; } @@ -78397,6 +79016,7 @@ function logExceptionOnExit(e) { if (ENVIRONMENT_IS_NODE) { if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); +// NODE-READ-START (this block is replaced with a no-op in dist/browser and dist/react-native by copyJSFiles.cjs) // `require()` is no-op in an ESM module, use `createRequire()` to construct // the require()` function. This is only necessary for multi-environment // builds, `-sENVIRONMENT=node` emits a static import declaration instead. @@ -78441,6 +79061,7 @@ readAsync = (filename, onload, onerror) => { }; // end include: node_shell_read.js +// NODE-READ-END if (process['argv'].length > 1) { thisProgram = process['argv'][1].replace(/\\/g, '/'); } @@ -83676,8 +84297,8 @@ class UserDelegationKeyCredential { ;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/utils/constants.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -const esm_utils_constants_SDK_VERSION = "12.32.0"; -const SERVICE_VERSION = "2026-04-06"; +const esm_utils_constants_SDK_VERSION = "12.33.0"; +const SERVICE_VERSION = "2026-06-06"; const BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; // 256MB const BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; // 4000MB const BLOCK_BLOB_MAX_BLOCKS = 50000; @@ -85760,6 +86381,7 @@ const BlobPropertiesInternal = { "Cool", "Archive", "Cold", + "Smart", ], }, }, @@ -85779,6 +86401,32 @@ const BlobPropertiesInternal = { "rehydrate-pending-to-hot", "rehydrate-pending-to-cool", "rehydrate-pending-to-cold", + "rehydrate-pending-to-smart", + ], + }, + }, + smartAccessTier: { + serializedName: "SmartAccessTier", + xmlName: "SmartAccessTier", + type: { + name: "Enum", + allowedValues: [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Cold", + "Smart", ], }, }, @@ -88924,6 +89572,13 @@ const BlobGetPropertiesHeaders = { name: "DateTimeRfc1123", }, }, + smartAccessTier: { + serializedName: "x-ms-smart-access-tier", + xmlName: "x-ms-smart-access-tier", + type: { + name: "String", + }, + }, versionId: { serializedName: "x-ms-version-id", xmlName: "x-ms-version-id", @@ -92918,7 +93573,7 @@ const timeoutInSeconds = { const version = { parameterPath: "version", mapper: { - defaultValue: "2026-04-06", + defaultValue: "2026-06-06", isConstant: true, serializedName: "x-ms-version", type: { @@ -93825,6 +94480,7 @@ const tier = { "Cool", "Archive", "Cold", + "Smart", ], }, }, @@ -94063,6 +94719,7 @@ const tier1 = { "Cool", "Archive", "Cold", + "Smart", ], }, }, @@ -97771,7 +98428,7 @@ class StorageClient extends ExtendedServiceClient { const defaults = { requestContentType: "application/json; charset=utf-8", }; - const packageDetails = `azsdk-js-azure-storage-blob/12.32.0`; + const packageDetails = `azsdk-js-azure-storage-blob/12.33.0`; const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` : `${packageDetails}`; @@ -97787,7 +98444,7 @@ class StorageClient extends ExtendedServiceClient { // Parameter assignments this.url = url; // Assigning values to Constant parameters - this.version = options.version || "2026-04-06"; + this.version = options.version || "2026-06-06"; this.service = new ServiceImpl(this); this.container = new ContainerImpl(this); this.blob = new BlobImpl(this); @@ -97840,6 +98497,13 @@ class StorageContextClient extends StorageClient { +const accountNameSuffixes = [ + "-secondary-ipv6", + "-secondary-dualstack", + "-ipv6", + "-dualstack", + "-secondary", +]; /** * Reserved URL characters must be properly escaped for Storage services like Blob or File. * @@ -98316,7 +98980,15 @@ function utils_common_getAccountNameFromUrl(url) { try { if (parsedUrl.hostname.split(".")[1] === "blob") { // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`; + // `${defaultEndpointsProtocol}://${accountName}-suffix.blob.${endpointSuffix}`; accountName = parsedUrl.hostname.split(".")[0]; + for (let i = 0; i < accountNameSuffixes.length; ++i) { + const suffix = accountNameSuffixes[i]; + if (accountName.endsWith(suffix)) { + accountName = accountName.substring(0, accountName.length - suffix.length); + break; + } + } } else if (utils_common_isIpEndpointStyle(parsedUrl)) { // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/ @@ -99290,6 +99962,10 @@ class SASQueryParameters { * Keys for request query parameters required in the SAS token */ requestQueryParameterKeys; + /** To indicate the depth of the virtual blob directory specified + * in the canonicalizedresource field of the string-to-sign. + */ + directoryDepth; /** * Optional. IP range allowed for this SAS. * @@ -99304,7 +99980,7 @@ class SASQueryParameters { } return undefined; } - constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope, delegatedUserObjectId, requestHeaderKeys, requestQueryParameterKeys) { + constructor(version, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope, delegatedUserObjectId, requestHeaderKeys, requestQueryParameterKeys, directoryDepth) { this.version = version; this.signature = signature; if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") { @@ -99327,6 +100003,7 @@ class SASQueryParameters { this.contentType = permissionsOrOptions.contentType; this.requestHeaderKeys = permissionsOrOptions.requestHeaderKeys; this.requestQueryParameterKeys = permissionsOrOptions.requestQueryParameterKeys; + this.directoryDepth = permissionsOrOptions.directoryDepth; if (permissionsOrOptions.userDelegationKey) { this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId; this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId; @@ -99359,6 +100036,7 @@ class SASQueryParameters { this.contentType = contentType; this.requestHeaderKeys = requestHeaderKeys; this.requestQueryParameterKeys = requestQueryParameterKeys; + this.directoryDepth = directoryDepth; if (userDelegationKey) { this.signedOid = userDelegationKey.signedObjectId; this.signedTenantId = userDelegationKey.signedTenantId; @@ -99402,6 +100080,7 @@ class SASQueryParameters { "rsct", "saoid", "scid", + "sdd", "sduoid", // Signed key user delegation object ID "skdutid", // Signed key user delegation tenant ID "srh", // Request Headers @@ -99498,6 +100177,9 @@ class SASQueryParameters { case "srq": // Request headers this.tryAppendQueryParameter(queries, param, this.requestQueryParameterKeys); break; + case "sdd": // Directory depth + this.tryAppendQueryParameter(queries, param, this.directoryDepth !== undefined ? this.directoryDepth.toString() : ""); + break; } } return queries.join("&"); @@ -99569,7 +100251,13 @@ function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKe // https://learn.microsoft.com/rest/api/storageservices/constructing-a-service-sas#constructing-the-signature-string if (version >= "2018-11-09") { if (sharedKeyCredential !== undefined) { - return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential); + // Version 2020-02-10 delegation SAS signature construction supports blob name as a virtual directory. + if (version >= "2020-02-10") { + return generateBlobSASQueryParameters20200210(blobSASSignatureValues, sharedKeyCredential); + } + else { + return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential); + } } else { // Version 2020-02-10 delegation SAS signature construction includes preauthorizedAgentObjectId, agentObjectId, correlationId. @@ -99725,6 +100413,85 @@ function generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKe stringToSign: stringToSign, }; } +/** + * ONLY AVAILABLE IN NODE.JS RUNTIME. + * IMPLEMENTATION FOR API VERSION FROM 2020-02-10. + * + * Creates an instance of SASQueryParameters. + * + * Only accepts required settings needed to create a SAS. For optional settings please + * set corresponding properties directly, such as permissions, startsOn and identifier. + * + * WARNING: When identifier is not provided, permissions and expiresOn are required. + * You MUST assign value to identifier or expiresOn & permissions manually if you initial with + * this constructor. + * + * @param blobSASSignatureValues - + * @param sharedKeyCredential - + */ +function generateBlobSASQueryParameters20200210(blobSASSignatureValues, sharedKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.identifier && + !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided."); + } + let resource = "c"; + let timestamp = blobSASSignatureValues.snapshotTime; + let directoryDepth = undefined; + if (blobSASSignatureValues.blobName) { + if (blobSASSignatureValues.isDirectory === true) { + resource = "d"; + directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length; + } + else { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } + else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } + } + } + // Calling parse and toString guarantees the proper ordering and throws on invalid characters. + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + // Signature is generated on the un-url-encoded values. + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn + ? utils_common_truncatedISO8061Date(blobSASSignatureValues.startsOn, false) + : "", + blobSASSignatureValues.expiresOn + ? utils_common_truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) + : "", + getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + blobSASSignatureValues.identifier, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + timestamp, + blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "", + blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "", + blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "", + blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "", + blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "", + ].join("\n"); + const signature = sharedKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, undefined, undefined, undefined, undefined, directoryDepth), + stringToSign: stringToSign, + }; +} /** * ONLY AVAILABLE IN NODE.JS RUNTIME. * IMPLEMENTATION FOR API VERSION FROM 2020-12-06. @@ -99749,14 +100516,21 @@ function generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKe } let resource = "c"; let timestamp = blobSASSignatureValues.snapshotTime; + let directoryDepth = undefined; if (blobSASSignatureValues.blobName) { - resource = "b"; - if (blobSASSignatureValues.snapshotTime) { - resource = "bs"; + if (blobSASSignatureValues.isDirectory === true) { + resource = "d"; + directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length; } - else if (blobSASSignatureValues.versionId) { - resource = "bv"; - timestamp = blobSASSignatureValues.versionId; + else { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } + else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } } } // Calling parse and toString guarantees the proper ordering and throws on invalid characters. @@ -99794,7 +100568,7 @@ function generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKe ].join("\n"); const signature = sharedKeyCredential.computeHMACSHA256(stringToSign); return { - sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope), + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope, undefined, undefined, undefined, directoryDepth), stringToSign: stringToSign, }; } @@ -99899,14 +100673,21 @@ function generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userD } let resource = "c"; let timestamp = blobSASSignatureValues.snapshotTime; + let directoryDepth = undefined; if (blobSASSignatureValues.blobName) { - resource = "b"; - if (blobSASSignatureValues.snapshotTime) { - resource = "bs"; + if (blobSASSignatureValues.isDirectory === true) { + resource = "d"; + directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length; } - else if (blobSASSignatureValues.versionId) { - resource = "bv"; - timestamp = blobSASSignatureValues.versionId; + else { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } + else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } } } // Calling parse and toString guarantees the proper ordering and throws on invalid characters. @@ -99955,7 +100736,7 @@ function generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userD ].join("\n"); const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); return { - sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId), + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, undefined, undefined, undefined, undefined, directoryDepth), stringToSign: stringToSign, }; } @@ -99981,14 +100762,21 @@ function generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userD } let resource = "c"; let timestamp = blobSASSignatureValues.snapshotTime; + let directoryDepth = undefined; if (blobSASSignatureValues.blobName) { - resource = "b"; - if (blobSASSignatureValues.snapshotTime) { - resource = "bs"; + if (blobSASSignatureValues.isDirectory === true) { + resource = "d"; + directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length; } - else if (blobSASSignatureValues.versionId) { - resource = "bv"; - timestamp = blobSASSignatureValues.versionId; + else { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } + else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } } } // Calling parse and toString guarantees the proper ordering and throws on invalid characters. @@ -100038,7 +100826,7 @@ function generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userD ].join("\n"); const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); return { - sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope), + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, undefined, undefined, undefined, directoryDepth), stringToSign: stringToSign, }; } @@ -100064,14 +100852,21 @@ function generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userD } let resource = "c"; let timestamp = blobSASSignatureValues.snapshotTime; + let directoryDepth = undefined; if (blobSASSignatureValues.blobName) { - resource = "b"; - if (blobSASSignatureValues.snapshotTime) { - resource = "bs"; + if (blobSASSignatureValues.isDirectory === true) { + resource = "d"; + directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length; } - else if (blobSASSignatureValues.versionId) { - resource = "bv"; - timestamp = blobSASSignatureValues.versionId; + else { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } + else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } } } // Calling parse and toString guarantees the proper ordering and throws on invalid characters. @@ -100123,7 +100918,7 @@ function generateBlobSASQueryParametersUDK20250705(blobSASSignatureValues, userD ].join("\n"); const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); return { - sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, blobSASSignatureValues.delegatedUserObjectId), + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, blobSASSignatureValues.delegatedUserObjectId, undefined, undefined, directoryDepth), stringToSign: stringToSign, }; } @@ -100149,14 +100944,21 @@ function generateBlobSASQueryParametersUDK20260406(blobSASSignatureValues, userD } let resource = "c"; let timestamp = blobSASSignatureValues.snapshotTime; + let directoryDepth = undefined; if (blobSASSignatureValues.blobName) { - resource = "b"; - if (blobSASSignatureValues.snapshotTime) { - resource = "bs"; + if (blobSASSignatureValues.isDirectory === true) { + resource = "d"; + directoryDepth = trimBlobName(blobSASSignatureValues.blobName).split("/").length; } - else if (blobSASSignatureValues.versionId) { - resource = "bv"; - timestamp = blobSASSignatureValues.versionId; + else { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } + else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } } } // Calling parse and toString guarantees the proper ordering and throws on invalid characters. @@ -100210,7 +101012,7 @@ function generateBlobSASQueryParametersUDK20260406(blobSASSignatureValues, userD ].join("\n"); const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); return { - sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, blobSASSignatureValues.delegatedUserObjectId, getKeysOfRequestHeaders(blobSASSignatureValues.requestHeaders), getKeysOfRequestHeaders(blobSASSignatureValues.requestQueryParameters)), + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope, blobSASSignatureValues.delegatedUserObjectId, getKeysOfRequestHeaders(blobSASSignatureValues.requestHeaders), getKeysOfRequestHeaders(blobSASSignatureValues.requestQueryParameters), directoryDepth), stringToSign: stringToSign, }; } @@ -100318,6 +101120,16 @@ function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) { blobSASSignatureValues.version = version; return blobSASSignatureValues; } +function trimBlobName(blobName) { + let internalName = blobName; + while (internalName.startsWith("/")) { + internalName = internalName.substring(1); + } + while (internalName.endsWith("/")) { + internalName = internalName.substring(0, internalName.length - 1); + } + return internalName; +} //# sourceMappingURL=BlobSASSignatureValues.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/storage-blob/dist/esm/BlobLeaseClient.js // Copyright (c) Microsoft Corporation. @@ -104168,6 +104980,7 @@ class BlobClient extends StorageClient_StorageClient { * ```ts snippet:ReadmeSampleDownloadBlob_Node * import { BlobServiceClient } from "@azure/storage-blob"; * import { DefaultAzureCredential } from "@azure/identity"; + * import { buffer } from "node:stream/consumers"; * * const account = ""; * const blobServiceClient = new BlobServiceClient( @@ -104184,22 +104997,10 @@ class BlobClient extends StorageClient_StorageClient { * // In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody * const downloadBlockBlobResponse = await blobClient.download(); * if (downloadBlockBlobResponse.readableStreamBody) { - * const downloaded = await streamToString(downloadBlockBlobResponse.readableStreamBody); - * console.log(`Downloaded blob content: ${downloaded}`); - * } - * - * async function streamToString(stream: NodeJS.ReadableStream): Promise { - * const result = await new Promise>((resolve, reject) => { - * const chunks: Buffer[] = []; - * stream.on("data", (data) => { - * chunks.push(Buffer.isBuffer(data) ? data : Buffer.from(data)); - * }); - * stream.on("end", () => { - * resolve(Buffer.concat(chunks)); - * }); - * stream.on("error", reject); - * }); - * return result.toString(); + * // Download the raw bytes of the blob. Use `text` from "node:stream/consumers" + * // instead if you want to read the content as a string directly. + * const downloaded = await buffer(downloadBlockBlobResponse.readableStreamBody); + * console.log(`Downloaded blob content: ${downloaded.toString()}`); * } * ``` * @@ -105571,6 +106372,7 @@ class BlockBlobClient extends BlobClient { * ```ts snippet:ClientsQuery * import { BlobServiceClient } from "@azure/storage-blob"; * import { DefaultAzureCredential } from "@azure/identity"; + * import { buffer } from "node:stream/consumers"; * * const account = ""; * const blobServiceClient = new BlobServiceClient( @@ -105586,22 +106388,10 @@ class BlockBlobClient extends BlobClient { * // Query and convert a blob to a string * const queryBlockBlobResponse = await blockBlobClient.query("select from BlobStorage"); * if (queryBlockBlobResponse.readableStreamBody) { - * const downloadedBuffer = await streamToBuffer(queryBlockBlobResponse.readableStreamBody); - * const downloaded = downloadedBuffer.toString(); - * console.log(`Query blob content: ${downloaded}`); - * } - * - * async function streamToBuffer(readableStream: NodeJS.ReadableStream): Promise { - * return new Promise((resolve, reject) => { - * const chunks: Buffer[] = []; - * readableStream.on("data", (data) => { - * chunks.push(data instanceof Buffer ? data : Buffer.from(data)); - * }); - * readableStream.on("end", () => { - * resolve(Buffer.concat(chunks)); - * }); - * readableStream.on("error", reject); - * }); + * // Read the response bytes. Use `text` from "node:stream/consumers" instead + * // if you want the response as a string directly. + * const downloadedBuffer = await buffer(queryBlockBlobResponse.readableStreamBody); + * console.log(`Query blob content: ${downloadedBuffer.toString()}`); * } * ``` * @@ -110859,6 +111649,24 @@ function config_getCacheServiceVersion() { return 'v1'; return process.env['ACTIONS_CACHE_SERVICE_V2'] ? 'v2' : 'v1'; } +// The cache-mode lattice: readable = {read, write}, writable = {write, +// write-only}, none = neither. +const KNOWN_CACHE_MODES = ['none', 'read', 'write', 'write-only']; +// The effective cache-mode exported by the runner, or '' when not set. +function getCacheMode() { + return (process.env['ACTIONS_CACHE_MODE'] || '').trim().toLowerCase(); +} +// Unset or unrecognized modes are permissive so behavior matches today. +function isCacheReadable(mode) { + if (!KNOWN_CACHE_MODES.includes(mode)) + return true; + return mode === 'read' || mode === 'write'; +} +function isCacheWritable(mode) { + if (!KNOWN_CACHE_MODES.includes(mode)) + return true; + return mode === 'write' || mode === 'write-only'; +} function getCacheServiceURL() { const version = config_getCacheServiceVersion(); // Based on the version of the cache service, we will determine which @@ -110908,6 +111716,7 @@ var cacheHttpClient_awaiter = (undefined && undefined.__awaiter) || function (th + function getCacheApiUrl(resource) { const baseUrl = getCacheServiceURL(); if (!baseUrl) { @@ -110935,6 +111744,7 @@ function createHttpClient() { } function getCacheEntry(keys, paths, options) { return cacheHttpClient_awaiter(this, void 0, void 0, function* () { + var _a; const httpClient = createHttpClient(); const version = getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive); const resource = `cache?keys=${encodeURIComponent(keys.join(','))}&version=${version}`; @@ -110948,6 +111758,12 @@ function getCacheEntry(keys, paths, options) { return null; } if (!isSuccessStatusCode(response.statusCode)) { + // Only surface the receiver's body for a `cache read denied:` policy denial + // so callers can dispatch on it; keep the generic message otherwise. + const errorMessage = (_a = response.error) === null || _a === void 0 ? void 0 : _a.message; + if (errorMessage === null || errorMessage === void 0 ? void 0 : errorMessage.includes(CacheReadDeniedMessagePrefix)) { + throw new Error(errorMessage); + } throw new Error(`Cache service responded with ${response.statusCode}`); } const cacheResult = response.result; @@ -112208,6 +113024,7 @@ var cache_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _ar + class ValidationError extends Error { constructor(message) { super(message); @@ -112223,19 +113040,20 @@ class ReserveCacheError extends Error { } } /** - * Stable prefix the receiver writes into the cache reservation response when - * the issuer downgraded the cache token to read-only (for example, because + * Stable prefix the cache service writes into the cache reservation response + * when the issuer downgraded the cache token to read-only (for example, because * the run was triggered by an untrusted event). saveCacheV1 / saveCacheV2 - * dispatch on this prefix to re-classify the failure as a - * CacheWriteDeniedError so consumers (and the outer catch arm) can - * distinguish a policy denial from other reservation failures. + * dispatch on this prefix to re-classify the failure as a CacheWriteDeniedError + * so consumers and tests can distinguish a policy denial from other reservation + * failures. Internally it is logged as a non-fatal warning like other + * best-effort save failures. */ const CACHE_WRITE_DENIED_PREFIX = 'cache write denied:'; /** * Raised when the cache backend refuses to reserve a writable cache entry * because the JWT issued for this run was scoped read-only (for example, the * run was triggered by an event the repository administrator classified as - * untrusted). The receiver-supplied detail message always begins with + * untrusted). The service-supplied detail message always begins with * `cache write denied:` (the full error message includes additional context * like the cache key). * @@ -112251,6 +113069,19 @@ class CacheWriteDeniedError extends ReserveCacheError { Object.setPrototypeOf(this, CacheWriteDeniedError.prototype); } } +// Re-exported from constants so consumers keep referencing it here; the shared +// value also drives detection in cacheHttpClient without duplicating the string. +const CACHE_READ_DENIED_PREFIX = CacheReadDeniedMessagePrefix; +// Raised when the cache backend denies a download URL because the run's token +// has no readable cache scopes. Caching is best-effort, so restoreCache logs a +// warning and reports a cache miss rather than rethrowing this. +class CacheReadDeniedError extends Error { + constructor(message) { + super(message); + this.name = 'CacheReadDeniedError'; + Object.setPrototypeOf(this, CacheReadDeniedError.prototype); + } +} class FinalizeCacheError extends Error { constructor(message) { super(message); @@ -112305,6 +113136,12 @@ function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) { const cacheServiceVersion = config_getCacheServiceVersion(); core_debug(`Cache service version: ${cacheServiceVersion}`); checkPaths(paths); + const cacheMode = getCacheMode(); + if (!isCacheReadable(cacheMode)) { + info(`Cache restore skipped: the effective cache-mode '${cacheMode}' does not permit reads.`); + core_debug(`Skipped restore for paths [${paths.join(', ')}] with primary key '${primaryKey}'.`); + return undefined; + } switch (cacheServiceVersion) { case 'v2': return yield restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsArchive); @@ -112326,6 +113163,7 @@ function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) { */ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) { + var _a; restoreKeys = restoreKeys || []; const keys = [primaryKey, ...restoreKeys]; core_debug('Resolved Keys:'); @@ -112340,10 +113178,26 @@ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { let archivePath = ''; try { // path are needed to compute version - const cacheEntry = yield getCacheEntry(keys, paths, { - compressionMethod, - enableCrossOsArchive - }); + let cacheEntry; + try { + cacheEntry = yield getCacheEntry(keys, paths, { + compressionMethod, + enableCrossOsArchive + }); + } + catch (error) { + // The v1 artifact cache service returns HTTP 403 with a + // `cache read denied:` body when the run's token has no readable cache + // scopes. getCacheEntry lives in a dependency-free internal module and + // cannot import CacheReadDeniedError without a circular dependency, so it + // only surfaces the raw denial message; we classify it into the typed + // error here so the outer catch and consumers can dispatch on it. + const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : ''; + if (errorMessage.includes(CACHE_READ_DENIED_PREFIX)) { + throw new CacheReadDeniedError(errorMessage); + } + throw error; + } if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) { // Cache not found return undefined; @@ -112372,7 +113226,9 @@ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { } else { // warn on cache restore failure and continue build - // Log server errors (5xx) as errors, all other errors as warnings + // Log server errors (5xx) as errors, all other errors as warnings. + // A read denied by policy (CacheReadDeniedError) is not an HttpClientError + // so it falls here and is warned, treated as a cache miss. if (typedError instanceof HttpClientError && typeof typedError.statusCode === 'number' && typedError.statusCode >= 500) { @@ -112407,6 +113263,7 @@ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { */ function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) { return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) { + var _a; // Override UploadOptions to force the use of Azure options = Object.assign(Object.assign({}, options), { useAzureSdk: true }); restoreKeys = restoreKeys || []; @@ -112428,7 +113285,20 @@ function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) { restoreKeys, version: getCacheVersion(paths, compressionMethod, enableCrossOsArchive) }; - const response = yield twirpClient.GetCacheEntryDownloadURL(request); + let response; + try { + response = yield twirpClient.GetCacheEntryDownloadURL(request); + } + catch (error) { + // The receiver returns twirp PermissionDenied (403) when the run's token + // has no readable cache scopes. The client wraps that 403, so the stable + // prefix is embedded in the message rather than leading it. + const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : ''; + if (errorMessage.includes(CACHE_READ_DENIED_PREFIX)) { + throw new CacheReadDeniedError(errorMessage); + } + throw error; + } if (!response.ok) { core_debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`); return undefined; @@ -112463,8 +113333,10 @@ function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) { throw error; } else { - // Supress all non-validation cache related errors because caching should be optional - // Log server errors (5xx) as errors, all other errors as warnings + // Suppress all non-validation cache related errors because caching should be optional + // Log server errors (5xx) as errors, all other errors as warnings. + // A read denied by policy (CacheReadDeniedError) is not an HttpClientError + // so it falls here and is warned, treated as a cache miss. if (typedError instanceof HttpClientError && typeof typedError.statusCode === 'number' && typedError.statusCode >= 500) { @@ -112503,6 +113375,12 @@ function cache_saveCache(paths_1, key_1, options_1) { core_debug(`Cache service version: ${cacheServiceVersion}`); checkPaths(paths); checkKey(key); + const cacheMode = getCacheMode(); + if (!isCacheWritable(cacheMode)) { + info(`Cache save skipped: the effective cache-mode '${cacheMode}' does not permit writes.`); + core_debug(`Skipped save for paths [${paths.join(', ')}] with key '${key}'.`); + return -1; + } switch (cacheServiceVersion) { case 'v2': return yield saveCacheV2(paths, key, options, enableCrossOsArchive); @@ -112580,17 +113458,14 @@ function saveCacheV1(paths_1, key_1, options_1) { if (typedError.name === ValidationError.name) { throw error; } - else if (typedError.name === CacheWriteDeniedError.name) { - // Cache write was denied by policy (read-only token). Surface to the - // customer at warning level so it is visible in the workflow log - // without failing the run. - warning(`Failed to save: ${typedError.message}`); - } else if (typedError.name === ReserveCacheError.name) { info(`Failed to save: ${typedError.message}`); } else { - // Log server errors (5xx) as errors, all other errors as warnings + // Log server errors (5xx) as errors, all other errors as warnings. + // A write denied by policy (CacheWriteDeniedError) is not an + // HttpClientError and its name does not match the ReserveCacheError arm, + // so it falls here and is warned without failing the run. if (typedError instanceof HttpClientError && typeof typedError.statusCode === 'number' && typedError.statusCode >= 500) { @@ -112701,12 +113576,6 @@ function saveCacheV2(paths_1, key_1, options_1) { if (typedError.name === ValidationError.name) { throw error; } - else if (typedError.name === CacheWriteDeniedError.name) { - // Cache write was denied by policy (read-only token). Surface to the - // customer at warning level so it is visible in the workflow log - // without failing the run. - warning(`Failed to save: ${typedError.message}`); - } else if (typedError.name === ReserveCacheError.name) { info(`Failed to save: ${typedError.message}`); } @@ -112714,7 +113583,10 @@ function saveCacheV2(paths_1, key_1, options_1) { warning(typedError.message); } else { - // Log server errors (5xx) as errors, all other errors as warnings + // Log server errors (5xx) as errors, all other errors as warnings. + // A write denied by policy (CacheWriteDeniedError) is not an + // HttpClientError and its name does not match the ReserveCacheError arm, + // so it falls here and is warned without failing the run. if (typedError instanceof HttpClientError && typeof typedError.statusCode === 'number' && typedError.statusCode >= 500) { diff --git a/flake.lock b/flake.lock index 25f6977..b0ccd92 100644 --- a/flake.lock +++ b/flake.lock @@ -22,12 +22,12 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1780314950, - "narHash": "sha256-1y6LHeumqA2lnUZap2yor+g4jMFtno5mx119LEv+dQQ=", - "rev": "8160d67d2693a1f7ea219db159ccdc29ae632918", - "revCount": 2677, + "lastModified": 1782900513, + "narHash": "sha256-GHrsl1+ysDFgmDQtQSqWS7TiYD2Q58VlwLvnf1+crJM=", + "rev": "16810aa8f4ad89ca480b1513774e8b6f485fe368", + "revCount": 2708, "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/nix-community/fenix/0.1.2677%2Brev-8160d67d2693a1f7ea219db159ccdc29ae632918/019e8362-a4ed-7631-b2a4-06d3f14d5570/source.tar.gz" + "url": "https://api.flakehub.com/f/pinned/nix-community/fenix/0.1.2708%2Brev-16810aa8f4ad89ca480b1513774e8b6f485fe368/019f1d68-8b55-7783-bed1-d5926f21ae52/source.tar.gz" }, "original": { "type": "tarball", @@ -36,12 +36,12 @@ }, "nixpkgs": { "locked": { - "lastModified": 1781577229, - "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", - "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", - "revCount": 1017464, + "lastModified": 1784007870, + "narHash": "sha256-djcLt/JJphyNt4eDY9XTly+/WbCK5lqWq9lSgCmJkkQ=", + "rev": "18b9261cb3294b6d2a06d03f96872827b8fe2698", + "revCount": 1034379, "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.1017464%2Brev-567a49d1913ce81ac6e9582e3553dd90a955875f/019ed27e-44b2-7462-b1ef-3564aa6c28ee/source.tar.gz" + "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.1.1034379%2Brev-18b9261cb3294b6d2a06d03f96872827b8fe2698/019f6132-7d6a-7801-abb1-b4bf03703a37/source.tar.gz" }, "original": { "type": "tarball", @@ -58,11 +58,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1780260465, - "narHash": "sha256-yJIyzYb6LhvbVMmj2EH62Mt0JHU3pQefr+oPEgaoaI8=", + "lastModified": 1782864348, + "narHash": "sha256-NVYhLbaefeIUftPlo3kS6qr0xd8eFJRodEiaHrvFKR4=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "c5d30e2331acb2cec913a086ab242591f4f367a5", + "rev": "0d381ca097a8e0375a19387874d952c0a230ac4f", "type": "github" }, "original": { diff --git a/package-lock.json b/package-lock.json index e76eb2f..f8dbed7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,9 +34,9 @@ } }, "node_modules/@actions/cache": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-6.1.0.tgz", - "integrity": "sha512-LVqybSbzhBp2uAETOQ3HnVjXA4AcjavgMH+LCr+cjgO+PZfciv/1QAgoW+esXBaAhvDid+vXeV70GGJpAh4V5Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-6.2.0.tgz", + "integrity": "sha512-Nv0xWRmbxfDbAn/70flO/F6tj2Nv4XTYMAsQHiDFSojCDfso/Zni+fRKa14ToI9hnmOW/rQcY1WYb6wsM7Pgwg==", "license": "MIT", "dependencies": { "@actions/core": "^3.0.1", @@ -121,21 +121,21 @@ "license": "MIT" }, "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha512-fNAjWnA/nZ2jz31kxR/AqRaUT8ewHBw/WuBIosK0moMy1C9e5ValbDfFdIxJzVOOYaYkV/b2F1S4H/aHiqfVQg==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.11.0.tgz", + "integrity": "sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -143,13 +143,13 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-client": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.2.tgz", - "integrity": "sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.11.0.tgz", + "integrity": "sha512-JjQWO6akOck45PH/XBrxzsQGAiKrfFl4m5iggJ0ItMIz5omRufOXWpqCPpdjKN3vKDzlSUvFjaMb7Zwf0gvAdA==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -161,19 +161,19 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-http-compat": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.4.0.tgz", - "integrity": "sha512-f1P96IB399YiN2ARYHP7EpZi3Bf3wH4SN2lGzrw7JVwm7bbsVYtf2iKSBwTywD2P62NOPZGHFSZi+6jjb75JuA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.5.0.tgz", + "integrity": "sha512-BoSmXPx2er1Ai+wKlDvj29jIQespCNBwEmKyZVHO2kEFsWbGjAjwMCGzug3DJM5/QYIV3vej0S1zcU5bq9fa8w==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" }, "peerDependencies": { "@azure/core-client": "^1.10.0", @@ -196,21 +196,21 @@ } }, "node_modules/@azure/core-paging": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", - "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.7.0.tgz", + "integrity": "sha512-7GEAoIsaoBr6KELNRb8nypowCqvk8dnCHFCYg4XD4lOQGY2GqjQg5IhkRjyBFRO18CGSMq05PaNqSOE9GQro3g==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz", - "integrity": "sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.25.0.tgz", + "integrity": "sha512-bMs8ekJLjX8wPV+9IPBges1SLPyuDtE9g5gLDWOpxzKcoOFQnpLGkbcT1tdw3FaAmDS1gnPmMmJ6y/T5B96kIA==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -222,25 +222,25 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.4.0.tgz", + "integrity": "sha512-eGwxD0AtncrxeBM4tG8R55Pc3rdX1hNW2WibJAgYpCVA6E93mvvVH+LcssoVjOBrSKWS55yEIHsk0X8ctHmfOQ==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.14.0.tgz", + "integrity": "sha512-9n2pWK61veAuN0V20t9lOuoV4CFMdyAZ1ygZzvBGk/pBBJRib/PjL9PLXa/aI2CcPpyHfqVsxxqLCYl6uZlfDw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -248,39 +248,39 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/core-xml": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.5.1.tgz", - "integrity": "sha512-xcNRHqCoSp4AunOALEae6A8f3qATb83gSrm31Iqb01OzblvC3/W/bfXozcq78EzIdzZzuH1bZ2NvRR0TdX709w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.6.0.tgz", + "integrity": "sha512-e7lX/dk//F6Qf7BB6PTY4+p2yuOQtyOeHGyapYHNwqSp2OnYpwQt49A/Nin2XmKBQ69pwagR4k/lQBq8lbHQkA==", "license": "MIT", "dependencies": { "fast-xml-parser": "^5.5.9", "tslib": "^2.8.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.4.0.tgz", + "integrity": "sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==", "license": "MIT", "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/storage-blob": { - "version": "12.32.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.32.0.tgz", - "integrity": "sha512-80LzSNnFQye2LCCBFghAJS6jJQJ7N4bfgZ6qDMgVGRtugZ7TLDKQZ2hczMigmZH3jAcMRdma/IygsC5+0gT7Tw==", + "version": "12.33.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.33.0.tgz", + "integrity": "sha512-2SX8oP8PyblUcAFZSg39c8Ls+tFjavM6sBeV+qpw33mRzRhI/5hrFJmJ/x0H9xx5l6ECPvgSP8uPxqTeVbHNIA==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", @@ -294,24 +294,24 @@ "@azure/core-util": "^1.11.0", "@azure/core-xml": "^1.4.5", "@azure/logger": "^1.1.4", - "@azure/storage-common": "^12.4.0", + "@azure/storage-common": "^12.4.1", "events": "^3.0.0", "tslib": "^2.8.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@azure/storage-common": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/@azure/storage-common/-/storage-common-12.4.0.tgz", - "integrity": "sha512-kNhJKMxQb374KOVt63CZnGIpDcrKNzJeyANLJymxE9mCJSdRGzb+Iv9oSIiCj6tNMLypr530b9ObOiA/5OvwOg==", + "version": "12.4.1", + "resolved": "https://registry.npmjs.org/@azure/storage-common/-/storage-common-12.4.1.tgz", + "integrity": "sha512-t14unw/WofGDUi7TKJrsyXyPsN+NLgRm7hMaq0llxNmTIzt7f257+6LE6FKIJPh88zLj6M7LPvzve0fEYg/L3A==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-http-compat": "^2.2.0", - "@azure/core-rest-pipeline": "^1.19.1", + "@azure/core-rest-pipeline": "^1.24.0", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.1.4", @@ -1136,19 +1136,19 @@ } }, "node_modules/@eslint/compat": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.1.tgz", - "integrity": "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.1.0.tgz", + "integrity": "sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.17.0" + "@eslint/core": "^1.2.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "peerDependencies": { - "eslint": "^8.40 || 9" + "eslint": "^8.40 || 9 || 10" }, "peerDependenciesMeta": { "eslint": { @@ -1156,6 +1156,19 @@ } } }, + "node_modules/@eslint/compat/node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, "node_modules/@eslint/config-array": { "version": "0.21.2", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", @@ -1198,9 +1211,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { @@ -1210,7 +1223,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -1235,9 +1248,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", "engines": { @@ -1390,14 +1403,14 @@ "license": "MIT" }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.2" + "@tybys/wasm-util": "^0.10.3" }, "funding": { "type": "github", @@ -1521,9 +1534,9 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.10.tgz", - "integrity": "sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w==", + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.11.tgz", + "integrity": "sha512-+s7HUxjfFqOMS9VlIwDffq0MikjSAK0gSpG73W+meAvVAvX4MBrHYTK5Bj3Uot55qFT4gzUtfzE4mGWY4Br8/Q==", "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", @@ -1587,9 +1600,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.0.tgz", - "integrity": "sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", "cpu": [ "arm" ], @@ -1601,9 +1614,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.0.tgz", - "integrity": "sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", "cpu": [ "arm64" ], @@ -1615,9 +1628,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.0.tgz", - "integrity": "sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", "cpu": [ "arm64" ], @@ -1629,9 +1642,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.0.tgz", - "integrity": "sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", "cpu": [ "x64" ], @@ -1643,9 +1656,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.0.tgz", - "integrity": "sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", "cpu": [ "arm64" ], @@ -1657,9 +1670,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.0.tgz", - "integrity": "sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", "cpu": [ "x64" ], @@ -1671,9 +1684,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.0.tgz", - "integrity": "sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", "cpu": [ "arm" ], @@ -1688,9 +1701,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.0.tgz", - "integrity": "sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", "cpu": [ "arm" ], @@ -1705,9 +1718,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.0.tgz", - "integrity": "sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", "cpu": [ "arm64" ], @@ -1722,9 +1735,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.0.tgz", - "integrity": "sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", "cpu": [ "arm64" ], @@ -1739,9 +1752,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.0.tgz", - "integrity": "sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", "cpu": [ "loong64" ], @@ -1756,9 +1769,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.0.tgz", - "integrity": "sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", "cpu": [ "loong64" ], @@ -1773,9 +1786,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.0.tgz", - "integrity": "sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", "cpu": [ "ppc64" ], @@ -1790,9 +1803,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.0.tgz", - "integrity": "sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", "cpu": [ "ppc64" ], @@ -1807,9 +1820,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.0.tgz", - "integrity": "sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", "cpu": [ "riscv64" ], @@ -1824,9 +1837,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.0.tgz", - "integrity": "sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", "cpu": [ "riscv64" ], @@ -1841,9 +1854,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.0.tgz", - "integrity": "sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", "cpu": [ "s390x" ], @@ -1858,9 +1871,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.0.tgz", - "integrity": "sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", "cpu": [ "x64" ], @@ -1875,9 +1888,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.0.tgz", - "integrity": "sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", "cpu": [ "x64" ], @@ -1892,9 +1905,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.0.tgz", - "integrity": "sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", "cpu": [ "x64" ], @@ -1906,9 +1919,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.0.tgz", - "integrity": "sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", "cpu": [ "arm64" ], @@ -1920,9 +1933,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.0.tgz", - "integrity": "sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", "cpu": [ "arm64" ], @@ -1934,9 +1947,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.0.tgz", - "integrity": "sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", "cpu": [ "ia32" ], @@ -1948,9 +1961,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.0.tgz", - "integrity": "sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", "cpu": [ "x64" ], @@ -1962,9 +1975,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.0.tgz", - "integrity": "sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", "cpu": [ "x64" ], @@ -2025,9 +2038,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", "optional": true, @@ -2063,9 +2076,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2073,17 +2086,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", - "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.64.0.tgz", + "integrity": "sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.61.1", - "@typescript-eslint/type-utils": "8.61.1", - "@typescript-eslint/utils": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/type-utils": "8.64.0", + "@typescript-eslint/utils": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -2096,15 +2109,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.61.1", + "@typescript-eslint/parser": "^8.64.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -2112,16 +2125,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", - "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.64.0.tgz", + "integrity": "sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", "debug": "^4.4.3" }, "engines": { @@ -2137,14 +2150,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", - "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.64.0.tgz", + "integrity": "sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.1", - "@typescript-eslint/types": "^8.61.1", + "@typescript-eslint/tsconfig-utils": "^8.64.0", + "@typescript-eslint/types": "^8.64.0", "debug": "^4.4.3" }, "engines": { @@ -2159,14 +2172,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", - "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.64.0.tgz", + "integrity": "sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1" + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2177,9 +2190,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", - "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.64.0.tgz", + "integrity": "sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==", "dev": true, "license": "MIT", "engines": { @@ -2194,15 +2207,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", - "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.64.0.tgz", + "integrity": "sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1", - "@typescript-eslint/utils": "8.61.1", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0", + "@typescript-eslint/utils": "8.64.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -2219,9 +2232,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", - "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz", + "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==", "dev": true, "license": "MIT", "engines": { @@ -2233,16 +2246,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", - "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz", + "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.61.1", - "@typescript-eslint/tsconfig-utils": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", + "@typescript-eslint/project-service": "8.64.0", + "@typescript-eslint/tsconfig-utils": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2271,9 +2284,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", "dependencies": { @@ -2300,16 +2313,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", - "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.64.0.tgz", + "integrity": "sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1" + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2324,13 +2337,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", - "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.64.0.tgz", + "integrity": "sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/types": "8.64.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -2355,9 +2368,9 @@ } }, "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz", - "integrity": "sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.7.tgz", + "integrity": "sha512-JVUD8X2tfDMWjcjLs4yVxxVrS8yR5vnh386GAXT9Qj79nBxxXSaHFQZg5FweLmT8HlPQ3kii6noUB+Z9RN7DvQ==", "license": "MIT", "dependencies": { "http-proxy-agent": "^7.0.0", @@ -2365,7 +2378,7 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { @@ -3004,9 +3017,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.38", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", - "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "version": "2.10.43", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", + "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3023,9 +3036,9 @@ "license": "Apache-2.0" }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3033,9 +3046,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", "dev": true, "funding": [ { @@ -3053,10 +3066,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001803", + "electron-to-chromium": "^1.5.389", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -3201,9 +3214,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "version": "1.0.30001805", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", + "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", "dev": true, "funding": [ { @@ -3473,7 +3486,7 @@ }, "node_modules/detsys-ts": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/DeterminateSystems/detsys-ts.git#a8adb8b0de2504c7ac5c364bd318731fd1cf280f", + "resolved": "git+ssh://git@github.com/DeterminateSystems/detsys-ts.git#83c1d865da238ba23e9bab47366fd29183355272", "license": "MIT", "dependencies": { "@actions/cache": "^6.0.0", @@ -3512,9 +3525,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.375", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz", - "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==", + "version": "1.5.392", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.392.tgz", + "integrity": "sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==", "dev": true, "license": "ISC" }, @@ -3676,13 +3689,14 @@ } }, "node_modules/es-to-primitive": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.1.tgz", - "integrity": "sha512-CxN9N56HYfd2m/acc/NOFrZQsN9kU4eh+2kk6A707Kz1krH8tKmfrs5RnftB8WNX80T0NS7vSQsDOlg23diR2g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "is-callable": "^1.2.7", "is-date-object": "^1.1.0", @@ -3761,9 +3775,9 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", "dev": true, "license": "MIT", "dependencies": { @@ -3772,8 +3786,8 @@ "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3894,9 +3908,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", - "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -3981,13 +3995,13 @@ } }, "node_modules/eslint-plugin-github": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-6.0.0.tgz", - "integrity": "sha512-J8MvUoiR/TU/Y9NnEmg1AnbvMUj9R6IO260z47zymMLLvso7B4c80IKjd8diqmqtSmeXXlbIus4i0SvK84flag==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-6.1.1.tgz", + "integrity": "sha512-xCqu1S/s/CCvoRLafaXNvwiVrxhroNOFLGyG9Dhi4i1PWZgPHlipjXysH6wccPFQyhSKE7gAjSLqdSdM204bZQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint/compat": "^1.2.3", + "@eslint/compat": "^2.0.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.14.0", "@github/browserslist-config": "^1.0.0", @@ -4004,18 +4018,45 @@ "eslint-plugin-no-only-tests": "^3.0.0", "eslint-plugin-prettier": "^5.2.1", "eslint-rule-documentation": ">=1.0.0", - "globals": "^16.0.0", + "globals": "^17.7.0", "jsx-ast-utils": "^3.3.2", "prettier": "^3.0.0", "svg-element-attributes": "^1.3.1", - "typescript": "^5.7.3", + "typescript": "^6.0.3", "typescript-eslint": "^8.14.0" }, "bin": { "eslint-ignore-errors": "bin/eslint-ignore-errors.js" }, "peerDependencies": { - "eslint": "^8 || ^9" + "eslint": "^8 || ^9 || ^10" + } + }, + "node_modules/eslint-plugin-github/node_modules/globals": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-github/node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, "node_modules/eslint-plugin-i18n-text": { @@ -4321,9 +4362,9 @@ "license": "MIT" }, "node_modules/fast-xml-builder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", - "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", + "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", "funding": [ { "type": "github", @@ -4332,14 +4373,14 @@ ], "license": "MIT", "dependencies": { - "path-expression-matcher": "^1.5.0", - "xml-naming": "^0.1.0" + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" } }, "node_modules/fast-xml-parser": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.9.2.tgz", - "integrity": "sha512-DYPkXnVSJHAGAkSBeVYhEo/seIpz2SLr9OQcX7m6lXaX3gvoB+DCKzFdZIEhZGI3I1DUhObBAUOT/v2xfoXz/w==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.10.0.tgz", + "integrity": "sha512-SLhnTEqE5QpJHq/6zl9bsmImEP2adv+y6Wy+cJa7nVTRzQh1OZfCe9k29M5xN74LWnu0xa1zrUrq3KnOKl92Fg==", "funding": [ { "type": "github", @@ -4350,10 +4391,10 @@ "dependencies": { "@nodable/entities": "^2.2.0", "fast-xml-builder": "^1.2.0", - "is-unsafe": "^1.0.1", - "path-expression-matcher": "^1.5.0", - "strnum": "^2.4.0", - "xml-naming": "^0.1.0" + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.1", + "xml-naming": "^0.3.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -5289,9 +5330,9 @@ } }, "node_modules/is-unsafe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-1.0.1.tgz", - "integrity": "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz", + "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==", "funding": [ { "type": "github", @@ -5385,9 +5426,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, "funding": [ { @@ -5442,9 +5483,9 @@ "license": "MIT" }, "node_modules/json-with-bigint": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", - "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", + "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", "license": "MIT" }, "node_modules/json5": { @@ -5729,9 +5770,9 @@ "license": "MIT" }, "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", "dev": true, "license": "MIT", "dependencies": { @@ -5758,9 +5799,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.48", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", - "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, "license": "MIT", "engines": { @@ -6003,9 +6044,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", "funding": [ { "type": "github", @@ -6049,9 +6090,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { @@ -6147,9 +6188,9 @@ } }, "node_modules/prettier": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", - "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", "dev": true, "license": "MIT", "bin": { @@ -6321,9 +6362,9 @@ } }, "node_modules/rollup": { - "version": "4.62.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.0.tgz", - "integrity": "sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, "license": "MIT", "dependencies": { @@ -6337,31 +6378,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.0", - "@rollup/rollup-android-arm64": "4.62.0", - "@rollup/rollup-darwin-arm64": "4.62.0", - "@rollup/rollup-darwin-x64": "4.62.0", - "@rollup/rollup-freebsd-arm64": "4.62.0", - "@rollup/rollup-freebsd-x64": "4.62.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.0", - "@rollup/rollup-linux-arm-musleabihf": "4.62.0", - "@rollup/rollup-linux-arm64-gnu": "4.62.0", - "@rollup/rollup-linux-arm64-musl": "4.62.0", - "@rollup/rollup-linux-loong64-gnu": "4.62.0", - "@rollup/rollup-linux-loong64-musl": "4.62.0", - "@rollup/rollup-linux-ppc64-gnu": "4.62.0", - "@rollup/rollup-linux-ppc64-musl": "4.62.0", - "@rollup/rollup-linux-riscv64-gnu": "4.62.0", - "@rollup/rollup-linux-riscv64-musl": "4.62.0", - "@rollup/rollup-linux-s390x-gnu": "4.62.0", - "@rollup/rollup-linux-x64-gnu": "4.62.0", - "@rollup/rollup-linux-x64-musl": "4.62.0", - "@rollup/rollup-openbsd-x64": "4.62.0", - "@rollup/rollup-openharmony-arm64": "4.62.0", - "@rollup/rollup-win32-arm64-msvc": "4.62.0", - "@rollup/rollup-win32-ia32-msvc": "4.62.0", - "@rollup/rollup-win32-x64-gnu": "4.62.0", - "@rollup/rollup-win32-x64-msvc": "4.62.0", + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" } }, @@ -6421,9 +6462,9 @@ } }, "node_modules/semver": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", - "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7014,9 +7055,9 @@ } }, "node_modules/type-fest": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz", - "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -7121,16 +7162,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", - "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.64.0.tgz", + "integrity": "sha512-0qg+pDNMnqYzqH9AnNK+39tejHvsShUOUUoRUgtnTGE7QuMZhiFDnozq8nHJVq+Wae6NMLKNWLg5WmkcC/ndyQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.61.1", - "@typescript-eslint/parser": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1", - "@typescript-eslint/utils": "8.61.1" + "@typescript-eslint/eslint-plugin": "8.64.0", + "@typescript-eslint/parser": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0", + "@typescript-eslint/utils": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7387,9 +7428,9 @@ } }, "node_modules/xml-naming": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", "funding": [ { "type": "github",