Skip to content

Commit 3f8caab

Browse files
committed
feat(portable): ExecutionLevel for nsis portable
Close #1440
1 parent fa50854 commit 3f8caab

File tree

17 files changed

+13525
-10328
lines changed

17 files changed

+13525
-10328
lines changed

docs/Developer API.md

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
<dd></dd>
2424
<dt><a href="#module_electron-builder/out/options/linuxOptions">electron-builder/out/options/linuxOptions</a></dt>
2525
<dd></dd>
26+
<dt><a href="#module_electron-builder/out/options/winOptions">electron-builder/out/options/winOptions</a></dt>
27+
<dd></dd>
2628
<dt><a href="#module_electron-builder/out/packager/dirPackager">electron-builder/out/packager/dirPackager</a></dt>
2729
<dd></dd>
2830
<dt><a href="#module_electron-builder/out/packager/mac">electron-builder/out/packager/mac</a></dt>
@@ -1228,6 +1230,39 @@
12281230
| depends| <code>Array&lt;string&gt;</code> \| <code>null</code> | <a name="LinuxTargetSpecificOptions-depends"></a>Package dependencies. |
12291231
| icon| <code>string</code> | <a name="LinuxTargetSpecificOptions-icon"></a> |
12301232

1233+
<a name="module_electron-builder/out/options/winOptions"></a>
1234+
1235+
## electron-builder/out/options/winOptions
1236+
1237+
* [electron-builder/out/options/winOptions](#module_electron-builder/out/options/winOptions)
1238+
* [`.CommonNsisOptions`](#CommonNsisOptions)
1239+
* [`.PortableOptions`](#PortableOptions) ⇐ <code>[CommonNsisOptions](#CommonNsisOptions)</code>
1240+
1241+
<a name="CommonNsisOptions"></a>
1242+
1243+
### `CommonNsisOptions`
1244+
**Kind**: interface of <code>[electron-builder/out/options/winOptions](#module_electron-builder/out/options/winOptions)</code>
1245+
**Properties**
1246+
1247+
| Name | Type |
1248+
| --- | --- |
1249+
| unicode| <code>boolean</code> |
1250+
| guid| <code>string</code> \| <code>null</code> |
1251+
| warningsAsErrors| <code>boolean</code> |
1252+
1253+
<a name="PortableOptions"></a>
1254+
1255+
### `PortableOptions` ⇐ <code>[CommonNsisOptions](#CommonNsisOptions)</code>
1256+
Portable Specific Options ([portable](#Config-portable})
1257+
1258+
**Kind**: interface of <code>[electron-builder/out/options/winOptions](#module_electron-builder/out/options/winOptions)</code>
1259+
**Extends**: <code>[CommonNsisOptions](#CommonNsisOptions)</code>
1260+
**Properties**
1261+
1262+
| Name | Type | Description |
1263+
| --- | --- | --- |
1264+
| requestExecutionLevel = <code>user</code>| <code>"user"</code> \| <code>"highest"</code> \| <code>"admin"</code> | <a name="PortableOptions-requestExecutionLevel"></a>The [requested execution level](http://nsis.sourceforge.net/Reference/RequestExecutionLevel) for Windows. |
1265+
12311266
<a name="module_electron-builder/out/packager/dirPackager"></a>
12321267

12331268
## electron-builder/out/packager/dirPackager
@@ -2990,6 +3025,7 @@ On Windows works only if [nsis.perMachine](https://github.com/electron-userland/
29903025
| target| <code>Array&lt;string \| [TargetConfig](#TargetConfig)&gt;</code> \| <code>string</code> \| <code>[TargetConfig](#TargetConfig)</code> \| <code>null</code> |
29913026
| icon| <code>string</code> \| <code>null</code> |
29923027
| fileAssociations| <code>Array&lt;[FileAssociation](#FileAssociation)&gt;</code> \| <code>[FileAssociation](#FileAssociation)</code> |
3028+
| forceCodeSigning| <code>boolean</code> |
29933029

29943030
<a name="Protocol"></a>
29953031

@@ -3050,7 +3086,6 @@ Please note — on macOS [you need to register an `open-url` event handler](http
30503086
| Name | Type | Description |
30513087
| --- | --- | --- |
30523088
| artifactName| <code>string</code> \| <code>null</code> | <a name="TargetSpecificOptions-artifactName"></a>The [artifact file name pattern](https://github.com/electron-userland/electron-builder/wiki/Options#artifact-file-name-pattern). |
3053-
| forceCodeSigning| <code>boolean</code> | <a name="TargetSpecificOptions-forceCodeSigning"></a> |
30543089
| publish| <code>null</code> \| <code>string</code> \| <code>[GithubOptions](Publishing-Artifacts#GithubOptions)</code> \| <code>[S3Options](Publishing-Artifacts#S3Options)</code> \| <code>[GenericServerOptions](Publishing-Artifacts#GenericServerOptions)</code> \| <code>[BintrayOptions](Publishing-Artifacts#BintrayOptions)</code> \| <code>Array</code> | <a name="TargetSpecificOptions-publish"></a> |
30553090

30563091
<a name="Platform"></a>

docs/Options.md

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ You can use [file macros](#file-macros) in the `from` and `to` fields as well.
112112
* [`.MacOptions`](#MacOptions) ⇐ <code>[PlatformSpecificBuildOptions](Developer-API#PlatformSpecificBuildOptions)</code>
113113
* [`.MasBuildOptions`](#MasBuildOptions) ⇐ <code>[MacOptions](#MacOptions)</code>
114114
* [`.Metadata`](#Metadata)
115-
* [`.NsisOptions`](#NsisOptions)
115+
* [`.NsisOptions`](#NsisOptions) ⇐ <code>[TargetSpecificOptions](Developer-API#TargetSpecificOptions)</code>
116116
* [`.NsisWebOptions`](#NsisWebOptions) ⇐ <code>[NsisOptions](#NsisOptions)</code>
117117
* [`.PackagerOptions`](#PackagerOptions)
118118
* [`.PkgOptions`](#PkgOptions) ⇐ <code>[TargetSpecificOptions](Developer-API#TargetSpecificOptions)</code>
@@ -141,7 +141,7 @@ You can use [file macros](#file-macros) in the `from` and `to` fields as well.
141141
<a name="AppXOptions"></a>
142142

143143
### `AppXOptions`
144-
AppX Options
144+
AppX Options ([appx](#Config-appx}).
145145

146146
**Kind**: interface of <code>[electron-builder](#module_electron-builder)</code>
147147
**See**: [Windows AppX docs](https://msdn.microsoft.com/en-us/library/windows/apps/br211453.aspx).
@@ -276,7 +276,7 @@ Configuration Options
276276
| win| <code>[WinBuildOptions](#WinBuildOptions)</code> \| <code>null</code> | <a name="Config-win"></a> |
277277
| nsis| <code>[NsisOptions](#NsisOptions)</code> \| <code>null</code> | <a name="Config-nsis"></a> |
278278
| nsisWeb| <code>[NsisWebOptions](#NsisWebOptions)</code> \| <code>null</code> | <a name="Config-nsisWeb"></a> |
279-
| portable| <code>[NsisOptions](#NsisOptions)</code> \| <code>null</code> | <a name="Config-portable"></a> |
279+
| portable| <code>[PortableOptions](Developer-API#PortableOptions)</code> \| <code>null</code> | <a name="Config-portable"></a> |
280280
| appx| <code>[AppXOptions](#AppXOptions)</code> \| <code>null</code> | <a name="Config-appx"></a> |
281281
| squirrelWindows| <code>[SquirrelWindowsOptions](#SquirrelWindowsOptions)</code> \| <code>null</code> | <a name="Config-squirrelWindows"></a> |
282282
| linux| <code>[LinuxBuildOptions](#LinuxBuildOptions)</code> \| <code>null</code> | <a name="Config-linux"></a> |
@@ -454,11 +454,13 @@ Some standard fields should be defined in the `package.json`.
454454

455455
<a name="NsisOptions"></a>
456456

457-
### `NsisOptions`
458-
NSIS specific options
457+
### `NsisOptions` ⇐ <code>[TargetSpecificOptions](Developer-API#TargetSpecificOptions)</code>
458+
NSIS specific options ([nsis](#Config-nsis}).
459+
459460
See [NSIS target notes](https://github.com/electron-userland/electron-builder/wiki/NSIS).
460461

461462
**Kind**: interface of <code>[electron-builder](#module_electron-builder)</code>
463+
**Extends**: <code>[TargetSpecificOptions](Developer-API#TargetSpecificOptions)</code>
462464
**Properties**
463465

464466
| Name | Type | Description |
@@ -488,7 +490,7 @@ See [NSIS target notes](https://github.com/electron-userland/electron-builder/wi
488490
<a name="NsisWebOptions"></a>
489491

490492
### `NsisWebOptions` ⇐ <code>[NsisOptions](#NsisOptions)</code>
491-
Web Installer Specific Options
493+
Web Installer Specific Options ([nsisWeb](#Config-nsisWeb}).
492494

493495
**Kind**: interface of <code>[electron-builder](#module_electron-builder)</code>
494496
**Extends**: <code>[NsisOptions](#NsisOptions)</code>
@@ -558,7 +560,8 @@ Web Installer Specific Options
558560
<a name="SquirrelWindowsOptions"></a>
559561

560562
### `SquirrelWindowsOptions` ⇐ <code>[WinBuildOptions](#WinBuildOptions)</code>
561-
Squirrel.Windows Options.
563+
Squirrel.Windows Options ([squirrelWindows](#Config-squirrelWindows}).
564+
562565
To use Squirrel.Windows please install `electron-builder-squirrel-windows` dependency. Squirrel.Windows target is maintained, but deprecated. Please use `nsis` instead.
563566

564567
**Kind**: interface of <code>[electron-builder](#module_electron-builder)</code>
@@ -577,7 +580,7 @@ To use Squirrel.Windows please install `electron-builder-squirrel-windows` depen
577580
<a name="WinBuildOptions"></a>
578581

579582
### `WinBuildOptions` ⇐ <code>[PlatformSpecificBuildOptions](Developer-API#PlatformSpecificBuildOptions)</code>
580-
Windows Specific Options
583+
Windows Specific Options ([win](#Config-win}).
581584

582585
**Kind**: interface of <code>[electron-builder](#module_electron-builder)</code>
583586
**Extends**: <code>[PlatformSpecificBuildOptions](Developer-API#PlatformSpecificBuildOptions)</code>

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"ajv": "^5.0.4-beta.2",
3232
"ajv-keywords": "^2.0.1-beta.2",
3333
"archiver": "^1.3.0",
34-
"aws-sdk": "^2.39.0",
34+
"aws-sdk": "^2.40.0",
3535
"bluebird-lst": "^1.0.2",
3636
"chalk": "^1.1.3",
3737
"chromium-pickle-js": "^0.2.0",
@@ -70,9 +70,9 @@
7070
"@types/source-map-support": "^0.2.28",
7171
"@types/xml2js": "^0.0.33",
7272
"babel-plugin-array-includes": "^2.0.3",
73-
"babel-plugin-transform-async-to-module-method": "^6.22.0",
73+
"babel-plugin-transform-async-to-module-method": "^6.24.1",
7474
"babel-plugin-transform-es2015-destructuring": "^6.23.0",
75-
"babel-plugin-transform-es2015-parameters": "^6.23.0",
75+
"babel-plugin-transform-es2015-parameters": "^6.24.1",
7676
"babel-plugin-transform-es2015-spread": "^6.22.0",
7777
"babel-plugin-transform-inline-imports-commonjs": "^1.2.0",
7878
"catharsis": "^0.8.8",

packages/electron-builder-core/src/core.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,6 @@ export interface TargetSpecificOptions {
118118
The [artifact file name pattern](https://github.com/electron-userland/electron-builder/wiki/Options#artifact-file-name-pattern).
119119
*/
120120
readonly artifactName?: string | null
121-
122-
readonly forceCodeSigning?: boolean
123121

124122
readonly publish?: Publish
125123
}
@@ -138,6 +136,8 @@ export interface PlatformSpecificBuildOptions extends TargetSpecificOptions {
138136
readonly icon?: string | null
139137

140138
readonly fileAssociations?: Array<FileAssociation> | FileAssociation
139+
140+
readonly forceCodeSigning?: boolean
141141
}
142142

143143
export const DEFAULT_TARGET = "default"

packages/electron-builder/src/metadata.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Arch, AsarOptions, AuthorMetadata, BeforeBuildContext, CompressionLevel
22
import { Publish } from "electron-builder-http/out/publishOptions"
33
import { DebOptions, LinuxBuildOptions, LinuxTargetSpecificOptions, SnapOptions } from "./options/linuxOptions"
44
import { DmgOptions, MacOptions, MasBuildOptions, PkgOptions } from "./options/macOptions"
5-
import { AppXOptions, NsisOptions, NsisWebOptions, SquirrelWindowsOptions, WinBuildOptions } from "./options/winOptions"
5+
import { AppXOptions, NsisOptions, NsisWebOptions, PortableOptions, SquirrelWindowsOptions, WinBuildOptions } from "./options/winOptions"
66
import { PlatformPackager } from "./platformPackager"
77

88
/**
@@ -207,12 +207,12 @@ export interface Config extends PlatformSpecificBuildOptions {
207207
readonly dmg?: DmgOptions | null
208208
readonly pkg?: PkgOptions | null
209209

210-
readonly win?: WinBuildOptions | null
211-
readonly nsis?: NsisOptions | null
212-
readonly nsisWeb?: NsisWebOptions | null
213-
readonly portable?: NsisOptions | null
214-
readonly appx?: AppXOptions | null
215-
readonly squirrelWindows?: SquirrelWindowsOptions | null
210+
readonly win?: WinBuildOptions | null
211+
readonly nsis?: NsisOptions | null
212+
readonly nsisWeb?: NsisWebOptions | null
213+
readonly portable?: PortableOptions | null
214+
readonly appx?: AppXOptions | null
215+
readonly squirrelWindows?: SquirrelWindowsOptions | null
216216

217217
readonly linux?: LinuxBuildOptions | null
218218
readonly deb?: DebOptions | null

packages/electron-builder/src/options/winOptions.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { PlatformSpecificBuildOptions, TargetConfigType } from "electron-builder-core"
1+
import { PlatformSpecificBuildOptions, TargetConfigType, TargetSpecificOptions } from "electron-builder-core"
22

33
/**
4-
* Windows Specific Options
4+
* Windows Specific Options ([win](#Config-win}).
55
*/
66
export interface WinBuildOptions extends PlatformSpecificBuildOptions {
77
/**
@@ -69,11 +69,18 @@ export interface WinBuildOptions extends PlatformSpecificBuildOptions {
6969
readonly publisherName?: string | Array<string> | null
7070
}
7171

72+
export interface CommonNsisOptions {
73+
readonly unicode?: boolean
74+
readonly guid?: string | null
75+
readonly warningsAsErrors?: boolean
76+
}
77+
7278
/**
73-
* NSIS specific options
79+
* NSIS specific options ([nsis](#Config-nsis}).
80+
*
7481
* See [NSIS target notes](https://github.com/electron-userland/electron-builder/wiki/NSIS).
7582
*/
76-
export interface NsisOptions {
83+
export interface NsisOptions extends CommonNsisOptions, TargetSpecificOptions {
7784
/**
7885
* One-click installation.
7986
* @default true
@@ -208,8 +215,19 @@ export interface NsisOptions {
208215
readonly deleteAppDataOnUninstall?: boolean
209216
}
210217

218+
/**
219+
* Portable Specific Options ([portable](#Config-portable})
220+
*/
221+
export interface PortableOptions extends TargetSpecificOptions, CommonNsisOptions {
222+
/**
223+
* The [requested execution level](http://nsis.sourceforge.net/Reference/RequestExecutionLevel) for Windows.
224+
* @default user
225+
*/
226+
readonly requestExecutionLevel?: "user" | "highest" | "admin"
227+
}
228+
211229
/**
212-
* Web Installer Specific Options
230+
* Web Installer Specific Options ([nsisWeb](#Config-nsisWeb}).
213231
*/
214232
export interface NsisWebOptions extends NsisOptions {
215233
/**
@@ -228,7 +246,8 @@ export interface NsisWebOptions extends NsisOptions {
228246
}
229247

230248
/**
231-
* Squirrel.Windows Options.
249+
* Squirrel.Windows Options ([squirrelWindows](#Config-squirrelWindows}).
250+
*
232251
* To use Squirrel.Windows please install `electron-builder-squirrel-windows` dependency. Squirrel.Windows target is maintained, but deprecated. Please use `nsis` instead.
233252
*/
234253
export interface SquirrelWindowsOptions extends WinBuildOptions {
@@ -270,7 +289,7 @@ export interface SquirrelWindowsOptions extends WinBuildOptions {
270289
}
271290

272291
/**
273-
* AppX Options
292+
* AppX Options ([appx](#Config-appx}).
274293
* @see [Windows AppX docs](https://msdn.microsoft.com/en-us/library/windows/apps/br211453.aspx).
275294
*/
276295
export interface AppXOptions {

packages/electron-builder/src/targets/nsis.ts

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { safeLoad } from "js-yaml"
99
import * as path from "path"
1010
import sanitizeFileName from "sanitize-filename"
1111
import { v5 as uuid5 } from "uuid-1345"
12-
import { NsisOptions } from "../options/winOptions"
12+
import { NsisOptions, PortableOptions } from "../options/winOptions"
1313
import { normalizeExt } from "../platformPackager"
1414
import { getSignVendorPath } from "../windowsCodeSign"
1515
import { WinPackager } from "../winPackager"
@@ -154,7 +154,10 @@ export default class NsisTarget extends Target {
154154
}
155155

156156
this.configureDefinesForAllTypeOfInstaller(defines)
157-
if (!isPortable) {
157+
if (isPortable) {
158+
defines.REQUEST_EXECUTION_LEVEL = (<PortableOptions>options).requestExecutionLevel || "user"
159+
}
160+
else {
158161
await this.configureDefines(oneClick, defines)
159162
}
160163

@@ -375,31 +378,16 @@ export default class NsisTarget extends Target {
375378
scriptHeader += createMacro("licensePage", licensePage)
376379
}
377380

378-
const messages = safeLoad(await readFile(path.join(__dirname, "..", "..", "templates", "nsis", "messages.yml"), "utf-8"))
379-
const langs: Array<string> = []
380-
for (const messageId of Object.keys(messages)) {
381-
const langToTranslations = messages[messageId]
382-
const unspecifiedLangs = new Set(bundledLanguages)
383-
for (const lang of Object.keys(langToTranslations)) {
384-
const langWithRegion = toLangWithRegion(lang)
385-
langs.push(`LangString ${messageId} ${lcid[langWithRegion]} "${langToTranslations[lang].replace(/\n/g, "$\\r$\\n")}"`)
386-
unspecifiedLangs.delete(langWithRegion)
387-
}
388-
389-
const defaultTranslation = langToTranslations["en"].replace(/\n/g, "$\\r$\\n")
390-
for (const langWithRegion of unspecifiedLangs) {
391-
langs.push(`LangString ${messageId} ${lcid[langWithRegion]} "${defaultTranslation}"`)
392-
}
393-
}
394-
395-
if (langs.length > 0) {
396-
scriptHeader += "\n" + langs.join("\n") + "\n\n"
397-
}
381+
scriptHeader += "\n" + computeCustomMessageTranslations(safeLoad(await readFile(path.join(this.nsisTemplatesDir, "messages.yml"), "utf-8"))).join("\n") + "\n\n"
398382

399383
if (this.isPortable) {
400384
return scriptHeader + originalScript
401385
}
402386

387+
if (this.options.oneClick === false) {
388+
scriptHeader += "\n" + computeCustomMessageTranslations(safeLoad(await readFile(path.join(this.nsisTemplatesDir, "boringMessages.yml"), "utf-8"))).join("\n") + "\n\n"
389+
}
390+
403391
const customInclude = await packager.getResource(this.options.include, "installer.nsh")
404392
if (customInclude != null) {
405393
scriptHeader += `!addincludedir "${packager.buildResourcesDir}"\n`
@@ -504,6 +492,25 @@ export default class NsisTarget extends Target {
504492
}
505493
}
506494

495+
function computeCustomMessageTranslations(messages: any): Array<string> {
496+
const result: Array<string> = []
497+
for (const messageId of Object.keys(messages)) {
498+
const langToTranslations = messages[messageId]
499+
const unspecifiedLangs = new Set(bundledLanguages)
500+
for (const lang of Object.keys(langToTranslations)) {
501+
const langWithRegion = toLangWithRegion(lang)
502+
result.push(`LangString ${messageId} ${lcid[langWithRegion]} "${langToTranslations[lang].replace(/\n/g, "$\\r$\\n")}"`)
503+
unspecifiedLangs.delete(langWithRegion)
504+
}
505+
506+
const defaultTranslation = langToTranslations["en"].replace(/\n/g, "$\\r$\\n")
507+
for (const langWithRegion of unspecifiedLangs) {
508+
result.push(`LangString ${messageId} ${lcid[langWithRegion]} "${defaultTranslation}"`)
509+
}
510+
}
511+
return result
512+
}
513+
507514
function toLangWithRegion(lang: string): string {
508515
let langWithRegion = langToLangWithRegion.get(lang)
509516
if (langWithRegion == null) {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
chooseInstallationOptions:
2+
en: Choose Installation Options
3+
ru: Выберите опции установки
4+
chooseUninstallationOptions:
5+
en: Choose Uninstallation Options
6+
ru: Выберите опции удаления
7+
freshInstallForAll:
8+
en: Fresh install for all users.
9+
ru: Новая установка для всех пользователей.
10+
freshInstallForCurrent:
11+
en: Fresh install for current user only.
12+
ru: Новая установка только для текущего пользователя.
13+
onlyForMe:
14+
en: Only for &me
15+
ru: Только для &меня
16+
forAll:
17+
en: Anyone who uses this computer (&all users)
18+
ru: Для &всех пользователей данного компьютера

0 commit comments

Comments
 (0)