cache-extensions 1.14.1 → 1.15.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/README.md CHANGED
@@ -15,6 +15,7 @@ Cache PHP extensions in [GitHub Actions](https://github.com/features/actions "Gi
15
15
  - [OS/Platform Support](#cloud-osplatform-support)
16
16
  - [Usage](#memo-usage)
17
17
  - [Inputs](#inputs)
18
+ - [Flags](#flags)
18
19
  - [Workflow](#workflow)
19
20
  - [Thread Safe Setup](#thread-safe-setup)
20
21
  - [License](#scroll-license)
@@ -99,6 +100,34 @@ Use this GitHub Action when the extensions you are adding in [setup-php](https:/
99
100
 
100
101
  See [action.yml](action.yml "Metadata for this GitHub Action") and usage below for more info.
101
102
 
103
+ ### Flags
104
+
105
+ > Specify using the `env` keyword
106
+
107
+ #### `share-cache-across-jobs` (optional)
108
+
109
+ - Specify `true` to share the cache across jobs in the same workflow.
110
+ - By default, it is set to `false` and the job ID is included in the cache key.
111
+
112
+ #### `share-cache-across-workflows` (optional)
113
+
114
+ - Specify `true` to share the cache across workflows for the same job ID.
115
+ - By default, it is set to `false` and the workflow ID is included in the cache key.
116
+ - Enable both flags to share the cache across all jobs and workflows in the repository.
117
+
118
+ ```yaml
119
+ - name: Setup cache environment
120
+ id: extcache
121
+ uses: shivammathur/cache-extensions@v1
122
+ with:
123
+ php-version: ${{ matrix.php-versions }}
124
+ extensions: ${{ env.extensions }}
125
+ key: ${{ env.key }}
126
+ env:
127
+ share-cache-across-jobs: true
128
+ share-cache-across-workflows: true
129
+ ```
130
+
102
131
  ### Workflow
103
132
 
104
133
  > Cache extensions in a PHP workflow
package/lib/cache.d.ts CHANGED
@@ -1,2 +1,8 @@
1
- export declare function handleDependencies(extensions: string, version: string): Promise<void>;
1
+ export declare function getErrorMessage(error: unknown): string;
2
+ export declare function normalizeModulePath(path: string): string;
3
+ export declare function shouldHandleDependencies(version: string, platform?: NodeJS.Platform): boolean;
4
+ export declare function handleDependencies(extensions: string, version: string, platform?: NodeJS.Platform): Promise<void>;
2
5
  export declare function run(): Promise<void>;
6
+ export declare function main(runAction?: () => Promise<void>): Promise<void>;
7
+ export declare function isMainModule(argv1?: string | undefined, moduleUrl?: string): boolean;
8
+ export declare function bootstrap(argv1?: string | undefined, moduleUrl?: string, runAction?: () => Promise<void>): Promise<void>;
package/lib/cache.js CHANGED
@@ -1,86 +1,91 @@
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]; } };
1
+ import { exec } from '@actions/exec';
2
+ import * as cache from '@actions/cache';
3
+ import * as core from '@actions/core';
4
+ import * as spu from 'setup-php/lib/utils.js';
5
+ import { existsSync, realpathSync } from 'node:fs';
6
+ import { join, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import * as utils from './utils.js';
9
+ const DEPENDENCY_CACHE_DIR = 'deps';
10
+ const DEPENDENCY_CACHE_PLATFORMS = new Set([
11
+ 'darwin',
12
+ 'linux'
13
+ ]);
14
+ const SKIP_DEPENDENCY_CACHE_VERSIONS = /^5\.[3-5]$/;
15
+ export function getErrorMessage(error) {
16
+ return error instanceof Error ? error.message : String(error);
17
+ }
18
+ export function normalizeModulePath(path) {
19
+ const resolvedPath = resolve(path);
20
+ return existsSync(resolvedPath) ? realpathSync(resolvedPath) : resolvedPath;
21
+ }
22
+ export function shouldHandleDependencies(version, platform = process.platform) {
23
+ return (!SKIP_DEPENDENCY_CACHE_VERSIONS.test(version) &&
24
+ DEPENDENCY_CACHE_PLATFORMS.has(platform));
25
+ }
26
+ export async function handleDependencies(extensions, version, platform = process.platform) {
27
+ if (!shouldHandleDependencies(version, platform)) {
28
+ return;
7
29
  }
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.handleDependencies = handleDependencies;
37
- exports.run = run;
38
- const exec_1 = require("@actions/exec");
39
- const cache = __importStar(require("@actions/cache"));
40
- const core = __importStar(require("@actions/core"));
41
- const spu = __importStar(require("setup-php/lib/utils"));
42
- const fs = __importStar(require("fs"));
43
- const path = __importStar(require("path"));
44
- const utils = __importStar(require("./utils"));
45
- async function handleDependencies(extensions, version) {
46
- if (!/^5.[3-5]$/.test(version) && /linux|darwin/.test(process.platform)) {
47
- const cache_key = (await utils.getOutput('key')) + '-deps';
48
- const cache_dir = path.join(await spu.readEnv('RUNNER_TOOL_CACHE'), 'deps');
49
- const cache_hit = await cache.restoreCache([cache_dir], cache_key, [cache_key]);
50
- await (0, exec_1.exec)(await utils.scriptCall('dependencies', extensions, version));
51
- if (!cache_hit && fs.existsSync(cache_dir)) {
52
- try {
53
- await cache.saveCache([cache_dir], cache_key);
54
- }
55
- catch {
56
- await cache.saveCache([cache_dir], cache_key + '-take-2');
57
- }
58
- }
30
+ const cacheKey = `${await utils.getOutput('key')}-deps`;
31
+ const cacheDir = join(await spu.readEnv('RUNNER_TOOL_CACHE'), DEPENDENCY_CACHE_DIR);
32
+ const cacheHit = await cache.restoreCache([cacheDir], cacheKey, [cacheKey]);
33
+ const dependencyScript = utils.scriptCall('dependencies', extensions, version);
34
+ await exec(dependencyScript.command, dependencyScript.args);
35
+ if (cacheHit || !existsSync(cacheDir)) {
36
+ return;
37
+ }
38
+ try {
39
+ await cache.saveCache([cacheDir], cacheKey);
40
+ }
41
+ catch {
42
+ await cache.saveCache([cacheDir], `${cacheKey}-take-2`);
59
43
  }
60
44
  }
61
- async function run() {
45
+ export async function run() {
62
46
  try {
63
47
  const version = await spu.parseVersion(await spu.readPHPVersion());
64
- const extensions = await utils.filterExtensions(await spu.getInput('extensions', true));
48
+ const extensions = utils.filterExtensions(await spu.getInput('extensions', true));
65
49
  const key = await spu.getInput('key', true);
66
- await (0, exec_1.exec)(await utils.scriptCall('data', extensions, version, key));
50
+ const shareCacheAcrossJobs = (await spu.readEnv('share-cache-across-jobs')) === 'true'
51
+ ? 'true'
52
+ : 'false';
53
+ const shareCacheAcrossWorkflows = (await spu.readEnv('share-cache-across-workflows')) === 'true'
54
+ ? 'true'
55
+ : 'false';
56
+ const dataScript = utils.scriptCall('data', extensions, version, key, shareCacheAcrossJobs, shareCacheAcrossWorkflows);
57
+ await exec(dataScript.command, dataScript.args);
67
58
  await handleDependencies(extensions, version);
68
59
  }
69
60
  catch (error) {
70
- core.setFailed(error.message);
61
+ core.setFailed(getErrorMessage(error));
71
62
  }
72
63
  }
73
- (async () => {
74
- await run();
75
- })().catch(error => {
76
- if (error.name === cache.ValidationError.name) {
77
- core.setFailed(error.message);
64
+ export async function main(runAction = run) {
65
+ try {
66
+ await runAction();
78
67
  }
79
- else if (error.name === cache.ReserveCacheError.name) {
80
- core.info(error.message);
68
+ catch (error) {
69
+ const message = getErrorMessage(error);
70
+ if (error instanceof cache.ValidationError) {
71
+ core.setFailed(message);
72
+ return;
73
+ }
74
+ if (error instanceof cache.ReserveCacheError) {
75
+ core.info(message);
76
+ return;
77
+ }
78
+ core.warning(message);
81
79
  }
82
- else {
83
- core.warning(error.message);
80
+ }
81
+ export function isMainModule(argv1 = process.argv[1], moduleUrl = import.meta.url) {
82
+ return (!!argv1 &&
83
+ normalizeModulePath(argv1) === normalizeModulePath(fileURLToPath(moduleUrl)));
84
+ }
85
+ export async function bootstrap(argv1 = process.argv[1], moduleUrl = import.meta.url, runAction = main) {
86
+ if (isMainModule(argv1, moduleUrl)) {
87
+ await runAction();
84
88
  }
85
- });
89
+ }
90
+ await bootstrap();
86
91
  //# sourceMappingURL=cache.js.map
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,gDAwBC;AAKD,kBAYC;AAvDD,wCAAmC;AACnC,sDAAwC;AACxC,oDAAsC;AACtC,yDAA2C;AAC3C,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAiC;AAQ1B,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,OAAe;IAEf,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxE,MAAM,SAAS,GAAW,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;QACnE,MAAM,SAAS,GAAW,IAAI,CAAC,IAAI,CACjC,MAAM,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,EACtC,MAAM,CACP,CAAC;QACF,MAAM,SAAS,GAAuB,MAAM,KAAK,CAAC,YAAY,CAC5D,CAAC,SAAS,CAAC,EACX,SAAS,EACT,CAAC,SAAS,CAAC,CACZ,CAAC;QACF,MAAM,IAAA,WAAI,EAAC,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAKM,KAAK,UAAU,GAAG;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAW,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAW,MAAM,KAAK,CAAC,gBAAgB,CACrD,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CACvC,CAAC;QACF,MAAM,GAAG,GAAW,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,IAAA,WAAI,EAAC,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,MAAM,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,SAAS,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAGD,CAAC,KAAK,IAAI,EAAE;IACV,MAAM,GAAG,EAAE,CAAC;AACd,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACjB,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/lib/utils.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ export declare const SCRIPT_PATH: string;
2
+ export type ScriptCall = {
3
+ command: 'bash';
4
+ args: [string, string, ...string[]];
5
+ };
1
6
  export declare function getOutput(output: string): Promise<string>;
2
- export declare function filterExtensions(extension_csv: string): Promise<string>;
3
- export declare function scriptCall(fn: string, ...args: string[]): Promise<string>;
7
+ export declare function filterExtensions(extension_csv: string): string;
8
+ export declare function scriptCall(fn: string, ...args: string[]): ScriptCall;
package/lib/utils.js CHANGED
@@ -1,57 +1,22 @@
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.getOutput = getOutput;
37
- exports.filterExtensions = filterExtensions;
38
- exports.scriptCall = scriptCall;
39
- const fs = __importStar(require("fs"));
40
- const path = __importStar(require("path"));
41
- const spu = __importStar(require("setup-php/lib/utils"));
42
- async function getOutput(output) {
43
- return fs.readFileSync(path.join(await spu.readEnv('RUNNER_TEMP'), output), 'utf8');
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import * as spu from 'setup-php/lib/utils.js';
4
+ export const SCRIPT_PATH = join(import.meta.dirname, '../src/scripts/cache.sh');
5
+ export async function getOutput(output) {
6
+ return readFile(join(await spu.readEnv('RUNNER_TEMP'), output), 'utf8');
44
7
  }
45
- async function filterExtensions(extension_csv) {
46
- return JSON.stringify(extension_csv
8
+ export function filterExtensions(extension_csv) {
9
+ return extension_csv
47
10
  .split(',')
48
11
  .filter(extension => {
49
12
  return extension.trim()[0] != ':';
50
13
  })
51
- .join(','));
14
+ .join(',');
52
15
  }
53
- async function scriptCall(fn, ...args) {
54
- const script = path.join(__dirname, '../src/scripts/cache.sh');
55
- return ['bash', script, fn, ...args].join(' ');
16
+ export function scriptCall(fn, ...args) {
17
+ return {
18
+ command: 'bash',
19
+ args: [SCRIPT_PATH, fn, ...args]
20
+ };
56
21
  }
57
22
  //# sourceMappingURL=utils.js.map
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8BAKC;AAOD,4CASC;AAQD,gCAMC;AA1CD,uCAAyB;AACzB,2CAA6B;AAC7B,yDAA2C;AAKpC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,OAAO,EAAE,CAAC,YAAY,CACpB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,EACnD,MAAM,CACP,CAAC;AACJ,CAAC;AAOM,KAAK,UAAU,gBAAgB,CAAC,aAAqB;IAC1D,OAAO,IAAI,CAAC,SAAS,CACnB,aAAa;SACV,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,SAAS,CAAC,EAAE;QAClB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAQM,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,GAAG,IAAc;IAEjB,MAAM,MAAM,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAC/B,OAAO,KAAK,GAAG,MAAM,wBAAwB,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;AAUhF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAAC,aAAqB;IACpD,OAAO,aAAa;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,SAAS,CAAC,EAAE;QAClB,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACpC,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAQD,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,GAAG,IAAc;IACtD,OAAO;QACL,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "cache-extensions",
3
- "version": "1.14.1",
3
+ "version": "1.15.0",
4
4
  "private": false,
5
5
  "description": "Cache PHP extensions in GitHub Actions",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=24"
9
+ },
6
10
  "main": "lib/cache.js",
7
11
  "types": "lib/cache.d.ts",
8
12
  "directories": {
@@ -19,8 +23,8 @@
19
23
  "lint": "eslint **/src/*.ts --cache --fix",
20
24
  "format": "prettier --write **/src/*.ts && git add .",
21
25
  "format-check": "prettier --check **/src/*.ts",
22
- "release": "ncc build -m -o dist && git add -f dist/",
23
- "test": "jest"
26
+ "release": "ncc build src/cache.ts -m && git add -f dist/",
27
+ "test": "node --disable-warning=ExperimentalWarning --experimental-vm-modules node_modules/jest/bin/jest.js"
24
28
  },
25
29
  "repository": {
26
30
  "type": "git",
@@ -35,30 +39,37 @@
35
39
  "author": "shivammathur",
36
40
  "license": "MIT",
37
41
  "dependencies": {
38
- "@actions/cache": "^5.0.5",
39
- "@actions/core": "^2.0.3",
40
- "@actions/exec": "^2.0.0",
41
- "setup-php": "2.36.0"
42
+ "@actions/cache": "^6.2.0",
43
+ "@actions/core": "^3.0.1",
44
+ "@actions/exec": "^3.0.0",
45
+ "setup-php": "^2.37.2"
42
46
  },
43
47
  "devDependencies": {
44
- "@eslint/compat": "^2.0.3",
48
+ "@eslint/compat": "^2.1.0",
49
+ "@eslint/eslintrc": "^3.3.6",
50
+ "@eslint/js": "^10.0.1",
45
51
  "@types/jest": "^30.0.0",
46
- "@types/node": "^25.5.0",
47
- "@typescript-eslint/eslint-plugin": "^8.57.0",
48
- "@typescript-eslint/parser": "^8.57.0",
49
- "@vercel/ncc": "^0.38.4",
50
- "eslint": "^9.39.1",
52
+ "@types/node": "^26.2.0",
53
+ "@typescript-eslint/eslint-plugin": "^8.67.0",
54
+ "@typescript-eslint/parser": "^8.67.0",
55
+ "@typescript/native": "npm:typescript@^7.0.2",
56
+ "@vercel/ncc": "^0.44.1",
57
+ "eslint": "^10.8.1",
51
58
  "eslint-config-prettier": "^10.1.8",
52
- "eslint-plugin-import": "^2.32.0",
53
- "eslint-plugin-jest": "^29.15.0",
54
- "eslint-plugin-prettier": "^5.5.5",
55
- "jest": "^30.3.0",
56
- "jest-circus": "^30.3.0",
57
- "prettier": "^3.8.1",
58
- "ts-jest": "^29.4.6",
59
- "typescript": "^5.9.3"
59
+ "eslint-import-resolver-typescript": "^4.4.5",
60
+ "eslint-plugin-import-x": "^4.17.1",
61
+ "eslint-plugin-jest": "^29.16.0",
62
+ "eslint-plugin-prettier": "^5.5.6",
63
+ "globals": "^17.9.0",
64
+ "jest": "^30.4.2",
65
+ "jest-circus": "^30.4.2",
66
+ "prettier": "^3.9.6",
67
+ "ts-jest": "^29.4.12",
68
+ "ts-node": "^10.9.2",
69
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
60
70
  },
61
71
  "overrides": {
72
+ "brace-expansion@1.x": "^1.1.18",
62
73
  "test-exclude": "^7.0.1",
63
74
  "glob": "^13.0.6",
64
75
  "undici": "^6.23.0"
package/src/cache.ts CHANGED
@@ -1,40 +1,77 @@
1
1
  import {exec} from '@actions/exec';
2
2
  import * as cache from '@actions/cache';
3
3
  import * as core from '@actions/core';
4
- import * as spu from 'setup-php/lib/utils';
5
- import * as fs from 'fs';
6
- import * as path from 'path';
7
- import * as utils from './utils';
4
+ import * as spu from 'setup-php/lib/utils.js';
5
+ import {existsSync, realpathSync} from 'node:fs';
6
+ import {join, resolve} from 'node:path';
7
+ import {fileURLToPath} from 'node:url';
8
+ import * as utils from './utils.js';
9
+
10
+ const DEPENDENCY_CACHE_DIR = 'deps';
11
+ const DEPENDENCY_CACHE_PLATFORMS = new Set<NodeJS.Platform>([
12
+ 'darwin',
13
+ 'linux'
14
+ ]);
15
+ const SKIP_DEPENDENCY_CACHE_VERSIONS = /^5\.[3-5]$/;
16
+
17
+ export function getErrorMessage(error: unknown): string {
18
+ return error instanceof Error ? error.message : String(error);
19
+ }
20
+
21
+ export function normalizeModulePath(path: string): string {
22
+ const resolvedPath = resolve(path);
23
+
24
+ return existsSync(resolvedPath) ? realpathSync(resolvedPath) : resolvedPath;
25
+ }
26
+
27
+ export function shouldHandleDependencies(
28
+ version: string,
29
+ platform: NodeJS.Platform = process.platform
30
+ ): boolean {
31
+ return (
32
+ !SKIP_DEPENDENCY_CACHE_VERSIONS.test(version) &&
33
+ DEPENDENCY_CACHE_PLATFORMS.has(platform)
34
+ );
35
+ }
8
36
 
9
37
  /**
10
38
  * Handle dependencies
11
39
  *
12
40
  * @param extensions
13
41
  * @param version
42
+ * @param platform
14
43
  */
15
44
  export async function handleDependencies(
16
45
  extensions: string,
17
- version: string
46
+ version: string,
47
+ platform: NodeJS.Platform = process.platform
18
48
  ): Promise<void> {
19
- if (!/^5.[3-5]$/.test(version) && /linux|darwin/.test(process.platform)) {
20
- const cache_key: string = (await utils.getOutput('key')) + '-deps';
21
- const cache_dir: string = path.join(
22
- await spu.readEnv('RUNNER_TOOL_CACHE'),
23
- 'deps'
24
- );
25
- const cache_hit: string | undefined = await cache.restoreCache(
26
- [cache_dir],
27
- cache_key,
28
- [cache_key]
29
- );
30
- await exec(await utils.scriptCall('dependencies', extensions, version));
31
- if (!cache_hit && fs.existsSync(cache_dir)) {
32
- try {
33
- await cache.saveCache([cache_dir], cache_key);
34
- } catch {
35
- await cache.saveCache([cache_dir], cache_key + '-take-2');
36
- }
37
- }
49
+ if (!shouldHandleDependencies(version, platform)) {
50
+ return;
51
+ }
52
+
53
+ const cacheKey = `${await utils.getOutput('key')}-deps`;
54
+ const cacheDir = join(
55
+ await spu.readEnv('RUNNER_TOOL_CACHE'),
56
+ DEPENDENCY_CACHE_DIR
57
+ );
58
+ const cacheHit = await cache.restoreCache([cacheDir], cacheKey, [cacheKey]);
59
+ const dependencyScript = utils.scriptCall(
60
+ 'dependencies',
61
+ extensions,
62
+ version
63
+ );
64
+
65
+ await exec(dependencyScript.command, dependencyScript.args);
66
+
67
+ if (cacheHit || !existsSync(cacheDir)) {
68
+ return;
69
+ }
70
+
71
+ try {
72
+ await cache.saveCache([cacheDir], cacheKey);
73
+ } catch {
74
+ await cache.saveCache([cacheDir], `${cacheKey}-take-2`);
38
75
  }
39
76
  }
40
77
 
@@ -43,27 +80,75 @@ export async function handleDependencies(
43
80
  */
44
81
  export async function run(): Promise<void> {
45
82
  try {
46
- const version: string = await spu.parseVersion(await spu.readPHPVersion());
47
- const extensions: string = await utils.filterExtensions(
83
+ const version = await spu.parseVersion(await spu.readPHPVersion());
84
+ const extensions = utils.filterExtensions(
48
85
  await spu.getInput('extensions', true)
49
86
  );
50
- const key: string = await spu.getInput('key', true);
51
- await exec(await utils.scriptCall('data', extensions, version, key));
87
+ const key = await spu.getInput('key', true);
88
+ const shareCacheAcrossJobs =
89
+ (await spu.readEnv('share-cache-across-jobs')) === 'true'
90
+ ? 'true'
91
+ : 'false';
92
+ const shareCacheAcrossWorkflows =
93
+ (await spu.readEnv('share-cache-across-workflows')) === 'true'
94
+ ? 'true'
95
+ : 'false';
96
+ const dataScript = utils.scriptCall(
97
+ 'data',
98
+ extensions,
99
+ version,
100
+ key,
101
+ shareCacheAcrossJobs,
102
+ shareCacheAcrossWorkflows
103
+ );
104
+
105
+ await exec(dataScript.command, dataScript.args);
52
106
  await handleDependencies(extensions, version);
53
107
  } catch (error) {
54
- core.setFailed((error as Error).message);
108
+ core.setFailed(getErrorMessage(error));
109
+ }
110
+ }
111
+
112
+ export async function main(
113
+ runAction: () => Promise<void> = run
114
+ ): Promise<void> {
115
+ try {
116
+ await runAction();
117
+ } catch (error) {
118
+ const message = getErrorMessage(error);
119
+
120
+ if (error instanceof cache.ValidationError) {
121
+ core.setFailed(message);
122
+ return;
123
+ }
124
+
125
+ if (error instanceof cache.ReserveCacheError) {
126
+ core.info(message);
127
+ return;
128
+ }
129
+
130
+ core.warning(message);
55
131
  }
56
132
  }
57
133
 
58
- // call the run function
59
- (async () => {
60
- await run();
61
- })().catch(error => {
62
- if (error.name === cache.ValidationError.name) {
63
- core.setFailed(error.message);
64
- } else if (error.name === cache.ReserveCacheError.name) {
65
- core.info(error.message);
66
- } else {
67
- core.warning(error.message);
134
+ export function isMainModule(
135
+ argv1: string | undefined = process.argv[1],
136
+ moduleUrl: string = import.meta.url
137
+ ): boolean {
138
+ return (
139
+ !!argv1 &&
140
+ normalizeModulePath(argv1) === normalizeModulePath(fileURLToPath(moduleUrl))
141
+ );
142
+ }
143
+
144
+ export async function bootstrap(
145
+ argv1: string | undefined = process.argv[1],
146
+ moduleUrl: string = import.meta.url,
147
+ runAction: () => Promise<void> = main
148
+ ): Promise<void> {
149
+ if (isMainModule(argv1, moduleUrl)) {
150
+ await runAction();
68
151
  }
69
- });
152
+ }
153
+
154
+ await bootstrap();
@@ -95,7 +95,6 @@ libdbus-1-3
95
95
  libdbusmenu-glib4
96
96
  libdbusmenu-gtk3-4
97
97
  libdconf1
98
- libde265-0
99
98
  libdebconfclient0
100
99
  libdeflate0
101
100
  libdevmapper-event1.02.1
@@ -189,7 +188,6 @@ libharfbuzz0b
189
188
  libhashkit2t64
190
189
  libhavege2
191
190
  libheif-plugin-aomdec
192
- libheif-plugin-libde265
193
191
  libheif1
194
192
  libhogweed6t64
195
193
  libhtml-parser-perl
@@ -88,6 +88,17 @@ linux_php_semver() {
88
88
  fi
89
89
  }
90
90
 
91
+ get_cache_scope() {
92
+ local scope="${GITHUB_REPOSITORY}"
93
+ if [ "${share_cache_across_workflows:-false}" != "true" ]; then
94
+ scope="$scope-${GITHUB_WORKFLOW}"
95
+ fi
96
+ if [ "$runner" = "github" ] && [ "${share_cache_across_jobs:-false}" != "true" ]; then
97
+ scope="$scope-${GITHUB_JOB}"
98
+ fi
99
+ echo "$scope"
100
+ }
101
+
91
102
  data() {
92
103
  old_versions="5.[3-5]"
93
104
  date='20260314'
@@ -108,17 +119,17 @@ data() {
108
119
  else
109
120
  os="Windows-$arch"
110
121
  dir='C:\\tools\\php\\ext'
122
+ [ "$version" = "8.6" ] && date='20260608'
111
123
  fi
112
124
  [[ ( -z "$ImageOS" && -z "$ImageVersion" ) ||
113
125
  ( -n "$RUNNER_ENVIRONMENT" && "$RUNNER_ENVIRONMENT" = "self-hosted" ) ||
114
126
  -n "$ACT" || -n "$CONTAINER" ]] && _runner=self-hosted || _runner=github
115
127
  runner="${runner:-${RUNNER:-$_runner}}"
116
- job="${GITHUB_REPOSITORY}-${GITHUB_WORKFLOW}"
117
- [ "$runner" = "github" ] && job="$job-${GITHUB_JOB}"
128
+ scope="$(get_cache_scope)"
118
129
  if command -v "sha256sum" >/dev/null; then
119
- key="$(echo -n "$extensions-$key-$job" | sha256sum | cut -d ' ' -f 1)"
130
+ key="$(echo -n "$extensions-$key-$scope" | sha256sum | cut -d ' ' -f 1)"
120
131
  else
121
- key="$(echo -n "$extensions-$key-$job" | openssl dgst -sha256 | cut -d ' ' -f 2)"
132
+ key="$(echo -n "$extensions-$key-$scope" | openssl dgst -sha256 | cut -d ' ' -f 2)"
122
133
  fi
123
134
  key="$os"-"$version"-"$key"-"$date"
124
135
  echo "$dir" > "${RUNNER_TEMP:?}"/dir
@@ -140,9 +151,10 @@ init() {
140
151
  export tick="✓"
141
152
  export cross="✗"
142
153
  script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)
154
+ platform_script="$script_dir/$(echo "$os" | tr '[:upper:]' '[:lower:]').sh"
143
155
  if [[ "$os" = "Linux" || "$os" = "Darwin" ]]; then
144
156
  # shellcheck disable=SC1090
145
- . "$script_dir/$(echo "$os" | tr '[:upper:]' '[:lower:]').sh"
157
+ . "$platform_script"
146
158
  self_hosted_helper
147
159
  fi
148
160
  }
@@ -151,6 +163,8 @@ run=$1
151
163
  extensions=$2
152
164
  version=$3
153
165
  key=$4
166
+ share_cache_across_jobs=${5:-false}
167
+ share_cache_across_workflows=${6:-false}
154
168
  os="$(uname -s)"
155
169
  init
156
170
  $run
@@ -21,6 +21,7 @@ add_brew_tap() {
21
21
  fi
22
22
  fi
23
23
  fi
24
+ brew trust "$tap" >/dev/null 2>&1
24
25
  }
25
26
 
26
27
  get_lookup_extension_name() {
@@ -85,7 +86,7 @@ setup_extensions_helper() {
85
86
  dependent_extension=$1
86
87
  dependency_extension=$2
87
88
  extension_dir=$3
88
- dependency_extension_name="$(basename "$(echo $dependency_extension | cut -d'@' -f 1)")"
89
+ dependency_extension_name="$(basename "$(echo "$dependency_extension" | cut -d'@' -f 1)")"
89
90
  cached_extension="${deps_cache_directory:?}/$dependency_extension_name.so"
90
91
  if ! [ -e "$cached_extension" ]; then
91
92
  brew install "$dependency_extension"
@@ -23,9 +23,8 @@ add_package() {
23
23
 
24
24
  add_ppa_package() {
25
25
  package=$1
26
- package_link="$(get_package_link "$package")"
27
- curl -o /tmp/"$package.deb" -sL "$package_link"
28
- sudo DEBIAN_FRONTEND=noninteractive dpkg -i "/tmp/$package.deb"
26
+ download_ppa_package "$package" "/tmp/$package.deb" &&
27
+ sudo DEBIAN_FRONTEND=noninteractive dpkg -i "/tmp/$package.deb"
29
28
  }
30
29
 
31
30
  link_apt_fast() {
@@ -35,11 +34,34 @@ link_apt_fast() {
35
34
  fi
36
35
  }
37
36
 
37
+ download_ppa_file() {
38
+ local file=$1
39
+ local target=$2
40
+ local root
41
+ local roots=()
42
+ if [[ -n "${preferred_ppa_root:-}" ]]; then
43
+ roots+=("$preferred_ppa_root")
44
+ fi
45
+ for root in "https://ppa.launchpadcontent.net" "https://ppa.setup-php.com"; do
46
+ [[ "$root" = "${preferred_ppa_root:-}" ]] && continue
47
+ roots+=("$root")
48
+ done
49
+ rm -f "$target"
50
+ for root in "${roots[@]}"; do
51
+ if curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" --connect-timeout 5 -o "$target" -fsL "$root/$file"; then
52
+ preferred_ppa_root=$root
53
+ return 0
54
+ fi
55
+ rm -f "$target"
56
+ done
57
+ return 1
58
+ }
59
+
38
60
  fetch_package() {
39
61
  if ! [ -e /tmp/Packages ]; then
40
62
  . /etc/os-release
41
63
  arch=$(dpkg --print-architecture)
42
- curl -o /tmp/Packages.gz -sL "http://ppa.launchpad.net/ondrej/php/ubuntu/dists/$VERSION_CODENAME/main/binary-$arch/Packages.gz"
64
+ download_ppa_file "ondrej/php/ubuntu/dists/$VERSION_CODENAME/main/binary-$arch/Packages.gz" "/tmp/Packages.gz" || return 1
43
65
  gzip -df /tmp/Packages.gz
44
66
  fi
45
67
  }
@@ -55,11 +77,20 @@ get_dependencies() {
55
77
  echo "${deps[@]}"
56
78
  }
57
79
 
58
- get_package_link() {
80
+ get_package_file() {
81
+ package=$1
82
+ awk -v package="$package" '
83
+ $1 == "Package:" && $2 == package { found = 1 }
84
+ found && $1 == "Filename:" { print $2; exit }
85
+ found && /^$/ { found = 0 }
86
+ ' /tmp/Packages | tr -d '\r'
87
+ }
88
+
89
+ download_ppa_package() {
59
90
  package=$1
60
- trunk="http://ppa.launchpad.net/ondrej/php/ubuntu"
61
- file=$(sed -e '/Package:\s'"$package$"'/,/^\s*$/!d' /tmp/Packages | grep -Eo "^Filename.*" | cut -d' ' -f 2 | tr -d '\r')
62
- echo "$trunk/$file"
91
+ target=$2
92
+ file=$(get_package_file "$package")
93
+ download_ppa_file "ondrej/php/ubuntu/$file" "$target"
63
94
  }
64
95
 
65
96
  setup_extensions_helper() {
@@ -68,8 +99,7 @@ setup_extensions_helper() {
68
99
  cached_extension="${deps_cache_directory:?}/$dependency_extension.so"
69
100
  if ! [ -e "$extension_dir/$dependency_extension.so" ]; then
70
101
  if ! [ -e "$cached_extension" ]; then
71
- extension_package_link="$(get_package_link "php${version:?}-$dependency_extension")"
72
- sudo curl -H "User-Agent: Debian APT-HTTP/GHA(ce)" -o "/tmp/$dependency_extension".deb -sL "$extension_package_link"
102
+ download_ppa_package "php${version:?}-$dependency_extension" "/tmp/$dependency_extension".deb || return 1
73
103
  sudo dpkg-deb -x "/tmp/$dependency_extension".deb /
74
104
  sudo cp "$extension_dir/$dependency_extension.so" "$cached_extension"
75
105
  fix_ownership "$extension_dir"
@@ -139,7 +169,7 @@ setup_dependencies() {
139
169
  extension_packages=""
140
170
  for extension_package in "${extensions_array[@]}"; do
141
171
  [[ ! "$extension_package" =~ php[0-9]+\.[0-9]+-[a-zA-Z0-9]+$ ]] && continue
142
- fetch_package
172
+ fetch_package || return 1
143
173
  libraries="$libraries $(get_dependencies "$extension_package" "lib")"
144
174
  IFS=' ' read -r -a dependency_extension_packages_array <<<"$(get_dependencies "$extension_package" "php$version-")"
145
175
  extension_packages="$extension_packages ${dependency_extension_packages_array[*]}"
package/src/utils.ts CHANGED
@@ -1,15 +1,19 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as spu from 'setup-php/lib/utils';
1
+ import {readFile} from 'node:fs/promises';
2
+ import {join} from 'node:path';
3
+ import * as spu from 'setup-php/lib/utils.js';
4
+
5
+ export const SCRIPT_PATH = join(import.meta.dirname, '../src/scripts/cache.sh');
6
+
7
+ export type ScriptCall = {
8
+ command: 'bash';
9
+ args: [string, string, ...string[]];
10
+ };
4
11
 
5
12
  /**
6
13
  * Function to get outputs
7
14
  */
8
15
  export async function getOutput(output: string): Promise<string> {
9
- return fs.readFileSync(
10
- path.join(await spu.readEnv('RUNNER_TEMP'), output),
11
- 'utf8'
12
- );
16
+ return readFile(join(await spu.readEnv('RUNNER_TEMP'), output), 'utf8');
13
17
  }
14
18
 
15
19
  /**
@@ -17,15 +21,13 @@ export async function getOutput(output: string): Promise<string> {
17
21
  *
18
22
  * @param extension_csv
19
23
  */
20
- export async function filterExtensions(extension_csv: string): Promise<string> {
21
- return JSON.stringify(
22
- extension_csv
23
- .split(',')
24
- .filter(extension => {
25
- return extension.trim()[0] != ':';
26
- })
27
- .join(',')
28
- );
24
+ export function filterExtensions(extension_csv: string): string {
25
+ return extension_csv
26
+ .split(',')
27
+ .filter(extension => {
28
+ return extension.trim()[0] != ':';
29
+ })
30
+ .join(',');
29
31
  }
30
32
 
31
33
  /**
@@ -34,10 +36,9 @@ export async function filterExtensions(extension_csv: string): Promise<string> {
34
36
  * @param fn
35
37
  * @param args
36
38
  */
37
- export async function scriptCall(
38
- fn: string,
39
- ...args: string[]
40
- ): Promise<string> {
41
- const script: string = path.join(__dirname, '../src/scripts/cache.sh');
42
- return ['bash', script, fn, ...args].join(' ');
39
+ export function scriptCall(fn: string, ...args: string[]): ScriptCall {
40
+ return {
41
+ command: 'bash',
42
+ args: [SCRIPT_PATH, fn, ...args]
43
+ };
43
44
  }