Skip to content

Commit 5a571dd

Browse files
committed
marketplace web extensions build
1 parent 1a8331f commit 5a571dd

3 files changed

Lines changed: 172 additions & 139 deletions

File tree

build/lib/extensions.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Licensed under the MIT License. See License.txt in the project root for license information.
55
*--------------------------------------------------------------------------------------------*/
66
Object.defineProperty(exports, "__esModule", { value: true });
7-
exports.packageMarketplaceExtensionsStream = exports.packageLocalWebExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0;
7+
exports.packageMarketplaceWebExtensionsStream = exports.packageMarketplaceExtensionsStream = exports.packageLocalWebExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0;
88
const es = require("event-stream");
99
const fs = require("fs");
1010
const glob = require("glob");
@@ -245,3 +245,18 @@ function packageMarketplaceExtensionsStream() {
245245
.pipe(util2.setExecutableBit(['**/*.sh']));
246246
}
247247
exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream;
248+
function packageMarketplaceWebExtensionsStream(builtInExtensions) {
249+
const extensions = builtInExtensions
250+
.map(extension => {
251+
const input = fromMarketplace(extension.name, extension.version, extension.metadata);
252+
return updateExtensionPackageJSON(input, (data) => {
253+
if (data.main) {
254+
data.browser = data.main;
255+
}
256+
data.extensionKind = ['web'];
257+
return data;
258+
}).pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
259+
});
260+
return es.merge(extensions);
261+
}
262+
exports.packageMarketplaceWebExtensionsStream = packageMarketplaceWebExtensionsStream;

build/lib/extensions.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -284,10 +284,25 @@ export function packageLocalWebExtensionsStream(): NodeJS.ReadWriteStream {
284284

285285
export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream {
286286
const extensions = builtInExtensions.map(extension => {
287-
return fromMarketplace(extension.name, extension.version, extension.metadata)
288-
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
289-
});
287+
return fromMarketplace(extension.name, extension.version, extension.metadata)
288+
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
289+
});
290290

291291
return es.merge(extensions)
292292
.pipe(util2.setExecutableBit(['**/*.sh']));
293293
}
294+
295+
export function packageMarketplaceWebExtensionsStream(builtInExtensions: IBuiltInExtension[]): NodeJS.ReadWriteStream {
296+
const extensions = builtInExtensions
297+
.map(extension => {
298+
const input = fromMarketplace(extension.name, extension.version, extension.metadata);
299+
return updateExtensionPackageJSON(input, (data: any) => {
300+
if (data.main) {
301+
data.browser = data.main;
302+
}
303+
data.extensionKind = ['web'];
304+
return data;
305+
}).pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
306+
});
307+
return es.merge(extensions);
308+
}

build/lib/i18n.js

Lines changed: 138 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -101,158 +101,161 @@ class TextModel {
101101
return this._lines;
102102
}
103103
}
104-
class XLF {
105-
constructor(project) {
106-
this.project = project;
107-
this.buffer = [];
108-
this.files = Object.create(null);
109-
this.numberOfMessages = 0;
110-
}
111-
toString() {
112-
this.appendHeader();
113-
for (let file in this.files) {
114-
this.appendNewLine(`<file original="${file}" source-language="en" datatype="plaintext"><body>`, 2);
115-
for (let item of this.files[file]) {
116-
this.addStringItem(file, item);
117-
}
118-
this.appendNewLine('</body></file>', 2);
119-
}
120-
this.appendFooter();
121-
return this.buffer.join('\r\n');
122-
}
123-
addFile(original, keys, messages) {
124-
if (keys.length === 0) {
125-
console.log('No keys in ' + original);
126-
return;
104+
let XLF = /** @class */ (() => {
105+
class XLF {
106+
constructor(project) {
107+
this.project = project;
108+
this.buffer = [];
109+
this.files = Object.create(null);
110+
this.numberOfMessages = 0;
127111
}
128-
if (keys.length !== messages.length) {
129-
throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`);
112+
toString() {
113+
this.appendHeader();
114+
for (let file in this.files) {
115+
this.appendNewLine(`<file original="${file}" source-language="en" datatype="plaintext"><body>`, 2);
116+
for (let item of this.files[file]) {
117+
this.addStringItem(file, item);
118+
}
119+
this.appendNewLine('</body></file>', 2);
120+
}
121+
this.appendFooter();
122+
return this.buffer.join('\r\n');
130123
}
131-
this.numberOfMessages += keys.length;
132-
this.files[original] = [];
133-
let existingKeys = new Set();
134-
for (let i = 0; i < keys.length; i++) {
135-
let key = keys[i];
136-
let realKey;
137-
let comment;
138-
if (Is.string(key)) {
139-
realKey = key;
140-
comment = undefined;
124+
addFile(original, keys, messages) {
125+
if (keys.length === 0) {
126+
console.log('No keys in ' + original);
127+
return;
128+
}
129+
if (keys.length !== messages.length) {
130+
throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`);
141131
}
142-
else if (LocalizeInfo.is(key)) {
143-
realKey = key.key;
144-
if (key.comment && key.comment.length > 0) {
145-
comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n');
132+
this.numberOfMessages += keys.length;
133+
this.files[original] = [];
134+
let existingKeys = new Set();
135+
for (let i = 0; i < keys.length; i++) {
136+
let key = keys[i];
137+
let realKey;
138+
let comment;
139+
if (Is.string(key)) {
140+
realKey = key;
141+
comment = undefined;
142+
}
143+
else if (LocalizeInfo.is(key)) {
144+
realKey = key.key;
145+
if (key.comment && key.comment.length > 0) {
146+
comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n');
147+
}
148+
}
149+
if (!realKey || existingKeys.has(realKey)) {
150+
continue;
146151
}
152+
existingKeys.add(realKey);
153+
let message = encodeEntities(messages[i]);
154+
this.files[original].push({ id: realKey, message: message, comment: comment });
155+
}
156+
}
157+
addStringItem(file, item) {
158+
if (!item.id || item.message === undefined || item.message === null) {
159+
throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`);
160+
}
161+
if (item.message.length === 0) {
162+
log(`Item with id ${item.id} in file ${file} has an empty message.`);
147163
}
148-
if (!realKey || existingKeys.has(realKey)) {
149-
continue;
164+
this.appendNewLine(`<trans-unit id="${item.id}">`, 4);
165+
this.appendNewLine(`<source xml:lang="en">${item.message}</source>`, 6);
166+
if (item.comment) {
167+
this.appendNewLine(`<note>${item.comment}</note>`, 6);
150168
}
151-
existingKeys.add(realKey);
152-
let message = encodeEntities(messages[i]);
153-
this.files[original].push({ id: realKey, message: message, comment: comment });
169+
this.appendNewLine('</trans-unit>', 4);
154170
}
155-
}
156-
addStringItem(file, item) {
157-
if (!item.id || item.message === undefined || item.message === null) {
158-
throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`);
171+
appendHeader() {
172+
this.appendNewLine('<?xml version="1.0" encoding="utf-8"?>', 0);
173+
this.appendNewLine('<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">', 0);
159174
}
160-
if (item.message.length === 0) {
161-
log(`Item with id ${item.id} in file ${file} has an empty message.`);
175+
appendFooter() {
176+
this.appendNewLine('</xliff>', 0);
162177
}
163-
this.appendNewLine(`<trans-unit id="${item.id}">`, 4);
164-
this.appendNewLine(`<source xml:lang="en">${item.message}</source>`, 6);
165-
if (item.comment) {
166-
this.appendNewLine(`<note>${item.comment}</note>`, 6);
178+
appendNewLine(content, indent) {
179+
let line = new Line(indent);
180+
line.append(content);
181+
this.buffer.push(line.toString());
167182
}
168-
this.appendNewLine('</trans-unit>', 4);
169183
}
170-
appendHeader() {
171-
this.appendNewLine('<?xml version="1.0" encoding="utf-8"?>', 0);
172-
this.appendNewLine('<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">', 0);
173-
}
174-
appendFooter() {
175-
this.appendNewLine('</xliff>', 0);
176-
}
177-
appendNewLine(content, indent) {
178-
let line = new Line(indent);
179-
line.append(content);
180-
this.buffer.push(line.toString());
181-
}
182-
}
183-
exports.XLF = XLF;
184-
XLF.parsePseudo = function (xlfString) {
185-
return new Promise((resolve) => {
186-
let parser = new xml2js.Parser();
187-
let files = [];
188-
parser.parseString(xlfString, function (_err, result) {
189-
const fileNodes = result['xliff']['file'];
190-
fileNodes.forEach(file => {
191-
const originalFilePath = file.$.original;
192-
const messages = {};
193-
const transUnits = file.body[0]['trans-unit'];
194-
if (transUnits) {
195-
transUnits.forEach((unit) => {
196-
const key = unit.$.id;
197-
const val = pseudify(unit.source[0]['_'].toString());
198-
if (key && val) {
199-
messages[key] = decodeEntities(val);
200-
}
201-
});
202-
files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' });
203-
}
184+
XLF.parsePseudo = function (xlfString) {
185+
return new Promise((resolve) => {
186+
let parser = new xml2js.Parser();
187+
let files = [];
188+
parser.parseString(xlfString, function (_err, result) {
189+
const fileNodes = result['xliff']['file'];
190+
fileNodes.forEach(file => {
191+
const originalFilePath = file.$.original;
192+
const messages = {};
193+
const transUnits = file.body[0]['trans-unit'];
194+
if (transUnits) {
195+
transUnits.forEach((unit) => {
196+
const key = unit.$.id;
197+
const val = pseudify(unit.source[0]['_'].toString());
198+
if (key && val) {
199+
messages[key] = decodeEntities(val);
200+
}
201+
});
202+
files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' });
203+
}
204+
});
205+
resolve(files);
204206
});
205-
resolve(files);
206207
});
207-
});
208-
};
209-
XLF.parse = function (xlfString) {
210-
return new Promise((resolve, reject) => {
211-
let parser = new xml2js.Parser();
212-
let files = [];
213-
parser.parseString(xlfString, function (err, result) {
214-
if (err) {
215-
reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
216-
}
217-
const fileNodes = result['xliff']['file'];
218-
if (!fileNodes) {
219-
reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`));
220-
}
221-
fileNodes.forEach((file) => {
222-
const originalFilePath = file.$.original;
223-
if (!originalFilePath) {
224-
reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`));
208+
};
209+
XLF.parse = function (xlfString) {
210+
return new Promise((resolve, reject) => {
211+
let parser = new xml2js.Parser();
212+
let files = [];
213+
parser.parseString(xlfString, function (err, result) {
214+
if (err) {
215+
reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
225216
}
226-
let language = file.$['target-language'];
227-
if (!language) {
228-
reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`));
229-
}
230-
const messages = {};
231-
const transUnits = file.body[0]['trans-unit'];
232-
if (transUnits) {
233-
transUnits.forEach((unit) => {
234-
const key = unit.$.id;
235-
if (!unit.target) {
236-
return; // No translation available
237-
}
238-
let val = unit.target[0];
239-
if (typeof val !== 'string') {
240-
val = val._;
241-
}
242-
if (key && val) {
243-
messages[key] = decodeEntities(val);
244-
}
245-
else {
246-
reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`));
247-
}
248-
});
249-
files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() });
217+
const fileNodes = result['xliff']['file'];
218+
if (!fileNodes) {
219+
reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`));
250220
}
221+
fileNodes.forEach((file) => {
222+
const originalFilePath = file.$.original;
223+
if (!originalFilePath) {
224+
reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`));
225+
}
226+
let language = file.$['target-language'];
227+
if (!language) {
228+
reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`));
229+
}
230+
const messages = {};
231+
const transUnits = file.body[0]['trans-unit'];
232+
if (transUnits) {
233+
transUnits.forEach((unit) => {
234+
const key = unit.$.id;
235+
if (!unit.target) {
236+
return; // No translation available
237+
}
238+
let val = unit.target[0];
239+
if (typeof val !== 'string') {
240+
val = val._;
241+
}
242+
if (key && val) {
243+
messages[key] = decodeEntities(val);
244+
}
245+
else {
246+
reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`));
247+
}
248+
});
249+
files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() });
250+
}
251+
});
252+
resolve(files);
251253
});
252-
resolve(files);
253254
});
254-
});
255-
};
255+
};
256+
return XLF;
257+
})();
258+
exports.XLF = XLF;
256259
class Limiter {
257260
constructor(maxDegreeOfParalellism) {
258261
this.maxDegreeOfParalellism = maxDegreeOfParalellism;

0 commit comments

Comments
 (0)