mirror of
https://github.com/Microsoft/vscode
synced 2024-09-18 01:58:27 +00:00
recompile build folder with const
over let
This commit is contained in:
parent
9792b8e561
commit
2c004b870f
|
@ -14,7 +14,7 @@ shasum.update(fs.readFileSync(path.join(ROOT, 'build/.cachesalt')));
|
||||||
shasum.update(fs.readFileSync(path.join(ROOT, '.yarnrc')));
|
shasum.update(fs.readFileSync(path.join(ROOT, '.yarnrc')));
|
||||||
shasum.update(fs.readFileSync(path.join(ROOT, 'remote/.yarnrc')));
|
shasum.update(fs.readFileSync(path.join(ROOT, 'remote/.yarnrc')));
|
||||||
// Add `package.json` and `yarn.lock` files
|
// Add `package.json` and `yarn.lock` files
|
||||||
for (let dir of dirs) {
|
for (const dir of dirs) {
|
||||||
const packageJsonPath = path.join(ROOT, dir, 'package.json');
|
const packageJsonPath = path.join(ROOT, dir, 'package.json');
|
||||||
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
|
||||||
const relevantPackageJsonSections = {
|
const relevantPackageJsonSections = {
|
||||||
|
|
|
@ -19,7 +19,6 @@ function main() {
|
||||||
fileName: 'combined.nls.metadata.json',
|
fileName: 'combined.nls.metadata.json',
|
||||||
jsonSpace: '',
|
jsonSpace: '',
|
||||||
edit: (parsedJson, file) => {
|
edit: (parsedJson, file) => {
|
||||||
let key;
|
|
||||||
if (file.base === 'out-vscode-web-min') {
|
if (file.base === 'out-vscode-web-min') {
|
||||||
return { vscode: parsedJson };
|
return { vscode: parsedJson };
|
||||||
}
|
}
|
||||||
|
@ -63,7 +62,7 @@ function main() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
key = 'vscode.' + file.relative.split('/')[0];
|
const key = 'vscode.' + file.relative.split('/')[0];
|
||||||
return { [key]: parsedJson };
|
return { [key]: parsedJson };
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
|
|
|
@ -39,7 +39,7 @@ async function main() {
|
||||||
outAppPath,
|
outAppPath,
|
||||||
force: true
|
force: true
|
||||||
});
|
});
|
||||||
let productJson = await fs.readJson(productJsonPath);
|
const productJson = await fs.readJson(productJsonPath);
|
||||||
Object.assign(productJson, {
|
Object.assign(productJson, {
|
||||||
darwinUniversalAssetId: 'darwin-universal'
|
darwinUniversalAssetId: 'darwin-universal'
|
||||||
});
|
});
|
||||||
|
|
|
@ -81,7 +81,7 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
|
||||||
out.push(file.contents);
|
out.push(file.contents);
|
||||||
}
|
}
|
||||||
}, function () {
|
}, function () {
|
||||||
let finish = () => {
|
const finish = () => {
|
||||||
{
|
{
|
||||||
const headerPickle = pickle.createEmpty();
|
const headerPickle = pickle.createEmpty();
|
||||||
headerPickle.writeString(JSON.stringify(filesystem.header));
|
headerPickle.writeString(JSON.stringify(filesystem.header));
|
||||||
|
|
|
@ -102,7 +102,7 @@ function getBuiltInExtensions() {
|
||||||
const control = readControlFile();
|
const control = readControlFile();
|
||||||
const streams = [];
|
const streams = [];
|
||||||
for (const extension of [...builtInExtensions, ...webBuiltInExtensions]) {
|
for (const extension of [...builtInExtensions, ...webBuiltInExtensions]) {
|
||||||
let controlState = control[extension.name] || 'marketplace';
|
const controlState = control[extension.name] || 'marketplace';
|
||||||
control[extension.name] = controlState;
|
control[extension.name] = controlState;
|
||||||
streams.push(syncExtension(extension, controlState));
|
streams.push(syncExtension(extension, controlState));
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ const watch = require('./watch');
|
||||||
const reporter = (0, reporter_1.createReporter)();
|
const reporter = (0, reporter_1.createReporter)();
|
||||||
function getTypeScriptCompilerOptions(src) {
|
function getTypeScriptCompilerOptions(src) {
|
||||||
const rootDir = path.join(__dirname, `../../${src}`);
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
let options = {};
|
const options = {};
|
||||||
options.verbose = false;
|
options.verbose = false;
|
||||||
options.sourceMap = true;
|
options.sourceMap = true;
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
|
@ -80,7 +80,7 @@ function compileTask(src, out, build) {
|
||||||
}
|
}
|
||||||
const compile = createCompile(src, build, true);
|
const compile = createCompile(src, build, true);
|
||||||
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
|
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
|
||||||
let generator = new MonacoGenerator(false);
|
const generator = new MonacoGenerator(false);
|
||||||
if (src === 'src') {
|
if (src === 'src') {
|
||||||
generator.execute();
|
generator.execute();
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ function watchTask(out, build) {
|
||||||
const compile = createCompile('src', build);
|
const compile = createCompile('src', build);
|
||||||
const src = gulp.src('src/**', { base: 'src' });
|
const src = gulp.src('src/**', { base: 'src' });
|
||||||
const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
|
const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
|
||||||
let generator = new MonacoGenerator(true);
|
const generator = new MonacoGenerator(true);
|
||||||
generator.execute();
|
generator.execute();
|
||||||
return watchSrc
|
return watchSrc
|
||||||
.pipe(generator.stream)
|
.pipe(generator.stream)
|
||||||
|
@ -112,7 +112,7 @@ class MonacoGenerator {
|
||||||
this._isWatch = isWatch;
|
this._isWatch = isWatch;
|
||||||
this.stream = es.through();
|
this.stream = es.through();
|
||||||
this._watchedFiles = {};
|
this._watchedFiles = {};
|
||||||
let onWillReadFile = (moduleId, filePath) => {
|
const onWillReadFile = (moduleId, filePath) => {
|
||||||
if (!this._isWatch) {
|
if (!this._isWatch) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -149,7 +149,7 @@ class MonacoGenerator {
|
||||||
}, 20);
|
}, 20);
|
||||||
}
|
}
|
||||||
_run() {
|
_run() {
|
||||||
let r = monacodts.run3(this._declarationResolver);
|
const r = monacodts.run3(this._declarationResolver);
|
||||||
if (!r && !this._isWatch) {
|
if (!r && !this._isWatch) {
|
||||||
// The build must always be able to generate the monaco.d.ts
|
// The build must always be able to generate the monaco.d.ts
|
||||||
throw new Error(`monaco.d.ts generation error - Cannot continue`);
|
throw new Error(`monaco.d.ts generation error - Cannot continue`);
|
||||||
|
|
|
@ -41,7 +41,7 @@ module.exports = new (_a = class NoUnexternalizedStrings {
|
||||||
key = keyNode.value;
|
key = keyNode.value;
|
||||||
}
|
}
|
||||||
else if (keyNode.type === experimental_utils_1.AST_NODE_TYPES.ObjectExpression) {
|
else if (keyNode.type === experimental_utils_1.AST_NODE_TYPES.ObjectExpression) {
|
||||||
for (let property of keyNode.properties) {
|
for (const property of keyNode.properties) {
|
||||||
if (property.type === experimental_utils_1.AST_NODE_TYPES.Property && !property.computed) {
|
if (property.type === experimental_utils_1.AST_NODE_TYPES.Property && !property.computed) {
|
||||||
if (property.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier && property.key.name === 'key') {
|
if (property.key.type === experimental_utils_1.AST_NODE_TYPES.Identifier && property.key.name === 'key') {
|
||||||
if (isStringLiteral(property.value)) {
|
if (isStringLiteral(property.value)) {
|
||||||
|
@ -83,7 +83,7 @@ module.exports = new (_a = class NoUnexternalizedStrings {
|
||||||
// (2)
|
// (2)
|
||||||
// report all invalid NLS keys
|
// report all invalid NLS keys
|
||||||
if (!key.match(NoUnexternalizedStrings._rNlsKeys)) {
|
if (!key.match(NoUnexternalizedStrings._rNlsKeys)) {
|
||||||
for (let value of values) {
|
for (const value of values) {
|
||||||
context.report({ loc: value.call.loc, messageId: 'badKey', data: { key } });
|
context.report({ loc: value.call.loc, messageId: 'badKey', data: { key } });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ module.exports = new class ApiProviderNaming {
|
||||||
return {
|
return {
|
||||||
['TSInterfaceDeclaration[id.name=/.+Provider/] TSMethodSignature[key.name=/^(provide|resolve).+/]']: (node) => {
|
['TSInterfaceDeclaration[id.name=/.+Provider/] TSMethodSignature[key.name=/^(provide|resolve).+/]']: (node) => {
|
||||||
let found = false;
|
let found = false;
|
||||||
for (let param of node.params) {
|
for (const param of node.params) {
|
||||||
if (param.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
|
if (param.type === experimental_utils_1.AST_NODE_TYPES.Identifier) {
|
||||||
found = found || param.name === 'token';
|
found = found || param.name === 'token';
|
||||||
}
|
}
|
||||||
|
|
|
@ -345,7 +345,7 @@ function scanBuiltinExtensions(extensionsRoot, exclude = []) {
|
||||||
if (!fs.existsSync(packageJSONPath)) {
|
if (!fs.existsSync(packageJSONPath)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString('utf8'));
|
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath).toString('utf8'));
|
||||||
if (!isWebExtension(packageJSON)) {
|
if (!isWebExtension(packageJSON)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -373,7 +373,7 @@ function translatePackageJSON(packageJSON, packageNLSPath) {
|
||||||
const CharCode_PC = '%'.charCodeAt(0);
|
const CharCode_PC = '%'.charCodeAt(0);
|
||||||
const packageNls = JSON.parse(fs.readFileSync(packageNLSPath).toString());
|
const packageNls = JSON.parse(fs.readFileSync(packageNLSPath).toString());
|
||||||
const translate = (obj) => {
|
const translate = (obj) => {
|
||||||
for (let key in obj) {
|
for (const key in obj) {
|
||||||
const val = obj[key];
|
const val = obj[key];
|
||||||
if (Array.isArray(val)) {
|
if (Array.isArray(val)) {
|
||||||
val.forEach(translate);
|
val.forEach(translate);
|
||||||
|
|
|
@ -45,7 +45,7 @@ function getVersion(repo) {
|
||||||
}
|
}
|
||||||
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
||||||
let refsMatch;
|
let refsMatch;
|
||||||
let refs = {};
|
const refs = {};
|
||||||
while (refsMatch = refsRegex.exec(refsRaw)) {
|
while (refsMatch = refsRegex.exec(refsRaw)) {
|
||||||
refs[refsMatch[2]] = refsMatch[1];
|
refs[refsMatch[2]] = refsMatch[1];
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ exports.externalExtensionsWithTranslations = {
|
||||||
var LocalizeInfo;
|
var LocalizeInfo;
|
||||||
(function (LocalizeInfo) {
|
(function (LocalizeInfo) {
|
||||||
function is(value) {
|
function is(value) {
|
||||||
let candidate = value;
|
const candidate = value;
|
||||||
return Is.defined(candidate) && Is.string(candidate.key) && (Is.undef(candidate.comment) || (Is.array(candidate.comment) && candidate.comment.every(element => Is.string(element))));
|
return Is.defined(candidate) && Is.string(candidate.key) && (Is.undef(candidate.comment) || (Is.array(candidate.comment) && candidate.comment.every(element => Is.string(element))));
|
||||||
}
|
}
|
||||||
LocalizeInfo.is = is;
|
LocalizeInfo.is = is;
|
||||||
|
@ -57,8 +57,8 @@ var BundledFormat;
|
||||||
if (Is.undef(value)) {
|
if (Is.undef(value)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let candidate = value;
|
const candidate = value;
|
||||||
let length = Object.keys(value).length;
|
const length = Object.keys(value).length;
|
||||||
return length === 3 && Is.defined(candidate.keys) && Is.defined(candidate.messages) && Is.defined(candidate.bundles);
|
return length === 3 && Is.defined(candidate.keys) && Is.defined(candidate.messages) && Is.defined(candidate.bundles);
|
||||||
}
|
}
|
||||||
BundledFormat.is = is;
|
BundledFormat.is = is;
|
||||||
|
@ -70,7 +70,7 @@ var PackageJsonFormat;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Object.keys(value).every(key => {
|
return Object.keys(value).every(key => {
|
||||||
let element = value[key];
|
const element = value[key];
|
||||||
return Is.string(element) || (Is.object(element) && Is.defined(element.message) && Is.defined(element.comment));
|
return Is.string(element) || (Is.object(element) && Is.defined(element.message) && Is.defined(element.comment));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -133,9 +133,9 @@ class XLF {
|
||||||
}
|
}
|
||||||
this.numberOfMessages += keys.length;
|
this.numberOfMessages += keys.length;
|
||||||
this.files[original] = [];
|
this.files[original] = [];
|
||||||
let existingKeys = new Set();
|
const existingKeys = new Set();
|
||||||
for (let i = 0; i < keys.length; i++) {
|
for (let i = 0; i < keys.length; i++) {
|
||||||
let key = keys[i];
|
const key = keys[i];
|
||||||
let realKey;
|
let realKey;
|
||||||
let comment;
|
let comment;
|
||||||
if (Is.string(key)) {
|
if (Is.string(key)) {
|
||||||
|
@ -152,7 +152,7 @@ class XLF {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
existingKeys.add(realKey);
|
existingKeys.add(realKey);
|
||||||
let message = encodeEntities(messages[i]);
|
const message = encodeEntities(messages[i]);
|
||||||
this.files[original].push({ id: realKey, message: message, comment: comment });
|
this.files[original].push({ id: realKey, message: message, comment: comment });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,7 +178,7 @@ class XLF {
|
||||||
this.appendNewLine('</xliff>', 0);
|
this.appendNewLine('</xliff>', 0);
|
||||||
}
|
}
|
||||||
appendNewLine(content, indent) {
|
appendNewLine(content, indent) {
|
||||||
let line = new Line(indent);
|
const line = new Line(indent);
|
||||||
line.append(content);
|
line.append(content);
|
||||||
this.buffer.push(line.toString());
|
this.buffer.push(line.toString());
|
||||||
}
|
}
|
||||||
|
@ -186,8 +186,8 @@ class XLF {
|
||||||
exports.XLF = XLF;
|
exports.XLF = XLF;
|
||||||
XLF.parsePseudo = function (xlfString) {
|
XLF.parsePseudo = function (xlfString) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
let parser = new xml2js.Parser();
|
const parser = new xml2js.Parser();
|
||||||
let files = [];
|
const files = [];
|
||||||
parser.parseString(xlfString, function (_err, result) {
|
parser.parseString(xlfString, function (_err, result) {
|
||||||
const fileNodes = result['xliff']['file'];
|
const fileNodes = result['xliff']['file'];
|
||||||
fileNodes.forEach(file => {
|
fileNodes.forEach(file => {
|
||||||
|
@ -211,8 +211,8 @@ XLF.parsePseudo = function (xlfString) {
|
||||||
};
|
};
|
||||||
XLF.parse = function (xlfString) {
|
XLF.parse = function (xlfString) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let parser = new xml2js.Parser();
|
const parser = new xml2js.Parser();
|
||||||
let files = [];
|
const files = [];
|
||||||
parser.parseString(xlfString, function (err, result) {
|
parser.parseString(xlfString, function (err, result) {
|
||||||
if (err) {
|
if (err) {
|
||||||
reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
|
reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
|
||||||
|
@ -226,7 +226,7 @@ XLF.parse = function (xlfString) {
|
||||||
if (!originalFilePath) {
|
if (!originalFilePath) {
|
||||||
reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`));
|
reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`));
|
||||||
}
|
}
|
||||||
let language = file.$['target-language'];
|
const language = file.$['target-language'];
|
||||||
if (!language) {
|
if (!language) {
|
||||||
reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`));
|
reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`));
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ function stripComments(content) {
|
||||||
// Third group matches a multi line comment
|
// Third group matches a multi line comment
|
||||||
// Forth group matches a single line comment
|
// Forth group matches a single line comment
|
||||||
const regexp = /("[^"\\]*(?:\\.[^"\\]*)*")|('[^'\\]*(?:\\.[^'\\]*)*')|(\/\*[^\/\*]*(?:(?:\*|\/)[^\/\*]*)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
|
const regexp = /("[^"\\]*(?:\\.[^"\\]*)*")|('[^'\\]*(?:\\.[^'\\]*)*')|(\/\*[^\/\*]*(?:(?:\*|\/)[^\/\*]*)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
|
||||||
let result = content.replace(regexp, (match, _m1, _m2, m3, m4) => {
|
const result = content.replace(regexp, (match, _m1, _m2, m3, m4) => {
|
||||||
// Only one of m1, m2, m3, m4 matches
|
// Only one of m1, m2, m3, m4 matches
|
||||||
if (m3) {
|
if (m3) {
|
||||||
// A block comment. Replace with nothing
|
// A block comment. Replace with nothing
|
||||||
|
@ -356,20 +356,20 @@ function escapeCharacters(value) {
|
||||||
return result.join('');
|
return result.join('');
|
||||||
}
|
}
|
||||||
function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
||||||
let keysSection = json.keys;
|
const keysSection = json.keys;
|
||||||
let messageSection = json.messages;
|
const messageSection = json.messages;
|
||||||
let bundleSection = json.bundles;
|
const bundleSection = json.bundles;
|
||||||
let statistics = Object.create(null);
|
const statistics = Object.create(null);
|
||||||
let defaultMessages = Object.create(null);
|
const defaultMessages = Object.create(null);
|
||||||
let modules = Object.keys(keysSection);
|
const modules = Object.keys(keysSection);
|
||||||
modules.forEach((module) => {
|
modules.forEach((module) => {
|
||||||
let keys = keysSection[module];
|
const keys = keysSection[module];
|
||||||
let messages = messageSection[module];
|
const messages = messageSection[module];
|
||||||
if (!messages || keys.length !== messages.length) {
|
if (!messages || keys.length !== messages.length) {
|
||||||
emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`);
|
emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let messageMap = Object.create(null);
|
const messageMap = Object.create(null);
|
||||||
defaultMessages[module] = messageMap;
|
defaultMessages[module] = messageMap;
|
||||||
keys.map((key, i) => {
|
keys.map((key, i) => {
|
||||||
if (typeof key === 'string') {
|
if (typeof key === 'string') {
|
||||||
|
@ -380,27 +380,27 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n');
|
const languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n');
|
||||||
if (!fs.existsSync(languageDirectory)) {
|
if (!fs.existsSync(languageDirectory)) {
|
||||||
log(`No VS Code localization repository found. Looking at ${languageDirectory}`);
|
log(`No VS Code localization repository found. Looking at ${languageDirectory}`);
|
||||||
log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`);
|
log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`);
|
||||||
}
|
}
|
||||||
let sortedLanguages = sortLanguages(languages);
|
const sortedLanguages = sortLanguages(languages);
|
||||||
sortedLanguages.forEach((language) => {
|
sortedLanguages.forEach((language) => {
|
||||||
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
||||||
log(`Generating nls bundles for: ${language.id}`);
|
log(`Generating nls bundles for: ${language.id}`);
|
||||||
}
|
}
|
||||||
statistics[language.id] = 0;
|
statistics[language.id] = 0;
|
||||||
let localizedModules = Object.create(null);
|
const localizedModules = Object.create(null);
|
||||||
let languageFolderName = language.translationId || language.id;
|
const languageFolderName = language.translationId || language.id;
|
||||||
let i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json');
|
const i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json');
|
||||||
let allMessages;
|
let allMessages;
|
||||||
if (fs.existsSync(i18nFile)) {
|
if (fs.existsSync(i18nFile)) {
|
||||||
let content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
const content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
||||||
allMessages = JSON.parse(content);
|
allMessages = JSON.parse(content);
|
||||||
}
|
}
|
||||||
modules.forEach((module) => {
|
modules.forEach((module) => {
|
||||||
let order = keysSection[module];
|
const order = keysSection[module];
|
||||||
let moduleMessage;
|
let moduleMessage;
|
||||||
if (allMessages) {
|
if (allMessages) {
|
||||||
moduleMessage = allMessages.contents[module];
|
moduleMessage = allMessages.contents[module];
|
||||||
|
@ -412,7 +412,7 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
||||||
moduleMessage = defaultMessages[module];
|
moduleMessage = defaultMessages[module];
|
||||||
statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length;
|
statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length;
|
||||||
}
|
}
|
||||||
let localizedMessages = [];
|
const localizedMessages = [];
|
||||||
order.forEach((keyInfo) => {
|
order.forEach((keyInfo) => {
|
||||||
let key = null;
|
let key = null;
|
||||||
if (typeof keyInfo === 'string') {
|
if (typeof keyInfo === 'string') {
|
||||||
|
@ -434,14 +434,14 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
||||||
localizedModules[module] = localizedMessages;
|
localizedModules[module] = localizedMessages;
|
||||||
});
|
});
|
||||||
Object.keys(bundleSection).forEach((bundle) => {
|
Object.keys(bundleSection).forEach((bundle) => {
|
||||||
let modules = bundleSection[bundle];
|
const modules = bundleSection[bundle];
|
||||||
let contents = [
|
const contents = [
|
||||||
fileHeader,
|
fileHeader,
|
||||||
`define("${bundle}.nls.${language.id}", {`
|
`define("${bundle}.nls.${language.id}", {`
|
||||||
];
|
];
|
||||||
modules.forEach((module, index) => {
|
modules.forEach((module, index) => {
|
||||||
contents.push(`\t"${module}": [`);
|
contents.push(`\t"${module}": [`);
|
||||||
let messages = localizedModules[module];
|
const messages = localizedModules[module];
|
||||||
if (!messages) {
|
if (!messages) {
|
||||||
emitter.emit('error', `Didn't find messages for module ${module}.`);
|
emitter.emit('error', `Didn't find messages for module ${module}.`);
|
||||||
return;
|
return;
|
||||||
|
@ -456,11 +456,11 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
Object.keys(statistics).forEach(key => {
|
Object.keys(statistics).forEach(key => {
|
||||||
let value = statistics[key];
|
const value = statistics[key];
|
||||||
log(`${key} has ${value} untranslated strings.`);
|
log(`${key} has ${value} untranslated strings.`);
|
||||||
});
|
});
|
||||||
sortedLanguages.forEach(language => {
|
sortedLanguages.forEach(language => {
|
||||||
let stats = statistics[language.id];
|
const stats = statistics[language.id];
|
||||||
if (Is.undef(stats)) {
|
if (Is.undef(stats)) {
|
||||||
log(`\tNo translations found for language ${language.id}. Using default language instead.`);
|
log(`\tNo translations found for language ${language.id}. Using default language instead.`);
|
||||||
}
|
}
|
||||||
|
@ -468,7 +468,7 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
|
||||||
}
|
}
|
||||||
function processNlsFiles(opts) {
|
function processNlsFiles(opts) {
|
||||||
return (0, event_stream_1.through)(function (file) {
|
return (0, event_stream_1.through)(function (file) {
|
||||||
let fileName = path.basename(file.path);
|
const fileName = path.basename(file.path);
|
||||||
if (fileName === 'nls.metadata.json') {
|
if (fileName === 'nls.metadata.json') {
|
||||||
let json = null;
|
let json = null;
|
||||||
if (file.isBuffer()) {
|
if (file.isBuffer()) {
|
||||||
|
@ -525,7 +525,7 @@ function createXlfFilesForCoreBundle() {
|
||||||
if (file.isBuffer()) {
|
if (file.isBuffer()) {
|
||||||
const xlfs = Object.create(null);
|
const xlfs = Object.create(null);
|
||||||
const json = JSON.parse(file.contents.toString('utf8'));
|
const json = JSON.parse(file.contents.toString('utf8'));
|
||||||
for (let coreModule in json.keys) {
|
for (const coreModule in json.keys) {
|
||||||
const projectResource = getResource(coreModule);
|
const projectResource = getResource(coreModule);
|
||||||
const resource = projectResource.name;
|
const resource = projectResource.name;
|
||||||
const project = projectResource.project;
|
const project = projectResource.project;
|
||||||
|
@ -544,7 +544,7 @@ function createXlfFilesForCoreBundle() {
|
||||||
xlf.addFile(`src/${coreModule}`, keys, messages);
|
xlf.addFile(`src/${coreModule}`, keys, messages);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (let resource in xlfs) {
|
for (const resource in xlfs) {
|
||||||
const xlf = xlfs[resource];
|
const xlf = xlfs[resource];
|
||||||
const filePath = `${xlf.project}/${resource.replace(/\//g, '_')}.xlf`;
|
const filePath = `${xlf.project}/${resource.replace(/\//g, '_')}.xlf`;
|
||||||
const xlfFile = new File({
|
const xlfFile = new File({
|
||||||
|
@ -576,7 +576,7 @@ function createXlfFilesForExtensions() {
|
||||||
if (!stat.isDirectory()) {
|
if (!stat.isDirectory()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let extensionName = path.basename(extensionFolder.path);
|
const extensionName = path.basename(extensionFolder.path);
|
||||||
if (extensionName === 'node_modules') {
|
if (extensionName === 'node_modules') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -612,7 +612,7 @@ function createXlfFilesForExtensions() {
|
||||||
else if (basename === 'nls.metadata.json') {
|
else if (basename === 'nls.metadata.json') {
|
||||||
const json = JSON.parse(buffer.toString('utf8'));
|
const json = JSON.parse(buffer.toString('utf8'));
|
||||||
const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path));
|
const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path));
|
||||||
for (let file in json) {
|
for (const file in json) {
|
||||||
const fileContent = json[file];
|
const fileContent = json[file];
|
||||||
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
getXlf().addFile(`extensions/${extensionName}/${relPath}/${file}`, fileContent.keys, fileContent.messages);
|
||||||
}
|
}
|
||||||
|
@ -624,7 +624,7 @@ function createXlfFilesForExtensions() {
|
||||||
}
|
}
|
||||||
}, function () {
|
}, function () {
|
||||||
if (_xlf) {
|
if (_xlf) {
|
||||||
let xlfFile = new File({
|
const xlfFile = new File({
|
||||||
path: path.join(extensionsProject, extensionName + '.xlf'),
|
path: path.join(extensionsProject, extensionName + '.xlf'),
|
||||||
contents: Buffer.from(_xlf.toString(), 'utf8')
|
contents: Buffer.from(_xlf.toString(), 'utf8')
|
||||||
});
|
});
|
||||||
|
@ -656,14 +656,14 @@ function createXlfFilesForIsl() {
|
||||||
else {
|
else {
|
||||||
throw new Error(`Unknown input file ${file.path}`);
|
throw new Error(`Unknown input file ${file.path}`);
|
||||||
}
|
}
|
||||||
let xlf = new XLF(projectName), keys = [], messages = [];
|
const xlf = new XLF(projectName), keys = [], messages = [];
|
||||||
let model = new TextModel(file.contents.toString());
|
const model = new TextModel(file.contents.toString());
|
||||||
let inMessageSection = false;
|
let inMessageSection = false;
|
||||||
model.lines.forEach(line => {
|
model.lines.forEach(line => {
|
||||||
if (line.length === 0) {
|
if (line.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let firstChar = line.charAt(0);
|
const firstChar = line.charAt(0);
|
||||||
switch (firstChar) {
|
switch (firstChar) {
|
||||||
case ';':
|
case ';':
|
||||||
// Comment line;
|
// Comment line;
|
||||||
|
@ -675,13 +675,13 @@ function createXlfFilesForIsl() {
|
||||||
if (!inMessageSection) {
|
if (!inMessageSection) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let sections = line.split('=');
|
const sections = line.split('=');
|
||||||
if (sections.length !== 2) {
|
if (sections.length !== 2) {
|
||||||
throw new Error(`Badly formatted message found: ${line}`);
|
throw new Error(`Badly formatted message found: ${line}`);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let key = sections[0];
|
const key = sections[0];
|
||||||
let value = sections[1];
|
const value = sections[1];
|
||||||
if (key.length > 0 && value.length > 0) {
|
if (key.length > 0 && value.length > 0) {
|
||||||
keys.push(key);
|
keys.push(key);
|
||||||
messages.push(value);
|
messages.push(value);
|
||||||
|
@ -698,8 +698,8 @@ function createXlfFilesForIsl() {
|
||||||
}
|
}
|
||||||
exports.createXlfFilesForIsl = createXlfFilesForIsl;
|
exports.createXlfFilesForIsl = createXlfFilesForIsl;
|
||||||
function pushXlfFiles(apiHostname, username, password) {
|
function pushXlfFiles(apiHostname, username, password) {
|
||||||
let tryGetPromises = [];
|
const tryGetPromises = [];
|
||||||
let updateCreatePromises = [];
|
const updateCreatePromises = [];
|
||||||
return (0, event_stream_1.through)(function (file) {
|
return (0, event_stream_1.through)(function (file) {
|
||||||
const project = path.dirname(file.relative);
|
const project = path.dirname(file.relative);
|
||||||
const fileName = path.basename(file.path);
|
const fileName = path.basename(file.path);
|
||||||
|
@ -737,11 +737,11 @@ function getAllResources(project, apiHostname, username, password) {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
};
|
};
|
||||||
const request = https.request(options, (res) => {
|
const request = https.request(options, (res) => {
|
||||||
let buffer = [];
|
const buffer = [];
|
||||||
res.on('data', (chunk) => buffer.push(chunk));
|
res.on('data', (chunk) => buffer.push(chunk));
|
||||||
res.on('end', () => {
|
res.on('end', () => {
|
||||||
if (res.statusCode === 200) {
|
if (res.statusCode === 200) {
|
||||||
let json = JSON.parse(Buffer.concat(buffer).toString());
|
const json = JSON.parse(Buffer.concat(buffer).toString());
|
||||||
if (Array.isArray(json)) {
|
if (Array.isArray(json)) {
|
||||||
resolve(json.map(o => o.slug));
|
resolve(json.map(o => o.slug));
|
||||||
return;
|
return;
|
||||||
|
@ -760,7 +760,7 @@ function getAllResources(project, apiHostname, username, password) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function findObsoleteResources(apiHostname, username, password) {
|
function findObsoleteResources(apiHostname, username, password) {
|
||||||
let resourcesByProject = Object.create(null);
|
const resourcesByProject = Object.create(null);
|
||||||
resourcesByProject[extensionsProject] = [].concat(exports.externalExtensionsWithTranslations); // clone
|
resourcesByProject[extensionsProject] = [].concat(exports.externalExtensionsWithTranslations); // clone
|
||||||
return (0, event_stream_1.through)(function (file) {
|
return (0, event_stream_1.through)(function (file) {
|
||||||
const project = path.dirname(file.relative);
|
const project = path.dirname(file.relative);
|
||||||
|
@ -774,10 +774,10 @@ function findObsoleteResources(apiHostname, username, password) {
|
||||||
this.push(file);
|
this.push(file);
|
||||||
}, function () {
|
}, function () {
|
||||||
const json = JSON.parse(fs.readFileSync('./build/lib/i18n.resources.json', 'utf8'));
|
const json = JSON.parse(fs.readFileSync('./build/lib/i18n.resources.json', 'utf8'));
|
||||||
let i18Resources = [...json.editor, ...json.workbench].map((r) => r.project + '/' + r.name.replace(/\//g, '_'));
|
const i18Resources = [...json.editor, ...json.workbench].map((r) => r.project + '/' + r.name.replace(/\//g, '_'));
|
||||||
let extractedResources = [];
|
const extractedResources = [];
|
||||||
for (let project of [workbenchProject, editorProject]) {
|
for (const project of [workbenchProject, editorProject]) {
|
||||||
for (let resource of resourcesByProject[project]) {
|
for (const resource of resourcesByProject[project]) {
|
||||||
if (resource !== 'setup_messages') {
|
if (resource !== 'setup_messages') {
|
||||||
extractedResources.push(project + '/' + resource);
|
extractedResources.push(project + '/' + resource);
|
||||||
}
|
}
|
||||||
|
@ -787,11 +787,11 @@ function findObsoleteResources(apiHostname, username, password) {
|
||||||
console.log(`[i18n] Obsolete resources in file 'build/lib/i18n.resources.json': JSON.stringify(${i18Resources.filter(p => extractedResources.indexOf(p) === -1)})`);
|
console.log(`[i18n] Obsolete resources in file 'build/lib/i18n.resources.json': JSON.stringify(${i18Resources.filter(p => extractedResources.indexOf(p) === -1)})`);
|
||||||
console.log(`[i18n] Missing resources in file 'build/lib/i18n.resources.json': JSON.stringify(${extractedResources.filter(p => i18Resources.indexOf(p) === -1)})`);
|
console.log(`[i18n] Missing resources in file 'build/lib/i18n.resources.json': JSON.stringify(${extractedResources.filter(p => i18Resources.indexOf(p) === -1)})`);
|
||||||
}
|
}
|
||||||
let promises = [];
|
const promises = [];
|
||||||
for (let project in resourcesByProject) {
|
for (const project in resourcesByProject) {
|
||||||
promises.push(getAllResources(project, apiHostname, username, password).then(resources => {
|
promises.push(getAllResources(project, apiHostname, username, password).then(resources => {
|
||||||
let expectedResources = resourcesByProject[project];
|
const expectedResources = resourcesByProject[project];
|
||||||
let unusedResources = resources.filter(resource => resource && expectedResources.indexOf(resource) === -1);
|
const unusedResources = resources.filter(resource => resource && expectedResources.indexOf(resource) === -1);
|
||||||
if (unusedResources.length) {
|
if (unusedResources.length) {
|
||||||
console.log(`[transifex] Obsolete resources in project '${project}': ${unusedResources.join(', ')}`);
|
console.log(`[transifex] Obsolete resources in project '${project}': ${unusedResources.join(', ')}`);
|
||||||
}
|
}
|
||||||
|
@ -846,7 +846,7 @@ function createResource(project, slug, xlfFile, apiHostname, credentials) {
|
||||||
auth: credentials,
|
auth: credentials,
|
||||||
method: 'POST'
|
method: 'POST'
|
||||||
};
|
};
|
||||||
let request = https.request(options, (res) => {
|
const request = https.request(options, (res) => {
|
||||||
if (res.statusCode === 201) {
|
if (res.statusCode === 201) {
|
||||||
log(`Resource ${project}/${slug} successfully created on Transifex.`);
|
log(`Resource ${project}/${slug} successfully created on Transifex.`);
|
||||||
}
|
}
|
||||||
|
@ -878,7 +878,7 @@ function updateResource(project, slug, xlfFile, apiHostname, credentials) {
|
||||||
auth: credentials,
|
auth: credentials,
|
||||||
method: 'PUT'
|
method: 'PUT'
|
||||||
};
|
};
|
||||||
let request = https.request(options, (res) => {
|
const request = https.request(options, (res) => {
|
||||||
if (res.statusCode === 200) {
|
if (res.statusCode === 200) {
|
||||||
res.setEncoding('utf8');
|
res.setEncoding('utf8');
|
||||||
let responseBuffer = '';
|
let responseBuffer = '';
|
||||||
|
@ -903,7 +903,7 @@ function updateResource(project, slug, xlfFile, apiHostname, credentials) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function pullSetupXlfFiles(apiHostname, username, password, language, includeDefault) {
|
function pullSetupXlfFiles(apiHostname, username, password, language, includeDefault) {
|
||||||
let setupResources = [{ name: 'setup_messages', project: workbenchProject }];
|
const setupResources = [{ name: 'setup_messages', project: workbenchProject }];
|
||||||
if (includeDefault) {
|
if (includeDefault) {
|
||||||
setupResources.push({ name: 'setup_default', project: setupProject });
|
setupResources.push({ name: 'setup_default', project: setupProject });
|
||||||
}
|
}
|
||||||
|
@ -912,7 +912,7 @@ function pullSetupXlfFiles(apiHostname, username, password, language, includeDef
|
||||||
exports.pullSetupXlfFiles = pullSetupXlfFiles;
|
exports.pullSetupXlfFiles = pullSetupXlfFiles;
|
||||||
function pullXlfFiles(apiHostname, username, password, language, resources) {
|
function pullXlfFiles(apiHostname, username, password, language, resources) {
|
||||||
const credentials = `${username}:${password}`;
|
const credentials = `${username}:${password}`;
|
||||||
let expectedTranslationsCount = resources.length;
|
const expectedTranslationsCount = resources.length;
|
||||||
let translationsRetrieved = 0, called = false;
|
let translationsRetrieved = 0, called = false;
|
||||||
return (0, event_stream_1.readable)(function (_count, callback) {
|
return (0, event_stream_1.readable)(function (_count, callback) {
|
||||||
// Mark end of stream when all resources were retrieved
|
// Mark end of stream when all resources were retrieved
|
||||||
|
@ -939,7 +939,7 @@ function retrieveResource(language, resource, apiHostname, credentials) {
|
||||||
return limiter.queue(() => new Promise((resolve, reject) => {
|
return limiter.queue(() => new Promise((resolve, reject) => {
|
||||||
const slug = resource.name.replace(/\//g, '_');
|
const slug = resource.name.replace(/\//g, '_');
|
||||||
const project = resource.project;
|
const project = resource.project;
|
||||||
let transifexLanguageId = language.id === 'ps' ? 'en' : language.translationId || language.id;
|
const transifexLanguageId = language.id === 'ps' ? 'en' : language.translationId || language.id;
|
||||||
const options = {
|
const options = {
|
||||||
hostname: apiHostname,
|
hostname: apiHostname,
|
||||||
path: `/api/2/project/${project}/resource/${slug}/translation/${transifexLanguageId}?file&mode=onlyreviewed`,
|
path: `/api/2/project/${project}/resource/${slug}/translation/${transifexLanguageId}?file&mode=onlyreviewed`,
|
||||||
|
@ -948,8 +948,8 @@ function retrieveResource(language, resource, apiHostname, credentials) {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
};
|
};
|
||||||
console.log('[transifex] Fetching ' + options.path);
|
console.log('[transifex] Fetching ' + options.path);
|
||||||
let request = https.request(options, (res) => {
|
const request = https.request(options, (res) => {
|
||||||
let xlfBuffer = [];
|
const xlfBuffer = [];
|
||||||
res.on('data', (chunk) => xlfBuffer.push(chunk));
|
res.on('data', (chunk) => xlfBuffer.push(chunk));
|
||||||
res.on('end', () => {
|
res.on('end', () => {
|
||||||
if (res.statusCode === 200) {
|
if (res.statusCode === 200) {
|
||||||
|
@ -971,14 +971,14 @@ function retrieveResource(language, resource, apiHostname, credentials) {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
function prepareI18nFiles() {
|
function prepareI18nFiles() {
|
||||||
let parsePromises = [];
|
const parsePromises = [];
|
||||||
return (0, event_stream_1.through)(function (xlf) {
|
return (0, event_stream_1.through)(function (xlf) {
|
||||||
let stream = this;
|
const stream = this;
|
||||||
let parsePromise = XLF.parse(xlf.contents.toString());
|
const parsePromise = XLF.parse(xlf.contents.toString());
|
||||||
parsePromises.push(parsePromise);
|
parsePromises.push(parsePromise);
|
||||||
parsePromise.then(resolvedFiles => {
|
parsePromise.then(resolvedFiles => {
|
||||||
resolvedFiles.forEach(file => {
|
resolvedFiles.forEach(file => {
|
||||||
let translatedFile = createI18nFile(file.originalFilePath, file.messages);
|
const translatedFile = createI18nFile(file.originalFilePath, file.messages);
|
||||||
stream.queue(translatedFile);
|
stream.queue(translatedFile);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -990,7 +990,7 @@ function prepareI18nFiles() {
|
||||||
}
|
}
|
||||||
exports.prepareI18nFiles = prepareI18nFiles;
|
exports.prepareI18nFiles = prepareI18nFiles;
|
||||||
function createI18nFile(originalFilePath, messages) {
|
function createI18nFile(originalFilePath, messages) {
|
||||||
let result = Object.create(null);
|
const result = Object.create(null);
|
||||||
result[''] = [
|
result[''] = [
|
||||||
'--------------------------------------------------------------------------------------------',
|
'--------------------------------------------------------------------------------------------',
|
||||||
'Copyright (c) Microsoft Corporation. All rights reserved.',
|
'Copyright (c) Microsoft Corporation. All rights reserved.',
|
||||||
|
@ -998,7 +998,7 @@ function createI18nFile(originalFilePath, messages) {
|
||||||
'--------------------------------------------------------------------------------------------',
|
'--------------------------------------------------------------------------------------------',
|
||||||
'Do not edit this file. It is machine generated.'
|
'Do not edit this file. It is machine generated.'
|
||||||
];
|
];
|
||||||
for (let key of Object.keys(messages)) {
|
for (const key of Object.keys(messages)) {
|
||||||
result[key] = messages[key];
|
result[key] = messages[key];
|
||||||
}
|
}
|
||||||
let content = JSON.stringify(result, null, '\t');
|
let content = JSON.stringify(result, null, '\t');
|
||||||
|
@ -1012,16 +1012,16 @@ function createI18nFile(originalFilePath, messages) {
|
||||||
}
|
}
|
||||||
const i18nPackVersion = '1.0.0';
|
const i18nPackVersion = '1.0.0';
|
||||||
function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pseudo = false) {
|
function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pseudo = false) {
|
||||||
let parsePromises = [];
|
const parsePromises = [];
|
||||||
let mainPack = { version: i18nPackVersion, contents: {} };
|
const mainPack = { version: i18nPackVersion, contents: {} };
|
||||||
let extensionsPacks = {};
|
const extensionsPacks = {};
|
||||||
let errors = [];
|
const errors = [];
|
||||||
return (0, event_stream_1.through)(function (xlf) {
|
return (0, event_stream_1.through)(function (xlf) {
|
||||||
let project = path.basename(path.dirname(path.dirname(xlf.relative)));
|
const project = path.basename(path.dirname(path.dirname(xlf.relative)));
|
||||||
let resource = path.basename(xlf.relative, '.xlf');
|
const resource = path.basename(xlf.relative, '.xlf');
|
||||||
let contents = xlf.contents.toString();
|
const contents = xlf.contents.toString();
|
||||||
log(`Found ${project}: ${resource}`);
|
log(`Found ${project}: ${resource}`);
|
||||||
let parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
|
const parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
|
||||||
parsePromises.push(parsePromise);
|
parsePromises.push(parsePromise);
|
||||||
parsePromise.then(resolvedFiles => {
|
parsePromise.then(resolvedFiles => {
|
||||||
resolvedFiles.forEach(file => {
|
resolvedFiles.forEach(file => {
|
||||||
|
@ -1057,7 +1057,7 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse
|
||||||
const translatedMainFile = createI18nFile('./main', mainPack);
|
const translatedMainFile = createI18nFile('./main', mainPack);
|
||||||
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
||||||
this.queue(translatedMainFile);
|
this.queue(translatedMainFile);
|
||||||
for (let extension in extensionsPacks) {
|
for (const extension in extensionsPacks) {
|
||||||
const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]);
|
const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]);
|
||||||
this.queue(translatedExtFile);
|
this.queue(translatedExtFile);
|
||||||
const externalExtensionId = externalExtensions[extension];
|
const externalExtensionId = externalExtensions[extension];
|
||||||
|
@ -1077,14 +1077,14 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse
|
||||||
}
|
}
|
||||||
exports.prepareI18nPackFiles = prepareI18nPackFiles;
|
exports.prepareI18nPackFiles = prepareI18nPackFiles;
|
||||||
function prepareIslFiles(language, innoSetupConfig) {
|
function prepareIslFiles(language, innoSetupConfig) {
|
||||||
let parsePromises = [];
|
const parsePromises = [];
|
||||||
return (0, event_stream_1.through)(function (xlf) {
|
return (0, event_stream_1.through)(function (xlf) {
|
||||||
let stream = this;
|
const stream = this;
|
||||||
let parsePromise = XLF.parse(xlf.contents.toString());
|
const parsePromise = XLF.parse(xlf.contents.toString());
|
||||||
parsePromises.push(parsePromise);
|
parsePromises.push(parsePromise);
|
||||||
parsePromise.then(resolvedFiles => {
|
parsePromise.then(resolvedFiles => {
|
||||||
resolvedFiles.forEach(file => {
|
resolvedFiles.forEach(file => {
|
||||||
let translatedFile = createIslFile(file.originalFilePath, file.messages, language, innoSetupConfig);
|
const translatedFile = createIslFile(file.originalFilePath, file.messages, language, innoSetupConfig);
|
||||||
stream.queue(translatedFile);
|
stream.queue(translatedFile);
|
||||||
});
|
});
|
||||||
}).catch(reason => {
|
}).catch(reason => {
|
||||||
|
@ -1100,7 +1100,7 @@ function prepareIslFiles(language, innoSetupConfig) {
|
||||||
}
|
}
|
||||||
exports.prepareIslFiles = prepareIslFiles;
|
exports.prepareIslFiles = prepareIslFiles;
|
||||||
function createIslFile(originalFilePath, messages, language, innoSetup) {
|
function createIslFile(originalFilePath, messages, language, innoSetup) {
|
||||||
let content = [];
|
const content = [];
|
||||||
let originalContent;
|
let originalContent;
|
||||||
if (path.basename(originalFilePath) === 'Default') {
|
if (path.basename(originalFilePath) === 'Default') {
|
||||||
originalContent = new TextModel(fs.readFileSync(originalFilePath + '.isl', 'utf8'));
|
originalContent = new TextModel(fs.readFileSync(originalFilePath + '.isl', 'utf8'));
|
||||||
|
@ -1110,16 +1110,16 @@ function createIslFile(originalFilePath, messages, language, innoSetup) {
|
||||||
}
|
}
|
||||||
originalContent.lines.forEach(line => {
|
originalContent.lines.forEach(line => {
|
||||||
if (line.length > 0) {
|
if (line.length > 0) {
|
||||||
let firstChar = line.charAt(0);
|
const firstChar = line.charAt(0);
|
||||||
if (firstChar === '[' || firstChar === ';') {
|
if (firstChar === '[' || firstChar === ';') {
|
||||||
content.push(line);
|
content.push(line);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let sections = line.split('=');
|
const sections = line.split('=');
|
||||||
let key = sections[0];
|
const key = sections[0];
|
||||||
let translated = line;
|
let translated = line;
|
||||||
if (key) {
|
if (key) {
|
||||||
let translatedMessage = messages[key];
|
const translatedMessage = messages[key];
|
||||||
if (translatedMessage) {
|
if (translatedMessage) {
|
||||||
translated = `${key}=${translatedMessage}`;
|
translated = `${key}=${translatedMessage}`;
|
||||||
}
|
}
|
||||||
|
@ -1137,9 +1137,9 @@ function createIslFile(originalFilePath, messages, language, innoSetup) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function encodeEntities(value) {
|
function encodeEntities(value) {
|
||||||
let result = [];
|
const result = [];
|
||||||
for (let i = 0; i < value.length; i++) {
|
for (let i = 0; i < value.length; i++) {
|
||||||
let ch = value[i];
|
const ch = value[i];
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case '<':
|
case '<':
|
||||||
result.push('<');
|
result.push('<');
|
||||||
|
|
|
@ -27,7 +27,7 @@ function isDeclaration(ts, a) {
|
||||||
}
|
}
|
||||||
function visitTopLevelDeclarations(ts, sourceFile, visitor) {
|
function visitTopLevelDeclarations(ts, sourceFile, visitor) {
|
||||||
let stop = false;
|
let stop = false;
|
||||||
let visit = (node) => {
|
const visit = (node) => {
|
||||||
if (stop) {
|
if (stop) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -49,19 +49,19 @@ function visitTopLevelDeclarations(ts, sourceFile, visitor) {
|
||||||
visit(sourceFile);
|
visit(sourceFile);
|
||||||
}
|
}
|
||||||
function getAllTopLevelDeclarations(ts, sourceFile) {
|
function getAllTopLevelDeclarations(ts, sourceFile) {
|
||||||
let all = [];
|
const all = [];
|
||||||
visitTopLevelDeclarations(ts, sourceFile, (node) => {
|
visitTopLevelDeclarations(ts, sourceFile, (node) => {
|
||||||
if (node.kind === ts.SyntaxKind.InterfaceDeclaration || node.kind === ts.SyntaxKind.ClassDeclaration || node.kind === ts.SyntaxKind.ModuleDeclaration) {
|
if (node.kind === ts.SyntaxKind.InterfaceDeclaration || node.kind === ts.SyntaxKind.ClassDeclaration || node.kind === ts.SyntaxKind.ModuleDeclaration) {
|
||||||
let interfaceDeclaration = node;
|
const interfaceDeclaration = node;
|
||||||
let triviaStart = interfaceDeclaration.pos;
|
const triviaStart = interfaceDeclaration.pos;
|
||||||
let triviaEnd = interfaceDeclaration.name.pos;
|
const triviaEnd = interfaceDeclaration.name.pos;
|
||||||
let triviaText = getNodeText(sourceFile, { pos: triviaStart, end: triviaEnd });
|
const triviaText = getNodeText(sourceFile, { pos: triviaStart, end: triviaEnd });
|
||||||
if (triviaText.indexOf('@internal') === -1) {
|
if (triviaText.indexOf('@internal') === -1) {
|
||||||
all.push(node);
|
all.push(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let nodeText = getNodeText(sourceFile, node);
|
const nodeText = getNodeText(sourceFile, node);
|
||||||
if (nodeText.indexOf('@internal') === -1) {
|
if (nodeText.indexOf('@internal') === -1) {
|
||||||
all.push(node);
|
all.push(node);
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ function getNodeText(sourceFile, node) {
|
||||||
function hasModifier(modifiers, kind) {
|
function hasModifier(modifiers, kind) {
|
||||||
if (modifiers) {
|
if (modifiers) {
|
||||||
for (let i = 0; i < modifiers.length; i++) {
|
for (let i = 0; i < modifiers.length; i++) {
|
||||||
let mod = modifiers[i];
|
const mod = modifiers[i];
|
||||||
if (mod.kind === kind) {
|
if (mod.kind === kind) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -113,14 +113,14 @@ function isDefaultExport(ts, declaration) {
|
||||||
function getMassagedTopLevelDeclarationText(ts, sourceFile, declaration, importName, usage, enums) {
|
function getMassagedTopLevelDeclarationText(ts, sourceFile, declaration, importName, usage, enums) {
|
||||||
let result = getNodeText(sourceFile, declaration);
|
let result = getNodeText(sourceFile, declaration);
|
||||||
if (declaration.kind === ts.SyntaxKind.InterfaceDeclaration || declaration.kind === ts.SyntaxKind.ClassDeclaration) {
|
if (declaration.kind === ts.SyntaxKind.InterfaceDeclaration || declaration.kind === ts.SyntaxKind.ClassDeclaration) {
|
||||||
let interfaceDeclaration = declaration;
|
const interfaceDeclaration = declaration;
|
||||||
const staticTypeName = (isDefaultExport(ts, interfaceDeclaration)
|
const staticTypeName = (isDefaultExport(ts, interfaceDeclaration)
|
||||||
? `${importName}.default`
|
? `${importName}.default`
|
||||||
: `${importName}.${declaration.name.text}`);
|
: `${importName}.${declaration.name.text}`);
|
||||||
let instanceTypeName = staticTypeName;
|
let instanceTypeName = staticTypeName;
|
||||||
const typeParametersCnt = (interfaceDeclaration.typeParameters ? interfaceDeclaration.typeParameters.length : 0);
|
const typeParametersCnt = (interfaceDeclaration.typeParameters ? interfaceDeclaration.typeParameters.length : 0);
|
||||||
if (typeParametersCnt > 0) {
|
if (typeParametersCnt > 0) {
|
||||||
let arr = [];
|
const arr = [];
|
||||||
for (let i = 0; i < typeParametersCnt; i++) {
|
for (let i = 0; i < typeParametersCnt; i++) {
|
||||||
arr.push('any');
|
arr.push('any');
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ function getMassagedTopLevelDeclarationText(ts, sourceFile, declaration, importN
|
||||||
const members = interfaceDeclaration.members;
|
const members = interfaceDeclaration.members;
|
||||||
members.forEach((member) => {
|
members.forEach((member) => {
|
||||||
try {
|
try {
|
||||||
let memberText = getNodeText(sourceFile, member);
|
const memberText = getNodeText(sourceFile, member);
|
||||||
if (memberText.indexOf('@internal') >= 0 || memberText.indexOf('private') >= 0) {
|
if (memberText.indexOf('@internal') >= 0 || memberText.indexOf('private') >= 0) {
|
||||||
result = result.replace(memberText, '');
|
result = result.replace(memberText, '');
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,7 @@ function getMassagedTopLevelDeclarationText(ts, sourceFile, declaration, importN
|
||||||
result = result.replace(/export default /g, 'export ');
|
result = result.replace(/export default /g, 'export ');
|
||||||
result = result.replace(/export declare /g, 'export ');
|
result = result.replace(/export declare /g, 'export ');
|
||||||
result = result.replace(/declare /g, '');
|
result = result.replace(/declare /g, '');
|
||||||
let lines = result.split(/\r\n|\r|\n/);
|
const lines = result.split(/\r\n|\r|\n/);
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
if (/\s*\*/.test(lines[i])) {
|
if (/\s*\*/.test(lines[i])) {
|
||||||
// very likely a comment
|
// very likely a comment
|
||||||
|
@ -177,9 +177,9 @@ function format(ts, text, endl) {
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
// Parse the source text
|
// Parse the source text
|
||||||
let sourceFile = ts.createSourceFile('file.ts', text, ts.ScriptTarget.Latest, /*setParentPointers*/ true);
|
const sourceFile = ts.createSourceFile('file.ts', text, ts.ScriptTarget.Latest, /*setParentPointers*/ true);
|
||||||
// Get the formatting edits on the input sources
|
// Get the formatting edits on the input sources
|
||||||
let edits = ts.formatting.formatDocument(sourceFile, getRuleProvider(tsfmt), tsfmt);
|
const edits = ts.formatting.formatDocument(sourceFile, getRuleProvider(tsfmt), tsfmt);
|
||||||
// Apply the edits on the input code
|
// Apply the edits on the input code
|
||||||
return applyEdits(text, edits);
|
return applyEdits(text, edits);
|
||||||
function countParensCurly(text) {
|
function countParensCurly(text) {
|
||||||
|
@ -202,7 +202,7 @@ function format(ts, text, endl) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
function preformat(text, endl) {
|
function preformat(text, endl) {
|
||||||
let lines = text.split(endl);
|
const lines = text.split(endl);
|
||||||
let inComment = false;
|
let inComment = false;
|
||||||
let inCommentDeltaIndent = 0;
|
let inCommentDeltaIndent = 0;
|
||||||
let indent = 0;
|
let indent = 0;
|
||||||
|
@ -282,9 +282,9 @@ function format(ts, text, endl) {
|
||||||
// Apply edits in reverse on the existing text
|
// Apply edits in reverse on the existing text
|
||||||
let result = text;
|
let result = text;
|
||||||
for (let i = edits.length - 1; i >= 0; i--) {
|
for (let i = edits.length - 1; i >= 0; i--) {
|
||||||
let change = edits[i];
|
const change = edits[i];
|
||||||
let head = result.slice(0, change.span.start);
|
const head = result.slice(0, change.span.start);
|
||||||
let tail = result.slice(change.span.start + change.span.length);
|
const tail = result.slice(change.span.start + change.span.length);
|
||||||
result = head + change.newText + tail;
|
result = head + change.newText + tail;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -300,15 +300,15 @@ function createReplacerFromDirectives(directives) {
|
||||||
}
|
}
|
||||||
function createReplacer(data) {
|
function createReplacer(data) {
|
||||||
data = data || '';
|
data = data || '';
|
||||||
let rawDirectives = data.split(';');
|
const rawDirectives = data.split(';');
|
||||||
let directives = [];
|
const directives = [];
|
||||||
rawDirectives.forEach((rawDirective) => {
|
rawDirectives.forEach((rawDirective) => {
|
||||||
if (rawDirective.length === 0) {
|
if (rawDirective.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let pieces = rawDirective.split('=>');
|
const pieces = rawDirective.split('=>');
|
||||||
let findStr = pieces[0];
|
let findStr = pieces[0];
|
||||||
let replaceStr = pieces[1];
|
const replaceStr = pieces[1];
|
||||||
findStr = findStr.replace(/[\-\\\{\}\*\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&');
|
findStr = findStr.replace(/[\-\\\{\}\*\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&');
|
||||||
findStr = '\\b' + findStr + '\\b';
|
findStr = '\\b' + findStr + '\\b';
|
||||||
directives.push([new RegExp(findStr, 'g'), replaceStr]);
|
directives.push([new RegExp(findStr, 'g'), replaceStr]);
|
||||||
|
@ -317,32 +317,32 @@ function createReplacer(data) {
|
||||||
}
|
}
|
||||||
function generateDeclarationFile(ts, recipe, sourceFileGetter) {
|
function generateDeclarationFile(ts, recipe, sourceFileGetter) {
|
||||||
const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
|
const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
|
||||||
let lines = recipe.split(endl);
|
const lines = recipe.split(endl);
|
||||||
let result = [];
|
const result = [];
|
||||||
let usageCounter = 0;
|
let usageCounter = 0;
|
||||||
let usageImports = [];
|
const usageImports = [];
|
||||||
let usage = [];
|
const usage = [];
|
||||||
let failed = false;
|
let failed = false;
|
||||||
usage.push(`var a: any;`);
|
usage.push(`var a: any;`);
|
||||||
usage.push(`var b: any;`);
|
usage.push(`var b: any;`);
|
||||||
const generateUsageImport = (moduleId) => {
|
const generateUsageImport = (moduleId) => {
|
||||||
let importName = 'm' + (++usageCounter);
|
const importName = 'm' + (++usageCounter);
|
||||||
usageImports.push(`import * as ${importName} from './${moduleId.replace(/\.d\.ts$/, '')}';`);
|
usageImports.push(`import * as ${importName} from './${moduleId.replace(/\.d\.ts$/, '')}';`);
|
||||||
return importName;
|
return importName;
|
||||||
};
|
};
|
||||||
let enums = [];
|
const enums = [];
|
||||||
let version = null;
|
let version = null;
|
||||||
lines.forEach(line => {
|
lines.forEach(line => {
|
||||||
if (failed) {
|
if (failed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let m0 = line.match(/^\/\/dtsv=(\d+)$/);
|
const m0 = line.match(/^\/\/dtsv=(\d+)$/);
|
||||||
if (m0) {
|
if (m0) {
|
||||||
version = m0[1];
|
version = m0[1];
|
||||||
}
|
}
|
||||||
let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
|
const m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
|
||||||
if (m1) {
|
if (m1) {
|
||||||
let moduleId = m1[1];
|
const moduleId = m1[1];
|
||||||
const sourceFile = sourceFileGetter(moduleId);
|
const sourceFile = sourceFileGetter(moduleId);
|
||||||
if (!sourceFile) {
|
if (!sourceFile) {
|
||||||
logErr(`While handling ${line}`);
|
logErr(`While handling ${line}`);
|
||||||
|
@ -351,14 +351,14 @@ function generateDeclarationFile(ts, recipe, sourceFileGetter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const importName = generateUsageImport(moduleId);
|
const importName = generateUsageImport(moduleId);
|
||||||
let replacer = createReplacer(m1[2]);
|
const replacer = createReplacer(m1[2]);
|
||||||
let typeNames = m1[3].split(/,/);
|
const typeNames = m1[3].split(/,/);
|
||||||
typeNames.forEach((typeName) => {
|
typeNames.forEach((typeName) => {
|
||||||
typeName = typeName.trim();
|
typeName = typeName.trim();
|
||||||
if (typeName.length === 0) {
|
if (typeName.length === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let declaration = getTopLevelDeclaration(ts, sourceFile, typeName);
|
const declaration = getTopLevelDeclaration(ts, sourceFile, typeName);
|
||||||
if (!declaration) {
|
if (!declaration) {
|
||||||
logErr(`While handling ${line}`);
|
logErr(`While handling ${line}`);
|
||||||
logErr(`Cannot find ${typeName}`);
|
logErr(`Cannot find ${typeName}`);
|
||||||
|
@ -369,9 +369,9 @@ function generateDeclarationFile(ts, recipe, sourceFileGetter) {
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let m2 = line.match(/^\s*#includeAll\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
|
const m2 = line.match(/^\s*#includeAll\(([^;)]*)(;[^)]*)?\)\:(.*)$/);
|
||||||
if (m2) {
|
if (m2) {
|
||||||
let moduleId = m2[1];
|
const moduleId = m2[1];
|
||||||
const sourceFile = sourceFileGetter(moduleId);
|
const sourceFile = sourceFileGetter(moduleId);
|
||||||
if (!sourceFile) {
|
if (!sourceFile) {
|
||||||
logErr(`While handling ${line}`);
|
logErr(`While handling ${line}`);
|
||||||
|
@ -380,10 +380,10 @@ function generateDeclarationFile(ts, recipe, sourceFileGetter) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const importName = generateUsageImport(moduleId);
|
const importName = generateUsageImport(moduleId);
|
||||||
let replacer = createReplacer(m2[2]);
|
const replacer = createReplacer(m2[2]);
|
||||||
let typeNames = m2[3].split(/,/);
|
const typeNames = m2[3].split(/,/);
|
||||||
let typesToExcludeMap = {};
|
const typesToExcludeMap = {};
|
||||||
let typesToExcludeArr = [];
|
const typesToExcludeArr = [];
|
||||||
typeNames.forEach((typeName) => {
|
typeNames.forEach((typeName) => {
|
||||||
typeName = typeName.trim();
|
typeName = typeName.trim();
|
||||||
if (typeName.length === 0) {
|
if (typeName.length === 0) {
|
||||||
|
@ -400,7 +400,7 @@ function generateDeclarationFile(ts, recipe, sourceFileGetter) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// node is ts.VariableStatement
|
// node is ts.VariableStatement
|
||||||
let nodeText = getNodeText(sourceFile, declaration);
|
const nodeText = getNodeText(sourceFile, declaration);
|
||||||
for (let i = 0; i < typesToExcludeArr.length; i++) {
|
for (let i = 0; i < typesToExcludeArr.length; i++) {
|
||||||
if (nodeText.indexOf(typesToExcludeArr[i]) >= 0) {
|
if (nodeText.indexOf(typesToExcludeArr[i]) >= 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -605,7 +605,7 @@ class TypeScriptLanguageServiceHost {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function execute() {
|
function execute() {
|
||||||
let r = run3(new DeclarationResolver(new FSProvider()));
|
const r = run3(new DeclarationResolver(new FSProvider()));
|
||||||
if (!r) {
|
if (!r) {
|
||||||
throw new Error(`monaco.d.ts generation error - Cannot continue`);
|
throw new Error(`monaco.d.ts generation error - Cannot continue`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ const path = require("path");
|
||||||
const tss = require("./treeshaking");
|
const tss = require("./treeshaking");
|
||||||
const REPO_ROOT = path.join(__dirname, '../../');
|
const REPO_ROOT = path.join(__dirname, '../../');
|
||||||
const SRC_DIR = path.join(REPO_ROOT, 'src');
|
const SRC_DIR = path.join(REPO_ROOT, 'src');
|
||||||
let dirCache = {};
|
const dirCache = {};
|
||||||
function writeFile(filePath, contents) {
|
function writeFile(filePath, contents) {
|
||||||
function ensureDirs(dirPath) {
|
function ensureDirs(dirPath) {
|
||||||
if (dirCache[dirPath]) {
|
if (dirCache[dirPath]) {
|
||||||
|
@ -53,13 +53,13 @@ function extractEditor(options) {
|
||||||
options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
|
options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
let result = tss.shake(options);
|
const result = tss.shake(options);
|
||||||
for (let fileName in result) {
|
for (const fileName in result) {
|
||||||
if (result.hasOwnProperty(fileName)) {
|
if (result.hasOwnProperty(fileName)) {
|
||||||
writeFile(path.join(options.destRoot, fileName), result[fileName]);
|
writeFile(path.join(options.destRoot, fileName), result[fileName]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let copied = {};
|
const copied = {};
|
||||||
const copyFile = (fileName) => {
|
const copyFile = (fileName) => {
|
||||||
if (copied[fileName]) {
|
if (copied[fileName]) {
|
||||||
return;
|
return;
|
||||||
|
@ -72,7 +72,7 @@ function extractEditor(options) {
|
||||||
const writeOutputFile = (fileName, contents) => {
|
const writeOutputFile = (fileName, contents) => {
|
||||||
writeFile(path.join(options.destRoot, fileName), contents);
|
writeFile(path.join(options.destRoot, fileName), contents);
|
||||||
};
|
};
|
||||||
for (let fileName in result) {
|
for (const fileName in result) {
|
||||||
if (result.hasOwnProperty(fileName)) {
|
if (result.hasOwnProperty(fileName)) {
|
||||||
const fileContents = result[fileName];
|
const fileContents = result[fileName];
|
||||||
const info = ts.preProcessFile(fileContents);
|
const info = ts.preProcessFile(fileContents);
|
||||||
|
@ -119,7 +119,7 @@ function createESMSourcesAndResources2(options) {
|
||||||
const OUT_FOLDER = path.join(REPO_ROOT, options.outFolder);
|
const OUT_FOLDER = path.join(REPO_ROOT, options.outFolder);
|
||||||
const OUT_RESOURCES_FOLDER = path.join(REPO_ROOT, options.outResourcesFolder);
|
const OUT_RESOURCES_FOLDER = path.join(REPO_ROOT, options.outResourcesFolder);
|
||||||
const getDestAbsoluteFilePath = (file) => {
|
const getDestAbsoluteFilePath = (file) => {
|
||||||
let dest = options.renames[file.replace(/\\/g, '/')] || file;
|
const dest = options.renames[file.replace(/\\/g, '/')] || file;
|
||||||
if (dest === 'tsconfig.json') {
|
if (dest === 'tsconfig.json') {
|
||||||
return path.join(OUT_FOLDER, `tsconfig.json`);
|
return path.join(OUT_FOLDER, `tsconfig.json`);
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ function createESMSourcesAndResources2(options) {
|
||||||
if (dir.charAt(dir.length - 1) !== '/' || dir.charAt(dir.length - 1) !== '\\') {
|
if (dir.charAt(dir.length - 1) !== '/' || dir.charAt(dir.length - 1) !== '\\') {
|
||||||
dir += '/';
|
dir += '/';
|
||||||
}
|
}
|
||||||
let result = [];
|
const result = [];
|
||||||
_walkDirRecursive(dir, result, dir.length);
|
_walkDirRecursive(dir, result, dir.length);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -215,7 +215,7 @@ function createESMSourcesAndResources2(options) {
|
||||||
}
|
}
|
||||||
writeFile(absoluteFilePath, contents);
|
writeFile(absoluteFilePath, contents);
|
||||||
function toggleComments(fileContents) {
|
function toggleComments(fileContents) {
|
||||||
let lines = fileContents.split(/\r\n|\r|\n/);
|
const lines = fileContents.split(/\r\n|\r|\n/);
|
||||||
let mode = 0;
|
let mode = 0;
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
const line = lines[i];
|
const line = lines[i];
|
||||||
|
@ -278,14 +278,14 @@ function transportCSS(module, enqueue, write) {
|
||||||
let DATA = ';base64,' + fileContents.toString('base64');
|
let DATA = ';base64,' + fileContents.toString('base64');
|
||||||
if (!forceBase64 && /\.svg$/.test(url)) {
|
if (!forceBase64 && /\.svg$/.test(url)) {
|
||||||
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
||||||
let newText = fileContents.toString()
|
const newText = fileContents.toString()
|
||||||
.replace(/"/g, '\'')
|
.replace(/"/g, '\'')
|
||||||
.replace(/</g, '%3C')
|
.replace(/</g, '%3C')
|
||||||
.replace(/>/g, '%3E')
|
.replace(/>/g, '%3E')
|
||||||
.replace(/&/g, '%26')
|
.replace(/&/g, '%26')
|
||||||
.replace(/#/g, '%23')
|
.replace(/#/g, '%23')
|
||||||
.replace(/\s+/g, ' ');
|
.replace(/\s+/g, ' ');
|
||||||
let encodedData = ',' + newText;
|
const encodedData = ',' + newText;
|
||||||
if (encodedData.length < DATA.length) {
|
if (encodedData.length < DATA.length) {
|
||||||
DATA = encodedData;
|
DATA = encodedData;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ function printDiagnostics(options, diagnostics) {
|
||||||
result += `${path.join(options.sourcesRoot, diag.file.fileName)}`;
|
result += `${path.join(options.sourcesRoot, diag.file.fileName)}`;
|
||||||
}
|
}
|
||||||
if (diag.file && diag.start) {
|
if (diag.file && diag.start) {
|
||||||
let location = diag.file.getLineAndCharacterOfPosition(diag.start);
|
const location = diag.file.getLineAndCharacterOfPosition(diag.start);
|
||||||
result += `:${location.line + 1}:${location.character}`;
|
result += `:${location.line + 1}:${location.character}`;
|
||||||
}
|
}
|
||||||
result += ` - ` + JSON.stringify(diag.messageText);
|
result += ` - ` + JSON.stringify(diag.messageText);
|
||||||
|
@ -150,7 +150,7 @@ function processLibFiles(ts, options) {
|
||||||
result[key] = sourceText;
|
result[key] = sourceText;
|
||||||
// precess dependencies and "recurse"
|
// precess dependencies and "recurse"
|
||||||
const info = ts.preProcessFile(sourceText);
|
const info = ts.preProcessFile(sourceText);
|
||||||
for (let ref of info.libReferenceDirectives) {
|
for (const ref of info.libReferenceDirectives) {
|
||||||
stack.push(ref.fileName);
|
stack.push(ref.fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -503,7 +503,7 @@ function markNodes(ts, languageService, options) {
|
||||||
}
|
}
|
||||||
// queue the heritage clauses
|
// queue the heritage clauses
|
||||||
if (declaration.heritageClauses) {
|
if (declaration.heritageClauses) {
|
||||||
for (let heritageClause of declaration.heritageClauses) {
|
for (const heritageClause of declaration.heritageClauses) {
|
||||||
enqueue_black(heritageClause);
|
enqueue_black(heritageClause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -551,7 +551,7 @@ function generateResult(ts, languageService, shakeLevel) {
|
||||||
if (!program) {
|
if (!program) {
|
||||||
throw new Error('Could not get program from language service');
|
throw new Error('Could not get program from language service');
|
||||||
}
|
}
|
||||||
let result = {};
|
const result = {};
|
||||||
const writeFile = (filePath, contents) => {
|
const writeFile = (filePath, contents) => {
|
||||||
result[filePath] = contents;
|
result[filePath] = contents;
|
||||||
};
|
};
|
||||||
|
@ -567,7 +567,7 @@ function generateResult(ts, languageService, shakeLevel) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let text = sourceFile.text;
|
const text = sourceFile.text;
|
||||||
let result = '';
|
let result = '';
|
||||||
function keep(node) {
|
function keep(node) {
|
||||||
result += text.substring(node.pos, node.end);
|
result += text.substring(node.pos, node.end);
|
||||||
|
@ -597,7 +597,7 @@ function generateResult(ts, languageService, shakeLevel) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let survivingImports = [];
|
const survivingImports = [];
|
||||||
for (const importNode of node.importClause.namedBindings.elements) {
|
for (const importNode of node.importClause.namedBindings.elements) {
|
||||||
if (getColor(importNode) === 2 /* NodeColor.Black */) {
|
if (getColor(importNode) === 2 /* NodeColor.Black */) {
|
||||||
survivingImports.push(importNode.getFullText(sourceFile));
|
survivingImports.push(importNode.getFullText(sourceFile));
|
||||||
|
@ -626,7 +626,7 @@ function generateResult(ts, languageService, shakeLevel) {
|
||||||
}
|
}
|
||||||
if (ts.isExportDeclaration(node)) {
|
if (ts.isExportDeclaration(node)) {
|
||||||
if (node.exportClause && node.moduleSpecifier && ts.isNamedExports(node.exportClause)) {
|
if (node.exportClause && node.moduleSpecifier && ts.isNamedExports(node.exportClause)) {
|
||||||
let survivingExports = [];
|
const survivingExports = [];
|
||||||
for (const exportSpecifier of node.exportClause.elements) {
|
for (const exportSpecifier of node.exportClause.elements) {
|
||||||
if (getColor(exportSpecifier) === 2 /* NodeColor.Black */) {
|
if (getColor(exportSpecifier) === 2 /* NodeColor.Black */) {
|
||||||
survivingExports.push(exportSpecifier.getFullText(sourceFile));
|
survivingExports.push(exportSpecifier.getFullText(sourceFile));
|
||||||
|
@ -647,8 +647,8 @@ function generateResult(ts, languageService, shakeLevel) {
|
||||||
// keep method
|
// keep method
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let pos = member.pos - node.pos;
|
const pos = member.pos - node.pos;
|
||||||
let end = member.end - node.pos;
|
const end = member.end - node.pos;
|
||||||
toWrite = toWrite.substring(0, pos) + toWrite.substring(end);
|
toWrite = toWrite.substring(0, pos) + toWrite.substring(end);
|
||||||
}
|
}
|
||||||
return write(toWrite);
|
return write(toWrite);
|
||||||
|
|
|
@ -28,7 +28,14 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
log(colors.cyan(topic), message);
|
log(colors.cyan(topic), message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let host = new LanguageServiceHost(cmd, projectFile, _log), service = ts.createLanguageService(host, ts.createDocumentRegistry()), lastBuildVersion = Object.create(null), lastDtsHash = Object.create(null), userWantsDeclarations = cmd.options.declaration, oldErrors = Object.create(null), headUsed = process.memoryUsage().heapUsed, emitSourceMapsInStream = true;
|
const host = new LanguageServiceHost(cmd, projectFile, _log);
|
||||||
|
const service = ts.createLanguageService(host, ts.createDocumentRegistry());
|
||||||
|
const lastBuildVersion = Object.create(null);
|
||||||
|
const lastDtsHash = Object.create(null);
|
||||||
|
const userWantsDeclarations = cmd.options.declaration;
|
||||||
|
let oldErrors = Object.create(null);
|
||||||
|
let headUsed = process.memoryUsage().heapUsed;
|
||||||
|
let emitSourceMapsInStream = true;
|
||||||
// always emit declaraction files
|
// always emit declaraction files
|
||||||
host.getCompilationSettings().declaration = true;
|
host.getCompilationSettings().declaration = true;
|
||||||
function file(file) {
|
function file(file) {
|
||||||
|
@ -85,8 +92,8 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
process.nextTick(function () {
|
process.nextTick(function () {
|
||||||
if (/\.d\.ts$/.test(fileName)) {
|
if (/\.d\.ts$/.test(fileName)) {
|
||||||
// if it's already a d.ts file just emit it signature
|
// if it's already a d.ts file just emit it signature
|
||||||
let snapshot = host.getScriptSnapshot(fileName);
|
const snapshot = host.getScriptSnapshot(fileName);
|
||||||
let signature = crypto.createHash('md5')
|
const signature = crypto.createHash('md5')
|
||||||
.update(snapshot.getText(0, snapshot.getLength()))
|
.update(snapshot.getText(0, snapshot.getLength()))
|
||||||
.digest('base64');
|
.digest('base64');
|
||||||
return resolve({
|
return resolve({
|
||||||
|
@ -95,10 +102,10 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
files: []
|
files: []
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
let output = service.getEmitOutput(fileName);
|
const output = service.getEmitOutput(fileName);
|
||||||
let files = [];
|
const files = [];
|
||||||
let signature;
|
let signature;
|
||||||
for (let file of output.outputFiles) {
|
for (const file of output.outputFiles) {
|
||||||
if (!emitSourceMapsInStream && /\.js\.map$/.test(file.name)) {
|
if (!emitSourceMapsInStream && /\.js\.map$/.test(file.name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -111,19 +118,19 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let vinyl = new Vinyl({
|
const vinyl = new Vinyl({
|
||||||
path: file.name,
|
path: file.name,
|
||||||
contents: Buffer.from(file.text),
|
contents: Buffer.from(file.text),
|
||||||
base: !config._emitWithoutBasePath && baseFor(host.getScriptSnapshot(fileName)) || undefined
|
base: !config._emitWithoutBasePath && baseFor(host.getScriptSnapshot(fileName)) || undefined
|
||||||
});
|
});
|
||||||
if (!emitSourceMapsInStream && /\.js$/.test(file.name)) {
|
if (!emitSourceMapsInStream && /\.js$/.test(file.name)) {
|
||||||
let sourcemapFile = output.outputFiles.filter(f => /\.js\.map$/.test(f.name))[0];
|
const sourcemapFile = output.outputFiles.filter(f => /\.js\.map$/.test(f.name))[0];
|
||||||
if (sourcemapFile) {
|
if (sourcemapFile) {
|
||||||
let extname = path.extname(vinyl.relative);
|
const extname = path.extname(vinyl.relative);
|
||||||
let basename = path.basename(vinyl.relative, extname);
|
const basename = path.basename(vinyl.relative, extname);
|
||||||
let dirname = path.dirname(vinyl.relative);
|
const dirname = path.dirname(vinyl.relative);
|
||||||
let tsname = (dirname === '.' ? '' : dirname + '/') + basename + '.ts';
|
const tsname = (dirname === '.' ? '' : dirname + '/') + basename + '.ts';
|
||||||
let sourceMap = JSON.parse(sourcemapFile.text);
|
const sourceMap = JSON.parse(sourcemapFile.text);
|
||||||
sourceMap.sources[0] = tsname.replace(/\\/g, '/');
|
sourceMap.sources[0] = tsname.replace(/\\/g, '/');
|
||||||
vinyl.sourceMap = sourceMap;
|
vinyl.sourceMap = sourceMap;
|
||||||
}
|
}
|
||||||
|
@ -138,15 +145,15 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
let newErrors = Object.create(null);
|
const newErrors = Object.create(null);
|
||||||
let t1 = Date.now();
|
const t1 = Date.now();
|
||||||
let toBeEmitted = [];
|
const toBeEmitted = [];
|
||||||
let toBeCheckedSyntactically = [];
|
const toBeCheckedSyntactically = [];
|
||||||
let toBeCheckedSemantically = [];
|
const toBeCheckedSemantically = [];
|
||||||
let filesWithChangedSignature = [];
|
const filesWithChangedSignature = [];
|
||||||
let dependentFiles = [];
|
const dependentFiles = [];
|
||||||
let newLastBuildVersion = new Map();
|
const newLastBuildVersion = new Map();
|
||||||
for (let fileName of host.getScriptFileNames()) {
|
for (const fileName of host.getScriptFileNames()) {
|
||||||
if (lastBuildVersion[fileName] !== host.getScriptVersion(fileName)) {
|
if (lastBuildVersion[fileName] !== host.getScriptVersion(fileName)) {
|
||||||
toBeEmitted.push(fileName);
|
toBeEmitted.push(fileName);
|
||||||
toBeCheckedSyntactically.push(fileName);
|
toBeCheckedSyntactically.push(fileName);
|
||||||
|
@ -154,8 +161,8 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
let semanticCheckInfo = new Map();
|
const semanticCheckInfo = new Map();
|
||||||
let seenAsDependentFile = new Set();
|
const seenAsDependentFile = new Set();
|
||||||
function workOnNext() {
|
function workOnNext() {
|
||||||
let promise;
|
let promise;
|
||||||
// let fileName: string;
|
// let fileName: string;
|
||||||
|
@ -168,9 +175,9 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
}
|
}
|
||||||
// (1st) emit code
|
// (1st) emit code
|
||||||
else if (toBeEmitted.length) {
|
else if (toBeEmitted.length) {
|
||||||
let fileName = toBeEmitted.pop();
|
const fileName = toBeEmitted.pop();
|
||||||
promise = emitSoon(fileName).then(value => {
|
promise = emitSoon(fileName).then(value => {
|
||||||
for (let file of value.files) {
|
for (const file of value.files) {
|
||||||
_log('[emit code]', file.path);
|
_log('[emit code]', file.path);
|
||||||
out(file);
|
out(file);
|
||||||
}
|
}
|
||||||
|
@ -189,7 +196,7 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
}
|
}
|
||||||
// (2nd) check syntax
|
// (2nd) check syntax
|
||||||
else if (toBeCheckedSyntactically.length) {
|
else if (toBeCheckedSyntactically.length) {
|
||||||
let fileName = toBeCheckedSyntactically.pop();
|
const fileName = toBeCheckedSyntactically.pop();
|
||||||
_log('[check syntax]', fileName);
|
_log('[check syntax]', fileName);
|
||||||
promise = checkSyntaxSoon(fileName).then(diagnostics => {
|
promise = checkSyntaxSoon(fileName).then(diagnostics => {
|
||||||
delete oldErrors[fileName];
|
delete oldErrors[fileName];
|
||||||
|
@ -224,7 +231,7 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
// (4th) check dependents
|
// (4th) check dependents
|
||||||
else if (filesWithChangedSignature.length) {
|
else if (filesWithChangedSignature.length) {
|
||||||
while (filesWithChangedSignature.length) {
|
while (filesWithChangedSignature.length) {
|
||||||
let fileName = filesWithChangedSignature.pop();
|
const fileName = filesWithChangedSignature.pop();
|
||||||
if (!isExternalModule(service.getProgram().getSourceFile(fileName))) {
|
if (!isExternalModule(service.getProgram().getSourceFile(fileName))) {
|
||||||
_log('[check semantics*]', fileName + ' is an internal module and it has changed shape -> check whatever hasn\'t been checked yet');
|
_log('[check semantics*]', fileName + ' is an internal module and it has changed shape -> check whatever hasn\'t been checked yet');
|
||||||
toBeCheckedSemantically.push(...host.getScriptFileNames());
|
toBeCheckedSemantically.push(...host.getScriptFileNames());
|
||||||
|
@ -243,7 +250,7 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
|
||||||
}
|
}
|
||||||
if (fileName) {
|
if (fileName) {
|
||||||
seenAsDependentFile.add(fileName);
|
seenAsDependentFile.add(fileName);
|
||||||
let value = semanticCheckInfo.get(fileName);
|
const value = semanticCheckInfo.get(fileName);
|
||||||
if (value === 0) {
|
if (value === 0) {
|
||||||
// already validated successfully -> look at dependents next
|
// already validated successfully -> look at dependents next
|
||||||
host.collectDependents(fileName, dependentFiles);
|
host.collectDependents(fileName, dependentFiles);
|
||||||
|
@ -400,7 +407,7 @@ class LanguageServiceHost {
|
||||||
}
|
}
|
||||||
if (!old || old.getVersion() !== snapshot.getVersion()) {
|
if (!old || old.getVersion() !== snapshot.getVersion()) {
|
||||||
this._dependenciesRecomputeList.push(filename);
|
this._dependenciesRecomputeList.push(filename);
|
||||||
let node = this._dependencies.lookup(filename);
|
const node = this._dependencies.lookup(filename);
|
||||||
if (node) {
|
if (node) {
|
||||||
node.outgoing = Object.create(null);
|
node.outgoing = Object.create(null);
|
||||||
}
|
}
|
||||||
|
@ -479,7 +486,7 @@ class LanguageServiceHost {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
for (let key in this._fileNameToDeclaredModule) {
|
for (const key in this._fileNameToDeclaredModule) {
|
||||||
if (this._fileNameToDeclaredModule[key] && ~this._fileNameToDeclaredModule[key].indexOf(ref.fileName)) {
|
if (this._fileNameToDeclaredModule[key] && ~this._fileNameToDeclaredModule[key].indexOf(ref.fileName)) {
|
||||||
this._dependencies.inertEdge(filename, key);
|
this._dependencies.inertEdge(filename, key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ function create(projectPath, existingOptions, verbose = false, onError = _defaul
|
||||||
const result = (token) => createStream(token);
|
const result = (token) => createStream(token);
|
||||||
result.src = (opts) => {
|
result.src = (opts) => {
|
||||||
let _pos = 0;
|
let _pos = 0;
|
||||||
let _fileNames = cmdLine.fileNames.slice(0);
|
const _fileNames = cmdLine.fileNames.slice(0);
|
||||||
return new class extends stream_1.Readable {
|
return new class extends stream_1.Readable {
|
||||||
constructor() {
|
constructor() {
|
||||||
super({ objectMode: true });
|
super({ objectMode: true });
|
||||||
|
|
|
@ -30,7 +30,7 @@ var collections;
|
||||||
}
|
}
|
||||||
collections.lookupOrInsert = lookupOrInsert;
|
collections.lookupOrInsert = lookupOrInsert;
|
||||||
function forEach(collection, callback) {
|
function forEach(collection, callback) {
|
||||||
for (let key in collection) {
|
for (const key in collection) {
|
||||||
if (hasOwnProperty.call(collection, key)) {
|
if (hasOwnProperty.call(collection, key)) {
|
||||||
callback({
|
callback({
|
||||||
key: key,
|
key: key,
|
||||||
|
|
|
@ -240,7 +240,7 @@ function _rreaddir(dirPath, prepend, result) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function rreddir(dirPath) {
|
function rreddir(dirPath) {
|
||||||
let result = [];
|
const result = [];
|
||||||
_rreaddir(dirPath, '', result);
|
_rreaddir(dirPath, '', result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,7 @@ function createExternalLoaderConfig(webEndpoint, commit, quality) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
webEndpoint = webEndpoint + `/${quality}/${commit}`;
|
webEndpoint = webEndpoint + `/${quality}/${commit}`;
|
||||||
let nodePaths = acquireWebNodePaths();
|
const nodePaths = acquireWebNodePaths();
|
||||||
Object.keys(nodePaths).map(function (key, _) {
|
Object.keys(nodePaths).map(function (key, _) {
|
||||||
nodePaths[key] = `${webEndpoint}/node_modules/${key}/${nodePaths[key]}`;
|
nodePaths[key] = `${webEndpoint}/node_modules/${key}/${nodePaths[key]}`;
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue