mirror of
				https://gitea.com/actions/cache.git
				synced 2025-11-02 07:47:08 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			bishal/out
			...
			kotewar/ad
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7ce827153b | ||
| 
						 | 
					fb86cbf360 | 
@@ -1,14 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "Node.js & TypeScript",
 | 
			
		||||
	"image": "mcr.microsoft.com/devcontainers/typescript-node:16-bullseye",
 | 
			
		||||
	// Features to add to the dev container. More info: https://containers.dev/implementors/features.
 | 
			
		||||
	// "features": {},
 | 
			
		||||
	// Use 'forwardPorts' to make a list of ports inside the container available locally.
 | 
			
		||||
	// "forwardPorts": [],
 | 
			
		||||
	// Use 'postCreateCommand' to run commands after the container is created.
 | 
			
		||||
	"postCreateCommand": "npm install && npm run build"
 | 
			
		||||
	// Configure tool-specific properties.
 | 
			
		||||
	// "customizations": {},
 | 
			
		||||
	// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
 | 
			
		||||
	// "remoteUser": "root"
 | 
			
		||||
}
 | 
			
		||||
@@ -102,7 +102,7 @@ test("restore on GHES with AC available ", async () => {
 | 
			
		||||
    const infoMock = jest.spyOn(core, "info");
 | 
			
		||||
    const failedMock = jest.spyOn(core, "setFailed");
 | 
			
		||||
    const stateMock = jest.spyOn(core, "saveState");
 | 
			
		||||
    const setCacheHitOutputMock = jest.spyOn(core, "setOutput");
 | 
			
		||||
    const setCacheHitOutputMock = jest.spyOn(actionUtils, "setCacheHitOutput");
 | 
			
		||||
    const restoreCacheMock = jest
 | 
			
		||||
        .spyOn(cache, "restoreCache")
 | 
			
		||||
        .mockImplementationOnce(() => {
 | 
			
		||||
@@ -116,7 +116,7 @@ test("restore on GHES with AC available ", async () => {
 | 
			
		||||
 | 
			
		||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith(true);
 | 
			
		||||
 | 
			
		||||
    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
			
		||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
			
		||||
@@ -270,7 +270,7 @@ test("restore with cache found for key", async () => {
 | 
			
		||||
    const infoMock = jest.spyOn(core, "info");
 | 
			
		||||
    const failedMock = jest.spyOn(core, "setFailed");
 | 
			
		||||
    const stateMock = jest.spyOn(core, "saveState");
 | 
			
		||||
    const setCacheHitOutputMock = jest.spyOn(core, "setOutput");
 | 
			
		||||
    const setCacheHitOutputMock = jest.spyOn(actionUtils, "setCacheHitOutput");
 | 
			
		||||
    const restoreCacheMock = jest
 | 
			
		||||
        .spyOn(cache, "restoreCache")
 | 
			
		||||
        .mockImplementationOnce(() => {
 | 
			
		||||
@@ -284,7 +284,7 @@ test("restore with cache found for key", async () => {
 | 
			
		||||
 | 
			
		||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true");
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith(true);
 | 
			
		||||
 | 
			
		||||
    expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`);
 | 
			
		||||
    expect(failedMock).toHaveBeenCalledTimes(0);
 | 
			
		||||
@@ -303,7 +303,7 @@ test("restore with cache found for restore key", async () => {
 | 
			
		||||
    const infoMock = jest.spyOn(core, "info");
 | 
			
		||||
    const failedMock = jest.spyOn(core, "setFailed");
 | 
			
		||||
    const stateMock = jest.spyOn(core, "saveState");
 | 
			
		||||
    const setCacheHitOutputMock = jest.spyOn(core, "setOutput");
 | 
			
		||||
    const setCacheHitOutputMock = jest.spyOn(actionUtils, "setCacheHitOutput");
 | 
			
		||||
    const restoreCacheMock = jest
 | 
			
		||||
        .spyOn(cache, "restoreCache")
 | 
			
		||||
        .mockImplementationOnce(() => {
 | 
			
		||||
@@ -317,7 +317,8 @@ test("restore with cache found for restore key", async () => {
 | 
			
		||||
 | 
			
		||||
    expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key);
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1);
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false");
 | 
			
		||||
    expect(setCacheHitOutputMock).toHaveBeenCalledWith(false);
 | 
			
		||||
 | 
			
		||||
    expect(infoMock).toHaveBeenCalledWith(
 | 
			
		||||
        `Cache restored from key: ${restoreKey}`
 | 
			
		||||
    );
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ runs:
 | 
			
		||||
  using: 'node16'
 | 
			
		||||
  main: 'dist/restore/index.js'
 | 
			
		||||
  post: 'dist/save/index.js'
 | 
			
		||||
  post-if: success()
 | 
			
		||||
  post-if: 'success()'
 | 
			
		||||
branding:
 | 
			
		||||
  icon: 'archive'
 | 
			
		||||
  color: 'gray-dark'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1372
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1372
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										669
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										669
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							@@ -3046,19 +3046,18 @@ exports.default = _default;
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 105 */,
 | 
			
		||||
/* 106 */
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
/***/ (function(__unusedmodule, exports) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, '__esModule', { value: true });
 | 
			
		||||
 | 
			
		||||
var tslib = __webpack_require__(640);
 | 
			
		||||
 | 
			
		||||
// Copyright (c) Microsoft Corporation.
 | 
			
		||||
// Licensed under the MIT license.
 | 
			
		||||
var listenersMap = new WeakMap();
 | 
			
		||||
var abortedMap = new WeakMap();
 | 
			
		||||
/// <reference path="../shims-public.d.ts" />
 | 
			
		||||
const listenersMap = new WeakMap();
 | 
			
		||||
const abortedMap = new WeakMap();
 | 
			
		||||
/**
 | 
			
		||||
 * An aborter instance implements AbortSignal interface, can abort HTTP requests.
 | 
			
		||||
 *
 | 
			
		||||
@@ -3072,8 +3071,8 @@ var abortedMap = new WeakMap();
 | 
			
		||||
 * await doAsyncWork(AbortSignal.none);
 | 
			
		||||
 * ```
 | 
			
		||||
 */
 | 
			
		||||
var AbortSignal = /** @class */ (function () {
 | 
			
		||||
    function AbortSignal() {
 | 
			
		||||
class AbortSignal {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        /**
 | 
			
		||||
         * onabort event listener.
 | 
			
		||||
         */
 | 
			
		||||
@@ -3081,74 +3080,65 @@ var AbortSignal = /** @class */ (function () {
 | 
			
		||||
        listenersMap.set(this, []);
 | 
			
		||||
        abortedMap.set(this, false);
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(AbortSignal.prototype, "aborted", {
 | 
			
		||||
    /**
 | 
			
		||||
     * Status of whether aborted or not.
 | 
			
		||||
     *
 | 
			
		||||
     * @readonly
 | 
			
		||||
     */
 | 
			
		||||
        get: function () {
 | 
			
		||||
    get aborted() {
 | 
			
		||||
        if (!abortedMap.has(this)) {
 | 
			
		||||
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
 | 
			
		||||
        }
 | 
			
		||||
        return abortedMap.get(this);
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        configurable: true
 | 
			
		||||
    });
 | 
			
		||||
    Object.defineProperty(AbortSignal, "none", {
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new AbortSignal instance that will never be aborted.
 | 
			
		||||
     *
 | 
			
		||||
     * @readonly
 | 
			
		||||
     */
 | 
			
		||||
        get: function () {
 | 
			
		||||
    static get none() {
 | 
			
		||||
        return new AbortSignal();
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        configurable: true
 | 
			
		||||
    });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Added new "abort" event listener, only support "abort" event.
 | 
			
		||||
     *
 | 
			
		||||
     * @param _type - Only support "abort" event
 | 
			
		||||
     * @param listener - The listener to be added
 | 
			
		||||
     */
 | 
			
		||||
    AbortSignal.prototype.addEventListener = function (
 | 
			
		||||
    addEventListener(
 | 
			
		||||
    // tslint:disable-next-line:variable-name
 | 
			
		||||
    _type, listener) {
 | 
			
		||||
        if (!listenersMap.has(this)) {
 | 
			
		||||
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
 | 
			
		||||
        }
 | 
			
		||||
        var listeners = listenersMap.get(this);
 | 
			
		||||
        const listeners = listenersMap.get(this);
 | 
			
		||||
        listeners.push(listener);
 | 
			
		||||
    };
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove "abort" event listener, only support "abort" event.
 | 
			
		||||
     *
 | 
			
		||||
     * @param _type - Only support "abort" event
 | 
			
		||||
     * @param listener - The listener to be removed
 | 
			
		||||
     */
 | 
			
		||||
    AbortSignal.prototype.removeEventListener = function (
 | 
			
		||||
    removeEventListener(
 | 
			
		||||
    // tslint:disable-next-line:variable-name
 | 
			
		||||
    _type, listener) {
 | 
			
		||||
        if (!listenersMap.has(this)) {
 | 
			
		||||
            throw new TypeError("Expected `this` to be an instance of AbortSignal.");
 | 
			
		||||
        }
 | 
			
		||||
        var listeners = listenersMap.get(this);
 | 
			
		||||
        var index = listeners.indexOf(listener);
 | 
			
		||||
        const listeners = listenersMap.get(this);
 | 
			
		||||
        const index = listeners.indexOf(listener);
 | 
			
		||||
        if (index > -1) {
 | 
			
		||||
            listeners.splice(index, 1);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Dispatches a synthetic event to the AbortSignal.
 | 
			
		||||
     */
 | 
			
		||||
    AbortSignal.prototype.dispatchEvent = function (_event) {
 | 
			
		||||
    dispatchEvent(_event) {
 | 
			
		||||
        throw new Error("This is a stub dispatchEvent implementation that should not be used.  It only exists for type-checking purposes.");
 | 
			
		||||
    };
 | 
			
		||||
    return AbortSignal;
 | 
			
		||||
}());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Helper to trigger an abort event immediately, the onabort and all abort event listeners will be triggered.
 | 
			
		||||
 * Will try to trigger abort event for all linked AbortSignal nodes.
 | 
			
		||||
@@ -3166,12 +3156,12 @@ function abortSignal(signal) {
 | 
			
		||||
    if (signal.onabort) {
 | 
			
		||||
        signal.onabort.call(signal);
 | 
			
		||||
    }
 | 
			
		||||
    var listeners = listenersMap.get(signal);
 | 
			
		||||
    const listeners = listenersMap.get(signal);
 | 
			
		||||
    if (listeners) {
 | 
			
		||||
        // Create a copy of listeners so mutations to the array
 | 
			
		||||
        // (e.g. via removeListener calls) don't affect the listeners
 | 
			
		||||
        // we invoke.
 | 
			
		||||
        listeners.slice().forEach(function (listener) {
 | 
			
		||||
        listeners.slice().forEach((listener) => {
 | 
			
		||||
            listener.call(signal, { type: "abort" });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -3197,15 +3187,12 @@ function abortSignal(signal) {
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 */
 | 
			
		||||
var AbortError = /** @class */ (function (_super) {
 | 
			
		||||
    tslib.__extends(AbortError, _super);
 | 
			
		||||
    function AbortError(message) {
 | 
			
		||||
        var _this = _super.call(this, message) || this;
 | 
			
		||||
        _this.name = "AbortError";
 | 
			
		||||
        return _this;
 | 
			
		||||
class AbortError extends Error {
 | 
			
		||||
    constructor(message) {
 | 
			
		||||
        super(message);
 | 
			
		||||
        this.name = "AbortError";
 | 
			
		||||
    }
 | 
			
		||||
    return AbortError;
 | 
			
		||||
}(Error));
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * An AbortController provides an AbortSignal and the associated controls to signal
 | 
			
		||||
 * that an asynchronous operation should be aborted.
 | 
			
		||||
@@ -3240,10 +3227,9 @@ var AbortError = /** @class */ (function (_super) {
 | 
			
		||||
 * await doAsyncWork(aborter.withTimeout(25 * 1000));
 | 
			
		||||
 * ```
 | 
			
		||||
 */
 | 
			
		||||
var AbortController = /** @class */ (function () {
 | 
			
		||||
class AbortController {
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
 | 
			
		||||
    function AbortController(parentSignals) {
 | 
			
		||||
        var _this = this;
 | 
			
		||||
    constructor(parentSignals) {
 | 
			
		||||
        this._signal = new AbortSignal();
 | 
			
		||||
        if (!parentSignals) {
 | 
			
		||||
            return;
 | 
			
		||||
@@ -3253,8 +3239,7 @@ var AbortController = /** @class */ (function () {
 | 
			
		||||
            // eslint-disable-next-line prefer-rest-params
 | 
			
		||||
            parentSignals = arguments;
 | 
			
		||||
        }
 | 
			
		||||
        for (var _i = 0, parentSignals_1 = parentSignals; _i < parentSignals_1.length; _i++) {
 | 
			
		||||
            var parentSignal = parentSignals_1[_i];
 | 
			
		||||
        for (const parentSignal of parentSignals) {
 | 
			
		||||
            // if the parent signal has already had abort() called,
 | 
			
		||||
            // then call abort on this signal as well.
 | 
			
		||||
            if (parentSignal.aborted) {
 | 
			
		||||
@@ -3262,47 +3247,42 @@ var AbortController = /** @class */ (function () {
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                // when the parent signal aborts, this signal should as well.
 | 
			
		||||
                parentSignal.addEventListener("abort", function () {
 | 
			
		||||
                    _this.abort();
 | 
			
		||||
                parentSignal.addEventListener("abort", () => {
 | 
			
		||||
                    this.abort();
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(AbortController.prototype, "signal", {
 | 
			
		||||
    /**
 | 
			
		||||
     * The AbortSignal associated with this controller that will signal aborted
 | 
			
		||||
     * when the abort method is called on this controller.
 | 
			
		||||
     *
 | 
			
		||||
     * @readonly
 | 
			
		||||
     */
 | 
			
		||||
        get: function () {
 | 
			
		||||
    get signal() {
 | 
			
		||||
        return this._signal;
 | 
			
		||||
        },
 | 
			
		||||
        enumerable: false,
 | 
			
		||||
        configurable: true
 | 
			
		||||
    });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Signal that any operations passed this controller's associated abort signal
 | 
			
		||||
     * to cancel any remaining work and throw an `AbortError`.
 | 
			
		||||
     */
 | 
			
		||||
    AbortController.prototype.abort = function () {
 | 
			
		||||
    abort() {
 | 
			
		||||
        abortSignal(this._signal);
 | 
			
		||||
    };
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new AbortSignal instance that will abort after the provided ms.
 | 
			
		||||
     * @param ms - Elapsed time in milliseconds to trigger an abort.
 | 
			
		||||
     */
 | 
			
		||||
    AbortController.timeout = function (ms) {
 | 
			
		||||
        var signal = new AbortSignal();
 | 
			
		||||
        var timer = setTimeout(abortSignal, ms, signal);
 | 
			
		||||
    static timeout(ms) {
 | 
			
		||||
        const signal = new AbortSignal();
 | 
			
		||||
        const timer = setTimeout(abortSignal, ms, signal);
 | 
			
		||||
        // Prevent the active Timer from keeping the Node.js event loop active.
 | 
			
		||||
        if (typeof timer.unref === "function") {
 | 
			
		||||
            timer.unref();
 | 
			
		||||
        }
 | 
			
		||||
        return signal;
 | 
			
		||||
    };
 | 
			
		||||
    return AbortController;
 | 
			
		||||
}());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.AbortController = AbortController;
 | 
			
		||||
exports.AbortError = AbortError;
 | 
			
		||||
@@ -3475,7 +3455,7 @@ function downloadCache(archiveLocation, archivePath, options) {
 | 
			
		||||
        const archiveUrl = new url_1.URL(archiveLocation);
 | 
			
		||||
        const downloadOptions = options_1.getDownloadOptions(options);
 | 
			
		||||
        if (downloadOptions.useAzureSdk &&
 | 
			
		||||
            archiveUrl.hostname.endsWith('.blob.core.windows.net')) {
 | 
			
		||||
            archiveUrl.hostname.endsWith('.blob.core.windows.net') && !process.env['DOWNLOAD_WITH_HTTP_CLIENT']) {
 | 
			
		||||
            // Use Azure storage SDK to download caches hosted on Azure to improve speed and reliability.
 | 
			
		||||
            yield downloadUtils_1.downloadCacheStorageSDK(archiveLocation, archivePath, downloadOptions);
 | 
			
		||||
        }
 | 
			
		||||
@@ -9344,76 +9324,7 @@ function expand(str, isTop) {
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 307 */,
 | 
			
		||||
/* 308 */,
 | 
			
		||||
/* 309 */
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.NullStateProvider = exports.StateProvider = void 0;
 | 
			
		||||
const core = __importStar(__webpack_require__(470));
 | 
			
		||||
const constants_1 = __webpack_require__(196);
 | 
			
		||||
class StateProviderBase {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
 | 
			
		||||
        this.setState = (key, value) => { };
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
			
		||||
        this.getState = (key) => "";
 | 
			
		||||
    }
 | 
			
		||||
    getCacheState() {
 | 
			
		||||
        const cacheKey = this.getState(constants_1.State.CacheMatchedKey);
 | 
			
		||||
        if (cacheKey) {
 | 
			
		||||
            core.debug(`Cache state/key: ${cacheKey}`);
 | 
			
		||||
            return cacheKey;
 | 
			
		||||
        }
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
class StateProvider extends StateProviderBase {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super(...arguments);
 | 
			
		||||
        //setOutput = core.setOutput;
 | 
			
		||||
        this.setState = core.saveState;
 | 
			
		||||
        this.getState = core.getState;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.StateProvider = StateProvider;
 | 
			
		||||
class NullStateProvider extends StateProviderBase {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super(...arguments);
 | 
			
		||||
        //setOutput = core.setOutput;
 | 
			
		||||
        this.setState = core.setOutput;
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
			
		||||
        this.getState = (key) => "";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.NullStateProvider = NullStateProvider;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 309 */,
 | 
			
		||||
/* 310 */,
 | 
			
		||||
/* 311 */,
 | 
			
		||||
/* 312 */
 | 
			
		||||
@@ -38491,7 +38402,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.isCacheFeatureAvailable = exports.getInputAsInt = exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.setCacheHitOutput = exports.isExactKeyMatch = exports.isGhes = void 0;
 | 
			
		||||
exports.isCacheFeatureAvailable = exports.getInputAsInt = exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = exports.isGhes = void 0;
 | 
			
		||||
const cache = __importStar(__webpack_require__(692));
 | 
			
		||||
const core = __importStar(__webpack_require__(470));
 | 
			
		||||
const constants_1 = __webpack_require__(196);
 | 
			
		||||
@@ -38507,10 +38418,29 @@ function isExactKeyMatch(key, cacheKey) {
 | 
			
		||||
        }) === 0);
 | 
			
		||||
}
 | 
			
		||||
exports.isExactKeyMatch = isExactKeyMatch;
 | 
			
		||||
function setCacheState(state) {
 | 
			
		||||
    core.saveState(constants_1.State.CacheMatchedKey, state);
 | 
			
		||||
}
 | 
			
		||||
exports.setCacheState = setCacheState;
 | 
			
		||||
function setCacheHitOutput(isCacheHit) {
 | 
			
		||||
    core.setOutput(constants_1.Outputs.CacheHit, isCacheHit.toString());
 | 
			
		||||
}
 | 
			
		||||
exports.setCacheHitOutput = setCacheHitOutput;
 | 
			
		||||
function setOutputAndState(key, cacheKey) {
 | 
			
		||||
    setCacheHitOutput(isExactKeyMatch(key, cacheKey));
 | 
			
		||||
    // Store the matched cache key if it exists
 | 
			
		||||
    cacheKey && setCacheState(cacheKey);
 | 
			
		||||
}
 | 
			
		||||
exports.setOutputAndState = setOutputAndState;
 | 
			
		||||
function getCacheState() {
 | 
			
		||||
    const cacheKey = core.getState(constants_1.State.CacheMatchedKey);
 | 
			
		||||
    if (cacheKey) {
 | 
			
		||||
        core.debug(`Cache state/key: ${cacheKey}`);
 | 
			
		||||
        return cacheKey;
 | 
			
		||||
    }
 | 
			
		||||
    return undefined;
 | 
			
		||||
}
 | 
			
		||||
exports.getCacheState = getCacheState;
 | 
			
		||||
function logWarning(message) {
 | 
			
		||||
    const warningPrefix = "[warning]";
 | 
			
		||||
    core.info(`${warningPrefix}${message}`);
 | 
			
		||||
@@ -40942,96 +40872,7 @@ Object.defineProperty(exports, "toPlatformPath", { enumerable: true, get: functi
 | 
			
		||||
//# sourceMappingURL=core.js.map
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 471 */
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | 
			
		||||
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | 
			
		||||
    return new (P || (P = Promise))(function (resolve, reject) {
 | 
			
		||||
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | 
			
		||||
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | 
			
		||||
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | 
			
		||||
        step((generator = generator.apply(thisArg, _arguments || [])).next());
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
const cache = __importStar(__webpack_require__(692));
 | 
			
		||||
const core = __importStar(__webpack_require__(470));
 | 
			
		||||
const constants_1 = __webpack_require__(196);
 | 
			
		||||
const utils = __importStar(__webpack_require__(443));
 | 
			
		||||
// Catch and log any unhandled exceptions.  These exceptions can leak out of the uploadChunk method in
 | 
			
		||||
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
 | 
			
		||||
// throw an uncaught exception.  Instead of failing this action, just warn.
 | 
			
		||||
process.on("uncaughtException", e => utils.logWarning(e.message));
 | 
			
		||||
function saveImpl(stateProvider) {
 | 
			
		||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
        try {
 | 
			
		||||
            if (!utils.isCacheFeatureAvailable()) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!utils.isValidEvent()) {
 | 
			
		||||
                utils.logWarning(`Event Validation Error: The event type ${process.env[constants_1.Events.Key]} is not supported because it's not tied to a branch or tag ref.`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            // If restore has stored a primary key in state, reuse that
 | 
			
		||||
            // Else re-evaluate from inputs
 | 
			
		||||
            const primaryKey = stateProvider.getState(constants_1.State.CachePrimaryKey) ||
 | 
			
		||||
                core.getInput(constants_1.Inputs.Key);
 | 
			
		||||
            if (!primaryKey) {
 | 
			
		||||
                utils.logWarning(`Error retrieving key from state.`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            // If matched restore key is same as primary key, then do not save cache
 | 
			
		||||
            // NO-OP in case of SaveOnly action
 | 
			
		||||
            const state = stateProvider.getCacheState();
 | 
			
		||||
            if (utils.isExactKeyMatch(primaryKey, state)) {
 | 
			
		||||
                core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, {
 | 
			
		||||
                required: true
 | 
			
		||||
            });
 | 
			
		||||
            const cacheId = yield cache.saveCache(cachePaths, primaryKey, {
 | 
			
		||||
                uploadChunkSize: utils.getInputAsInt(constants_1.Inputs.UploadChunkSize)
 | 
			
		||||
            });
 | 
			
		||||
            if (cacheId != -1) {
 | 
			
		||||
                core.info(`Cache saved with key: ${primaryKey}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (error) {
 | 
			
		||||
            utils.logWarning(error.message);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
exports.default = saveImpl;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 471 */,
 | 
			
		||||
/* 472 */,
 | 
			
		||||
/* 473 */,
 | 
			
		||||
/* 474 */,
 | 
			
		||||
@@ -44265,318 +44106,7 @@ exports.default = _default;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 640 */
 | 
			
		||||
/***/ (function(module) {
 | 
			
		||||
 | 
			
		||||
/*! *****************************************************************************
 | 
			
		||||
Copyright (c) Microsoft Corporation.
 | 
			
		||||
 | 
			
		||||
Permission to use, copy, modify, and/or distribute this software for any
 | 
			
		||||
purpose with or without fee is hereby granted.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
 | 
			
		||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
			
		||||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
 | 
			
		||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 | 
			
		||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
 | 
			
		||||
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
***************************************************************************** */
 | 
			
		||||
/* global global, define, System, Reflect, Promise */
 | 
			
		||||
var __extends;
 | 
			
		||||
var __assign;
 | 
			
		||||
var __rest;
 | 
			
		||||
var __decorate;
 | 
			
		||||
var __param;
 | 
			
		||||
var __metadata;
 | 
			
		||||
var __awaiter;
 | 
			
		||||
var __generator;
 | 
			
		||||
var __exportStar;
 | 
			
		||||
var __values;
 | 
			
		||||
var __read;
 | 
			
		||||
var __spread;
 | 
			
		||||
var __spreadArrays;
 | 
			
		||||
var __spreadArray;
 | 
			
		||||
var __await;
 | 
			
		||||
var __asyncGenerator;
 | 
			
		||||
var __asyncDelegator;
 | 
			
		||||
var __asyncValues;
 | 
			
		||||
var __makeTemplateObject;
 | 
			
		||||
var __importStar;
 | 
			
		||||
var __importDefault;
 | 
			
		||||
var __classPrivateFieldGet;
 | 
			
		||||
var __classPrivateFieldSet;
 | 
			
		||||
var __createBinding;
 | 
			
		||||
(function (factory) {
 | 
			
		||||
    var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
 | 
			
		||||
    if (typeof define === "function" && define.amd) {
 | 
			
		||||
        define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); });
 | 
			
		||||
    }
 | 
			
		||||
    else if ( true && typeof module.exports === "object") {
 | 
			
		||||
        factory(createExporter(root, createExporter(module.exports)));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        factory(createExporter(root));
 | 
			
		||||
    }
 | 
			
		||||
    function createExporter(exports, previous) {
 | 
			
		||||
        if (exports !== root) {
 | 
			
		||||
            if (typeof Object.create === "function") {
 | 
			
		||||
                Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                exports.__esModule = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
(function (exporter) {
 | 
			
		||||
    var extendStatics = Object.setPrototypeOf ||
 | 
			
		||||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
 | 
			
		||||
        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
 | 
			
		||||
 | 
			
		||||
    __extends = function (d, b) {
 | 
			
		||||
        if (typeof b !== "function" && b !== null)
 | 
			
		||||
            throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
 | 
			
		||||
        extendStatics(d, b);
 | 
			
		||||
        function __() { this.constructor = d; }
 | 
			
		||||
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __assign = Object.assign || function (t) {
 | 
			
		||||
        for (var s, i = 1, n = arguments.length; i < n; i++) {
 | 
			
		||||
            s = arguments[i];
 | 
			
		||||
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
 | 
			
		||||
        }
 | 
			
		||||
        return t;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __rest = function (s, e) {
 | 
			
		||||
        var t = {};
 | 
			
		||||
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
 | 
			
		||||
            t[p] = s[p];
 | 
			
		||||
        if (s != null && typeof Object.getOwnPropertySymbols === "function")
 | 
			
		||||
            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
 | 
			
		||||
                if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
 | 
			
		||||
                    t[p[i]] = s[p[i]];
 | 
			
		||||
            }
 | 
			
		||||
        return t;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __decorate = function (decorators, target, key, desc) {
 | 
			
		||||
        var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
 | 
			
		||||
        if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
 | 
			
		||||
        else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
 | 
			
		||||
        return c > 3 && r && Object.defineProperty(target, key, r), r;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __param = function (paramIndex, decorator) {
 | 
			
		||||
        return function (target, key) { decorator(target, key, paramIndex); }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __metadata = function (metadataKey, metadataValue) {
 | 
			
		||||
        if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __awaiter = function (thisArg, _arguments, P, generator) {
 | 
			
		||||
        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | 
			
		||||
        return new (P || (P = Promise))(function (resolve, reject) {
 | 
			
		||||
            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
 | 
			
		||||
            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
 | 
			
		||||
            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
 | 
			
		||||
            step((generator = generator.apply(thisArg, _arguments || [])).next());
 | 
			
		||||
        });
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __generator = function (thisArg, body) {
 | 
			
		||||
        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
 | 
			
		||||
        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
 | 
			
		||||
        function verb(n) { return function (v) { return step([n, v]); }; }
 | 
			
		||||
        function step(op) {
 | 
			
		||||
            if (f) throw new TypeError("Generator is already executing.");
 | 
			
		||||
            while (_) try {
 | 
			
		||||
                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
 | 
			
		||||
                if (y = 0, t) op = [op[0] & 2, t.value];
 | 
			
		||||
                switch (op[0]) {
 | 
			
		||||
                    case 0: case 1: t = op; break;
 | 
			
		||||
                    case 4: _.label++; return { value: op[1], done: false };
 | 
			
		||||
                    case 5: _.label++; y = op[1]; op = [0]; continue;
 | 
			
		||||
                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
 | 
			
		||||
                    default:
 | 
			
		||||
                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
 | 
			
		||||
                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
 | 
			
		||||
                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
 | 
			
		||||
                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
 | 
			
		||||
                        if (t[2]) _.ops.pop();
 | 
			
		||||
                        _.trys.pop(); continue;
 | 
			
		||||
                }
 | 
			
		||||
                op = body.call(thisArg, _);
 | 
			
		||||
            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
 | 
			
		||||
            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __exportStar = function(m, o) {
 | 
			
		||||
        for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __createBinding = Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
        if (k2 === undefined) k2 = k;
 | 
			
		||||
        Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
 | 
			
		||||
    }) : (function(o, m, k, k2) {
 | 
			
		||||
        if (k2 === undefined) k2 = k;
 | 
			
		||||
        o[k2] = m[k];
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    __values = function (o) {
 | 
			
		||||
        var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
 | 
			
		||||
        if (m) return m.call(o);
 | 
			
		||||
        if (o && typeof o.length === "number") return {
 | 
			
		||||
            next: function () {
 | 
			
		||||
                if (o && i >= o.length) o = void 0;
 | 
			
		||||
                return { value: o && o[i++], done: !o };
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __read = function (o, n) {
 | 
			
		||||
        var m = typeof Symbol === "function" && o[Symbol.iterator];
 | 
			
		||||
        if (!m) return o;
 | 
			
		||||
        var i = m.call(o), r, ar = [], e;
 | 
			
		||||
        try {
 | 
			
		||||
            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
 | 
			
		||||
        }
 | 
			
		||||
        catch (error) { e = { error: error }; }
 | 
			
		||||
        finally {
 | 
			
		||||
            try {
 | 
			
		||||
                if (r && !r.done && (m = i["return"])) m.call(i);
 | 
			
		||||
            }
 | 
			
		||||
            finally { if (e) throw e.error; }
 | 
			
		||||
        }
 | 
			
		||||
        return ar;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /** @deprecated */
 | 
			
		||||
    __spread = function () {
 | 
			
		||||
        for (var ar = [], i = 0; i < arguments.length; i++)
 | 
			
		||||
            ar = ar.concat(__read(arguments[i]));
 | 
			
		||||
        return ar;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /** @deprecated */
 | 
			
		||||
    __spreadArrays = function () {
 | 
			
		||||
        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
 | 
			
		||||
        for (var r = Array(s), k = 0, i = 0; i < il; i++)
 | 
			
		||||
            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
 | 
			
		||||
                r[k] = a[j];
 | 
			
		||||
        return r;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __spreadArray = function (to, from, pack) {
 | 
			
		||||
        if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
 | 
			
		||||
            if (ar || !(i in from)) {
 | 
			
		||||
                if (!ar) ar = Array.prototype.slice.call(from, 0, i);
 | 
			
		||||
                ar[i] = from[i];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return to.concat(ar || Array.prototype.slice.call(from));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __await = function (v) {
 | 
			
		||||
        return this instanceof __await ? (this.v = v, this) : new __await(v);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __asyncGenerator = function (thisArg, _arguments, generator) {
 | 
			
		||||
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
 | 
			
		||||
        var g = generator.apply(thisArg, _arguments || []), i, q = [];
 | 
			
		||||
        return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
 | 
			
		||||
        function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
 | 
			
		||||
        function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
 | 
			
		||||
        function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);  }
 | 
			
		||||
        function fulfill(value) { resume("next", value); }
 | 
			
		||||
        function reject(value) { resume("throw", value); }
 | 
			
		||||
        function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __asyncDelegator = function (o) {
 | 
			
		||||
        var i, p;
 | 
			
		||||
        return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
 | 
			
		||||
        function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __asyncValues = function (o) {
 | 
			
		||||
        if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
 | 
			
		||||
        var m = o[Symbol.asyncIterator], i;
 | 
			
		||||
        return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
 | 
			
		||||
        function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
 | 
			
		||||
        function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __makeTemplateObject = function (cooked, raw) {
 | 
			
		||||
        if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
 | 
			
		||||
        return cooked;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    var __setModuleDefault = Object.create ? (function(o, v) {
 | 
			
		||||
        Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
    }) : function(o, v) {
 | 
			
		||||
        o["default"] = v;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __importStar = function (mod) {
 | 
			
		||||
        if (mod && mod.__esModule) return mod;
 | 
			
		||||
        var result = {};
 | 
			
		||||
        if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
        __setModuleDefault(result, mod);
 | 
			
		||||
        return result;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __importDefault = function (mod) {
 | 
			
		||||
        return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __classPrivateFieldGet = function (receiver, state, kind, f) {
 | 
			
		||||
        if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
 | 
			
		||||
        if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
 | 
			
		||||
        return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    __classPrivateFieldSet = function (receiver, state, value, kind, f) {
 | 
			
		||||
        if (kind === "m") throw new TypeError("Private method is not writable");
 | 
			
		||||
        if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
 | 
			
		||||
        if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
 | 
			
		||||
        return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    exporter("__extends", __extends);
 | 
			
		||||
    exporter("__assign", __assign);
 | 
			
		||||
    exporter("__rest", __rest);
 | 
			
		||||
    exporter("__decorate", __decorate);
 | 
			
		||||
    exporter("__param", __param);
 | 
			
		||||
    exporter("__metadata", __metadata);
 | 
			
		||||
    exporter("__awaiter", __awaiter);
 | 
			
		||||
    exporter("__generator", __generator);
 | 
			
		||||
    exporter("__exportStar", __exportStar);
 | 
			
		||||
    exporter("__createBinding", __createBinding);
 | 
			
		||||
    exporter("__values", __values);
 | 
			
		||||
    exporter("__read", __read);
 | 
			
		||||
    exporter("__spread", __spread);
 | 
			
		||||
    exporter("__spreadArrays", __spreadArrays);
 | 
			
		||||
    exporter("__spreadArray", __spreadArray);
 | 
			
		||||
    exporter("__await", __await);
 | 
			
		||||
    exporter("__asyncGenerator", __asyncGenerator);
 | 
			
		||||
    exporter("__asyncDelegator", __asyncDelegator);
 | 
			
		||||
    exporter("__asyncValues", __asyncValues);
 | 
			
		||||
    exporter("__makeTemplateObject", __makeTemplateObject);
 | 
			
		||||
    exporter("__importStar", __importStar);
 | 
			
		||||
    exporter("__importDefault", __importDefault);
 | 
			
		||||
    exporter("__classPrivateFieldGet", __classPrivateFieldGet);
 | 
			
		||||
    exporter("__classPrivateFieldSet", __classPrivateFieldSet);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
/* 640 */,
 | 
			
		||||
/* 641 */,
 | 
			
		||||
/* 642 */,
 | 
			
		||||
/* 643 */,
 | 
			
		||||
@@ -47407,6 +46937,29 @@ exports.default = _default;
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
 | 
			
		||||
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
 | 
			
		||||
    return new (P || (P = Promise))(function (resolve, reject) {
 | 
			
		||||
@@ -47416,15 +46969,49 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
 | 
			
		||||
        step((generator = generator.apply(thisArg, _arguments || [])).next());
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
			
		||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
const saveImpl_1 = __importDefault(__webpack_require__(471));
 | 
			
		||||
const stateProvider_1 = __webpack_require__(309);
 | 
			
		||||
const cache = __importStar(__webpack_require__(692));
 | 
			
		||||
const core = __importStar(__webpack_require__(470));
 | 
			
		||||
const constants_1 = __webpack_require__(196);
 | 
			
		||||
const utils = __importStar(__webpack_require__(443));
 | 
			
		||||
// Catch and log any unhandled exceptions.  These exceptions can leak out of the uploadChunk method in
 | 
			
		||||
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
 | 
			
		||||
// throw an uncaught exception.  Instead of failing this action, just warn.
 | 
			
		||||
process.on("uncaughtException", e => utils.logWarning(e.message));
 | 
			
		||||
function run() {
 | 
			
		||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
        yield (0, saveImpl_1.default)(new stateProvider_1.StateProvider());
 | 
			
		||||
        try {
 | 
			
		||||
            if (!utils.isCacheFeatureAvailable()) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!utils.isValidEvent()) {
 | 
			
		||||
                utils.logWarning(`Event Validation Error: The event type ${process.env[constants_1.Events.Key]} is not supported because it's not tied to a branch or tag ref.`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            const state = utils.getCacheState();
 | 
			
		||||
            // Inputs are re-evaluted before the post action, so we want the original key used for restore
 | 
			
		||||
            const primaryKey = core.getState(constants_1.State.CachePrimaryKey);
 | 
			
		||||
            if (!primaryKey) {
 | 
			
		||||
                utils.logWarning(`Error retrieving key from state.`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (utils.isExactKeyMatch(primaryKey, state)) {
 | 
			
		||||
                core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, {
 | 
			
		||||
                required: true
 | 
			
		||||
            });
 | 
			
		||||
            const cacheId = yield cache.saveCache(cachePaths, primaryKey, {
 | 
			
		||||
                uploadChunkSize: utils.getInputAsInt(constants_1.Inputs.UploadChunkSize)
 | 
			
		||||
            });
 | 
			
		||||
            if (cacheId != -1) {
 | 
			
		||||
                core.info(`Cache saved with key: ${primaryKey}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (error) {
 | 
			
		||||
            utils.logWarning(error.message);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
run();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								examples.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								examples.md
									
									
									
									
									
								
							@@ -309,14 +309,29 @@ We cache the elements of the Cabal store separately, as the entirety of `~/.caba
 | 
			
		||||
For npm, cache files are stored in `~/.npm` on Posix, or `~\AppData\npm-cache` on Windows, but it's possible to use `npm config get cache` to find the path on any platform. See [the npm docs](https://docs.npmjs.com/cli/cache#cache) for more details.
 | 
			
		||||
 | 
			
		||||
If using `npm config` to retrieve the cache directory, ensure you run [actions/setup-node](https://github.com/actions/setup-node) first to ensure your `npm` version is correct.
 | 
			
		||||
After [deprecation](https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/) of save-state and set-output commands, the correct way to set output is using `${GITHUB_OUTPUT}`. For linux, we can use `${GITHUB_OUTPUT}` whereas for windows we need to use `${env:GITHUB_OUTPUT}` due to two different default shells in these two different OS ie `bash` and `pwsh` respectively.
 | 
			
		||||
 | 
			
		||||
>Note: It is not recommended to cache `node_modules`, as it can break across Node versions and won't work with `npm ci`
 | 
			
		||||
 | 
			
		||||
### **Get npm cache directory using same shell**
 | 
			
		||||
### Bash shell
 | 
			
		||||
```yaml
 | 
			
		||||
- name: Get npm cache directory
 | 
			
		||||
  id: npm-cache-dir
 | 
			
		||||
  run: |
 | 
			
		||||
    echo "::set-output name=dir::$(npm config get cache)"
 | 
			
		||||
  id: npm-cache
 | 
			
		||||
  shell: bash
 | 
			
		||||
  run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### PWSH shell
 | 
			
		||||
```yaml
 | 
			
		||||
- name: Get npm cache directory
 | 
			
		||||
  id: npm-cache
 | 
			
		||||
  shell: pwsh
 | 
			
		||||
  run: echo "dir=$(npm config get cache)" >> ${env:GITHUB_OUTPUT}
 | 
			
		||||
```
 | 
			
		||||
`Get npm cache directory` step can then be used with `actions/cache` as shown below
 | 
			
		||||
 | 
			
		||||
```yaml
 | 
			
		||||
- uses: actions/cache@v3
 | 
			
		||||
  id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true'
 | 
			
		||||
  with:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										34
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -9,7 +9,7 @@
 | 
			
		||||
      "version": "3.0.11",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@actions/cache": "^3.0.5",
 | 
			
		||||
        "@actions/cache": "file:actions-cache-3.0.6.tgz",
 | 
			
		||||
        "@actions/core": "^1.10.0",
 | 
			
		||||
        "@actions/exec": "^1.1.1",
 | 
			
		||||
        "@actions/io": "^1.1.2"
 | 
			
		||||
@@ -36,15 +36,17 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@actions/cache": {
 | 
			
		||||
      "version": "3.0.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.0.5.tgz",
 | 
			
		||||
      "integrity": "sha512-0WpPmwnRPkn5k5ASmjoX8bY8NrZEPTwN+64nGYJmR/bHjEVgC8svdf5K956wi67tNJBGJky2+UfvNbUOtHmMHg==",
 | 
			
		||||
      "version": "3.0.6",
 | 
			
		||||
      "resolved": "file:actions-cache-3.0.6.tgz",
 | 
			
		||||
      "integrity": "sha512-xAJz3mtBOQyUCjQJ3e7DnVZdnfEz0iwEXCbKAj8YHmwwdpv1o7ZG8LJJ6I1eKh7wSbxYlWTaWPmhp8TnCCu0eg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@actions/core": "^1.10.0",
 | 
			
		||||
        "@actions/exec": "^1.0.1",
 | 
			
		||||
        "@actions/glob": "^0.1.0",
 | 
			
		||||
        "@actions/http-client": "^2.0.1",
 | 
			
		||||
        "@actions/io": "^1.0.1",
 | 
			
		||||
        "@azure/abort-controller": "^1.1.0",
 | 
			
		||||
        "@azure/ms-rest-js": "^2.6.0",
 | 
			
		||||
        "@azure/storage-blob": "^12.8.0",
 | 
			
		||||
        "semver": "^6.1.0",
 | 
			
		||||
@@ -111,14 +113,14 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@azure/abort-controller": {
 | 
			
		||||
      "version": "1.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-lNUmDRVGpanCsiUN3NWxFTdwmdFI53xwhkTFfHDGTYk46ca7Ind3nanJc+U6Zj9Tv+9nTCWRBscWEW1DyKOpTw==",
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": "^2.0.0"
 | 
			
		||||
        "tslib": "^2.2.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=8.0.0"
 | 
			
		||||
        "node": ">=12.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@azure/abort-controller/node_modules/tslib": {
 | 
			
		||||
@@ -9721,15 +9723,15 @@
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@actions/cache": {
 | 
			
		||||
      "version": "3.0.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.0.5.tgz",
 | 
			
		||||
      "integrity": "sha512-0WpPmwnRPkn5k5ASmjoX8bY8NrZEPTwN+64nGYJmR/bHjEVgC8svdf5K956wi67tNJBGJky2+UfvNbUOtHmMHg==",
 | 
			
		||||
      "version": "file:actions-cache-3.0.6.tgz",
 | 
			
		||||
      "integrity": "sha512-xAJz3mtBOQyUCjQJ3e7DnVZdnfEz0iwEXCbKAj8YHmwwdpv1o7ZG8LJJ6I1eKh7wSbxYlWTaWPmhp8TnCCu0eg==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@actions/core": "^1.10.0",
 | 
			
		||||
        "@actions/exec": "^1.0.1",
 | 
			
		||||
        "@actions/glob": "^0.1.0",
 | 
			
		||||
        "@actions/http-client": "^2.0.1",
 | 
			
		||||
        "@actions/io": "^1.0.1",
 | 
			
		||||
        "@azure/abort-controller": "^1.1.0",
 | 
			
		||||
        "@azure/ms-rest-js": "^2.6.0",
 | 
			
		||||
        "@azure/storage-blob": "^12.8.0",
 | 
			
		||||
        "semver": "^6.1.0",
 | 
			
		||||
@@ -9792,11 +9794,11 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@azure/abort-controller": {
 | 
			
		||||
      "version": "1.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-lNUmDRVGpanCsiUN3NWxFTdwmdFI53xwhkTFfHDGTYk46ca7Ind3nanJc+U6Zj9Tv+9nTCWRBscWEW1DyKOpTw==",
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "tslib": "^2.0.0"
 | 
			
		||||
        "tslib": "^2.2.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "tslib": {
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@
 | 
			
		||||
  "author": "GitHub",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@actions/cache": "^3.0.5",
 | 
			
		||||
    "@actions/cache": "file:actions-cache-3.0.6.tgz",
 | 
			
		||||
    "@actions/core": "^1.10.0",
 | 
			
		||||
    "@actions/exec": "^1.1.1",
 | 
			
		||||
    "@actions/io": "^1.1.2"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
name: 'Restore Cache'
 | 
			
		||||
description: 'Restore Cache artifacts like dependencies and build outputs to improve workflow execution time'
 | 
			
		||||
author: 'GitHub'
 | 
			
		||||
inputs:
 | 
			
		||||
  path:
 | 
			
		||||
    description: 'The same list of files, directories, and wildcard patterns to restore cache that were used while saving it'
 | 
			
		||||
    required: true
 | 
			
		||||
  key:
 | 
			
		||||
    description: 'An explicit key for restoring the cache'
 | 
			
		||||
    required: true
 | 
			
		||||
  restore-keys:
 | 
			
		||||
    description: 'An ordered list of keys to use for restoring stale cache if no cache hit occurred for key. Note `cache-hit` returns false in this case.'
 | 
			
		||||
    required: false
 | 
			
		||||
outputs:
 | 
			
		||||
  cache-hit:
 | 
			
		||||
    description: 'A boolean value to indicate an exact match was found for the primary key'
 | 
			
		||||
runs:
 | 
			
		||||
  using: 'node16'
 | 
			
		||||
  main: '../dist/restore/index.js'
 | 
			
		||||
branding:
 | 
			
		||||
  icon: 'archive'
 | 
			
		||||
  color: 'gray-dark'
 | 
			
		||||
  
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
name: 'Save Cache'
 | 
			
		||||
description: 'Save Cache artifacts like dependencies and build outputs to improve workflow execution time'
 | 
			
		||||
author: 'GitHub'
 | 
			
		||||
inputs:
 | 
			
		||||
  path:
 | 
			
		||||
    description: 'A list of files, directories, and wildcard patterns to cache'
 | 
			
		||||
    required: true
 | 
			
		||||
  key:
 | 
			
		||||
    description: 'An explicit key for saving the cache'
 | 
			
		||||
    required: true
 | 
			
		||||
  upload-chunk-size:
 | 
			
		||||
    description: 'The chunk size used to split up large files during upload, in bytes'
 | 
			
		||||
    required: false
 | 
			
		||||
runs:
 | 
			
		||||
  using: 'node16'
 | 
			
		||||
  main: '../dist/save/index.js'
 | 
			
		||||
branding:
 | 
			
		||||
  icon: 'archive'
 | 
			
		||||
  color: 'gray-dark'
 | 
			
		||||
@@ -1,8 +1,60 @@
 | 
			
		||||
import { StateProvider } from "./stateProvider";
 | 
			
		||||
import restoreImpl from "./restoreImpl";
 | 
			
		||||
import * as cache from "@actions/cache";
 | 
			
		||||
import * as core from "@actions/core";
 | 
			
		||||
 | 
			
		||||
import { Events, Inputs, State } from "./constants";
 | 
			
		||||
import * as utils from "./utils/actionUtils";
 | 
			
		||||
 | 
			
		||||
async function run(): Promise<void> {
 | 
			
		||||
    await restoreImpl(new StateProvider());
 | 
			
		||||
    try {
 | 
			
		||||
        if (!utils.isCacheFeatureAvailable()) {
 | 
			
		||||
            utils.setCacheHitOutput(false);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Validate inputs, this can cause task failure
 | 
			
		||||
        if (!utils.isValidEvent()) {
 | 
			
		||||
            utils.logWarning(
 | 
			
		||||
                `Event Validation Error: The event type ${
 | 
			
		||||
                    process.env[Events.Key]
 | 
			
		||||
                } is not supported because it's not tied to a branch or tag ref.`
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const primaryKey = core.getInput(Inputs.Key, { required: true });
 | 
			
		||||
        core.saveState(State.CachePrimaryKey, primaryKey);
 | 
			
		||||
 | 
			
		||||
        const restoreKeys = utils.getInputAsArray(Inputs.RestoreKeys);
 | 
			
		||||
        const cachePaths = utils.getInputAsArray(Inputs.Path, {
 | 
			
		||||
            required: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const cacheKey = await cache.restoreCache(
 | 
			
		||||
            cachePaths,
 | 
			
		||||
            primaryKey,
 | 
			
		||||
            restoreKeys
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if (!cacheKey) {
 | 
			
		||||
            core.info(
 | 
			
		||||
                `Cache not found for input keys: ${[
 | 
			
		||||
                    primaryKey,
 | 
			
		||||
                    ...restoreKeys
 | 
			
		||||
                ].join(", ")}`
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Store the matched cache key
 | 
			
		||||
        utils.setCacheState(cacheKey);
 | 
			
		||||
 | 
			
		||||
        const isExactKeyMatch = utils.isExactKeyMatch(primaryKey, cacheKey);
 | 
			
		||||
        utils.setCacheHitOutput(isExactKeyMatch);
 | 
			
		||||
        core.info(`Cache restored from key: ${cacheKey}`);
 | 
			
		||||
    } catch (error: unknown) {
 | 
			
		||||
        core.setFailed((error as Error).message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
run();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,67 +0,0 @@
 | 
			
		||||
import * as cache from "@actions/cache";
 | 
			
		||||
import * as core from "@actions/core";
 | 
			
		||||
 | 
			
		||||
import { Events, Inputs, Outputs, State } from "./constants";
 | 
			
		||||
import { IStateProvider } from "./stateProvider";
 | 
			
		||||
import * as utils from "./utils/actionUtils";
 | 
			
		||||
 | 
			
		||||
async function restoreImpl(stateProvider: IStateProvider): Promise<string | undefined> {
 | 
			
		||||
    try {
 | 
			
		||||
        if (!utils.isCacheFeatureAvailable()) {
 | 
			
		||||
            utils.setCacheHitOutput(false);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Validate inputs, this can cause task failure
 | 
			
		||||
        if (!utils.isValidEvent()) {
 | 
			
		||||
            utils.logWarning(
 | 
			
		||||
                `Event Validation Error: The event type ${
 | 
			
		||||
                    process.env[Events.Key]
 | 
			
		||||
                } is not supported because it's not tied to a branch or tag ref.`
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const primaryKey = core.getInput(Inputs.Key, { required: true });
 | 
			
		||||
        stateProvider.setState(State.CachePrimaryKey, primaryKey);
 | 
			
		||||
 | 
			
		||||
        const restoreKeys = utils.getInputAsArray(Inputs.RestoreKeys);
 | 
			
		||||
        const cachePaths = utils.getInputAsArray(Inputs.Path, {
 | 
			
		||||
            required: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const cacheKey = await cache.restoreCache(
 | 
			
		||||
            cachePaths,
 | 
			
		||||
            primaryKey,
 | 
			
		||||
            restoreKeys
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if (!cacheKey) {
 | 
			
		||||
            core.info(
 | 
			
		||||
                `Cache not found for input keys: ${[
 | 
			
		||||
                    primaryKey,
 | 
			
		||||
                    ...restoreKeys
 | 
			
		||||
                ].join(", ")}`
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Store the matched cache key in states
 | 
			
		||||
        stateProvider.setState(State.CacheMatchedKey, cacheKey);
 | 
			
		||||
 | 
			
		||||
        const isExactKeyMatch = utils.isExactKeyMatch(
 | 
			
		||||
            core.getInput(Inputs.Key, { required: true }),
 | 
			
		||||
            cacheKey
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        core.setOutput(Outputs.CacheHit, isExactKeyMatch.toString());
 | 
			
		||||
        core.info(`Cache restored from key: ${cacheKey}`);
 | 
			
		||||
 | 
			
		||||
        return cacheKey;
 | 
			
		||||
    } catch (error: unknown) {
 | 
			
		||||
        core.setFailed((error as Error).message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default restoreImpl;
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
import restoreImpl from "./restoreImpl";
 | 
			
		||||
import { NullStateProvider } from "./stateProvider";
 | 
			
		||||
 | 
			
		||||
async function run(): Promise<void> {
 | 
			
		||||
    await restoreImpl(new NullStateProvider());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
run();
 | 
			
		||||
 | 
			
		||||
export default run;
 | 
			
		||||
							
								
								
									
										57
									
								
								src/save.ts
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								src/save.ts
									
									
									
									
									
								
							@@ -1,8 +1,59 @@
 | 
			
		||||
import saveImpl from "./saveImpl";
 | 
			
		||||
import { StateProvider } from "./stateProvider";
 | 
			
		||||
import * as cache from "@actions/cache";
 | 
			
		||||
import * as core from "@actions/core";
 | 
			
		||||
 | 
			
		||||
import { Events, Inputs, State } from "./constants";
 | 
			
		||||
import * as utils from "./utils/actionUtils";
 | 
			
		||||
 | 
			
		||||
// Catch and log any unhandled exceptions.  These exceptions can leak out of the uploadChunk method in
 | 
			
		||||
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
 | 
			
		||||
// throw an uncaught exception.  Instead of failing this action, just warn.
 | 
			
		||||
process.on("uncaughtException", e => utils.logWarning(e.message));
 | 
			
		||||
 | 
			
		||||
async function run(): Promise<void> {
 | 
			
		||||
    await saveImpl(new StateProvider());
 | 
			
		||||
    try {
 | 
			
		||||
        if (!utils.isCacheFeatureAvailable()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!utils.isValidEvent()) {
 | 
			
		||||
            utils.logWarning(
 | 
			
		||||
                `Event Validation Error: The event type ${
 | 
			
		||||
                    process.env[Events.Key]
 | 
			
		||||
                } is not supported because it's not tied to a branch or tag ref.`
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const state = utils.getCacheState();
 | 
			
		||||
 | 
			
		||||
        // Inputs are re-evaluted before the post action, so we want the original key used for restore
 | 
			
		||||
        const primaryKey = core.getState(State.CachePrimaryKey);
 | 
			
		||||
        if (!primaryKey) {
 | 
			
		||||
            utils.logWarning(`Error retrieving key from state.`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (utils.isExactKeyMatch(primaryKey, state)) {
 | 
			
		||||
            core.info(
 | 
			
		||||
                `Cache hit occurred on the primary key ${primaryKey}, not saving cache.`
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const cachePaths = utils.getInputAsArray(Inputs.Path, {
 | 
			
		||||
            required: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const cacheId = await cache.saveCache(cachePaths, primaryKey, {
 | 
			
		||||
            uploadChunkSize: utils.getInputAsInt(Inputs.UploadChunkSize)
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (cacheId != -1) {
 | 
			
		||||
            core.info(`Cache saved with key: ${primaryKey}`);
 | 
			
		||||
        }
 | 
			
		||||
    } catch (error: unknown) {
 | 
			
		||||
        utils.logWarning((error as Error).message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
run();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,65 +0,0 @@
 | 
			
		||||
import * as cache from "@actions/cache";
 | 
			
		||||
import * as core from "@actions/core";
 | 
			
		||||
 | 
			
		||||
import { Events, Inputs, State } from "./constants";
 | 
			
		||||
import { IStateProvider } from "./stateProvider";
 | 
			
		||||
import * as utils from "./utils/actionUtils";
 | 
			
		||||
 | 
			
		||||
// Catch and log any unhandled exceptions.  These exceptions can leak out of the uploadChunk method in
 | 
			
		||||
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
 | 
			
		||||
// throw an uncaught exception.  Instead of failing this action, just warn.
 | 
			
		||||
process.on("uncaughtException", e => utils.logWarning(e.message));
 | 
			
		||||
 | 
			
		||||
async function saveImpl(stateProvider: IStateProvider): Promise<void> {
 | 
			
		||||
    try {
 | 
			
		||||
        if (!utils.isCacheFeatureAvailable()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!utils.isValidEvent()) {
 | 
			
		||||
            utils.logWarning(
 | 
			
		||||
                `Event Validation Error: The event type ${
 | 
			
		||||
                    process.env[Events.Key]
 | 
			
		||||
                } is not supported because it's not tied to a branch or tag ref.`
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If restore has stored a primary key in state, reuse that
 | 
			
		||||
        // Else re-evaluate from inputs
 | 
			
		||||
        const primaryKey =
 | 
			
		||||
            stateProvider.getState(State.CachePrimaryKey) ||
 | 
			
		||||
            core.getInput(Inputs.Key);
 | 
			
		||||
 | 
			
		||||
        if (!primaryKey) {
 | 
			
		||||
            utils.logWarning(`Error retrieving key from state.`);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If matched restore key is same as primary key, then do not save cache
 | 
			
		||||
        // NO-OP in case of SaveOnly action
 | 
			
		||||
        const state = stateProvider.getCacheState();
 | 
			
		||||
        if (utils.isExactKeyMatch(primaryKey, state)) {
 | 
			
		||||
            core.info(
 | 
			
		||||
                `Cache hit occurred on the primary key ${primaryKey}, not saving cache.`
 | 
			
		||||
            );
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const cachePaths = utils.getInputAsArray(Inputs.Path, {
 | 
			
		||||
            required: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const cacheId = await cache.saveCache(cachePaths, primaryKey, {
 | 
			
		||||
            uploadChunkSize: utils.getInputAsInt(Inputs.UploadChunkSize)
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (cacheId != -1) {
 | 
			
		||||
            core.info(`Cache saved with key: ${primaryKey}`);
 | 
			
		||||
        }
 | 
			
		||||
    } catch (error: unknown) {
 | 
			
		||||
        utils.logWarning((error as Error).message);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default saveImpl;
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
import saveImpl from "./saveImpl";
 | 
			
		||||
import { NullStateProvider } from "./stateProvider";
 | 
			
		||||
 | 
			
		||||
async function run(): Promise<void> {
 | 
			
		||||
    await saveImpl(new NullStateProvider());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
run();
 | 
			
		||||
 | 
			
		||||
export default run;
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
import * as core from "@actions/core";
 | 
			
		||||
 | 
			
		||||
import { State } from "./constants";
 | 
			
		||||
 | 
			
		||||
export interface IStateProvider {
 | 
			
		||||
    //setOutput(key: string, value: string): void;
 | 
			
		||||
    setState(key: string, value: string): void;
 | 
			
		||||
    getState(key: string): string;
 | 
			
		||||
 | 
			
		||||
    getCacheState(): string | undefined;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class StateProviderBase implements IStateProvider {
 | 
			
		||||
    getCacheState(): string | undefined {
 | 
			
		||||
        const cacheKey = this.getState(State.CacheMatchedKey);
 | 
			
		||||
        if (cacheKey) {
 | 
			
		||||
            core.debug(`Cache state/key: ${cacheKey}`);
 | 
			
		||||
            return cacheKey;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
 | 
			
		||||
    setState = (key: string, value: string) => {};
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
			
		||||
    getState = (key: string) => "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class StateProvider extends StateProviderBase {
 | 
			
		||||
    //setOutput = core.setOutput;
 | 
			
		||||
    setState = core.saveState;
 | 
			
		||||
    getState = core.getState;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class NullStateProvider extends StateProviderBase {
 | 
			
		||||
    //setOutput = core.setOutput;
 | 
			
		||||
    setState = core.setOutput;
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
			
		||||
    getState = (key: string) => "";
 | 
			
		||||
}
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import * as cache from "@actions/cache";
 | 
			
		||||
import * as core from "@actions/core";
 | 
			
		||||
 | 
			
		||||
import { Outputs, RefKey } from "../constants";
 | 
			
		||||
import { Outputs, RefKey, State } from "../constants";
 | 
			
		||||
 | 
			
		||||
export function isGhes(): boolean {
 | 
			
		||||
    const ghUrl = new URL(
 | 
			
		||||
@@ -19,10 +19,30 @@ export function isExactKeyMatch(key: string, cacheKey?: string): boolean {
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function setCacheState(state: string): void {
 | 
			
		||||
    core.saveState(State.CacheMatchedKey, state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function setCacheHitOutput(isCacheHit: boolean): void {
 | 
			
		||||
    core.setOutput(Outputs.CacheHit, isCacheHit.toString());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function setOutputAndState(key: string, cacheKey?: string): void {
 | 
			
		||||
    setCacheHitOutput(isExactKeyMatch(key, cacheKey));
 | 
			
		||||
    // Store the matched cache key if it exists
 | 
			
		||||
    cacheKey && setCacheState(cacheKey);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getCacheState(): string | undefined {
 | 
			
		||||
    const cacheKey = core.getState(State.CacheMatchedKey);
 | 
			
		||||
    if (cacheKey) {
 | 
			
		||||
        core.debug(`Cache state/key: ${cacheKey}`);
 | 
			
		||||
        return cacheKey;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return undefined;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function logWarning(message: string): void {
 | 
			
		||||
    const warningPrefix = "[warning]";
 | 
			
		||||
    core.info(`${warningPrefix}${message}`);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user