@kirill.konshin/electron-builder 0.0.1
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/.ctirc +11 -0
- package/.turbo/turbo-build.log +14 -0
- package/dist/builder.d.ts +8 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +129 -0
- package/dist/builder.js.map +1 -0
- package/dist/images.d.ts +7 -0
- package/dist/images.d.ts.map +1 -0
- package/dist/images.js +25 -0
- package/dist/images.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/package.json +58 -0
- package/src/builder.ts +150 -0
- package/src/images.ts +33 -0
- package/src/index.ts +2 -0
- package/tsconfig.json +10 -0
- package/turbo.json +10 -0
- package/vite.config.ts +2 -0
package/.ctirc
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[36mvite v7.0.6 [32mbuilding SSR bundle for production...[36m[39m
|
|
2
|
+
create succeeded: /home/runner/work/utils/utils/packages/electron-builder/src
|
|
3
|
+
transforming...
|
|
4
|
+
[32m✓[39m 3 modules transformed.
|
|
5
|
+
rendering chunks...
|
|
6
|
+
|
|
7
|
+
[vite:dts] Start generate declaration files...
|
|
8
|
+
[2mdist/[22m[36mindex.js [39m[1m[2m0.17 kB[22m[1m[22m[2m │ map: 0.09 kB[22m
|
|
9
|
+
[2mdist/[22m[36mimages.js [39m[1m[2m1.02 kB[22m[1m[22m[2m │ map: 1.94 kB[22m
|
|
10
|
+
[2mdist/[22m[36mbuilder.js [39m[1m[2m3.03 kB[22m[1m[22m[2m │ map: 6.73 kB[22m
|
|
11
|
+
[vite:dts] Declaration files built in 1393ms.
|
|
12
|
+
|
|
13
|
+
[32m✓ built in 2.09s[39m
|
|
14
|
+
Updated package.json with exports
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Configuration } from 'electron-builder';
|
|
2
|
+
import { GithubOptions, S3Options } from 'builder-util-runtime';
|
|
3
|
+
export declare function builerConfig(options: {
|
|
4
|
+
config: Configuration;
|
|
5
|
+
s3?: Pick<S3Options, 'bucket'> & Partial<S3Options>;
|
|
6
|
+
githubReleases: Pick<GithubOptions, 'owner' | 'repo'> & Partial<GithubOptions>;
|
|
7
|
+
}): Configuration;
|
|
8
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAyDrE,wBAAgB,YAAY,CAAC,OAAO,EAAE;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACpD,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAClF,GAAG,aAAa,CAuFhB"}
|
package/dist/builder.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
const {
|
|
2
|
+
GITHUB_REF_TYPE,
|
|
3
|
+
GITHUB_REF_NAME,
|
|
4
|
+
GITHUB_RUN_ID,
|
|
5
|
+
GITHUB_REF,
|
|
6
|
+
AWS_URL,
|
|
7
|
+
AWS_ACCESS_KEY_ID,
|
|
8
|
+
AWS_SECRET_ACCESS_KEY,
|
|
9
|
+
GH_TOKEN,
|
|
10
|
+
CSC_IDENTITY_AUTO_DISCOVERY
|
|
11
|
+
} = process.env;
|
|
12
|
+
const isGithubTag = GITHUB_REF_TYPE === "tag";
|
|
13
|
+
const isGithubMaster = GITHUB_REF_TYPE === "branch" && GITHUB_REF_NAME === "master";
|
|
14
|
+
const isDevPublish = AWS_URL?.includes(":9000");
|
|
15
|
+
const isNoAutoDiscovery = CSC_IDENTITY_AUTO_DISCOVERY === "false";
|
|
16
|
+
const isSkipPublish = !isDevPublish && !isGithubMaster && !isGithubTag;
|
|
17
|
+
const channel = isGithubTag ? "latest" : GITHUB_REF_NAME;
|
|
18
|
+
function getVersion() {
|
|
19
|
+
if (isGithubMaster) {
|
|
20
|
+
return `0.0.${GITHUB_RUN_ID}`;
|
|
21
|
+
}
|
|
22
|
+
if (isGithubTag) {
|
|
23
|
+
return GITHUB_REF.split("/").pop();
|
|
24
|
+
}
|
|
25
|
+
return `0.0.${Date.now()}`;
|
|
26
|
+
}
|
|
27
|
+
function getTarget() {
|
|
28
|
+
const arch = ["arm64", isNoAutoDiscovery ? "" : "x64"].filter(Boolean);
|
|
29
|
+
const target = [
|
|
30
|
+
{
|
|
31
|
+
target: "dmg",
|
|
32
|
+
arch
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
target: "zip",
|
|
36
|
+
arch
|
|
37
|
+
}
|
|
38
|
+
];
|
|
39
|
+
if (isNoAutoDiscovery) {
|
|
40
|
+
console.log("Skipping signing...");
|
|
41
|
+
delete process.env.CSC_LINK;
|
|
42
|
+
return [target[0]];
|
|
43
|
+
}
|
|
44
|
+
return target;
|
|
45
|
+
}
|
|
46
|
+
function builerConfig(options) {
|
|
47
|
+
if (options.s3 && (!AWS_URL || !AWS_ACCESS_KEY_ID || !AWS_SECRET_ACCESS_KEY)) {
|
|
48
|
+
throw new Error("Missing AWS configuration");
|
|
49
|
+
}
|
|
50
|
+
if (options.githubReleases && !GH_TOKEN) {
|
|
51
|
+
throw new Error("Missing AWS configuration");
|
|
52
|
+
}
|
|
53
|
+
const config = {
|
|
54
|
+
files: [
|
|
55
|
+
"**/*",
|
|
56
|
+
"!electron-builder.js",
|
|
57
|
+
"!electron-builder.yml",
|
|
58
|
+
"!package.json",
|
|
59
|
+
"assets",
|
|
60
|
+
...options.config.files
|
|
61
|
+
],
|
|
62
|
+
directories: {
|
|
63
|
+
buildResources: "assets"
|
|
64
|
+
},
|
|
65
|
+
mac: {
|
|
66
|
+
category: options.config.mac?.category ?? "public.app-category.utils",
|
|
67
|
+
target: getTarget()
|
|
68
|
+
},
|
|
69
|
+
//TODO Windows target
|
|
70
|
+
dmg: {
|
|
71
|
+
contents: [
|
|
72
|
+
{
|
|
73
|
+
x: 130,
|
|
74
|
+
y: 130
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
x: 370,
|
|
78
|
+
y: 130,
|
|
79
|
+
type: "link",
|
|
80
|
+
path: "/Applications"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
publish: [
|
|
85
|
+
options.s3 && {
|
|
86
|
+
provider: "s3",
|
|
87
|
+
endpoint: AWS_URL,
|
|
88
|
+
channel,
|
|
89
|
+
...options.s3
|
|
90
|
+
// bucket
|
|
91
|
+
},
|
|
92
|
+
options.githubReleases && GH_TOKEN && (isGithubTag || isGithubMaster) && {
|
|
93
|
+
provider: "github",
|
|
94
|
+
private: true,
|
|
95
|
+
token: GH_TOKEN,
|
|
96
|
+
releaseType: isGithubTag ? "release" : "draft",
|
|
97
|
+
channel,
|
|
98
|
+
...options.githubReleases
|
|
99
|
+
// repo, owner
|
|
100
|
+
}
|
|
101
|
+
].filter(Boolean),
|
|
102
|
+
extraMetadata: {
|
|
103
|
+
version: getVersion()
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
if (isSkipPublish) {
|
|
107
|
+
delete config.publish;
|
|
108
|
+
delete config.extraMetadata;
|
|
109
|
+
}
|
|
110
|
+
console.log("Electron Builder context", {
|
|
111
|
+
isDevPublish,
|
|
112
|
+
isGithubMaster,
|
|
113
|
+
isGithubTag,
|
|
114
|
+
isSkipPublish,
|
|
115
|
+
isNoAutoDiscovery,
|
|
116
|
+
channel,
|
|
117
|
+
GITHUB_RUN_ID,
|
|
118
|
+
GITHUB_REF_TYPE,
|
|
119
|
+
GITHUB_REF_NAME,
|
|
120
|
+
CSC_IDENTITY_AUTO_DISCOVERY,
|
|
121
|
+
AWS_URL
|
|
122
|
+
});
|
|
123
|
+
console.log("Electron Builder configuration", JSON.stringify(config, null, 2));
|
|
124
|
+
return config;
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
builerConfig
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sources":["../src/builder.ts"],"sourcesContent":["import type { Configuration, MacConfiguration } from 'electron-builder';\nimport type { GithubOptions, S3Options } from 'builder-util-runtime';\n\nconst {\n GITHUB_REF_TYPE,\n GITHUB_REF_NAME,\n GITHUB_RUN_ID,\n GITHUB_REF,\n AWS_URL,\n AWS_ACCESS_KEY_ID,\n AWS_SECRET_ACCESS_KEY,\n GH_TOKEN,\n CSC_IDENTITY_AUTO_DISCOVERY,\n} = process.env;\n\nconst isGithubTag = GITHUB_REF_TYPE === 'tag';\nconst isGithubMaster = GITHUB_REF_TYPE === 'branch' && GITHUB_REF_NAME === 'master';\nconst isDevPublish = AWS_URL?.includes(':9000');\nconst isNoAutoDiscovery = CSC_IDENTITY_AUTO_DISCOVERY === 'false';\nconst isSkipPublish = !isDevPublish && !isGithubMaster && !isGithubTag;\n\n//FIXME Refine logic, tags should be versions, not channels, use branches? See how Changesets does it\nconst channel = isGithubTag ? 'latest' : GITHUB_REF_NAME; // https://www.electron.build/tutorials/release-using-channels.html\n\nfunction getVersion() {\n if (isGithubMaster) {\n return `0.0.${GITHUB_RUN_ID}`; //TODO Figure out last normal in master and bump it\n }\n if (isGithubTag) {\n return GITHUB_REF!.split('/').pop();\n }\n return `0.0.${Date.now()}`; //TODO Read from package.json?\n}\n\nfunction getTarget() {\n const arch = ['arm64', isNoAutoDiscovery ? '' : 'x64'].filter(Boolean) as any;\n\n const target: MacConfiguration['target'] = [\n {\n target: 'dmg',\n arch,\n },\n {\n target: 'zip',\n arch,\n },\n ];\n\n // Leave only DMG if no signing\n if (isNoAutoDiscovery) {\n console.log('Skipping signing...');\n delete process.env.CSC_LINK;\n return [target[0]]; // only keep DMG\n }\n\n return target;\n}\n\nexport function builerConfig(options: {\n config: Configuration;\n s3?: Pick<S3Options, 'bucket'> & Partial<S3Options>; //TODO Omit?\n githubReleases: Pick<GithubOptions, 'owner' | 'repo'> & Partial<GithubOptions>;\n}): Configuration {\n if (options.s3 && (!AWS_URL || !AWS_ACCESS_KEY_ID || !AWS_SECRET_ACCESS_KEY)) {\n throw new Error('Missing AWS configuration');\n }\n\n if (options.githubReleases && !GH_TOKEN) {\n throw new Error('Missing AWS configuration');\n }\n\n const config: Configuration = {\n files: [\n '**/*',\n '!electron-builder.js',\n '!electron-builder.yml',\n '!package.json',\n 'assets',\n ...(options.config.files as never),\n ],\n directories: {\n buildResources: 'assets',\n },\n mac: {\n category: options.config.mac?.category ?? 'public.app-category.utils',\n target: getTarget(),\n },\n //TODO Windows target\n dmg: {\n contents: [\n {\n x: 130,\n y: 130,\n },\n {\n x: 370,\n y: 130,\n type: 'link',\n path: '/Applications',\n },\n ],\n },\n publish: [\n options.s3 &&\n ({\n provider: 's3',\n endpoint: AWS_URL,\n channel,\n ...options.s3, // bucket\n } as S3Options),\n options.githubReleases &&\n GH_TOKEN &&\n (isGithubTag || isGithubMaster) &&\n ({\n provider: 'github',\n private: true,\n token: GH_TOKEN,\n releaseType: isGithubTag ? 'release' : 'draft',\n channel,\n ...options.githubReleases, // repo, owner\n } as GithubOptions),\n ].filter(Boolean) as never,\n extraMetadata: {\n version: getVersion(),\n },\n };\n\n if (isSkipPublish) {\n delete config.publish;\n delete (config as never as any).extraMetadata;\n }\n\n console.log('Electron Builder context', {\n isDevPublish,\n isGithubMaster,\n isGithubTag,\n isSkipPublish,\n isNoAutoDiscovery,\n channel,\n GITHUB_RUN_ID: GITHUB_RUN_ID,\n GITHUB_REF_TYPE: GITHUB_REF_TYPE,\n GITHUB_REF_NAME: GITHUB_REF_NAME,\n CSC_IDENTITY_AUTO_DISCOVERY: CSC_IDENTITY_AUTO_DISCOVERY,\n AWS_URL: AWS_URL,\n });\n\n console.log('Electron Builder configuration', JSON.stringify(config, null, 2));\n\n return config;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/images.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function generateImages({ iconPsdPath, dmgBackgroundPsdPath, electronAssetsPath, webPublicPath, }: {
|
|
2
|
+
iconPsdPath: string;
|
|
3
|
+
dmgBackgroundPsdPath: string;
|
|
4
|
+
electronAssetsPath: string;
|
|
5
|
+
webPublicPath: string;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../src/images.ts"],"names":[],"mappings":"AAIA,wBAAsB,cAAc,CAAC,EACjC,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GAChB,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB"}
|
package/dist/images.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import psd from "psd";
|
|
2
|
+
import sharp from "sharp";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
async function generateImages({
|
|
5
|
+
iconPsdPath,
|
|
6
|
+
dmgBackgroundPsdPath,
|
|
7
|
+
electronAssetsPath,
|
|
8
|
+
webPublicPath
|
|
9
|
+
}) {
|
|
10
|
+
const iconPsd = await psd.open(iconPsdPath);
|
|
11
|
+
await iconPsd.image.saveAsPng(path.join(electronAssetsPath, "icon.png"));
|
|
12
|
+
const bgPsd = await psd.open(dmgBackgroundPsdPath);
|
|
13
|
+
await bgPsd.image.saveAsPng(path.join(electronAssetsPath, "background@2x.png"));
|
|
14
|
+
const iconPng = sharp(path.join(electronAssetsPath, "icon.png"));
|
|
15
|
+
const bgPng = sharp(path.join(electronAssetsPath, "background@2x.png"));
|
|
16
|
+
await bgPng.resize(500).toFile(path.join(electronAssetsPath, "background.png"));
|
|
17
|
+
await iconPng.toFile(path.join(electronAssetsPath, "splash.webp"));
|
|
18
|
+
await iconPng.toFile(path.join(electronAssetsPath, "icon.icns"));
|
|
19
|
+
await iconPng.toFile(path.join(webPublicPath, "icon.png"));
|
|
20
|
+
await iconPng.resize(32).toFile(path.join(webPublicPath, "favicon.ico"));
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
generateImages
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"images.js","sources":["../src/images.ts"],"sourcesContent":["import psd from 'psd';\nimport sharp from 'sharp';\nimport path from 'node:path';\n\nexport async function generateImages({\n iconPsdPath,\n dmgBackgroundPsdPath,\n electronAssetsPath,\n webPublicPath,\n}: {\n iconPsdPath: string;\n dmgBackgroundPsdPath: string;\n electronAssetsPath: string;\n webPublicPath: string;\n}): Promise<void> {\n const iconPsd = await psd.open(iconPsdPath);\n await iconPsd.image!.saveAsPng(path.join(electronAssetsPath, 'icon.png'));\n\n const bgPsd = await psd.open(dmgBackgroundPsdPath);\n await bgPsd.image!.saveAsPng(path.join(electronAssetsPath, 'background@2x.png'));\n\n const iconPng = sharp(path.join(electronAssetsPath, 'icon.png'));\n const bgPng = sharp(path.join(electronAssetsPath, 'background@2x.png'));\n\n await bgPng.resize(500).toFile(path.join(electronAssetsPath, 'background.png'));\n\n await iconPng.toFile(path.join(electronAssetsPath, 'splash.webp'));\n await iconPng.toFile(path.join(electronAssetsPath, 'icon.icns'));\n\n //TODO Crop without icon BG\n await iconPng.toFile(path.join(webPublicPath, 'icon.png'));\n await iconPng.resize(32).toFile(path.join(webPublicPath, 'favicon.ico'));\n}\n"],"names":[],"mappings":";;;AAIA,eAAsB,eAAe;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKkB;AACd,QAAM,UAAU,MAAM,IAAI,KAAK,WAAW;AAC1C,QAAM,QAAQ,MAAO,UAAU,KAAK,KAAK,oBAAoB,UAAU,CAAC;AAExE,QAAM,QAAQ,MAAM,IAAI,KAAK,oBAAoB;AACjD,QAAM,MAAM,MAAO,UAAU,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAE/E,QAAM,UAAU,MAAM,KAAK,KAAK,oBAAoB,UAAU,CAAC;AAC/D,QAAM,QAAQ,MAAM,KAAK,KAAK,oBAAoB,mBAAmB,CAAC;AAEtE,QAAM,MAAM,OAAO,GAAG,EAAE,OAAO,KAAK,KAAK,oBAAoB,gBAAgB,CAAC;AAE9E,QAAM,QAAQ,OAAO,KAAK,KAAK,oBAAoB,aAAa,CAAC;AACjE,QAAM,QAAQ,OAAO,KAAK,KAAK,oBAAoB,WAAW,CAAC;AAG/D,QAAM,QAAQ,OAAO,KAAK,KAAK,eAAe,UAAU,CAAC;AACzD,QAAM,QAAQ,OAAO,EAAE,EAAE,OAAO,KAAK,KAAK,eAAe,aAAa,CAAC;AAC3E;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kirill.konshin/electron-builder",
|
|
3
|
+
"description": "Utilities",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"----- BUILD -----": "",
|
|
8
|
+
"clean": "rm -rf dist .tscache tsconfig.tsbuildinfo",
|
|
9
|
+
"build": "vite build",
|
|
10
|
+
"build:index": "cti create ./src",
|
|
11
|
+
"build:check-types": "attw --pack .",
|
|
12
|
+
"start": "yarn build --watch",
|
|
13
|
+
"wait": "wait-on ./dist/index.js",
|
|
14
|
+
"----- TEST -----": "",
|
|
15
|
+
"test:disabled": "vitest run --coverage",
|
|
16
|
+
"test:watch": "vitest watch --coverage",
|
|
17
|
+
"----- STORYBOOK -----": "",
|
|
18
|
+
"storybook:start": "storybook dev -p 6006",
|
|
19
|
+
"storybook:build": "storybook build"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"psd": "^3.4.0",
|
|
23
|
+
"sharp": "^0.34.3"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@kirill.konshin/utils-private": "*",
|
|
27
|
+
"electron": "^37.2.5",
|
|
28
|
+
"electron-builder": "^26.0.12"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"electron": "^37",
|
|
32
|
+
"electron-builder": "^26"
|
|
33
|
+
},
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"author": "Kirill Konshin <kirill@konshin.org> (https://konshin.org)",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"exports": {
|
|
40
|
+
".": {
|
|
41
|
+
"import": {
|
|
42
|
+
"import": "./dist/index.js",
|
|
43
|
+
"types": "./dist/index.d.ts"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"main": "./dist/index.js",
|
|
48
|
+
"module": "./dist/index.js",
|
|
49
|
+
"types": "./dist/index.d.ts",
|
|
50
|
+
"peerDependenciesMeta": {
|
|
51
|
+
"electron": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"electron-builder": {
|
|
55
|
+
"optional": true
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
package/src/builder.ts
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { Configuration, MacConfiguration } from 'electron-builder';
|
|
2
|
+
import type { GithubOptions, S3Options } from 'builder-util-runtime';
|
|
3
|
+
|
|
4
|
+
const {
|
|
5
|
+
GITHUB_REF_TYPE,
|
|
6
|
+
GITHUB_REF_NAME,
|
|
7
|
+
GITHUB_RUN_ID,
|
|
8
|
+
GITHUB_REF,
|
|
9
|
+
AWS_URL,
|
|
10
|
+
AWS_ACCESS_KEY_ID,
|
|
11
|
+
AWS_SECRET_ACCESS_KEY,
|
|
12
|
+
GH_TOKEN,
|
|
13
|
+
CSC_IDENTITY_AUTO_DISCOVERY,
|
|
14
|
+
} = process.env;
|
|
15
|
+
|
|
16
|
+
const isGithubTag = GITHUB_REF_TYPE === 'tag';
|
|
17
|
+
const isGithubMaster = GITHUB_REF_TYPE === 'branch' && GITHUB_REF_NAME === 'master';
|
|
18
|
+
const isDevPublish = AWS_URL?.includes(':9000');
|
|
19
|
+
const isNoAutoDiscovery = CSC_IDENTITY_AUTO_DISCOVERY === 'false';
|
|
20
|
+
const isSkipPublish = !isDevPublish && !isGithubMaster && !isGithubTag;
|
|
21
|
+
|
|
22
|
+
//FIXME Refine logic, tags should be versions, not channels, use branches? See how Changesets does it
|
|
23
|
+
const channel = isGithubTag ? 'latest' : GITHUB_REF_NAME; // https://www.electron.build/tutorials/release-using-channels.html
|
|
24
|
+
|
|
25
|
+
function getVersion() {
|
|
26
|
+
if (isGithubMaster) {
|
|
27
|
+
return `0.0.${GITHUB_RUN_ID}`; //TODO Figure out last normal in master and bump it
|
|
28
|
+
}
|
|
29
|
+
if (isGithubTag) {
|
|
30
|
+
return GITHUB_REF!.split('/').pop();
|
|
31
|
+
}
|
|
32
|
+
return `0.0.${Date.now()}`; //TODO Read from package.json?
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function getTarget() {
|
|
36
|
+
const arch = ['arm64', isNoAutoDiscovery ? '' : 'x64'].filter(Boolean) as any;
|
|
37
|
+
|
|
38
|
+
const target: MacConfiguration['target'] = [
|
|
39
|
+
{
|
|
40
|
+
target: 'dmg',
|
|
41
|
+
arch,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
target: 'zip',
|
|
45
|
+
arch,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
// Leave only DMG if no signing
|
|
50
|
+
if (isNoAutoDiscovery) {
|
|
51
|
+
console.log('Skipping signing...');
|
|
52
|
+
delete process.env.CSC_LINK;
|
|
53
|
+
return [target[0]]; // only keep DMG
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return target;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function builerConfig(options: {
|
|
60
|
+
config: Configuration;
|
|
61
|
+
s3?: Pick<S3Options, 'bucket'> & Partial<S3Options>; //TODO Omit?
|
|
62
|
+
githubReleases: Pick<GithubOptions, 'owner' | 'repo'> & Partial<GithubOptions>;
|
|
63
|
+
}): Configuration {
|
|
64
|
+
if (options.s3 && (!AWS_URL || !AWS_ACCESS_KEY_ID || !AWS_SECRET_ACCESS_KEY)) {
|
|
65
|
+
throw new Error('Missing AWS configuration');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (options.githubReleases && !GH_TOKEN) {
|
|
69
|
+
throw new Error('Missing AWS configuration');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const config: Configuration = {
|
|
73
|
+
files: [
|
|
74
|
+
'**/*',
|
|
75
|
+
'!electron-builder.js',
|
|
76
|
+
'!electron-builder.yml',
|
|
77
|
+
'!package.json',
|
|
78
|
+
'assets',
|
|
79
|
+
...(options.config.files as never),
|
|
80
|
+
],
|
|
81
|
+
directories: {
|
|
82
|
+
buildResources: 'assets',
|
|
83
|
+
},
|
|
84
|
+
mac: {
|
|
85
|
+
category: options.config.mac?.category ?? 'public.app-category.utils',
|
|
86
|
+
target: getTarget(),
|
|
87
|
+
},
|
|
88
|
+
//TODO Windows target
|
|
89
|
+
dmg: {
|
|
90
|
+
contents: [
|
|
91
|
+
{
|
|
92
|
+
x: 130,
|
|
93
|
+
y: 130,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
x: 370,
|
|
97
|
+
y: 130,
|
|
98
|
+
type: 'link',
|
|
99
|
+
path: '/Applications',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
publish: [
|
|
104
|
+
options.s3 &&
|
|
105
|
+
({
|
|
106
|
+
provider: 's3',
|
|
107
|
+
endpoint: AWS_URL,
|
|
108
|
+
channel,
|
|
109
|
+
...options.s3, // bucket
|
|
110
|
+
} as S3Options),
|
|
111
|
+
options.githubReleases &&
|
|
112
|
+
GH_TOKEN &&
|
|
113
|
+
(isGithubTag || isGithubMaster) &&
|
|
114
|
+
({
|
|
115
|
+
provider: 'github',
|
|
116
|
+
private: true,
|
|
117
|
+
token: GH_TOKEN,
|
|
118
|
+
releaseType: isGithubTag ? 'release' : 'draft',
|
|
119
|
+
channel,
|
|
120
|
+
...options.githubReleases, // repo, owner
|
|
121
|
+
} as GithubOptions),
|
|
122
|
+
].filter(Boolean) as never,
|
|
123
|
+
extraMetadata: {
|
|
124
|
+
version: getVersion(),
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
if (isSkipPublish) {
|
|
129
|
+
delete config.publish;
|
|
130
|
+
delete (config as never as any).extraMetadata;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.log('Electron Builder context', {
|
|
134
|
+
isDevPublish,
|
|
135
|
+
isGithubMaster,
|
|
136
|
+
isGithubTag,
|
|
137
|
+
isSkipPublish,
|
|
138
|
+
isNoAutoDiscovery,
|
|
139
|
+
channel,
|
|
140
|
+
GITHUB_RUN_ID: GITHUB_RUN_ID,
|
|
141
|
+
GITHUB_REF_TYPE: GITHUB_REF_TYPE,
|
|
142
|
+
GITHUB_REF_NAME: GITHUB_REF_NAME,
|
|
143
|
+
CSC_IDENTITY_AUTO_DISCOVERY: CSC_IDENTITY_AUTO_DISCOVERY,
|
|
144
|
+
AWS_URL: AWS_URL,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
console.log('Electron Builder configuration', JSON.stringify(config, null, 2));
|
|
148
|
+
|
|
149
|
+
return config;
|
|
150
|
+
}
|
package/src/images.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import psd from 'psd';
|
|
2
|
+
import sharp from 'sharp';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
|
|
5
|
+
export async function generateImages({
|
|
6
|
+
iconPsdPath,
|
|
7
|
+
dmgBackgroundPsdPath,
|
|
8
|
+
electronAssetsPath,
|
|
9
|
+
webPublicPath,
|
|
10
|
+
}: {
|
|
11
|
+
iconPsdPath: string;
|
|
12
|
+
dmgBackgroundPsdPath: string;
|
|
13
|
+
electronAssetsPath: string;
|
|
14
|
+
webPublicPath: string;
|
|
15
|
+
}): Promise<void> {
|
|
16
|
+
const iconPsd = await psd.open(iconPsdPath);
|
|
17
|
+
await iconPsd.image!.saveAsPng(path.join(electronAssetsPath, 'icon.png'));
|
|
18
|
+
|
|
19
|
+
const bgPsd = await psd.open(dmgBackgroundPsdPath);
|
|
20
|
+
await bgPsd.image!.saveAsPng(path.join(electronAssetsPath, 'background@2x.png'));
|
|
21
|
+
|
|
22
|
+
const iconPng = sharp(path.join(electronAssetsPath, 'icon.png'));
|
|
23
|
+
const bgPng = sharp(path.join(electronAssetsPath, 'background@2x.png'));
|
|
24
|
+
|
|
25
|
+
await bgPng.resize(500).toFile(path.join(electronAssetsPath, 'background.png'));
|
|
26
|
+
|
|
27
|
+
await iconPng.toFile(path.join(electronAssetsPath, 'splash.webp'));
|
|
28
|
+
await iconPng.toFile(path.join(electronAssetsPath, 'icon.icns'));
|
|
29
|
+
|
|
30
|
+
//TODO Crop without icon BG
|
|
31
|
+
await iconPng.toFile(path.join(webPublicPath, 'icon.png'));
|
|
32
|
+
await iconPng.resize(32).toFile(path.join(webPublicPath, 'favicon.ico'));
|
|
33
|
+
}
|
package/src/index.ts
ADDED
package/tsconfig.json
ADDED
package/turbo.json
ADDED
package/vite.config.ts
ADDED