Skip to content

Commit a456367

Browse files
committed
feat: add integrity digest plugin
1 parent 4229328 commit a456367

4 files changed

Lines changed: 201 additions & 5 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
## @electron-forge/plugin-integrity-digest
2+
3+
This plugin provides a `packageAfterCopy` hook for calculating and storing integrity digests when packaging with Electron Forge.
4+
5+
### Usage
6+
7+
Install `@electron-forge/plugin-integrity-digest` and add this plugin to the `plugins` array in your Forge configuration:
8+
9+
```shell
10+
# Yarn
11+
yarn add --dev @electron-forge/plugin-integrity-digest
12+
13+
# npm
14+
npm i -D @electron-forge/plugin-integrity-digest
15+
```
16+
17+
```js
18+
// forge.config.js
19+
20+
const { IntegrityDigestPlugin } = require('@electron-forge/plugin-integrity-digest');
21+
22+
const forgeConfig = {
23+
plugins: [new IntegrityDigestPlugin()],
24+
};
25+
26+
module.exports = forgeConfig;
27+
```
28+
29+
If desired, you can pass a specific version of integrity digest to calculate and store. Currently, the only version is `1`.
30+
31+
```js
32+
const forgeConfig = {
33+
plugins: [new IntegrityDigestPlugin({version: 1})],
34+
};
35+
```
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "@electron-forge/plugin-integrity-digest",
3+
"version": "7.11.1",
4+
"description": "A plugin for generating integrity digests in Electron Forge",
5+
"repository": "https://github.com/electron/forge",
6+
"author": "Noah Gregory <noahmgregory@gmail.com>",
7+
"license": "MIT",
8+
"main": "dist/IntegrityDigestPlugin.js",
9+
"files": [
10+
"dist",
11+
"src",
12+
"package.json",
13+
"README.md"
14+
],
15+
"typings": "dist/IntegrityDigestPlugin.d.ts",
16+
"engines": {
17+
"node": ">= 16.4.0"
18+
},
19+
"dependencies": {
20+
"@electron-forge/plugin-base": "workspace:*",
21+
"@electron-forge/shared-types": "workspace:*",
22+
"@electron/asar": "4.1.0"
23+
},
24+
"publishConfig": {
25+
"access": "public"
26+
}
27+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import path from 'node:path';
2+
3+
import {
4+
calculateIntegrityDigestForApp,
5+
setStoredIntegrityDigestForApp,
6+
// eslint-disable-next-line import/no-unresolved -- @electron/asar is ESM; ESLint can't resolve it.
7+
} from '@electron/asar';
8+
import { namedHookWithTaskFn, PluginBase } from '@electron-forge/plugin-base';
9+
import {
10+
ForgeMultiHookMap,
11+
type ForgePlatform,
12+
} from '@electron-forge/shared-types';
13+
14+
type IntegrityDigestVersion = 1; // TODO: Export this from @electron/asar
15+
16+
export type IntegrityDigestConfig = {
17+
version: IntegrityDigestVersion;
18+
};
19+
20+
export default class IntegrityDigestPlugin extends PluginBase<IntegrityDigestConfig> {
21+
name = 'integrity-digest';
22+
23+
constructor(config: IntegrityDigestConfig = { version: 1 }) {
24+
super(config);
25+
}
26+
27+
getHooks(): ForgeMultiHookMap {
28+
return {
29+
packageAfterCopy: namedHookWithTaskFn<'packageAfterCopy'>(
30+
async (
31+
listrTask,
32+
resolvedForgeConfig,
33+
resourcesPath,
34+
electronVersion,
35+
platform,
36+
) => {
37+
const { version } = this.config;
38+
const applePlatforms: ForgePlatform[] = ['darwin', 'mas'];
39+
if (!applePlatforms.includes(platform)) return;
40+
// `resourcesPath` points to `<App>.app/Contents/Resources/app`, so go up 3 levels to reach `<App>.app`.
41+
const appPath = path.resolve(resourcesPath, '../../..');
42+
const integrityDigest = calculateIntegrityDigestForApp(
43+
appPath,
44+
version,
45+
);
46+
setStoredIntegrityDigestForApp(appPath, integrityDigest);
47+
},
48+
'Calculating and Storing Integrity Digest',
49+
),
50+
};
51+
}
52+
}
53+
54+
export { IntegrityDigestPlugin };

yarn.lock

Lines changed: 85 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,16 @@ __metadata:
11111111
languageName: unknown
11121112
linkType: soft
11131113

1114+
"@electron-forge/plugin-integrity-digest@workspace:packages/plugin/integrity-digest":
1115+
version: 0.0.0-use.local
1116+
resolution: "@electron-forge/plugin-integrity-digest@workspace:packages/plugin/integrity-digest"
1117+
dependencies:
1118+
"@electron-forge/plugin-base": "workspace:*"
1119+
"@electron-forge/shared-types": "workspace:*"
1120+
"@electron/asar": "npm:4.1.0"
1121+
languageName: unknown
1122+
linkType: soft
1123+
11141124
"@electron-forge/plugin-local-electron@workspace:packages/plugin/local-electron":
11151125
version: 0.0.0-use.local
11161126
resolution: "@electron-forge/plugin-local-electron@workspace:packages/plugin/local-electron"
@@ -1405,6 +1415,23 @@ __metadata:
14051415
languageName: unknown
14061416
linkType: soft
14071417

1418+
"@electron/asar@npm:4.1.0":
1419+
version: 4.1.0
1420+
resolution: "@electron/asar@npm:4.1.0"
1421+
dependencies:
1422+
commander: "npm:^13.1.0"
1423+
glob: "npm:^13.0.2"
1424+
minimatch: "npm:^10.0.1"
1425+
plist: "npm:^3.1.0"
1426+
dependenciesMeta:
1427+
electron:
1428+
built: true
1429+
bin:
1430+
asar: bin/asar.mjs
1431+
checksum: 10c0/f75565faeae0e54170ec625ceb5339d0f5c3fec79ff6d6794b0172aa2c5d96a2a9d189943c78004875b53d0010f39925dc6d6fcc76b324571986e68f82d87b0a
1432+
languageName: node
1433+
linkType: hard
1434+
14081435
"@electron/asar@npm:^3.2.1":
14091436
version: 3.4.1
14101437
resolution: "@electron/asar@npm:3.4.1"
@@ -6747,6 +6774,13 @@ __metadata:
67476774
languageName: node
67486775
linkType: hard
67496776

6777+
"balanced-match@npm:^4.0.2":
6778+
version: 4.0.4
6779+
resolution: "balanced-match@npm:4.0.4"
6780+
checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b
6781+
languageName: node
6782+
linkType: hard
6783+
67506784
"bare-events@npm:^2.7.0":
67516785
version: 2.8.2
67526786
resolution: "bare-events@npm:2.8.2"
@@ -6938,6 +6972,15 @@ __metadata:
69386972
languageName: node
69396973
linkType: hard
69406974

6975+
"brace-expansion@npm:^5.0.2":
6976+
version: 5.0.3
6977+
resolution: "brace-expansion@npm:5.0.3"
6978+
dependencies:
6979+
balanced-match: "npm:^4.0.2"
6980+
checksum: 10c0/e474d300e581ec56851b3863ff1cf18573170c6d06deb199ccbd03b2119c36975f6ce2abc7b770f5bebddc1ab022661a9fea9b4d56f33315d7bef54d8793869e
6981+
languageName: node
6982+
linkType: hard
6983+
69416984
"braces@npm:^3.0.3, braces@npm:~3.0.2":
69426985
version: 3.0.3
69436986
resolution: "braces@npm:3.0.3"
@@ -11411,6 +11454,17 @@ __metadata:
1141111454
languageName: node
1141211455
linkType: hard
1141311456

11457+
"glob@npm:^13.0.2":
11458+
version: 13.0.6
11459+
resolution: "glob@npm:13.0.6"
11460+
dependencies:
11461+
minimatch: "npm:^10.2.2"
11462+
minipass: "npm:^7.1.3"
11463+
path-scurry: "npm:^2.0.2"
11464+
checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a
11465+
languageName: node
11466+
linkType: hard
11467+
1141411468
"glob@npm:^7.1.3, glob@npm:^7.1.6":
1141511469
version: 7.2.3
1141611470
resolution: "glob@npm:7.2.3"
@@ -14816,12 +14870,12 @@ __metadata:
1481614870
languageName: node
1481714871
linkType: hard
1481814872

14819-
"minimatch@npm:^10.0.1, minimatch@npm:^10.1.1":
14820-
version: 10.1.1
14821-
resolution: "minimatch@npm:10.1.1"
14873+
"minimatch@npm:^10.0.1, minimatch@npm:^10.2.2":
14874+
version: 10.2.4
14875+
resolution: "minimatch@npm:10.2.4"
1482214876
dependencies:
14823-
"@isaacs/brace-expansion": "npm:^5.0.0"
14824-
checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902
14877+
brace-expansion: "npm:^5.0.2"
14878+
checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945
1482514879
languageName: node
1482614880
linkType: hard
1482714881

@@ -14834,6 +14888,15 @@ __metadata:
1483414888
languageName: node
1483514889
linkType: hard
1483614890

14891+
"minimatch@npm:^10.1.1":
14892+
version: 10.1.1
14893+
resolution: "minimatch@npm:10.1.1"
14894+
dependencies:
14895+
"@isaacs/brace-expansion": "npm:^5.0.0"
14896+
checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902
14897+
languageName: node
14898+
linkType: hard
14899+
1483714900
"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
1483814901
version: 3.1.2
1483914902
resolution: "minimatch@npm:3.1.2"
@@ -14990,6 +15053,13 @@ __metadata:
1499015053
languageName: node
1499115054
linkType: hard
1499215055

15056+
"minipass@npm:^7.1.3":
15057+
version: 7.1.3
15058+
resolution: "minipass@npm:7.1.3"
15059+
checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb
15060+
languageName: node
15061+
linkType: hard
15062+
1499315063
"minizlib@npm:^2.1.1":
1499415064
version: 2.1.2
1499515065
resolution: "minizlib@npm:2.1.2"
@@ -16432,6 +16502,16 @@ __metadata:
1643216502
languageName: node
1643316503
linkType: hard
1643416504

16505+
"path-scurry@npm:^2.0.2":
16506+
version: 2.0.2
16507+
resolution: "path-scurry@npm:2.0.2"
16508+
dependencies:
16509+
lru-cache: "npm:^11.0.0"
16510+
minipass: "npm:^7.1.2"
16511+
checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482
16512+
languageName: node
16513+
linkType: hard
16514+
1643516515
"path-to-regexp@npm:0.1.12":
1643616516
version: 0.1.12
1643716517
resolution: "path-to-regexp@npm:0.1.12"

0 commit comments

Comments
 (0)