@keymanapp/kmc-package 18.0.41-alpha → 18.0.45-alpha
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/build/src/compiler/cp1252.d.ts +7 -7
- package/build/src/compiler/cp1252.js +287 -290
- package/build/src/compiler/cp1252.js.map +1 -1
- package/build/src/compiler/kmp-compiler.d.ts +105 -105
- package/build/src/compiler/kmp-compiler.js +502 -505
- package/build/src/compiler/kmp-compiler.js.map +1 -1
- package/build/src/compiler/kmp-inf-writer.d.ts +21 -21
- package/build/src/compiler/kmp-inf-writer.js +143 -146
- package/build/src/compiler/kmp-inf-writer.js.map +1 -1
- package/build/src/compiler/kmx-keyboard-metadata.d.ts +3 -3
- package/build/src/compiler/kmx-keyboard-metadata.js +17 -20
- package/build/src/compiler/kmx-keyboard-metadata.js.map +1 -1
- package/build/src/compiler/markdown.d.ts +12 -12
- package/build/src/compiler/markdown.js +47 -50
- package/build/src/compiler/markdown.js.map +1 -1
- package/build/src/compiler/package-compiler-messages.d.ts +130 -130
- package/build/src/compiler/package-compiler-messages.js +79 -82
- package/build/src/compiler/package-compiler-messages.js.map +1 -1
- package/build/src/compiler/package-keyboard-target-validator.d.ts +12 -12
- package/build/src/compiler/package-keyboard-target-validator.js +43 -46
- package/build/src/compiler/package-keyboard-target-validator.js.map +1 -1
- package/build/src/compiler/package-metadata-collector.d.ts +16 -16
- package/build/src/compiler/package-metadata-collector.js +80 -83
- package/build/src/compiler/package-metadata-collector.js.map +1 -1
- package/build/src/compiler/package-metadata-updater.d.ts +4 -4
- package/build/src/compiler/package-metadata-updater.js +11 -14
- package/build/src/compiler/package-metadata-updater.js.map +1 -1
- package/build/src/compiler/package-validation.d.ts +18 -18
- package/build/src/compiler/package-validation.js +178 -181
- package/build/src/compiler/package-validation.js.map +1 -1
- package/build/src/compiler/package-version-validator.d.ts +20 -20
- package/build/src/compiler/package-version-validator.js +90 -93
- package/build/src/compiler/package-version-validator.js.map +1 -1
- package/build/src/compiler/redist-files.d.ts +17 -17
- package/build/src/compiler/redist-files.js +57 -60
- package/build/src/compiler/redist-files.js.map +1 -1
- package/build/src/compiler/web-keyboard-metadata.d.ts +20 -20
- package/build/src/compiler/web-keyboard-metadata.js +35 -38
- package/build/src/compiler/web-keyboard-metadata.js.map +1 -1
- package/build/src/compiler/windows-package-installer-compiler.d.ts +106 -106
- package/build/src/compiler/windows-package-installer-compiler.js +172 -175
- package/build/src/compiler/windows-package-installer-compiler.js.map +1 -1
- package/build/src/main.d.ts +4 -4
- package/build/src/main.js +5 -8
- package/build/src/main.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a .exe installer that bundles one or more .kmp files, together with
|
|
3
|
-
* setup.exe, keymandesktop.msi, and generates and includes a setup.inf also.
|
|
4
|
-
*
|
|
5
|
-
* This module is effectively deprecated, but is present to keep parity with the
|
|
6
|
-
* legacy kmcomp compiler. Thus, it is included as part of the package compiler,
|
|
7
|
-
* and will be removed in a future version.
|
|
8
|
-
*
|
|
9
|
-
* This tool assumes that the installer .msi is the same version as the
|
|
10
|
-
* compiler, unlike the legacy compiler which read this metadata from the .msi.
|
|
11
|
-
*/
|
|
12
|
-
import { CompilerCallbacks, KeymanCompiler, KeymanCompilerArtifact, KeymanCompilerArtifacts, KeymanCompilerResult } from "@keymanapp/common-types";
|
|
13
|
-
import { KmpCompilerOptions } from "./kmp-compiler.js";
|
|
14
|
-
/**
|
|
15
|
-
* @public
|
|
16
|
-
* Sources and metadata for the Windows package installer compiler
|
|
17
|
-
*/
|
|
18
|
-
export interface WindowsPackageInstallerSources {
|
|
19
|
-
msiFilename: string;
|
|
20
|
-
setupExeFilename: string;
|
|
21
|
-
licenseFilename: string;
|
|
22
|
-
titleImageFilename?: string;
|
|
23
|
-
appName?: string;
|
|
24
|
-
startDisabled: boolean;
|
|
25
|
-
startWithConfiguration: boolean;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* @public
|
|
29
|
-
* Options for the .kps Windows package installer compiler
|
|
30
|
-
*/
|
|
31
|
-
export interface WindowsPackageInstallerCompilerOptions extends KmpCompilerOptions {
|
|
32
|
-
/**
|
|
33
|
-
* Sources and metadata for the Windows package installer compiler
|
|
34
|
-
*/
|
|
35
|
-
sources: WindowsPackageInstallerSources;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* @public
|
|
39
|
-
* Internal in-memory build artifacts from a successful compilation
|
|
40
|
-
*/
|
|
41
|
-
export interface WindowsPackageInstallerCompilerArtifacts extends KeymanCompilerArtifacts {
|
|
42
|
-
/**
|
|
43
|
-
* Binary package installer filedata and filename - installable into Keyman
|
|
44
|
-
* desktop and mobile projects
|
|
45
|
-
*/
|
|
46
|
-
exe: KeymanCompilerArtifact;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* @public
|
|
50
|
-
* Build artifacts from the .kps Windows package installer compiler
|
|
51
|
-
*/
|
|
52
|
-
export interface WindowsPackageInstallerCompilerResult extends KeymanCompilerResult {
|
|
53
|
-
/**
|
|
54
|
-
* Internal in-memory build artifacts from a successful compilation. Caller
|
|
55
|
-
* can write these to disk with {@link WindowsPackageInstallerCompiler.write}
|
|
56
|
-
*/
|
|
57
|
-
artifacts: WindowsPackageInstallerCompilerArtifacts;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* @public
|
|
61
|
-
* Compiles a .kps file to a .exe installer. The compiler does not read or write
|
|
62
|
-
* from filesystem or network directly, but relies on callbacks for all external
|
|
63
|
-
* IO.
|
|
64
|
-
*/
|
|
65
|
-
export declare class WindowsPackageInstallerCompiler implements KeymanCompiler {
|
|
66
|
-
private kmpCompiler;
|
|
67
|
-
private callbacks;
|
|
68
|
-
private options;
|
|
69
|
-
/**
|
|
70
|
-
* Initialize the compiler.
|
|
71
|
-
* Copies options.
|
|
72
|
-
* @param callbacks - Callbacks for external interfaces, including message
|
|
73
|
-
* reporting and file io
|
|
74
|
-
* @param options - Compiler options
|
|
75
|
-
* @returns false if initialization fails
|
|
76
|
-
*/
|
|
77
|
-
init(callbacks: CompilerCallbacks, options: WindowsPackageInstallerCompilerOptions): Promise<boolean>;
|
|
78
|
-
/**
|
|
79
|
-
* Compiles a .kps file to .exe Windows package installer file. Returns an
|
|
80
|
-
* object containing binary artifacts on success. The files are passed in by
|
|
81
|
-
* name, and the compiler will use callbacks as passed to the
|
|
82
|
-
* {@link WindowsPackageInstallerCompiler.init} function to read any input
|
|
83
|
-
* files by disk.
|
|
84
|
-
* @param infile - Path to source file. Path will be parsed to find relative
|
|
85
|
-
* references in the .kmn file, such as icon or On Screen
|
|
86
|
-
* Keyboard file
|
|
87
|
-
* @param outfile - Path to output file. The file will not be written to, but
|
|
88
|
-
* will be included in the result for use by
|
|
89
|
-
* {@link WindowsPackageInstallerCompiler.write}.
|
|
90
|
-
* @returns Binary artifacts on success, null on failure.
|
|
91
|
-
*/
|
|
92
|
-
run(inputFilename: string, outputFilename?: string): Promise<WindowsPackageInstallerCompilerResult>;
|
|
93
|
-
/**
|
|
94
|
-
* Write artifacts from a successful compile to disk, via callbacks methods.
|
|
95
|
-
* The artifacts written may include:
|
|
96
|
-
*
|
|
97
|
-
* - .exe file - binary Windows package installer executable file
|
|
98
|
-
*
|
|
99
|
-
* @param artifacts - object containing artifact binary data to write out
|
|
100
|
-
* @returns true on success
|
|
101
|
-
*/
|
|
102
|
-
write(artifacts: WindowsPackageInstallerCompilerArtifacts): Promise<boolean>;
|
|
103
|
-
private buildZip;
|
|
104
|
-
private buildSetupInf;
|
|
105
|
-
private buildSfx;
|
|
106
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Create a .exe installer that bundles one or more .kmp files, together with
|
|
3
|
+
* setup.exe, keymandesktop.msi, and generates and includes a setup.inf also.
|
|
4
|
+
*
|
|
5
|
+
* This module is effectively deprecated, but is present to keep parity with the
|
|
6
|
+
* legacy kmcomp compiler. Thus, it is included as part of the package compiler,
|
|
7
|
+
* and will be removed in a future version.
|
|
8
|
+
*
|
|
9
|
+
* This tool assumes that the installer .msi is the same version as the
|
|
10
|
+
* compiler, unlike the legacy compiler which read this metadata from the .msi.
|
|
11
|
+
*/
|
|
12
|
+
import { CompilerCallbacks, KeymanCompiler, KeymanCompilerArtifact, KeymanCompilerArtifacts, KeymanCompilerResult } from "@keymanapp/common-types";
|
|
13
|
+
import { KmpCompilerOptions } from "./kmp-compiler.js";
|
|
14
|
+
/**
|
|
15
|
+
* @public
|
|
16
|
+
* Sources and metadata for the Windows package installer compiler
|
|
17
|
+
*/
|
|
18
|
+
export interface WindowsPackageInstallerSources {
|
|
19
|
+
msiFilename: string;
|
|
20
|
+
setupExeFilename: string;
|
|
21
|
+
licenseFilename: string;
|
|
22
|
+
titleImageFilename?: string;
|
|
23
|
+
appName?: string;
|
|
24
|
+
startDisabled: boolean;
|
|
25
|
+
startWithConfiguration: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @public
|
|
29
|
+
* Options for the .kps Windows package installer compiler
|
|
30
|
+
*/
|
|
31
|
+
export interface WindowsPackageInstallerCompilerOptions extends KmpCompilerOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Sources and metadata for the Windows package installer compiler
|
|
34
|
+
*/
|
|
35
|
+
sources: WindowsPackageInstallerSources;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @public
|
|
39
|
+
* Internal in-memory build artifacts from a successful compilation
|
|
40
|
+
*/
|
|
41
|
+
export interface WindowsPackageInstallerCompilerArtifacts extends KeymanCompilerArtifacts {
|
|
42
|
+
/**
|
|
43
|
+
* Binary package installer filedata and filename - installable into Keyman
|
|
44
|
+
* desktop and mobile projects
|
|
45
|
+
*/
|
|
46
|
+
exe: KeymanCompilerArtifact;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @public
|
|
50
|
+
* Build artifacts from the .kps Windows package installer compiler
|
|
51
|
+
*/
|
|
52
|
+
export interface WindowsPackageInstallerCompilerResult extends KeymanCompilerResult {
|
|
53
|
+
/**
|
|
54
|
+
* Internal in-memory build artifacts from a successful compilation. Caller
|
|
55
|
+
* can write these to disk with {@link WindowsPackageInstallerCompiler.write}
|
|
56
|
+
*/
|
|
57
|
+
artifacts: WindowsPackageInstallerCompilerArtifacts;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @public
|
|
61
|
+
* Compiles a .kps file to a .exe installer. The compiler does not read or write
|
|
62
|
+
* from filesystem or network directly, but relies on callbacks for all external
|
|
63
|
+
* IO.
|
|
64
|
+
*/
|
|
65
|
+
export declare class WindowsPackageInstallerCompiler implements KeymanCompiler {
|
|
66
|
+
private kmpCompiler;
|
|
67
|
+
private callbacks;
|
|
68
|
+
private options;
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the compiler.
|
|
71
|
+
* Copies options.
|
|
72
|
+
* @param callbacks - Callbacks for external interfaces, including message
|
|
73
|
+
* reporting and file io
|
|
74
|
+
* @param options - Compiler options
|
|
75
|
+
* @returns false if initialization fails
|
|
76
|
+
*/
|
|
77
|
+
init(callbacks: CompilerCallbacks, options: WindowsPackageInstallerCompilerOptions): Promise<boolean>;
|
|
78
|
+
/**
|
|
79
|
+
* Compiles a .kps file to .exe Windows package installer file. Returns an
|
|
80
|
+
* object containing binary artifacts on success. The files are passed in by
|
|
81
|
+
* name, and the compiler will use callbacks as passed to the
|
|
82
|
+
* {@link WindowsPackageInstallerCompiler.init} function to read any input
|
|
83
|
+
* files by disk.
|
|
84
|
+
* @param infile - Path to source file. Path will be parsed to find relative
|
|
85
|
+
* references in the .kmn file, such as icon or On Screen
|
|
86
|
+
* Keyboard file
|
|
87
|
+
* @param outfile - Path to output file. The file will not be written to, but
|
|
88
|
+
* will be included in the result for use by
|
|
89
|
+
* {@link WindowsPackageInstallerCompiler.write}.
|
|
90
|
+
* @returns Binary artifacts on success, null on failure.
|
|
91
|
+
*/
|
|
92
|
+
run(inputFilename: string, outputFilename?: string): Promise<WindowsPackageInstallerCompilerResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Write artifacts from a successful compile to disk, via callbacks methods.
|
|
95
|
+
* The artifacts written may include:
|
|
96
|
+
*
|
|
97
|
+
* - .exe file - binary Windows package installer executable file
|
|
98
|
+
*
|
|
99
|
+
* @param artifacts - object containing artifact binary data to write out
|
|
100
|
+
* @returns true on success
|
|
101
|
+
*/
|
|
102
|
+
write(artifacts: WindowsPackageInstallerCompilerArtifacts): Promise<boolean>;
|
|
103
|
+
private buildZip;
|
|
104
|
+
private buildSetupInf;
|
|
105
|
+
private buildSfx;
|
|
106
|
+
}
|
|
107
107
|
//# sourceMappingURL=windows-package-installer-compiler.d.ts.map
|
|
@@ -1,181 +1,178 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a .exe installer that bundles one or more .kmp files, together with
|
|
3
|
-
* setup.exe, keymandesktop.msi, and generates and includes a setup.inf also.
|
|
4
|
-
*
|
|
5
|
-
* This module is effectively deprecated, but is present to keep parity with the
|
|
6
|
-
* legacy kmcomp compiler. Thus, it is included as part of the package compiler,
|
|
7
|
-
* and will be removed in a future version.
|
|
8
|
-
*
|
|
9
|
-
* This tool assumes that the installer .msi is the same version as the
|
|
10
|
-
* compiler, unlike the legacy compiler which read this metadata from the .msi.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* @param
|
|
37
|
-
*
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
* -
|
|
107
|
-
*
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
//
|
|
125
|
-
// the zip
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
zip.file(
|
|
131
|
-
zip.file(
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
buildSetupInf(sources, kmpJson, kmpFilename, kps) {
|
|
1
|
+
/**
|
|
2
|
+
* Create a .exe installer that bundles one or more .kmp files, together with
|
|
3
|
+
* setup.exe, keymandesktop.msi, and generates and includes a setup.inf also.
|
|
4
|
+
*
|
|
5
|
+
* This module is effectively deprecated, but is present to keep parity with the
|
|
6
|
+
* legacy kmcomp compiler. Thus, it is included as part of the package compiler,
|
|
7
|
+
* and will be removed in a future version.
|
|
8
|
+
*
|
|
9
|
+
* This tool assumes that the installer .msi is the same version as the
|
|
10
|
+
* compiler, unlike the legacy compiler which read this metadata from the .msi.
|
|
11
|
+
*/
|
|
12
|
+
import JSZip from 'jszip';
|
|
13
|
+
import KEYMAN_VERSION from "@keymanapp/keyman-version";
|
|
14
|
+
import { KmpCompiler } from "./kmp-compiler.js";
|
|
15
|
+
import { CompilerMessages } from "./package-compiler-messages.js";
|
|
16
|
+
const SETUP_INF_FILENAME = 'setup.inf';
|
|
17
|
+
const PRODUCT_NAME = 'Keyman';
|
|
18
|
+
;
|
|
19
|
+
;
|
|
20
|
+
;
|
|
21
|
+
/**
|
|
22
|
+
* @public
|
|
23
|
+
* Compiles a .kps file to a .exe installer. The compiler does not read or write
|
|
24
|
+
* from filesystem or network directly, but relies on callbacks for all external
|
|
25
|
+
* IO.
|
|
26
|
+
*/
|
|
27
|
+
export class WindowsPackageInstallerCompiler {
|
|
28
|
+
kmpCompiler;
|
|
29
|
+
callbacks;
|
|
30
|
+
options;
|
|
31
|
+
/**
|
|
32
|
+
* Initialize the compiler.
|
|
33
|
+
* Copies options.
|
|
34
|
+
* @param callbacks - Callbacks for external interfaces, including message
|
|
35
|
+
* reporting and file io
|
|
36
|
+
* @param options - Compiler options
|
|
37
|
+
* @returns false if initialization fails
|
|
38
|
+
*/
|
|
39
|
+
async init(callbacks, options) {
|
|
40
|
+
this.callbacks = callbacks;
|
|
41
|
+
this.options = { ...options };
|
|
42
|
+
this.kmpCompiler = new KmpCompiler();
|
|
43
|
+
return await this.kmpCompiler.init(callbacks, options);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compiles a .kps file to .exe Windows package installer file. Returns an
|
|
47
|
+
* object containing binary artifacts on success. The files are passed in by
|
|
48
|
+
* name, and the compiler will use callbacks as passed to the
|
|
49
|
+
* {@link WindowsPackageInstallerCompiler.init} function to read any input
|
|
50
|
+
* files by disk.
|
|
51
|
+
* @param infile - Path to source file. Path will be parsed to find relative
|
|
52
|
+
* references in the .kmn file, such as icon or On Screen
|
|
53
|
+
* Keyboard file
|
|
54
|
+
* @param outfile - Path to output file. The file will not be written to, but
|
|
55
|
+
* will be included in the result for use by
|
|
56
|
+
* {@link WindowsPackageInstallerCompiler.write}.
|
|
57
|
+
* @returns Binary artifacts on success, null on failure.
|
|
58
|
+
*/
|
|
59
|
+
async run(inputFilename, outputFilename) {
|
|
60
|
+
const sources = this.options.sources;
|
|
61
|
+
const kps = this.kmpCompiler.loadKpsFile(inputFilename);
|
|
62
|
+
if (!kps) {
|
|
63
|
+
// errors will already have been reported by loadKpsFile
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
// Check existence of required files
|
|
67
|
+
for (const filename of [sources.licenseFilename, sources.msiFilename, sources.setupExeFilename]) {
|
|
68
|
+
if (!this.callbacks.fs.existsSync(filename)) {
|
|
69
|
+
this.callbacks.reportMessage(CompilerMessages.Error_FileDoesNotExist({ filename }));
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Check existence of optional files
|
|
74
|
+
for (const filename of [sources.titleImageFilename]) {
|
|
75
|
+
if (filename && !this.callbacks.fs.existsSync(filename)) {
|
|
76
|
+
this.callbacks.reportMessage(CompilerMessages.Error_FileDoesNotExist({ filename }));
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Note: we never use the MSIFileName field from the .kps any more
|
|
81
|
+
// Nor do we use the MSIOptions field.
|
|
82
|
+
// Build the zip
|
|
83
|
+
const zipBuffer = await this.buildZip(kps, inputFilename, sources);
|
|
84
|
+
if (!zipBuffer) {
|
|
85
|
+
// Error messages already reported by buildZip
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
// Build the sfx
|
|
89
|
+
const sfxBuffer = this.buildSfx(zipBuffer, sources);
|
|
90
|
+
const result = {
|
|
91
|
+
artifacts: {
|
|
92
|
+
exe: {
|
|
93
|
+
data: sfxBuffer,
|
|
94
|
+
filename: outputFilename ?? inputFilename.replace(/\.kps$/, '.exe')
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Write artifacts from a successful compile to disk, via callbacks methods.
|
|
102
|
+
* The artifacts written may include:
|
|
103
|
+
*
|
|
104
|
+
* - .exe file - binary Windows package installer executable file
|
|
105
|
+
*
|
|
106
|
+
* @param artifacts - object containing artifact binary data to write out
|
|
107
|
+
* @returns true on success
|
|
108
|
+
*/
|
|
109
|
+
async write(artifacts) {
|
|
110
|
+
this.callbacks.fs.writeFileSync(artifacts.exe.filename, artifacts.exe.data);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
async buildZip(kps, kpsFilename, sources) {
|
|
114
|
+
const kmpJson = this.kmpCompiler.transformKpsFileToKmpObject(kpsFilename, kps);
|
|
115
|
+
if (!kmpJson.info?.name?.description) {
|
|
116
|
+
this.callbacks.reportMessage(CompilerMessages.Error_PackageNameCannotBeBlank());
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const kmpFilename = this.callbacks.path.basename(kpsFilename, ".kps" /* KeymanFileTypes.Source.Package */) + ".kmp" /* KeymanFileTypes.Binary.Package */;
|
|
120
|
+
const setupInfBuffer = this.buildSetupInf(sources, kmpJson, kmpFilename, kps);
|
|
121
|
+
const kmpBuffer = await this.kmpCompiler.buildKmpFile(kpsFilename, kmpJson);
|
|
122
|
+
// Note that this does not technically generate a "valid" sfx according to
|
|
123
|
+
// the zip spec, because the offsets in the .zip are relative to the start
|
|
124
|
+
// of the zip, rather than to the start of the sfx. However, as Keyman's
|
|
125
|
+
// installer chops out the zip from the sfx and loads it in a new stream, it
|
|
126
|
+
// works as expected.
|
|
127
|
+
const zip = JSZip();
|
|
128
|
+
zip.file(SETUP_INF_FILENAME, setupInfBuffer);
|
|
129
|
+
zip.file(kmpFilename, kmpBuffer);
|
|
130
|
+
zip.file(this.callbacks.path.basename(sources.msiFilename), this.callbacks.loadFile(sources.msiFilename));
|
|
131
|
+
zip.file(this.callbacks.path.basename(sources.licenseFilename), this.callbacks.loadFile(sources.licenseFilename));
|
|
132
|
+
if (sources.titleImageFilename) {
|
|
133
|
+
zip.file(this.callbacks.path.basename(sources.titleImageFilename), this.callbacks.loadFile(sources.titleImageFilename));
|
|
134
|
+
}
|
|
135
|
+
return zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' });
|
|
136
|
+
}
|
|
137
|
+
buildSetupInf(sources, kmpJson, kmpFilename, kps) {
|
|
140
138
|
let setupInf = `[Setup]
|
|
141
139
|
Version=${KEYMAN_VERSION.VERSION}
|
|
142
140
|
MSIFileName=${this.callbacks.path.basename(sources.msiFilename)}
|
|
143
141
|
MSIOptions=
|
|
144
142
|
AppName=${sources.appName ?? PRODUCT_NAME}
|
|
145
143
|
License=${this.callbacks.path.basename(sources.licenseFilename)}
|
|
146
|
-
`;
|
|
147
|
-
if (sources.titleImageFilename) {
|
|
148
|
-
setupInf += `TitleImage=${this.callbacks.path.basename(sources.titleImageFilename)}\n`;
|
|
149
|
-
}
|
|
150
|
-
if (kmpJson.options.graphicFile) {
|
|
151
|
-
setupInf += `BitmapFileName=${this.callbacks.path.basename(kmpJson.options.graphicFile)}\n`;
|
|
152
|
-
}
|
|
153
|
-
if (sources.startDisabled) {
|
|
154
|
-
setupInf += `StartDisabled=True\n`;
|
|
155
|
-
}
|
|
156
|
-
if (sources.startWithConfiguration) {
|
|
157
|
-
setupInf += `StartWithConfiguration=True\n`;
|
|
158
|
-
}
|
|
159
|
-
setupInf += `\n[Packages]\n`;
|
|
160
|
-
setupInf += kmpFilename + '\n';
|
|
161
|
-
// TODO: multiple packages?
|
|
162
|
-
const strings = !kps.Strings?.String ? [] : (Array.isArray(kps.Strings.String) ? kps.Strings.String : [kps.Strings.String]);
|
|
163
|
-
if (strings.length) {
|
|
164
|
-
setupInf += `\n[Strings]\n`;
|
|
165
|
-
for (const str of strings) {
|
|
166
|
-
setupInf += `${str.$?.Name}=${str.$?.Value}\n`;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const setupInfBuffer = new TextEncoder().encode(setupInf);
|
|
170
|
-
return setupInfBuffer;
|
|
171
|
-
}
|
|
172
|
-
buildSfx(zipBuffer, sources) {
|
|
173
|
-
const setupRedistBuffer = this.callbacks.loadFile(sources.setupExeFilename);
|
|
174
|
-
const buffer = new Uint8Array(setupRedistBuffer.length + zipBuffer.length);
|
|
175
|
-
buffer.set(setupRedistBuffer, 0);
|
|
176
|
-
buffer.set(zipBuffer, setupRedistBuffer.length);
|
|
177
|
-
return buffer;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
//# sourceMappingURL=windows-package-installer-compiler.js.map
|
|
181
|
-
//# debugId=416a1ac8-98e1-51e8-b77b-4b2a264f7ee6
|
|
144
|
+
`;
|
|
145
|
+
if (sources.titleImageFilename) {
|
|
146
|
+
setupInf += `TitleImage=${this.callbacks.path.basename(sources.titleImageFilename)}\n`;
|
|
147
|
+
}
|
|
148
|
+
if (kmpJson.options.graphicFile) {
|
|
149
|
+
setupInf += `BitmapFileName=${this.callbacks.path.basename(kmpJson.options.graphicFile)}\n`;
|
|
150
|
+
}
|
|
151
|
+
if (sources.startDisabled) {
|
|
152
|
+
setupInf += `StartDisabled=True\n`;
|
|
153
|
+
}
|
|
154
|
+
if (sources.startWithConfiguration) {
|
|
155
|
+
setupInf += `StartWithConfiguration=True\n`;
|
|
156
|
+
}
|
|
157
|
+
setupInf += `\n[Packages]\n`;
|
|
158
|
+
setupInf += kmpFilename + '\n';
|
|
159
|
+
// TODO: multiple packages?
|
|
160
|
+
const strings = !kps.Strings?.String ? [] : (Array.isArray(kps.Strings.String) ? kps.Strings.String : [kps.Strings.String]);
|
|
161
|
+
if (strings.length) {
|
|
162
|
+
setupInf += `\n[Strings]\n`;
|
|
163
|
+
for (const str of strings) {
|
|
164
|
+
setupInf += `${str.$?.Name}=${str.$?.Value}\n`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const setupInfBuffer = new TextEncoder().encode(setupInf);
|
|
168
|
+
return setupInfBuffer;
|
|
169
|
+
}
|
|
170
|
+
buildSfx(zipBuffer, sources) {
|
|
171
|
+
const setupRedistBuffer = this.callbacks.loadFile(sources.setupExeFilename);
|
|
172
|
+
const buffer = new Uint8Array(setupRedistBuffer.length + zipBuffer.length);
|
|
173
|
+
buffer.set(setupRedistBuffer, 0);
|
|
174
|
+
buffer.set(zipBuffer, setupRedistBuffer.length);
|
|
175
|
+
return buffer;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=windows-package-installer-compiler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows-package-installer-compiler.js","sources":["../../../src/compiler/windows-package-installer-compiler.ts"],"
|
|
1
|
+
{"version":3,"file":"windows-package-installer-compiler.js","sourceRoot":"","sources":["../../../src/compiler/windows-package-installer-compiler.ts"],"names":[],"mappings":"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"}
|
package/build/src/main.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { KmpCompiler, KmpCompilerOptions, KmpCompilerResult, KmpCompilerArtifacts } from "./compiler/kmp-compiler.js";
|
|
2
|
-
export { PackageValidation } from "./compiler/package-validation.js";
|
|
3
|
-
export { WindowsPackageInstallerSources, WindowsPackageInstallerCompiler, WindowsPackageInstallerCompilerOptions, WindowsPackageInstallerCompilerResult, WindowsPackageInstallerCompilerArtifacts, } from "./compiler/windows-package-installer-compiler.js";
|
|
4
|
-
export { CompilerMessages as PackageCompilerMessages } from './compiler/package-compiler-messages.js';
|
|
1
|
+
export { KmpCompiler, KmpCompilerOptions, KmpCompilerResult, KmpCompilerArtifacts } from "./compiler/kmp-compiler.js";
|
|
2
|
+
export { PackageValidation } from "./compiler/package-validation.js";
|
|
3
|
+
export { WindowsPackageInstallerSources, WindowsPackageInstallerCompiler, WindowsPackageInstallerCompilerOptions, WindowsPackageInstallerCompilerResult, WindowsPackageInstallerCompilerArtifacts, } from "./compiler/windows-package-installer-compiler.js";
|
|
4
|
+
export { CompilerMessages as PackageCompilerMessages } from './compiler/package-compiler-messages.js';
|
|
5
5
|
//# sourceMappingURL=main.d.ts.map
|
package/build/src/main.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
|
|
6
|
-
export { CompilerMessages as PackageCompilerMessages } from './compiler/package-compiler-messages.js';
|
|
7
|
-
//# sourceMappingURL=main.js.map
|
|
8
|
-
//# debugId=b7b71e3a-7073-54de-95a4-1d0917c8245c
|
|
1
|
+
export { KmpCompiler } from "./compiler/kmp-compiler.js";
|
|
2
|
+
export { PackageValidation } from "./compiler/package-validation.js";
|
|
3
|
+
export { WindowsPackageInstallerCompiler, } from "./compiler/windows-package-installer-compiler.js";
|
|
4
|
+
export { CompilerMessages as PackageCompilerMessages } from './compiler/package-compiler-messages.js';
|
|
5
|
+
//# sourceMappingURL=main.js.map
|
package/build/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../../src/main.ts"],"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+D,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAEL,+BAA+B,GAIhC,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,yCAAyC,CAAC"}
|