@keymanapp/kmc-copy 18.0.138-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/KeymanProjectCopier.d.ts +145 -0
- package/build/src/KeymanProjectCopier.d.ts.map +1 -0
- package/build/src/KeymanProjectCopier.js +551 -0
- package/build/src/KeymanProjectCopier.js.map +1 -0
- package/build/src/cloud.d.ts +26 -0
- package/build/src/cloud.d.ts.map +1 -0
- package/build/src/cloud.js +126 -0
- package/build/src/cloud.js.map +1 -0
- package/build/src/copier-async-callbacks.d.ts +21 -0
- package/build/src/copier-async-callbacks.d.ts.map +1 -0
- package/build/src/copier-async-callbacks.js +113 -0
- package/build/src/copier-async-callbacks.js.map +1 -0
- package/build/src/copier-messages.d.ts +130 -0
- package/build/src/copier-messages.d.ts.map +1 -0
- package/build/src/copier-messages.js +91 -0
- package/build/src/copier-messages.js.map +1 -0
- package/build/src/main.d.ts +3 -0
- package/build/src/main.d.ts.map +1 -0
- package/build/src/main.js +6 -0
- package/build/src/main.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Keyman is copyright (C) SIL International. MIT License.
|
|
3
|
+
*
|
|
4
|
+
* Copy a keyboard or lexical model project
|
|
5
|
+
*/
|
|
6
|
+
import { KeymanDeveloperProjectOptions, KPJFileReader, KPJFileWriter, KpsFileReader, KpsFileWriter } from "@keymanapp/developer-utils";
|
|
7
|
+
import { KeymanFileTypes } from "@keymanapp/common-types";
|
|
8
|
+
import { CopierMessages } from "./copier-messages.js";
|
|
9
|
+
import { CopierAsyncCallbacks } from "./copier-async-callbacks.js";
|
|
10
|
+
import { GitHubRef, KeymanCloudSource } from "./cloud.js";
|
|
11
|
+
;
|
|
12
|
+
;
|
|
13
|
+
;
|
|
14
|
+
export class KeymanProjectCopier {
|
|
15
|
+
options;
|
|
16
|
+
callbacks;
|
|
17
|
+
asyncCallbacks;
|
|
18
|
+
sourceId;
|
|
19
|
+
outputId;
|
|
20
|
+
outPath;
|
|
21
|
+
githubRef;
|
|
22
|
+
cloudSource;
|
|
23
|
+
isLocalOrigin() {
|
|
24
|
+
return this.githubRef == undefined;
|
|
25
|
+
}
|
|
26
|
+
relocateExternalFiles = false; // TODO-COPY: support
|
|
27
|
+
async init(callbacks, options) {
|
|
28
|
+
this.callbacks = callbacks;
|
|
29
|
+
this.options = options;
|
|
30
|
+
this.cloudSource = new KeymanCloudSource(this.callbacks);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Copy a Keyman project. Returns an object containing binary
|
|
35
|
+
* artifacts on success. The files are passed in by name, and the compiler
|
|
36
|
+
* will use callbacks as passed to the {@link KeymanProjectCopier.init}
|
|
37
|
+
* function to read any input files by disk.
|
|
38
|
+
* @param source Source file or folder to copy. Can be a local file or folder, github:repo[:path], or cloud:id
|
|
39
|
+
* @returns Binary artifacts on success, null on failure.
|
|
40
|
+
*/
|
|
41
|
+
async run(source) {
|
|
42
|
+
if (!this.verifyOutputPath()) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
let projectSource;
|
|
46
|
+
const projectSourceOrRef = await this.getSourceProject(source);
|
|
47
|
+
if (!projectSourceOrRef) {
|
|
48
|
+
// error will have been raised in getSourceProject
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
if (typeof projectSourceOrRef == 'string') {
|
|
52
|
+
projectSource = projectSourceOrRef;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
projectSource = projectSourceOrRef.path;
|
|
56
|
+
this.githubRef = projectSourceOrRef;
|
|
57
|
+
}
|
|
58
|
+
this.asyncCallbacks = new CopierAsyncCallbacks(this.callbacks, this.githubRef);
|
|
59
|
+
// TODO-COPY: validate outputId is valid for the project type?
|
|
60
|
+
this.outputId = this.callbacks.path.basename(this.outPath);
|
|
61
|
+
this.sourceId = this.callbacks.path.basename(projectSource, ".kpj" /* KeymanFileTypes.Source.Project */);
|
|
62
|
+
// copy project file
|
|
63
|
+
const project = await this.loadProjectFromFile(projectSource);
|
|
64
|
+
if (!project) {
|
|
65
|
+
// loadProjectFromFile already reported errors
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const result = { artifacts: {
|
|
69
|
+
'kmc-copy:outputPath': {
|
|
70
|
+
data: null,
|
|
71
|
+
filename: this.outPath
|
|
72
|
+
}
|
|
73
|
+
} };
|
|
74
|
+
const success = await this.copyProjectFile(project, projectSource, this.outPath, projectSource, result);
|
|
75
|
+
return success ? result : null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Resolve the source project file to either a local filesystem file,
|
|
79
|
+
* or a reference on GitHub
|
|
80
|
+
* @param source
|
|
81
|
+
* @returns path to .kpj (either local or remote)
|
|
82
|
+
*/
|
|
83
|
+
async getSourceProject(source) {
|
|
84
|
+
if (source.startsWith('github:')) {
|
|
85
|
+
// `github:owner/repo:path/to/kpj`, referencing a .kpj file
|
|
86
|
+
return await this.getGitHubSourceProject(source);
|
|
87
|
+
}
|
|
88
|
+
else if (source.startsWith('cloud:')) {
|
|
89
|
+
// `cloud:id`, referencing a Keyman Cloud keyboard
|
|
90
|
+
return await this.getCloudSourceProject(source);
|
|
91
|
+
}
|
|
92
|
+
else if (this.callbacks.fs.existsSync(source) && source.endsWith(".kpj" /* KeymanFileTypes.Source.Project */) && !this.callbacks.isDirectory(source)) {
|
|
93
|
+
// referencing a local filesystem project file
|
|
94
|
+
return this.getLocalFileProject(source);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Referencing a folder, or a missing local file
|
|
98
|
+
return this.getLocalFolderProject(source);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Resolve source path to the contained project file; the project
|
|
103
|
+
* file must have the same basename as the folder in this case
|
|
104
|
+
* @param source
|
|
105
|
+
* @returns
|
|
106
|
+
*/
|
|
107
|
+
getLocalFolderProject(source) {
|
|
108
|
+
source = this.normalizePath(source);
|
|
109
|
+
const projectSource = this.normalizePath(this.callbacks.path.join(source, this.callbacks.path.basename(source) + ".kpj" /* KeymanFileTypes.Source.Project */));
|
|
110
|
+
if (!this.callbacks.fs.existsSync(projectSource)) {
|
|
111
|
+
this.callbacks.reportMessage(CopierMessages.Error_CannotFindInputProject({ project: source }));
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return projectSource;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Resolve source path to the input .kpj filename, folder name
|
|
118
|
+
* is not relevant when .kpj filename is passed in
|
|
119
|
+
* @param source
|
|
120
|
+
* @returns
|
|
121
|
+
*/
|
|
122
|
+
getLocalFileProject(source) {
|
|
123
|
+
return this.normalizePath(source);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Resolve path to GitHub source, which must be in the following format:
|
|
127
|
+
* `github:owner/repo[:branch]:path/to/kpj`
|
|
128
|
+
* The path must be fully qualified, referencing the .kpj file; it
|
|
129
|
+
* cannot just be the folder where the .kpj is found
|
|
130
|
+
* @param source
|
|
131
|
+
* @returns a promise: GitHub reference to the source for the keyboard, or null on failure
|
|
132
|
+
*/
|
|
133
|
+
async getGitHubSourceProject(source) {
|
|
134
|
+
const parts = source.split(':');
|
|
135
|
+
if (parts.length < 3 || parts.length > 4 || !parts[1].match(/^[a-z0-9-]+\/[a-z0-9._-]+$/i)) {
|
|
136
|
+
// https://stackoverflow.com/questions/59081778/rules-for-special-characters-in-github-repository-name
|
|
137
|
+
this.callbacks.reportMessage(CopierMessages.Error_InvalidGitHubSource({ source }));
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const origin = parts[1].split('/');
|
|
141
|
+
const ref = new GitHubRef({
|
|
142
|
+
owner: origin[0],
|
|
143
|
+
repo: origin[1],
|
|
144
|
+
branch: null,
|
|
145
|
+
path: null
|
|
146
|
+
});
|
|
147
|
+
if (parts.length == 4) {
|
|
148
|
+
ref.branch = parts[2];
|
|
149
|
+
ref.path = parts[3];
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
ref.branch = await this.cloudSource.getDefaultBranchFromGitHub(ref);
|
|
153
|
+
if (!ref.branch) {
|
|
154
|
+
this.callbacks.reportMessage(CopierMessages.Error_CouldNotFindDefaultBranchOnGitHub({ ref: ref.toString() }));
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
ref.path = parts[2];
|
|
158
|
+
}
|
|
159
|
+
if (!ref.path.startsWith('/')) {
|
|
160
|
+
ref.path = '/' + ref.path;
|
|
161
|
+
}
|
|
162
|
+
return ref;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Resolve path to Keyman Cloud source (which is on GitHub), which must be in
|
|
166
|
+
* the following format:
|
|
167
|
+
* `cloud:keyboard_id|model_id`
|
|
168
|
+
* The `keyboard_id` parameter should be a valid id (a-z0-9_), as found at
|
|
169
|
+
* https://keyman.com/keyboards; alternativel if it is a model_id, it should
|
|
170
|
+
* have the format author.bcp47.uniq
|
|
171
|
+
* @param source
|
|
172
|
+
* @returns a promise: GitHub reference to the source for the keyboard, or null on failure
|
|
173
|
+
*/
|
|
174
|
+
async getCloudSourceProject(source) {
|
|
175
|
+
const parts = source.split(':');
|
|
176
|
+
const id = parts[1];
|
|
177
|
+
const isModel = /^[^.]+\.[^.]+\.[^.]+$/.test(id);
|
|
178
|
+
const remote = await this.cloudSource.getSourceFromKeymanCloud(id, isModel);
|
|
179
|
+
if (!remote) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
// append project filename .kpj
|
|
183
|
+
remote.path += '/' + this.callbacks.path.basename(remote.path) + ".kpj" /* KeymanFileTypes.Source.Project */;
|
|
184
|
+
return remote;
|
|
185
|
+
}
|
|
186
|
+
normalizePath(path) {
|
|
187
|
+
return path.replaceAll(/\\/g, '/');
|
|
188
|
+
}
|
|
189
|
+
verifyOutputPath() {
|
|
190
|
+
this.outPath = this.normalizePath(this.options.outPath);
|
|
191
|
+
if (this.outPath.endsWith('/')) {
|
|
192
|
+
this.outPath = this.outPath.substring(0, this.outPath.length - 1);
|
|
193
|
+
}
|
|
194
|
+
if (this.callbacks.fs.existsSync(this.outPath)) {
|
|
195
|
+
this.callbacks.reportMessage(CopierMessages.Error_OutputPathAlreadyExists({ outPath: this.outPath }));
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
copiers = {
|
|
201
|
+
".kpj": this.copyProjectFile.bind(this),
|
|
202
|
+
".kmn": this.copyKmnSourceFile.bind(this),
|
|
203
|
+
".kps": this.copyKpsSourceFile.bind(this),
|
|
204
|
+
".kvks": this.copySourceFile.bind(this),
|
|
205
|
+
".keyman-touch-layout": this.copySourceFile.bind(this),
|
|
206
|
+
".xml": this.copySourceFile.bind(this),
|
|
207
|
+
".model.ts": this.copyModelTsSourceFile.bind(this),
|
|
208
|
+
};
|
|
209
|
+
async copyFolder(inputPath, outputPath, ignorePatterns, result) {
|
|
210
|
+
// TODO-COPY: watch out for file collisions when copying project files -- after renames
|
|
211
|
+
const files = await this.asyncCallbacks.fsAsync.readdir(inputPath);
|
|
212
|
+
for (const { filename, type } of files) {
|
|
213
|
+
const fullPath = this.normalizePath(this.callbacks.path.join(inputPath, filename));
|
|
214
|
+
if (ignorePatterns.find(pattern => (typeof pattern == 'string' && pattern == fullPath) || (fullPath.match(pattern)))) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (type == 'dir') {
|
|
218
|
+
await this.copyFolder(fullPath, this.callbacks.path.join(outputPath, filename), ignorePatterns, result);
|
|
219
|
+
}
|
|
220
|
+
else if (!result.artifacts[fullPath]) {
|
|
221
|
+
result.artifacts[fullPath] = {
|
|
222
|
+
data: await this.asyncCallbacks.fsAsync.readFile(fullPath),
|
|
223
|
+
filename: this.generateNewFilename(fullPath, outputPath)
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
resolveFilename(base, filename) {
|
|
229
|
+
if (this.isLocalOrigin()) {
|
|
230
|
+
return this.callbacks.resolveFilename(base, filename);
|
|
231
|
+
}
|
|
232
|
+
// GitHub resolveFilename
|
|
233
|
+
if (filename.startsWith('/')) {
|
|
234
|
+
return filename;
|
|
235
|
+
}
|
|
236
|
+
let result = this.normalizePath(this.callbacks.path.normalize(this.callbacks.path.join(this.callbacks.path.dirname(base), filename)));
|
|
237
|
+
if (!result.startsWith('/'))
|
|
238
|
+
result = '/' + result;
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
async copyProjectFile(project, filename, outputPath, source, result) {
|
|
242
|
+
for (const file of project.files) {
|
|
243
|
+
const normalizedFilePath = this.normalizePath(file.filePath);
|
|
244
|
+
const subOutputPath = this.normalizePath(this.calculateNewFilePath(normalizedFilePath));
|
|
245
|
+
const subFilename = this.normalizePath(this.resolveFilename(project.projectFilename, normalizedFilePath));
|
|
246
|
+
const copier = this.copiers[file.fileType] ?? this.copyGenericFile.bind(this);
|
|
247
|
+
// Ignore errors because we will continue to do a best effort
|
|
248
|
+
await copier(project, subFilename, subOutputPath, source, result);
|
|
249
|
+
}
|
|
250
|
+
if (project.options.version == "2.0") {
|
|
251
|
+
// For version 2.0 projects, we also copy every file in the folder
|
|
252
|
+
// except for project.buildpath and .kpj.user
|
|
253
|
+
await this.copyFolder(project.projectPath, outputPath, [/\.kpj\.user$/, project.resolveBuildPath()], result);
|
|
254
|
+
}
|
|
255
|
+
// Rewrite the project
|
|
256
|
+
project.options = new KeymanDeveloperProjectOptions('2.0');
|
|
257
|
+
const writer = new KPJFileWriter();
|
|
258
|
+
const data = new TextEncoder().encode(writer.write(project));
|
|
259
|
+
result.artifacts[filename] = {
|
|
260
|
+
data,
|
|
261
|
+
filename: this.generateNewFilename(filename, outputPath)
|
|
262
|
+
};
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
async copyGenericFile(_project, filename, outputPath, _source, result) {
|
|
266
|
+
if (result.artifacts[filename]) {
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
const data = await this.asyncCallbacks.fsAsync.readFile(filename);
|
|
270
|
+
if (!data) {
|
|
271
|
+
// We'll add an null artifact and do a best effort, rather
|
|
272
|
+
// than fail the process altogether.
|
|
273
|
+
result.artifacts[filename] = {
|
|
274
|
+
data: null,
|
|
275
|
+
filename: this.generateNewFilename(filename, outputPath)
|
|
276
|
+
};
|
|
277
|
+
// Only warn that the file is missing if it isn't an output file,
|
|
278
|
+
// because a clean project won't contain any outputs (binaries)
|
|
279
|
+
if (KeymanFileTypes.binaryTypeFromFilename(filename) === null) {
|
|
280
|
+
this.callbacks.reportMessage(CopierMessages.Warn_FileNotFound({ filename, newFilename: result.artifacts[filename].filename }));
|
|
281
|
+
}
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
result.artifacts[filename] = {
|
|
285
|
+
data,
|
|
286
|
+
filename: this.generateNewFilename(filename, outputPath)
|
|
287
|
+
};
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
async copySourceFile(project, filename, _outputPath, source, result) {
|
|
291
|
+
return await this.copyGenericFile(project, filename, this.callbacks.path.join(this.outPath, 'source'), source, result);
|
|
292
|
+
}
|
|
293
|
+
async copyModelTsSourceFile(project, filename, outputPath, source, result) {
|
|
294
|
+
if (!await this.copySourceFile(project, filename, outputPath, source, result)) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
// Replace wordlist references and update files
|
|
298
|
+
const lines = new TextDecoder().decode(result.artifacts[filename].data);
|
|
299
|
+
const sources = lines.match(/(sources:\s*\[)([^\]]+)(\])/m);
|
|
300
|
+
if (!sources) {
|
|
301
|
+
this.callbacks.reportMessage(CopierMessages.Warn_NoWordlistsFound({ filename }));
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
const wordlistString = sources[2];
|
|
305
|
+
const wordlists = wordlistString.matchAll(/(['"])(.+)(\1)/g);
|
|
306
|
+
let index = 0;
|
|
307
|
+
let out = '';
|
|
308
|
+
for (const wordlist of wordlists) {
|
|
309
|
+
const wordlistFilename = wordlist[2];
|
|
310
|
+
const newRelativePath = await this.copySubFileAndGetRelativePath(project, filename, wordlistFilename, outputPath, source, result);
|
|
311
|
+
out += wordlistString.substring(index, wordlist.index) + wordlist[1] + newRelativePath + wordlist[3];
|
|
312
|
+
index = wordlist.index + wordlist[0].length;
|
|
313
|
+
}
|
|
314
|
+
out += wordlistString.substring(index);
|
|
315
|
+
const outLines = lines.substring(0, sources.index ?? 0) + sources[1] + out + sources[3] + lines.substring((sources.index ?? 0) + sources[0].length);
|
|
316
|
+
result.artifacts[filename].data = new TextEncoder().encode(outLines);
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
async copyKmnSourceFile(project, filename, outputPath, source, result) {
|
|
320
|
+
if (!await this.copySourceFile(project, filename, outputPath, source, result)) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
// Replace file references for known files
|
|
324
|
+
const stores = ['&BITMAP', '&DISPLAYMAP', '&INCLUDECODES', '&KMW_EMBEDCSS', '&KMW_EMBEDJS', '&KMW_HELPFILE', '&LAYOUTFILE', '&VISUALKEYBOARD'];
|
|
325
|
+
const storeRegexes = stores.map(m => ({ id: m, re: new RegExp(`^\\s*store\\s*\\(\\s*${m}\\s*\\)\\s*(['"])(.+?)(\\1)`, 'i') }));
|
|
326
|
+
const replacementRegex = /^(\s*store\s*\(\s*&[a-z0-9-_]+\s*\)\s*(['"]))(.+?)(\2.*)$/i;
|
|
327
|
+
const lines = new TextDecoder().decode(result.artifacts[filename].data).replaceAll(/\r\n/g, '\n').replaceAll(/\r/g, '\n').split('\n');
|
|
328
|
+
for (let i = 0; i < lines.length; i++) {
|
|
329
|
+
const line = lines[i];
|
|
330
|
+
for (const r of storeRegexes) {
|
|
331
|
+
const m = line.match(r.re);
|
|
332
|
+
if (m) {
|
|
333
|
+
const newRelativePath = await this.copySubFileAndGetRelativePath(project, filename, m[2], outputPath, source, result);
|
|
334
|
+
lines[i] = line.replace(replacementRegex, `$1${newRelativePath}$4`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// rewrite fixups inside the source file
|
|
339
|
+
result.artifacts[filename].data = new TextEncoder().encode(lines.join('\n'));
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
async copyKpsSourceFile(project, filename, outputPath, source, result) {
|
|
343
|
+
if (!await this.copySourceFile(project, filename, outputPath, source, result)) {
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
const reader = new KpsFileReader(this.callbacks);
|
|
347
|
+
const kps = reader.read(result.artifacts[filename].data);
|
|
348
|
+
if (!kps) {
|
|
349
|
+
this.callbacks.reportMessage(CopierMessages.Error_PackageFileCouldNotBeRead({ filename }));
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
if (kps.Package?.Files?.File.length) {
|
|
353
|
+
for (const file of kps.Package.Files.File) {
|
|
354
|
+
const newRelativePath = await this.copySubFileAndGetRelativePath(project, filename, file.Name, outputPath, source, result);
|
|
355
|
+
const remap = (ref) => ref == file.Name ? newRelativePath : ref;
|
|
356
|
+
// Update all other file links in the .kps
|
|
357
|
+
kps.Package.Options.GraphicFile = remap(kps.Package.Options.GraphicFile);
|
|
358
|
+
kps.Package.Options.LicenseFile = remap(kps.Package.Options.LicenseFile);
|
|
359
|
+
kps.Package.Options.MSIFileName = remap(kps.Package.Options.MSIFileName);
|
|
360
|
+
kps.Package.Options.ReadMeFile = remap(kps.Package.Options.ReadMeFile);
|
|
361
|
+
kps.Package.Options.WelcomeFile = remap(kps.Package.Options.WelcomeFile);
|
|
362
|
+
if (kps.Package?.Keyboards?.Keyboard?.length) {
|
|
363
|
+
for (const keyboard of kps.Package.Keyboards?.Keyboard) {
|
|
364
|
+
keyboard.DisplayFont = remap(keyboard.DisplayFont);
|
|
365
|
+
keyboard.OSKFont = remap(keyboard.OSKFont);
|
|
366
|
+
if (keyboard.WebDisplayFonts?.Font?.length) {
|
|
367
|
+
for (const font of keyboard.WebDisplayFonts.Font) {
|
|
368
|
+
font.$.Filename = remap(font.$.Filename);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (keyboard.WebOSKFonts?.Font?.length) {
|
|
372
|
+
for (const font of keyboard.WebOSKFonts.Font) {
|
|
373
|
+
font.$.Filename = remap(font.$.Filename);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// Rewrite keyboard id
|
|
377
|
+
if (keyboard.ID == this.sourceId) {
|
|
378
|
+
keyboard.ID = this.outputId;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
if (kps.Package?.LexicalModels?.LexicalModel?.length) {
|
|
383
|
+
for (const model of kps.Package.LexicalModels?.LexicalModel) {
|
|
384
|
+
// Rewrite keyboard id
|
|
385
|
+
if (model.ID == this.sourceId) {
|
|
386
|
+
model.ID = this.outputId;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Rewrite
|
|
391
|
+
file.Name = newRelativePath;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Rewrite the .kps artifact
|
|
395
|
+
const writer = new KpsFileWriter();
|
|
396
|
+
const output = writer.write(kps);
|
|
397
|
+
result.artifacts[filename].data = new TextEncoder().encode(output);
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
async copySubFileAndGetRelativePath(project, parentFilename, originalSubfilename, outputPath, source, result) {
|
|
401
|
+
originalSubfilename = this.normalizePath(originalSubfilename);
|
|
402
|
+
const subFilename = this.normalizePath(this.resolveFilename(parentFilename, originalSubfilename));
|
|
403
|
+
const subFilenameAbsolute = this.normalizePath(this.resolveFilename(project.projectPath, subFilename));
|
|
404
|
+
const subFilenameRelative = this.normalizePath(this.callbacks.path.relative(project.projectPath, subFilenameAbsolute));
|
|
405
|
+
let subOutputPath;
|
|
406
|
+
if (this.callbacks.path.isAbsolute(subFilenameRelative) || subFilenameRelative.startsWith('..')) {
|
|
407
|
+
if (this.isLocalOrigin() && !this.relocateExternalFiles) {
|
|
408
|
+
// Reference outside the project structure, do not attempt to normalize or copy,
|
|
409
|
+
// but we do need to update references for the new output path
|
|
410
|
+
return this.normalizePath(this.callbacks.path.relative(result.artifacts[parentFilename].filename, subFilenameAbsolute));
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// Reference outside the project structure, we will copy into a subfolder of the project;
|
|
414
|
+
// should be relative to root of remote repo, e.g. release/k/khmer_angkor references release/shared/fonts/...,
|
|
415
|
+
// so should go external/release/shared/fonts/...
|
|
416
|
+
subOutputPath = this.normalizePath(this.callbacks.path.join(this.options.outPath, 'external', this.callbacks.path.dirname(subFilenameAbsolute)));
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
subOutputPath = this.normalizePath(this.callbacks.path.join(outputPath, this.callbacks.path.dirname(originalSubfilename)));
|
|
421
|
+
}
|
|
422
|
+
await this.copyGenericFile(project, subFilename, subOutputPath, source, result);
|
|
423
|
+
// Even if the subfile is missing, we'll still continue the overall copy
|
|
424
|
+
return this.normalizePath(this.callbacks.path.relative(this.callbacks.path.dirname(result.artifacts[parentFilename].filename), result.artifacts[subFilename].filename));
|
|
425
|
+
}
|
|
426
|
+
splitFilename(filename) {
|
|
427
|
+
// We have a special case for .model.kps, as this is not a specific file
|
|
428
|
+
// type in KeymanFileTypes, but we still need to transform the file basename
|
|
429
|
+
const ext = filename.endsWith('.model.kps') ? '.model.kps' : KeymanFileTypes.fromFilename(filename);
|
|
430
|
+
const path = this.callbacks.path.dirname(filename);
|
|
431
|
+
const base = this.callbacks.path.basename(filename, ext);
|
|
432
|
+
return { ext, path, base };
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* renames matching filename to the output filename pattern, and prepends the
|
|
436
|
+
* outputPath
|
|
437
|
+
* @param filename
|
|
438
|
+
* @param outputPath
|
|
439
|
+
* @returns
|
|
440
|
+
*/
|
|
441
|
+
generateNewFilename(filename, outputPath) {
|
|
442
|
+
const { ext, base } = this.splitFilename(filename);
|
|
443
|
+
const newFilename = base == this.sourceId
|
|
444
|
+
? this.callbacks.path.join(outputPath, this.outputId + ext)
|
|
445
|
+
: this.callbacks.path.join(outputPath, base + ext);
|
|
446
|
+
return this.normalizePath(newFilename);
|
|
447
|
+
}
|
|
448
|
+
calculateNewFilePath(oldFilePath) {
|
|
449
|
+
// Do not change filename here, just its path
|
|
450
|
+
const { ext, base } = this.splitFilename(oldFilePath);
|
|
451
|
+
const filename = base + ext;
|
|
452
|
+
const sourceType = KeymanFileTypes.sourceTypeFromFilename(oldFilePath);
|
|
453
|
+
if (sourceType === null) {
|
|
454
|
+
// Standard metadata files -- root of project
|
|
455
|
+
if (filename === KeymanFileTypes.HISTORY_MD || filename === KeymanFileTypes.README_MD || filename === KeymanFileTypes.LICENSE_MD) {
|
|
456
|
+
return this.outPath;
|
|
457
|
+
}
|
|
458
|
+
// Other files referenced in project, maintain original path
|
|
459
|
+
return this.callbacks.path.join(this.outPath, this.callbacks.path.dirname(oldFilePath));
|
|
460
|
+
}
|
|
461
|
+
if (sourceType == ".kpj" /* KeymanFileTypes.Source.Project */) {
|
|
462
|
+
// Project file -- root of project
|
|
463
|
+
return this.outPath;
|
|
464
|
+
}
|
|
465
|
+
// source type is valid
|
|
466
|
+
return this.callbacks.path.join(this.outPath, 'source');
|
|
467
|
+
}
|
|
468
|
+
async loadProjectFromFile(filename) {
|
|
469
|
+
const kpjData = await this.asyncCallbacks.fsAsync.readFile(filename);
|
|
470
|
+
const reader = new KPJFileReader(this.asyncCallbacks);
|
|
471
|
+
let kpj = null;
|
|
472
|
+
try {
|
|
473
|
+
kpj = reader.read(kpjData);
|
|
474
|
+
if (!kpj) {
|
|
475
|
+
this.callbacks.reportMessage(CopierMessages.Error_ProjectFileCouldNotBeRead({ filename }));
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
if (kpj.KeymanDeveloperProject?.Options?.Version && kpj.KeymanDeveloperProject.Options.Version != "1.0" && kpj.KeymanDeveloperProject.Options.Version != "2.0") {
|
|
479
|
+
this.callbacks.reportMessage(CopierMessages.Error_UnsupportedProjectVersion({ filename, version: kpj.KeymanDeveloperProject.Options.Version }));
|
|
480
|
+
return null;
|
|
481
|
+
}
|
|
482
|
+
reader.validate(kpj);
|
|
483
|
+
}
|
|
484
|
+
catch (e) {
|
|
485
|
+
this.callbacks.reportMessage(CopierMessages.Error_InvalidProjectFile({ filename, message: (e ?? '').toString() }));
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
488
|
+
const project = await reader.transform(filename, kpj);
|
|
489
|
+
return project;
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Write artifacts from a successful compile to disk, via callbacks methods.
|
|
493
|
+
* The artifacts written will include all files from the project, across
|
|
494
|
+
* multiple folders. Folders will be created as needed
|
|
495
|
+
*
|
|
496
|
+
* @param artifacts - object containing artifact binary data to write out
|
|
497
|
+
* @returns true on success
|
|
498
|
+
*/
|
|
499
|
+
/* c8 ignore start */
|
|
500
|
+
async write(artifacts) {
|
|
501
|
+
if (this.callbacks.fs.existsSync(artifacts["kmc-copy:outputPath"].filename)) {
|
|
502
|
+
this.callbacks.reportMessage(CopierMessages.Error_OutputPathAlreadyExists({ outPath: this.outPath }));
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
const pathsCreated = [];
|
|
506
|
+
if (this.options.dryRun) {
|
|
507
|
+
this.callbacks.reportMessage(CopierMessages.Info_DryRun({ outPath: this.outPath }));
|
|
508
|
+
}
|
|
509
|
+
for (const key of Object.keys(artifacts)) {
|
|
510
|
+
const a = artifacts[key];
|
|
511
|
+
if (a.data == null) {
|
|
512
|
+
// We can have non-existent files (e.g. build artifacts), for which we
|
|
513
|
+
// have recorded filename changes for other linkages, but don't want to
|
|
514
|
+
// write them out
|
|
515
|
+
// also 'copier base path' has null data
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
const path = this.callbacks.path.dirname(a.filename);
|
|
519
|
+
try {
|
|
520
|
+
if (this.options.dryRun) {
|
|
521
|
+
if (!pathsCreated.includes(path)) {
|
|
522
|
+
this.callbacks.reportMessage(CopierMessages.Info_DryRunCreatingFolder({ path }));
|
|
523
|
+
pathsCreated.push(path);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
this.callbacks.fs.mkdirSync(path, { recursive: true });
|
|
528
|
+
}
|
|
529
|
+
/* c8 ignore next 4 */
|
|
530
|
+
}
|
|
531
|
+
catch (e) {
|
|
532
|
+
this.callbacks.reportMessage(CopierMessages.Error_CannotCreateFolder({ folderName: path, e }));
|
|
533
|
+
return false;
|
|
534
|
+
}
|
|
535
|
+
try {
|
|
536
|
+
if (this.options.dryRun) {
|
|
537
|
+
this.callbacks.reportMessage(CopierMessages.Info_DryRunWritingFile({ filename: a.filename }));
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
this.callbacks.fs.writeFileSync(a.filename, a.data);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
catch (e) {
|
|
544
|
+
this.callbacks.reportMessage(CopierMessages.Error_CannotWriteOutputFile({ filename: a.filename, e }));
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
//# sourceMappingURL=KeymanProjectCopier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeymanProjectCopier.js","sourceRoot":"","sources":["../../src/KeymanProjectCopier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CompilerCallbacks } from "@keymanapp/developer-utils";
|
|
2
|
+
export declare class GitHubRef {
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
branch: string;
|
|
6
|
+
path: string;
|
|
7
|
+
constructor(owner: string | GitHubRef, repo?: string, branch?: string, path?: string);
|
|
8
|
+
toString(): string;
|
|
9
|
+
}
|
|
10
|
+
export declare class KeymanCloudSource {
|
|
11
|
+
private callbacks;
|
|
12
|
+
static readonly KeymanApp_Owner = "keymanapp";
|
|
13
|
+
static readonly KeymanApp_Keyboards_Repo = "keyboards";
|
|
14
|
+
static readonly KeymanApp_Keyboards_DefaultBranch = "master";
|
|
15
|
+
static readonly KeymanApp_LexicalModels_Repo = "lexical-models";
|
|
16
|
+
static readonly KeymanApp_LexicalModels_DefaultBranch = "master";
|
|
17
|
+
constructor(callbacks: CompilerCallbacks);
|
|
18
|
+
getDefaultBranchFromGitHub(ref: GitHubRef): Promise<string>;
|
|
19
|
+
downloadFolderFromGitHub(ref: GitHubRef): Promise<{
|
|
20
|
+
filename: string;
|
|
21
|
+
type: 'dir' | 'file';
|
|
22
|
+
}[]>;
|
|
23
|
+
downloadFileFromGitHub(ref: GitHubRef): Promise<Uint8Array>;
|
|
24
|
+
getSourceFromKeymanCloud(id: string, isModel: boolean): Promise<GitHubRef | null>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/cloud.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAI/D,qBAAa,SAAS;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;gBACR,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAapF,QAAQ;CAMT;AAED,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,SAAS;IAN7B,gBAAuB,eAAe,eAAe;IACrD,gBAAuB,wBAAwB,eAAe;IAC9D,gBAAuB,iCAAiC,YAAY;IACpE,gBAAuB,4BAA4B,oBAAoB;IACvE,gBAAuB,qCAAqC,YAAY;gBAEpD,SAAS,EAAE,iBAAiB;IAGnC,0BAA0B,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3D,wBAAwB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC;QAAC,QAAQ,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,KAAK,GAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAuBxF,sBAAsB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IAuB3D,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAuC/F"}
|