From 068fe031ff84375304bd325845b47545a02fa174 Mon Sep 17 00:00:00 2001 From: Daniel Kennedy Date: Fri, 10 Apr 2026 10:53:08 -0400 Subject: [PATCH 1/3] Readme: bump all the example versions to v7 --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index fb59126..b708eb3 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ You are welcome to still raise bugs in this repo. ### Inputs ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: # Name of the artifact to upload. # Optional. Default is 'artifact' @@ -131,7 +131,7 @@ You are welcome to still raise bugs in this repo. steps: - run: mkdir -p path/to/artifact - run: echo hello > path/to/artifact/world.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/to/artifact/world.txt @@ -143,7 +143,7 @@ steps: steps: - run: mkdir -p path/to/artifact - run: echo hello > path/to/artifact/world.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: path: path/to/artifact/world.txt archive: false @@ -152,7 +152,7 @@ steps: ### Upload an Entire Directory ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/to/artifact/ # or path/to/artifact @@ -161,7 +161,7 @@ steps: ### Upload using a Wildcard Pattern ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/**/[abc]rtifac?/* @@ -170,7 +170,7 @@ steps: ### Upload using Multiple Paths and Exclusions ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: | @@ -218,7 +218,7 @@ For instance, if you are uploading random binary data, you can save a lot of tim - name: Make a 1GB random binary file run: | dd if=/dev/urandom of=my-1gb-file bs=1M count=1000 -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: my-1gb-file @@ -231,7 +231,7 @@ But, if you are uploading data that is easily compressed (like plaintext, code, - name: Make a file with a lot of repeated text run: | for i in {1..100000}; do echo -n 'foobar' >> foobar.txt; done -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: foobar.txt @@ -243,7 +243,7 @@ But, if you are uploading data that is easily compressed (like plaintext, code, If a path (or paths), result in no files being found for the artifact, the action will succeed but print out a warning. In certain scenarios it may be desirable to fail the action or suppress the warning. The `if-no-files-found` option allows you to customize the behavior of the action if no files are found: ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/to/artifact/ @@ -256,13 +256,13 @@ Unlike earlier versions of `upload-artifact`, uploading to the same artifact via ```yaml - run: echo hi > world.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: # implicitly named as 'artifact' path: world.txt - run: echo howdy > extra-file.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: # also implicitly named as 'artifact', will fail here! path: extra-file.txt @@ -288,7 +288,7 @@ jobs: - name: Build run: ./some-script --version=${{ matrix.version }} > my-binary - name: Upload - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: binary-${{ matrix.os }}-${{ matrix.version }} path: my-binary @@ -306,7 +306,7 @@ You can use `~` in the path input as a substitute for `$HOME`. Basic tilde expan - run: | mkdir -p ~/new/artifact echo hello > ~/new/artifact/world.txt - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: my-artifacts path: ~/new/**/* @@ -321,7 +321,7 @@ Environment variables along with context expressions can also be used for input. - run: | mkdir -p ${{ github.workspace }}/artifact echo hello > ${{ github.workspace }}/artifact/world.txt - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: ${{ env.name }}-name path: ${{ github.workspace }}/artifact/**/* @@ -335,7 +335,7 @@ For environment variables created in other steps, make sure to use the `env` exp mkdir testing echo "This is a file to upload" > testing/file.txt echo "artifactPath=testing/file.txt" >> $GITHUB_ENV - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: artifact path: ${{ env.artifactPath }} # this will resolve to testing/file.txt at runtime @@ -350,7 +350,7 @@ Artifacts are retained for 90 days by default. You can specify a shorter retenti run: echo "I won't live long" > my_file.txt - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: my-artifact path: my_file.txt @@ -366,7 +366,7 @@ If an artifact upload is successful then an `artifact-id` output is available. T #### Example output between steps ```yml - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 id: artifact-upload-step with: name: my-artifact @@ -385,7 +385,7 @@ jobs: outputs: output1: ${{ steps.artifact-upload-step.outputs.artifact-id }} steps: - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 id: artifact-upload-step with: name: my-artifact @@ -411,7 +411,7 @@ jobs: - name: Create a file run: echo "hello world" > my-file.txt - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: my-artifact # NOTE: same artifact name path: my-file.txt @@ -422,7 +422,7 @@ jobs: - name: Create a different file run: echo "goodbye world" > my-file.txt - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: my-artifact # NOTE: same artifact name path: my-file.txt @@ -438,7 +438,7 @@ Any files that contain sensitive information that should not be in the uploaded using the `path`: ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact include-hidden-files: true @@ -470,7 +470,7 @@ If you must preserve permissions, you can `tar` all of your files together befor run: tar -cvf my_files.tar /path/to/my/directory - name: 'Upload Artifact' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: path: my_files.tar archive: false From e454baaac2be505c9450e11b8f3215c6fc023ce8 Mon Sep 17 00:00:00 2001 From: Daniel Kennedy Date: Fri, 10 Apr 2026 10:55:51 -0400 Subject: [PATCH 2/3] Readme: bump all the example versions to v7 (#796) --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index fb59126..b708eb3 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ You are welcome to still raise bugs in this repo. ### Inputs ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: # Name of the artifact to upload. # Optional. Default is 'artifact' @@ -131,7 +131,7 @@ You are welcome to still raise bugs in this repo. steps: - run: mkdir -p path/to/artifact - run: echo hello > path/to/artifact/world.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/to/artifact/world.txt @@ -143,7 +143,7 @@ steps: steps: - run: mkdir -p path/to/artifact - run: echo hello > path/to/artifact/world.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: path: path/to/artifact/world.txt archive: false @@ -152,7 +152,7 @@ steps: ### Upload an Entire Directory ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/to/artifact/ # or path/to/artifact @@ -161,7 +161,7 @@ steps: ### Upload using a Wildcard Pattern ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/**/[abc]rtifac?/* @@ -170,7 +170,7 @@ steps: ### Upload using Multiple Paths and Exclusions ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: | @@ -218,7 +218,7 @@ For instance, if you are uploading random binary data, you can save a lot of tim - name: Make a 1GB random binary file run: | dd if=/dev/urandom of=my-1gb-file bs=1M count=1000 -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: my-1gb-file @@ -231,7 +231,7 @@ But, if you are uploading data that is easily compressed (like plaintext, code, - name: Make a file with a lot of repeated text run: | for i in {1..100000}; do echo -n 'foobar' >> foobar.txt; done -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: foobar.txt @@ -243,7 +243,7 @@ But, if you are uploading data that is easily compressed (like plaintext, code, If a path (or paths), result in no files being found for the artifact, the action will succeed but print out a warning. In certain scenarios it may be desirable to fail the action or suppress the warning. The `if-no-files-found` option allows you to customize the behavior of the action if no files are found: ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact path: path/to/artifact/ @@ -256,13 +256,13 @@ Unlike earlier versions of `upload-artifact`, uploading to the same artifact via ```yaml - run: echo hi > world.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: # implicitly named as 'artifact' path: world.txt - run: echo howdy > extra-file.txt -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: # also implicitly named as 'artifact', will fail here! path: extra-file.txt @@ -288,7 +288,7 @@ jobs: - name: Build run: ./some-script --version=${{ matrix.version }} > my-binary - name: Upload - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: binary-${{ matrix.os }}-${{ matrix.version }} path: my-binary @@ -306,7 +306,7 @@ You can use `~` in the path input as a substitute for `$HOME`. Basic tilde expan - run: | mkdir -p ~/new/artifact echo hello > ~/new/artifact/world.txt - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: my-artifacts path: ~/new/**/* @@ -321,7 +321,7 @@ Environment variables along with context expressions can also be used for input. - run: | mkdir -p ${{ github.workspace }}/artifact echo hello > ${{ github.workspace }}/artifact/world.txt - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: ${{ env.name }}-name path: ${{ github.workspace }}/artifact/**/* @@ -335,7 +335,7 @@ For environment variables created in other steps, make sure to use the `env` exp mkdir testing echo "This is a file to upload" > testing/file.txt echo "artifactPath=testing/file.txt" >> $GITHUB_ENV - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: artifact path: ${{ env.artifactPath }} # this will resolve to testing/file.txt at runtime @@ -350,7 +350,7 @@ Artifacts are retained for 90 days by default. You can specify a shorter retenti run: echo "I won't live long" > my_file.txt - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: my-artifact path: my_file.txt @@ -366,7 +366,7 @@ If an artifact upload is successful then an `artifact-id` output is available. T #### Example output between steps ```yml - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 id: artifact-upload-step with: name: my-artifact @@ -385,7 +385,7 @@ jobs: outputs: output1: ${{ steps.artifact-upload-step.outputs.artifact-id }} steps: - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 id: artifact-upload-step with: name: my-artifact @@ -411,7 +411,7 @@ jobs: - name: Create a file run: echo "hello world" > my-file.txt - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: my-artifact # NOTE: same artifact name path: my-file.txt @@ -422,7 +422,7 @@ jobs: - name: Create a different file run: echo "goodbye world" > my-file.txt - name: Upload Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: my-artifact # NOTE: same artifact name path: my-file.txt @@ -438,7 +438,7 @@ Any files that contain sensitive information that should not be in the uploaded using the `path`: ```yaml -- uses: actions/upload-artifact@v4 +- uses: actions/upload-artifact@v7 with: name: my-artifact include-hidden-files: true @@ -470,7 +470,7 @@ If you must preserve permissions, you can `tar` all of your files together befor run: tar -cvf my_files.tar /path/to/my/directory - name: 'Upload Artifact' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: path: my_files.tar archive: false From 634250c1388765ea7ed0f053e636f1f399000b94 Mon Sep 17 00:00:00 2001 From: Yang Cao Date: Fri, 10 Apr 2026 11:58:04 -0400 Subject: [PATCH 3/3] Include changes in typespec/ts-http-runtime 0.3.5 --- dist/merge/index.js | 180 ++++++++++++++++++++++++------------------- dist/upload/index.js | 180 ++++++++++++++++++++++++------------------- package-lock.json | 10 +-- package.json | 2 +- 4 files changed, 206 insertions(+), 166 deletions(-) diff --git a/dist/merge/index.js b/dist/merge/index.js index 3b522d4..bf6f202 100644 --- a/dist/merge/index.js +++ b/dist/merge/index.js @@ -88021,13 +88021,13 @@ class Sanitizer { message: value.message, }; } - if (key === "headers") { + if (key === "headers" && isObject(value)) { return this.sanitizeHeaders(value); } - else if (key === "url") { + else if (key === "url" && typeof value === "string") { return this.sanitizeUrl(value); } - else if (key === "query") { + else if (key === "query" && isObject(value)) { return this.sanitizeQuery(value); } else if (key === "body") { @@ -88598,6 +88598,68 @@ function logPolicy_logPolicy(options = {}) { }; } //# sourceMappingURL=logPolicy.js.map +;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/redirectPolicy.js +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * The programmatic identifier of the redirectPolicy. + */ +const redirectPolicyName = "redirectPolicy"; +/** + * Methods that are allowed to follow redirects 301 and 302 + */ +const allowedRedirect = ["GET", "HEAD"]; +/** + * A policy to follow Location headers from the server in order + * to support server-side redirection. + * In the browser, this policy is not used. + * @param options - Options to control policy behavior. + */ +function redirectPolicy_redirectPolicy(options = {}) { + const { maxRetries = 20, allowCrossOriginRedirects = false } = options; + return { + name: redirectPolicyName, + async sendRequest(request, next) { + const response = await next(request); + return handleRedirect(next, response, maxRetries, allowCrossOriginRedirects); + }, + }; +} +async function handleRedirect(next, response, maxRetries, allowCrossOriginRedirects, currentRetries = 0) { + const { request, status, headers } = response; + const locationHeader = headers.get("location"); + if (locationHeader && + (status === 300 || + (status === 301 && allowedRedirect.includes(request.method)) || + (status === 302 && allowedRedirect.includes(request.method)) || + (status === 303 && request.method === "POST") || + status === 307) && + currentRetries < maxRetries) { + const url = new URL(locationHeader, request.url); + // Only follow redirects to the same origin by default. + if (!allowCrossOriginRedirects) { + const originalUrl = new URL(request.url); + if (url.origin !== originalUrl.origin) { + log_logger.verbose(`Skipping cross-origin redirect from ${originalUrl.origin} to ${url.origin}.`); + return response; + } + } + request.url = url.toString(); + // POST request with Status code 303 should be converted into a + // redirected GET request if the redirect url is present in the location header + if (status === 303) { + request.method = "GET"; + request.headers.delete("Content-Length"); + delete request.body; + } + request.headers.delete("Authorization"); + const res = await next(request); + return handleRedirect(next, res, maxRetries, allowCrossOriginRedirects, currentRetries + 1); + } + return response; +} +//# sourceMappingURL=redirectPolicy.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/userAgentPlatform.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. @@ -88615,15 +88677,14 @@ function getHeaderName() { async function userAgentPlatform_setPlatformSpecificData(map) { if (process && process.versions) { const osInfo = `${os.type()} ${os.release()}; ${os.arch()}`; - const versions = process.versions; - if (versions.bun) { - map.set("Bun", `${versions.bun} (${osInfo})`); + if (process.versions.bun) { + map.set("Bun", `${process.versions.bun} (${osInfo})`); } - else if (versions.deno) { - map.set("Deno", `${versions.deno} (${osInfo})`); + else if (process.versions.deno) { + map.set("Deno", `${process.versions.deno} (${osInfo})`); } - else if (versions.node) { - map.set("Node", `${versions.node} (${osInfo})`); + else if (process.versions.node) { + map.set("Node", `${process.versions.node} (${osInfo})`); } } } @@ -88930,7 +88991,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.3"; +const constants_SDK_VERSION = "0.3.5"; const constants_DEFAULT_RETRY_POLICY_COUNT = 3; //# sourceMappingURL=constants.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/retryPolicy.js @@ -88940,6 +89001,7 @@ const constants_DEFAULT_RETRY_POLICY_COUNT = 3; + const retryPolicyLogger = createClientLogger("ts-http-runtime retryPolicy"); /** * The programmatic identifier of the retryPolicy. @@ -88970,11 +89032,11 @@ function retryPolicy_retryPolicy(strategies, options = { maxRetries: constants_D // RestErrors are valid targets for the retry strategies. // If none of the retry strategies can work with them, they will be thrown later in this policy. // If the received error is not a RestError, it is immediately thrown. - responseError = e; - if (!e || responseError.name !== "RestError") { + if (!restError_isRestError(e)) { throw e; } - response = responseError.response; + responseError = e; + response = e.response; } if (request.abortSignal?.aborted) { logger.error(`Retry ${retryCount}: Request aborted.`); @@ -89375,16 +89437,15 @@ function setProxyAgentOnRequest(request, cachedAgents, proxyUrl) { if (request.tlsSettings) { log_logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored."); } - const headers = request.headers.toJSON(); if (isInsecure) { if (!cachedAgents.httpProxyAgent) { - cachedAgents.httpProxyAgent = new http_proxy_agent_dist.HttpProxyAgent(proxyUrl, { headers }); + cachedAgents.httpProxyAgent = new http_proxy_agent_dist.HttpProxyAgent(proxyUrl); } request.agent = cachedAgents.httpProxyAgent; } else { if (!cachedAgents.httpsProxyAgent) { - cachedAgents.httpsProxyAgent = new dist.HttpsProxyAgent(proxyUrl, { headers }); + cachedAgents.httpsProxyAgent = new dist.HttpsProxyAgent(proxyUrl); } request.agent = cachedAgents.httpsProxyAgent; } @@ -89436,13 +89497,13 @@ function typeGuards_isBinaryBody(body) { (body instanceof Uint8Array || typeGuards_isReadableStream(body) || typeof body === "function" || - body instanceof Blob)); + (typeof Blob !== "undefined" && body instanceof Blob))); } function typeGuards_isReadableStream(x) { return isNodeReadableStream(x) || isWebReadableStream(x); } -function isBlob(x) { - return typeof x.stream === "function"; +function typeGuards_isBlob(x) { + return typeof Blob !== "undefined" && x instanceof Blob; } //# sourceMappingURL=typeGuards.js.map // EXTERNAL MODULE: external "stream" @@ -89488,7 +89549,7 @@ function toStream(source) { if (source instanceof Uint8Array) { return external_stream_.Readable.from(Buffer.from(source)); } - else if (isBlob(source)) { + else if (typeGuards_isBlob(source)) { return ensureNodeStream(source.stream()); } else { @@ -89538,7 +89599,7 @@ function getLength(source) { if (source instanceof Uint8Array) { return source.byteLength; } - else if (isBlob(source)) { + else if (typeGuards_isBlob(source)) { // if was created using createFile then -1 means we have an unknown size return source.size === -1 ? undefined : source.size; } @@ -90067,9 +90128,14 @@ async function sendRequest_sendRequest(method, url, pipeline, options = {}, cust * @returns returns the content-type */ function getRequestContentType(options = {}) { - return (options.contentType ?? - options.headers?.["content-type"] ?? - getContentType(options.body)); + if (options.contentType) { + return options.contentType; + } + const headerContentType = options.headers?.["content-type"]; + if (typeof headerContentType === "string") { + return headerContentType; + } + return getContentType(options.body); } /** * Function to determine the content-type of a body @@ -90084,6 +90150,9 @@ function getContentType(body) { if (ArrayBuffer.isView(body)) { return "application/octet-stream"; } + if (isBlob(body) && body.type) { + return body.type; + } if (typeof body === "string") { try { JSON.parse(body); @@ -90134,9 +90203,15 @@ function getRequestBody(body, contentType = "") { if (typeof FormData !== "undefined" && body instanceof FormData) { return { body }; } + if (isBlob(body)) { + return { body }; + } if (isReadableStream(body)) { return { body }; } + if (typeof body === "function") { + return { body: body }; + } if (ArrayBuffer.isView(body)) { return { body: body instanceof Uint8Array ? body : JSON.stringify(body) }; } @@ -90326,8 +90401,6 @@ function statusCodeToNumber(statusCode) { - - //# sourceMappingURL=index.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/pipeline.js // Copyright (c) Microsoft Corporation. @@ -90524,59 +90597,6 @@ function throttlingRetryPolicy(options = {}) { }; } //# sourceMappingURL=throttlingRetryPolicy.js.map -;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/redirectPolicy.js -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -/** - * The programmatic identifier of the redirectPolicy. - */ -const redirectPolicyName = "redirectPolicy"; -/** - * Methods that are allowed to follow redirects 301 and 302 - */ -const allowedRedirect = ["GET", "HEAD"]; -/** - * A policy to follow Location headers from the server in order - * to support server-side redirection. - * In the browser, this policy is not used. - * @param options - Options to control policy behavior. - */ -function redirectPolicy_redirectPolicy(options = {}) { - const { maxRetries = 20 } = options; - return { - name: redirectPolicyName, - async sendRequest(request, next) { - const response = await next(request); - return handleRedirect(next, response, maxRetries); - }, - }; -} -async function handleRedirect(next, response, maxRetries, currentRetries = 0) { - const { request, status, headers } = response; - const locationHeader = headers.get("location"); - if (locationHeader && - (status === 300 || - (status === 301 && allowedRedirect.includes(request.method)) || - (status === 302 && allowedRedirect.includes(request.method)) || - (status === 303 && request.method === "POST") || - status === 307) && - currentRetries < maxRetries) { - const url = new URL(locationHeader, request.url); - request.url = url.toString(); - // POST request with Status code 303 should be converted into a - // redirected GET request if the redirect url is present in the location header - if (status === 303) { - request.method = "GET"; - request.headers.delete("Content-Length"); - delete request.body; - } - request.headers.delete("Authorization"); - const res = await next(request); - return handleRedirect(next, res, maxRetries, currentRetries + 1); - } - return response; -} -//# sourceMappingURL=redirectPolicy.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/tlsPolicy.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. diff --git a/dist/upload/index.js b/dist/upload/index.js index a4ca651..a36d775 100644 --- a/dist/upload/index.js +++ b/dist/upload/index.js @@ -85596,13 +85596,13 @@ class Sanitizer { message: value.message, }; } - if (key === "headers") { + if (key === "headers" && isObject(value)) { return this.sanitizeHeaders(value); } - else if (key === "url") { + else if (key === "url" && typeof value === "string") { return this.sanitizeUrl(value); } - else if (key === "query") { + else if (key === "query" && isObject(value)) { return this.sanitizeQuery(value); } else if (key === "body") { @@ -86173,6 +86173,68 @@ function logPolicy_logPolicy(options = {}) { }; } //# sourceMappingURL=logPolicy.js.map +;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/redirectPolicy.js +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * The programmatic identifier of the redirectPolicy. + */ +const redirectPolicyName = "redirectPolicy"; +/** + * Methods that are allowed to follow redirects 301 and 302 + */ +const allowedRedirect = ["GET", "HEAD"]; +/** + * A policy to follow Location headers from the server in order + * to support server-side redirection. + * In the browser, this policy is not used. + * @param options - Options to control policy behavior. + */ +function redirectPolicy_redirectPolicy(options = {}) { + const { maxRetries = 20, allowCrossOriginRedirects = false } = options; + return { + name: redirectPolicyName, + async sendRequest(request, next) { + const response = await next(request); + return handleRedirect(next, response, maxRetries, allowCrossOriginRedirects); + }, + }; +} +async function handleRedirect(next, response, maxRetries, allowCrossOriginRedirects, currentRetries = 0) { + const { request, status, headers } = response; + const locationHeader = headers.get("location"); + if (locationHeader && + (status === 300 || + (status === 301 && allowedRedirect.includes(request.method)) || + (status === 302 && allowedRedirect.includes(request.method)) || + (status === 303 && request.method === "POST") || + status === 307) && + currentRetries < maxRetries) { + const url = new URL(locationHeader, request.url); + // Only follow redirects to the same origin by default. + if (!allowCrossOriginRedirects) { + const originalUrl = new URL(request.url); + if (url.origin !== originalUrl.origin) { + log_logger.verbose(`Skipping cross-origin redirect from ${originalUrl.origin} to ${url.origin}.`); + return response; + } + } + request.url = url.toString(); + // POST request with Status code 303 should be converted into a + // redirected GET request if the redirect url is present in the location header + if (status === 303) { + request.method = "GET"; + request.headers.delete("Content-Length"); + delete request.body; + } + request.headers.delete("Authorization"); + const res = await next(request); + return handleRedirect(next, res, maxRetries, allowCrossOriginRedirects, currentRetries + 1); + } + return response; +} +//# sourceMappingURL=redirectPolicy.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/util/userAgentPlatform.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. @@ -86190,15 +86252,14 @@ function getHeaderName() { async function userAgentPlatform_setPlatformSpecificData(map) { if (process && process.versions) { const osInfo = `${os.type()} ${os.release()}; ${os.arch()}`; - const versions = process.versions; - if (versions.bun) { - map.set("Bun", `${versions.bun} (${osInfo})`); + if (process.versions.bun) { + map.set("Bun", `${process.versions.bun} (${osInfo})`); } - else if (versions.deno) { - map.set("Deno", `${versions.deno} (${osInfo})`); + else if (process.versions.deno) { + map.set("Deno", `${process.versions.deno} (${osInfo})`); } - else if (versions.node) { - map.set("Node", `${versions.node} (${osInfo})`); + else if (process.versions.node) { + map.set("Node", `${process.versions.node} (${osInfo})`); } } } @@ -86505,7 +86566,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.3"; +const constants_SDK_VERSION = "0.3.5"; const constants_DEFAULT_RETRY_POLICY_COUNT = 3; //# sourceMappingURL=constants.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/retryPolicy.js @@ -86515,6 +86576,7 @@ const constants_DEFAULT_RETRY_POLICY_COUNT = 3; + const retryPolicyLogger = createClientLogger("ts-http-runtime retryPolicy"); /** * The programmatic identifier of the retryPolicy. @@ -86545,11 +86607,11 @@ function retryPolicy_retryPolicy(strategies, options = { maxRetries: constants_D // RestErrors are valid targets for the retry strategies. // If none of the retry strategies can work with them, they will be thrown later in this policy. // If the received error is not a RestError, it is immediately thrown. - responseError = e; - if (!e || responseError.name !== "RestError") { + if (!restError_isRestError(e)) { throw e; } - response = responseError.response; + responseError = e; + response = e.response; } if (request.abortSignal?.aborted) { logger.error(`Retry ${retryCount}: Request aborted.`); @@ -86950,16 +87012,15 @@ function setProxyAgentOnRequest(request, cachedAgents, proxyUrl) { if (request.tlsSettings) { log_logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored."); } - const headers = request.headers.toJSON(); if (isInsecure) { if (!cachedAgents.httpProxyAgent) { - cachedAgents.httpProxyAgent = new http_proxy_agent_dist.HttpProxyAgent(proxyUrl, { headers }); + cachedAgents.httpProxyAgent = new http_proxy_agent_dist.HttpProxyAgent(proxyUrl); } request.agent = cachedAgents.httpProxyAgent; } else { if (!cachedAgents.httpsProxyAgent) { - cachedAgents.httpsProxyAgent = new dist.HttpsProxyAgent(proxyUrl, { headers }); + cachedAgents.httpsProxyAgent = new dist.HttpsProxyAgent(proxyUrl); } request.agent = cachedAgents.httpsProxyAgent; } @@ -87011,13 +87072,13 @@ function typeGuards_isBinaryBody(body) { (body instanceof Uint8Array || typeGuards_isReadableStream(body) || typeof body === "function" || - body instanceof Blob)); + (typeof Blob !== "undefined" && body instanceof Blob))); } function typeGuards_isReadableStream(x) { return isNodeReadableStream(x) || isWebReadableStream(x); } -function isBlob(x) { - return typeof x.stream === "function"; +function typeGuards_isBlob(x) { + return typeof Blob !== "undefined" && x instanceof Blob; } //# sourceMappingURL=typeGuards.js.map // EXTERNAL MODULE: external "stream" @@ -87063,7 +87124,7 @@ function toStream(source) { if (source instanceof Uint8Array) { return external_stream_.Readable.from(Buffer.from(source)); } - else if (isBlob(source)) { + else if (typeGuards_isBlob(source)) { return ensureNodeStream(source.stream()); } else { @@ -87113,7 +87174,7 @@ function getLength(source) { if (source instanceof Uint8Array) { return source.byteLength; } - else if (isBlob(source)) { + else if (typeGuards_isBlob(source)) { // if was created using createFile then -1 means we have an unknown size return source.size === -1 ? undefined : source.size; } @@ -87642,9 +87703,14 @@ async function sendRequest_sendRequest(method, url, pipeline, options = {}, cust * @returns returns the content-type */ function getRequestContentType(options = {}) { - return (options.contentType ?? - options.headers?.["content-type"] ?? - getContentType(options.body)); + if (options.contentType) { + return options.contentType; + } + const headerContentType = options.headers?.["content-type"]; + if (typeof headerContentType === "string") { + return headerContentType; + } + return getContentType(options.body); } /** * Function to determine the content-type of a body @@ -87659,6 +87725,9 @@ function getContentType(body) { if (ArrayBuffer.isView(body)) { return "application/octet-stream"; } + if (isBlob(body) && body.type) { + return body.type; + } if (typeof body === "string") { try { JSON.parse(body); @@ -87709,9 +87778,15 @@ function getRequestBody(body, contentType = "") { if (typeof FormData !== "undefined" && body instanceof FormData) { return { body }; } + if (isBlob(body)) { + return { body }; + } if (isReadableStream(body)) { return { body }; } + if (typeof body === "function") { + return { body: body }; + } if (ArrayBuffer.isView(body)) { return { body: body instanceof Uint8Array ? body : JSON.stringify(body) }; } @@ -87901,8 +87976,6 @@ function statusCodeToNumber(statusCode) { - - //# sourceMappingURL=index.js.map ;// CONCATENATED MODULE: ./node_modules/@azure/core-rest-pipeline/dist/esm/pipeline.js // Copyright (c) Microsoft Corporation. @@ -88099,59 +88172,6 @@ function throttlingRetryPolicy(options = {}) { }; } //# sourceMappingURL=throttlingRetryPolicy.js.map -;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/redirectPolicy.js -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -/** - * The programmatic identifier of the redirectPolicy. - */ -const redirectPolicyName = "redirectPolicy"; -/** - * Methods that are allowed to follow redirects 301 and 302 - */ -const allowedRedirect = ["GET", "HEAD"]; -/** - * A policy to follow Location headers from the server in order - * to support server-side redirection. - * In the browser, this policy is not used. - * @param options - Options to control policy behavior. - */ -function redirectPolicy_redirectPolicy(options = {}) { - const { maxRetries = 20 } = options; - return { - name: redirectPolicyName, - async sendRequest(request, next) { - const response = await next(request); - return handleRedirect(next, response, maxRetries); - }, - }; -} -async function handleRedirect(next, response, maxRetries, currentRetries = 0) { - const { request, status, headers } = response; - const locationHeader = headers.get("location"); - if (locationHeader && - (status === 300 || - (status === 301 && allowedRedirect.includes(request.method)) || - (status === 302 && allowedRedirect.includes(request.method)) || - (status === 303 && request.method === "POST") || - status === 307) && - currentRetries < maxRetries) { - const url = new URL(locationHeader, request.url); - request.url = url.toString(); - // POST request with Status code 303 should be converted into a - // redirected GET request if the redirect url is present in the location header - if (status === 303) { - request.method = "GET"; - request.headers.delete("Content-Length"); - delete request.body; - } - request.headers.delete("Authorization"); - const res = await next(request); - return handleRedirect(next, res, maxRetries, currentRetries + 1); - } - return response; -} -//# sourceMappingURL=redirectPolicy.js.map ;// CONCATENATED MODULE: ./node_modules/@typespec/ts-http-runtime/dist/esm/policies/tlsPolicy.js // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. diff --git a/package-lock.json b/package-lock.json index 5739b1d..7b5e877 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "upload-artifact", - "version": "7.0.0", + "version": "7.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "upload-artifact", - "version": "7.0.0", + "version": "7.0.1", "license": "MIT", "dependencies": { "@actions/artifact": "^6.2.0", @@ -2477,9 +2477,9 @@ } }, "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.3.tgz", - "integrity": "sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.5.tgz", + "integrity": "sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==", "license": "MIT", "dependencies": { "http-proxy-agent": "^7.0.0", diff --git a/package.json b/package.json index b71533f..73f7754 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "upload-artifact", - "version": "7.0.0", + "version": "7.0.1", "description": "Upload an Actions Artifact in a workflow run", "type": "module", "main": "dist/upload/index.js",