@boringcache/action-core 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -0
- package/dist/index.js +20 -2
- package/dist/inputs.d.ts +27 -0
- package/dist/inputs.js +177 -0
- package/dist/proxy.d.ts +31 -0
- package/dist/proxy.js +210 -0
- package/dist/workspace.d.ts +14 -0
- package/dist/workspace.js +83 -0
- package/package.json +2 -3
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,4 @@
|
|
|
1
1
|
export { ensureBoringCache, execBoringCache, isCliAvailable, getToolCacheInfo, SetupOptions, ToolCacheInfo, } from './setup';
|
|
2
|
+
export { getWorkspace, getCacheTagPrefix, pathExists, } from './workspace';
|
|
3
|
+
export { getCacheConfig, validateInputs, resolvePath, resolvePaths, parseEntries, getPlatformSuffix, getInputsWorkspace, convertCacheFormatToEntries, CacheConfig, CacheEntry, } from './inputs';
|
|
4
|
+
export { startRegistryProxy, waitForProxy, stopRegistryProxy, findAvailablePort, ProxyOptions, ProxyHandle, } from './proxy';
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getToolCacheInfo = exports.isCliAvailable = exports.execBoringCache = exports.ensureBoringCache = void 0;
|
|
3
|
+
exports.findAvailablePort = exports.stopRegistryProxy = exports.waitForProxy = exports.startRegistryProxy = exports.convertCacheFormatToEntries = exports.getInputsWorkspace = exports.getPlatformSuffix = exports.parseEntries = exports.resolvePaths = exports.resolvePath = exports.validateInputs = exports.getCacheConfig = exports.pathExists = exports.getCacheTagPrefix = exports.getWorkspace = exports.getToolCacheInfo = exports.isCliAvailable = exports.execBoringCache = exports.ensureBoringCache = void 0;
|
|
4
4
|
var setup_1 = require("./setup");
|
|
5
5
|
Object.defineProperty(exports, "ensureBoringCache", { enumerable: true, get: function () { return setup_1.ensureBoringCache; } });
|
|
6
6
|
Object.defineProperty(exports, "execBoringCache", { enumerable: true, get: function () { return setup_1.execBoringCache; } });
|
|
7
7
|
Object.defineProperty(exports, "isCliAvailable", { enumerable: true, get: function () { return setup_1.isCliAvailable; } });
|
|
8
8
|
Object.defineProperty(exports, "getToolCacheInfo", { enumerable: true, get: function () { return setup_1.getToolCacheInfo; } });
|
|
9
|
-
|
|
9
|
+
var workspace_1 = require("./workspace");
|
|
10
|
+
Object.defineProperty(exports, "getWorkspace", { enumerable: true, get: function () { return workspace_1.getWorkspace; } });
|
|
11
|
+
Object.defineProperty(exports, "getCacheTagPrefix", { enumerable: true, get: function () { return workspace_1.getCacheTagPrefix; } });
|
|
12
|
+
Object.defineProperty(exports, "pathExists", { enumerable: true, get: function () { return workspace_1.pathExists; } });
|
|
13
|
+
var inputs_1 = require("./inputs");
|
|
14
|
+
Object.defineProperty(exports, "getCacheConfig", { enumerable: true, get: function () { return inputs_1.getCacheConfig; } });
|
|
15
|
+
Object.defineProperty(exports, "validateInputs", { enumerable: true, get: function () { return inputs_1.validateInputs; } });
|
|
16
|
+
Object.defineProperty(exports, "resolvePath", { enumerable: true, get: function () { return inputs_1.resolvePath; } });
|
|
17
|
+
Object.defineProperty(exports, "resolvePaths", { enumerable: true, get: function () { return inputs_1.resolvePaths; } });
|
|
18
|
+
Object.defineProperty(exports, "parseEntries", { enumerable: true, get: function () { return inputs_1.parseEntries; } });
|
|
19
|
+
Object.defineProperty(exports, "getPlatformSuffix", { enumerable: true, get: function () { return inputs_1.getPlatformSuffix; } });
|
|
20
|
+
Object.defineProperty(exports, "getInputsWorkspace", { enumerable: true, get: function () { return inputs_1.getInputsWorkspace; } });
|
|
21
|
+
Object.defineProperty(exports, "convertCacheFormatToEntries", { enumerable: true, get: function () { return inputs_1.convertCacheFormatToEntries; } });
|
|
22
|
+
var proxy_1 = require("./proxy");
|
|
23
|
+
Object.defineProperty(exports, "startRegistryProxy", { enumerable: true, get: function () { return proxy_1.startRegistryProxy; } });
|
|
24
|
+
Object.defineProperty(exports, "waitForProxy", { enumerable: true, get: function () { return proxy_1.waitForProxy; } });
|
|
25
|
+
Object.defineProperty(exports, "stopRegistryProxy", { enumerable: true, get: function () { return proxy_1.stopRegistryProxy; } });
|
|
26
|
+
Object.defineProperty(exports, "findAvailablePort", { enumerable: true, get: function () { return proxy_1.findAvailablePort; } });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBT2lCO0FBTmYsMEdBQUEsaUJBQWlCLE9BQUE7QUFDakIsd0dBQUEsZUFBZSxPQUFBO0FBQ2YsdUdBQUEsY0FBYyxPQUFBO0FBQ2QseUdBQUEsZ0JBQWdCLE9BQUE7QUFLbEIseUNBSXFCO0FBSG5CLHlHQUFBLFlBQVksT0FBQTtBQUNaLDhHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLHVHQUFBLFVBQVUsT0FBQTtBQUdaLG1DQVdrQjtBQVZoQix3R0FBQSxjQUFjLE9BQUE7QUFDZCx3R0FBQSxjQUFjLE9BQUE7QUFDZCxxR0FBQSxXQUFXLE9BQUE7QUFDWCxzR0FBQSxZQUFZLE9BQUE7QUFDWixzR0FBQSxZQUFZLE9BQUE7QUFDWiwyR0FBQSxpQkFBaUIsT0FBQTtBQUNqQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQixxSEFBQSwyQkFBMkIsT0FBQTtBQUs3QixpQ0FPaUI7QUFOZiwyR0FBQSxrQkFBa0IsT0FBQTtBQUNsQixxR0FBQSxZQUFZLE9BQUE7QUFDWiwwR0FBQSxpQkFBaUIsT0FBQTtBQUNqQiwwR0FBQSxpQkFBaUIsT0FBQSJ9
|
package/dist/inputs.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface CacheConfig {
|
|
2
|
+
workspace: string;
|
|
3
|
+
fullKey: string;
|
|
4
|
+
platformSuffix: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CacheEntry {
|
|
7
|
+
tag: string;
|
|
8
|
+
restorePath: string;
|
|
9
|
+
savePath: string;
|
|
10
|
+
}
|
|
11
|
+
interface ParseEntryOptions {
|
|
12
|
+
resolvePaths?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function getCacheConfig(key: string, enableCrossOsArchive: boolean, noPlatform?: boolean): Promise<CacheConfig>;
|
|
15
|
+
export declare function validateInputs(inputs: Record<string, unknown>): void;
|
|
16
|
+
export declare function resolvePath(pathInput: string): string;
|
|
17
|
+
export declare function resolvePaths(pathInput: string): string;
|
|
18
|
+
export declare function parseEntries(entriesInput: string, _action: 'save' | 'restore', options?: ParseEntryOptions): CacheEntry[];
|
|
19
|
+
export declare function getPlatformSuffix(noPlatform: boolean, enableCrossOsArchive: boolean): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get workspace from action inputs (Record-based).
|
|
22
|
+
* Used by the generic action/save/restore actions.
|
|
23
|
+
* NOTE: This is different from workspace.ts getWorkspace which takes a string.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getInputsWorkspace(inputs: Record<string, unknown>): string;
|
|
26
|
+
export declare function convertCacheFormatToEntries(inputs: Record<string, unknown>, _action: 'save' | 'restore'): string;
|
|
27
|
+
export {};
|
package/dist/inputs.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getCacheConfig = getCacheConfig;
|
|
37
|
+
exports.validateInputs = validateInputs;
|
|
38
|
+
exports.resolvePath = resolvePath;
|
|
39
|
+
exports.resolvePaths = resolvePaths;
|
|
40
|
+
exports.parseEntries = parseEntries;
|
|
41
|
+
exports.getPlatformSuffix = getPlatformSuffix;
|
|
42
|
+
exports.getInputsWorkspace = getInputsWorkspace;
|
|
43
|
+
exports.convertCacheFormatToEntries = convertCacheFormatToEntries;
|
|
44
|
+
const core = __importStar(require("@actions/core"));
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
async function getCacheConfig(key, enableCrossOsArchive, noPlatform = false) {
|
|
48
|
+
let workspace = process.env.BORINGCACHE_DEFAULT_WORKSPACE ||
|
|
49
|
+
process.env.GITHUB_REPOSITORY ||
|
|
50
|
+
'default/default';
|
|
51
|
+
if (!workspace.includes('/')) {
|
|
52
|
+
workspace = `default/${workspace}`;
|
|
53
|
+
}
|
|
54
|
+
let platformSuffix = '';
|
|
55
|
+
if (!noPlatform && !enableCrossOsArchive) {
|
|
56
|
+
const platform = os.platform() === 'darwin' ? 'darwin' : os.platform() === 'win32' ? 'windows' : 'linux';
|
|
57
|
+
const arch = os.arch() === 'arm64' ? 'arm64' : 'amd64';
|
|
58
|
+
platformSuffix = `-${platform}-${arch}`;
|
|
59
|
+
}
|
|
60
|
+
const fullKey = key + platformSuffix;
|
|
61
|
+
return { workspace, fullKey, platformSuffix };
|
|
62
|
+
}
|
|
63
|
+
function validateInputs(inputs) {
|
|
64
|
+
const hasCliFormat = inputs.workspace || inputs.entries;
|
|
65
|
+
const hasCacheFormat = inputs.path || inputs.key;
|
|
66
|
+
if (!hasCliFormat && !hasCacheFormat) {
|
|
67
|
+
throw new Error('Either (workspace + entries) or (path + key) inputs are required');
|
|
68
|
+
}
|
|
69
|
+
if (hasCliFormat && hasCacheFormat) {
|
|
70
|
+
core.warning('Both CLI format (workspace/entries) and actions/cache format (path/key) provided. Using CLI format.');
|
|
71
|
+
}
|
|
72
|
+
if (hasCliFormat && !inputs.entries) {
|
|
73
|
+
throw new Error('Input "entries" is required when using CLI format');
|
|
74
|
+
}
|
|
75
|
+
if (hasCacheFormat && !hasCliFormat) {
|
|
76
|
+
if (!inputs.path) {
|
|
77
|
+
throw new Error('Input "path" is required when using actions/cache format');
|
|
78
|
+
}
|
|
79
|
+
if (!inputs.key) {
|
|
80
|
+
throw new Error('Input "key" is required when using actions/cache format');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (inputs.workspace && typeof inputs.workspace === 'string' && !inputs.workspace.includes('/')) {
|
|
84
|
+
throw new Error('Workspace must be in format "namespace/workspace" (e.g., "my-org/my-project")');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function resolvePath(pathInput) {
|
|
88
|
+
const trimmedPath = pathInput.trim();
|
|
89
|
+
if (path.isAbsolute(trimmedPath)) {
|
|
90
|
+
return trimmedPath;
|
|
91
|
+
}
|
|
92
|
+
if (trimmedPath.startsWith('~/')) {
|
|
93
|
+
return path.join(os.homedir(), trimmedPath.slice(2));
|
|
94
|
+
}
|
|
95
|
+
return path.resolve(process.cwd(), trimmedPath);
|
|
96
|
+
}
|
|
97
|
+
function resolvePaths(pathInput) {
|
|
98
|
+
return pathInput
|
|
99
|
+
.split('\n')
|
|
100
|
+
.map(p => p.trim())
|
|
101
|
+
.filter(p => p)
|
|
102
|
+
.map(p => resolvePath(p))
|
|
103
|
+
.join('\n');
|
|
104
|
+
}
|
|
105
|
+
function parseEntries(entriesInput, _action, options = {}) {
|
|
106
|
+
const shouldResolve = options.resolvePaths ?? true;
|
|
107
|
+
return entriesInput
|
|
108
|
+
.split(',')
|
|
109
|
+
.map(entry => entry.trim())
|
|
110
|
+
.filter(entry => entry)
|
|
111
|
+
.map(entry => {
|
|
112
|
+
const colonIndex = entry.indexOf(':');
|
|
113
|
+
if (colonIndex === -1) {
|
|
114
|
+
throw new Error(`Invalid entry format: ${entry}. Expected format: tag:path or tag:restore_path=>save_path`);
|
|
115
|
+
}
|
|
116
|
+
const tag = entry.substring(0, colonIndex).trim();
|
|
117
|
+
const pathSpec = entry.substring(colonIndex + 1).trim();
|
|
118
|
+
if (!tag) {
|
|
119
|
+
throw new Error(`Invalid entry format: ${entry}. Tag cannot be empty`);
|
|
120
|
+
}
|
|
121
|
+
let restorePathInput = pathSpec;
|
|
122
|
+
let savePathInput = pathSpec;
|
|
123
|
+
const redirectIndex = pathSpec.indexOf('=>');
|
|
124
|
+
if (redirectIndex !== -1) {
|
|
125
|
+
restorePathInput = pathSpec.substring(0, redirectIndex).trim();
|
|
126
|
+
savePathInput = pathSpec.substring(redirectIndex + 2).trim();
|
|
127
|
+
if (!restorePathInput || !savePathInput) {
|
|
128
|
+
throw new Error(`Invalid entry format: ${entry}. Expected restore and save paths when using => syntax`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const restorePath = shouldResolve ? resolvePath(restorePathInput) : restorePathInput;
|
|
132
|
+
const savePath = shouldResolve ? resolvePath(savePathInput) : savePathInput;
|
|
133
|
+
return { tag, restorePath, savePath };
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function getPlatformSuffix(noPlatform, enableCrossOsArchive) {
|
|
137
|
+
if (noPlatform || enableCrossOsArchive) {
|
|
138
|
+
return '';
|
|
139
|
+
}
|
|
140
|
+
const platform = os.platform() === 'darwin' ? 'darwin' : os.platform() === 'win32' ? 'windows' : 'linux';
|
|
141
|
+
const arch = os.arch() === 'arm64' ? 'arm64' : 'amd64';
|
|
142
|
+
return `-${platform}-${arch}`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get workspace from action inputs (Record-based).
|
|
146
|
+
* Used by the generic action/save/restore actions.
|
|
147
|
+
* NOTE: This is different from workspace.ts getWorkspace which takes a string.
|
|
148
|
+
*/
|
|
149
|
+
function getInputsWorkspace(inputs) {
|
|
150
|
+
if (inputs.workspace && typeof inputs.workspace === 'string') {
|
|
151
|
+
return inputs.workspace;
|
|
152
|
+
}
|
|
153
|
+
const repo = process.env.GITHUB_REPOSITORY;
|
|
154
|
+
if (repo) {
|
|
155
|
+
const parts = repo.split('/');
|
|
156
|
+
return `${parts[0]}/${parts[1]}`;
|
|
157
|
+
}
|
|
158
|
+
return 'default/default';
|
|
159
|
+
}
|
|
160
|
+
function convertCacheFormatToEntries(inputs, _action) {
|
|
161
|
+
if (!inputs.path || !inputs.key) {
|
|
162
|
+
throw new Error('actions/cache format requires both path and key inputs');
|
|
163
|
+
}
|
|
164
|
+
const pathInput = inputs.path;
|
|
165
|
+
const keyInput = inputs.key;
|
|
166
|
+
const noPlatformInput = inputs.noPlatform;
|
|
167
|
+
const enableCrossOsArchiveInput = inputs.enableCrossOsArchive;
|
|
168
|
+
const paths = pathInput
|
|
169
|
+
.split('\n')
|
|
170
|
+
.map(p => p.trim())
|
|
171
|
+
.filter(p => p);
|
|
172
|
+
const shouldDisablePlatform = noPlatformInput || enableCrossOsArchiveInput || false;
|
|
173
|
+
const platformSuffix = getPlatformSuffix(shouldDisablePlatform, enableCrossOsArchiveInput || false);
|
|
174
|
+
const fullKey = keyInput + platformSuffix;
|
|
175
|
+
return paths.map(p => `${fullKey}:${resolvePath(p)}`).join(',');
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2lucHV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSx3Q0F3QkM7QUFFRCx3Q0E0QkM7QUFFRCxrQ0FZQztBQUVELG9DQU9DO0FBRUQsb0NBMkNDO0FBRUQsOENBUUM7QUFPRCxnREFZQztBQUVELGtFQXVCQztBQXBNRCxvREFBc0M7QUFDdEMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQWtCdEIsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsR0FBVyxFQUNYLG9CQUE2QixFQUM3QixhQUFzQixLQUFLO0lBRTNCLElBQUksU0FBUyxHQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCO1FBQzdCLGlCQUFpQixDQUFDO0lBRXBCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDN0IsU0FBUyxHQUFHLFdBQVcsU0FBUyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztJQUN4QixJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3pHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3ZELGNBQWMsR0FBRyxJQUFJLFFBQVEsSUFBSSxJ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
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface ProxyOptions {
|
|
2
|
+
command: 'cache-registry' | 'docker-registry';
|
|
3
|
+
workspace: string;
|
|
4
|
+
tag: string;
|
|
5
|
+
host?: string;
|
|
6
|
+
port: number;
|
|
7
|
+
noGit?: boolean;
|
|
8
|
+
noPlatform?: boolean;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ProxyHandle {
|
|
12
|
+
pid: number;
|
|
13
|
+
port: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Start a registry proxy (docker-registry or cache-registry).
|
|
17
|
+
* Spawns a detached boringcache process, writes PID file, returns handle.
|
|
18
|
+
*/
|
|
19
|
+
export declare function startRegistryProxy(options: ProxyOptions): Promise<ProxyHandle>;
|
|
20
|
+
/**
|
|
21
|
+
* Poll /v2/ until proxy is ready. Checks that the process is still alive.
|
|
22
|
+
*/
|
|
23
|
+
export declare function waitForProxy(port: number, timeoutMs?: number, pid?: number): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Graceful stop: SIGTERM, wait 2s, SIGKILL if still alive.
|
|
26
|
+
*/
|
|
27
|
+
export declare function stopRegistryProxy(pid: number): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Bind to port 0 and return the assigned port.
|
|
30
|
+
*/
|
|
31
|
+
export declare function findAvailablePort(): Promise<number>;
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startRegistryProxy = startRegistryProxy;
|
|
37
|
+
exports.waitForProxy = waitForProxy;
|
|
38
|
+
exports.stopRegistryProxy = stopRegistryProxy;
|
|
39
|
+
exports.findAvailablePort = findAvailablePort;
|
|
40
|
+
const core = __importStar(require("@actions/core"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const net = __importStar(require("net"));
|
|
43
|
+
const http = __importStar(require("http"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const child_process_1 = require("child_process");
|
|
47
|
+
const PROXY_LOG_FILE = path.join(os.tmpdir(), 'boringcache-proxy.log');
|
|
48
|
+
const PROXY_PID_FILE = path.join(os.tmpdir(), 'boringcache-proxy.pid');
|
|
49
|
+
function isProcessAlive(pid) {
|
|
50
|
+
try {
|
|
51
|
+
process.kill(pid, 0);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function readProxyLogs() {
|
|
59
|
+
try {
|
|
60
|
+
return fs.readFileSync(PROXY_LOG_FILE, 'utf-8').trim();
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function isProxyRunning(port) {
|
|
67
|
+
try {
|
|
68
|
+
return await new Promise((resolve) => {
|
|
69
|
+
const req = http.get(`http://127.0.0.1:${port}/v2/`, (res) => {
|
|
70
|
+
resolve(res.statusCode === 200 || res.statusCode === 401);
|
|
71
|
+
});
|
|
72
|
+
req.on('error', () => resolve(false));
|
|
73
|
+
req.setTimeout(1000, () => { req.destroy(); resolve(false); });
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Start a registry proxy (docker-registry or cache-registry).
|
|
82
|
+
* Spawns a detached boringcache process, writes PID file, returns handle.
|
|
83
|
+
*/
|
|
84
|
+
async function startRegistryProxy(options) {
|
|
85
|
+
if (!process.env.BORINGCACHE_API_TOKEN) {
|
|
86
|
+
throw new Error('BORINGCACHE_API_TOKEN is required for registry proxy mode');
|
|
87
|
+
}
|
|
88
|
+
const host = options.host || '127.0.0.1';
|
|
89
|
+
if (await isProxyRunning(options.port)) {
|
|
90
|
+
core.info(`Registry proxy already running on port ${options.port}, reusing`);
|
|
91
|
+
try {
|
|
92
|
+
const pid = parseInt(fs.readFileSync(PROXY_PID_FILE, 'utf-8').trim(), 10);
|
|
93
|
+
if (pid > 0)
|
|
94
|
+
return { pid, port: options.port };
|
|
95
|
+
}
|
|
96
|
+
catch { }
|
|
97
|
+
return { pid: -1, port: options.port };
|
|
98
|
+
}
|
|
99
|
+
const args = [options.command, options.workspace, options.tag];
|
|
100
|
+
if (options.noGit) {
|
|
101
|
+
args.push('--no-git');
|
|
102
|
+
}
|
|
103
|
+
if (options.noPlatform) {
|
|
104
|
+
args.push('--no-platform');
|
|
105
|
+
}
|
|
106
|
+
args.push('--host', host, '--port', String(options.port));
|
|
107
|
+
if (options.verbose) {
|
|
108
|
+
args.push('--verbose');
|
|
109
|
+
}
|
|
110
|
+
core.info(`Starting registry proxy on ${host}:${options.port}...`);
|
|
111
|
+
const logFile = path.join(os.tmpdir(), `boringcache-proxy-${options.port}.log`);
|
|
112
|
+
const logFd = fs.openSync(logFile, 'w');
|
|
113
|
+
const child = (0, child_process_1.spawn)('boringcache', args, {
|
|
114
|
+
detached: true,
|
|
115
|
+
stdio: ['ignore', logFd, logFd],
|
|
116
|
+
env: process.env
|
|
117
|
+
});
|
|
118
|
+
child.unref();
|
|
119
|
+
fs.closeSync(logFd);
|
|
120
|
+
if (!child.pid) {
|
|
121
|
+
throw new Error('Failed to start registry proxy');
|
|
122
|
+
}
|
|
123
|
+
fs.writeFileSync(PROXY_PID_FILE, String(child.pid));
|
|
124
|
+
core.info(`Registry proxy started (PID: ${child.pid})`);
|
|
125
|
+
return { pid: child.pid, port: options.port };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Poll /v2/ until proxy is ready. Checks that the process is still alive.
|
|
129
|
+
*/
|
|
130
|
+
async function waitForProxy(port, timeoutMs = 20000, pid) {
|
|
131
|
+
const start = Date.now();
|
|
132
|
+
const interval = 500;
|
|
133
|
+
while (Date.now() - start < timeoutMs) {
|
|
134
|
+
if (pid && pid > 0 && !isProcessAlive(pid)) {
|
|
135
|
+
const logs = readProxyLogs();
|
|
136
|
+
throw new Error(`Registry proxy exited before becoming ready${logs ? `:\n${logs}` : ''}`);
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
const ok = await new Promise((resolve) => {
|
|
140
|
+
const req = http.get(`http://127.0.0.1:${port}/v2/`, (res) => {
|
|
141
|
+
resolve(res.statusCode === 200 || res.statusCode === 401);
|
|
142
|
+
});
|
|
143
|
+
req.on('error', () => resolve(false));
|
|
144
|
+
req.setTimeout(1000, () => {
|
|
145
|
+
req.destroy();
|
|
146
|
+
resolve(false);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
if (ok) {
|
|
150
|
+
core.info('Registry proxy is ready');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
}
|
|
156
|
+
await new Promise(resolve => setTimeout(resolve, interval));
|
|
157
|
+
}
|
|
158
|
+
const logs = readProxyLogs();
|
|
159
|
+
throw new Error(`Registry proxy did not become ready within ${timeoutMs}ms${logs ? `:\n${logs}` : ''}`);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Graceful stop: SIGTERM, wait 2s, SIGKILL if still alive.
|
|
163
|
+
*/
|
|
164
|
+
async function stopRegistryProxy(pid) {
|
|
165
|
+
if (pid <= 0) {
|
|
166
|
+
core.info('No proxy PID to stop (was reused from another invocation)');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
core.info(`Stopping registry proxy (PID: ${pid})...`);
|
|
170
|
+
try {
|
|
171
|
+
process.kill(pid, 'SIGTERM');
|
|
172
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
173
|
+
try {
|
|
174
|
+
process.kill(pid, 0);
|
|
175
|
+
process.kill(pid, 'SIGKILL');
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
}
|
|
179
|
+
core.info('Registry proxy stopped');
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
const code = err.code;
|
|
183
|
+
if (code === 'ESRCH') {
|
|
184
|
+
core.info(`Registry proxy (PID: ${pid}) already exited`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
core.warning(`Failed to stop registry proxy: ${err.message}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Bind to port 0 and return the assigned port.
|
|
193
|
+
*/
|
|
194
|
+
async function findAvailablePort() {
|
|
195
|
+
return new Promise((resolve, reject) => {
|
|
196
|
+
const server = net.createServer();
|
|
197
|
+
server.listen(0, '127.0.0.1', () => {
|
|
198
|
+
const addr = server.address();
|
|
199
|
+
if (addr && typeof addr !== 'string') {
|
|
200
|
+
const port = addr.port;
|
|
201
|
+
server.close(() => resolve(port));
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
server.close(() => reject(new Error('Failed to get port')));
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
server.on('error', reject);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4REEsZ0RBZ0RDO0FBS0Qsb0NBZ0NDO0FBS0QsOENBdUJDO0FBS0QsOENBY0M7QUFsTUQsb0RBQXNDO0FBQ3RDLHVDQUF5QjtBQUN6Qix5Q0FBMkI7QUFDM0IsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsaURBQW9EO0FBa0JwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLHVCQUF1QixDQUFDLENBQUM7QUFFdkUsU0FBUyxjQUFjLENBQUMsR0FBVztJQUNqQyxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhO0lBQ3BCLElBQUksQ0FBQztRQUNILE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQVk7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksT0FBTyxDQUFVLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUMsTUFBTSxHQUFHLEdB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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve workspace from input or environment.
|
|
3
|
+
* Used by docker, buildkit, nodejs, rust, ruby actions.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getWorkspace(inputWorkspace: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Resolve cache tag prefix from input or GITHUB_REPOSITORY.
|
|
8
|
+
* Falls back to the provided default (e.g. 'nodejs', 'rust', 'ruby').
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCacheTagPrefix(inputCacheTag: string, defaultPrefix: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Async file/directory existence check.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pathExists(p: string): Promise<boolean>;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getWorkspace = getWorkspace;
|
|
37
|
+
exports.getCacheTagPrefix = getCacheTagPrefix;
|
|
38
|
+
exports.pathExists = pathExists;
|
|
39
|
+
const core = __importStar(require("@actions/core"));
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
/**
|
|
42
|
+
* Resolve workspace from input or environment.
|
|
43
|
+
* Used by docker, buildkit, nodejs, rust, ruby actions.
|
|
44
|
+
*/
|
|
45
|
+
function getWorkspace(inputWorkspace) {
|
|
46
|
+
let workspace = inputWorkspace || process.env.BORINGCACHE_DEFAULT_WORKSPACE || '';
|
|
47
|
+
if (!workspace) {
|
|
48
|
+
core.setFailed('Workspace is required. Set workspace input or BORINGCACHE_DEFAULT_WORKSPACE env var.');
|
|
49
|
+
throw new Error('Workspace required');
|
|
50
|
+
}
|
|
51
|
+
if (!workspace.includes('/')) {
|
|
52
|
+
workspace = `default/${workspace}`;
|
|
53
|
+
}
|
|
54
|
+
return workspace;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve cache tag prefix from input or GITHUB_REPOSITORY.
|
|
58
|
+
* Falls back to the provided default (e.g. 'nodejs', 'rust', 'ruby').
|
|
59
|
+
*/
|
|
60
|
+
function getCacheTagPrefix(inputCacheTag, defaultPrefix) {
|
|
61
|
+
if (inputCacheTag) {
|
|
62
|
+
return inputCacheTag;
|
|
63
|
+
}
|
|
64
|
+
const repo = process.env.GITHUB_REPOSITORY || '';
|
|
65
|
+
if (repo) {
|
|
66
|
+
const repoName = repo.split('/')[1] || repo;
|
|
67
|
+
return repoName;
|
|
68
|
+
}
|
|
69
|
+
return defaultPrefix;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Async file/directory existence check.
|
|
73
|
+
*/
|
|
74
|
+
async function pathExists(p) {
|
|
75
|
+
try {
|
|
76
|
+
await fs.promises.access(p);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3dvcmtzcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLG9DQWFDO0FBTUQsOENBWUM7QUFLRCxnQ0FPQztBQWxERCxvREFBc0M7QUFDdEMsdUNBQXlCO0FBRXpCOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FBQyxjQUFzQjtJQUNqRCxJQUFJLFNBQVMsR0FBRyxjQUFjLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsSUFBSSxFQUFFLENBQUM7SUFFbEYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzRkFBc0YsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3QixTQUFTLEdBQUcsV0FBVyxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLGFBQXFCLEVBQUUsYUFBcUI7SUFDNUUsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7SUFDakQsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1FBQzVDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQVM7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@boringcache/action-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Shared core library for BoringCache GitHub Actions",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -40,8 +40,7 @@
|
|
|
40
40
|
"@actions/cache": "^4.1.0",
|
|
41
41
|
"@actions/core": "^1.11.1",
|
|
42
42
|
"@actions/exec": "^1.1.1",
|
|
43
|
-
"@actions/tool-cache": "^2.0.1"
|
|
44
|
-
"@boringcache/action-core": "^1.0.1"
|
|
43
|
+
"@actions/tool-cache": "^2.0.1"
|
|
45
44
|
},
|
|
46
45
|
"devDependencies": {
|
|
47
46
|
"@types/jest": "^29.5.14",
|