typescript 4.3.4 → 4.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/tsc.js CHANGED
@@ -65,7 +65,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
65
65
  var ts;
66
66
  (function (ts) {
67
67
  ts.versionMajorMinor = "4.3";
68
- ts.version = "4.3.4";
68
+ ts.version = "4.3.5";
69
69
  var NativeCollections;
70
70
  (function (NativeCollections) {
71
71
  function tryGetNativeMap() {
package/lib/tsserver.js CHANGED
@@ -96,7 +96,7 @@ var ts;
96
96
  // The following is baselined as a literal template type without intervention
97
97
  /** The version of the TypeScript compiler release */
98
98
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
99
- ts.version = "4.3.4";
99
+ ts.version = "4.3.5";
100
100
  /* @internal */
101
101
  var Comparison;
102
102
  (function (Comparison) {
@@ -123997,10 +123997,9 @@ var ts;
123997
123997
  getTypeScriptMemberSymbols();
123998
123998
  }
123999
123999
  else if (isRightOfOpenTag) {
124000
- var tagSymbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124001
- ts.Debug.assertEachIsDefined(tagSymbols, "getJsxIntrinsicTagNames() should all be defined");
124000
+ symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124001
+ ts.Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
124002
124002
  tryGetGlobalSymbols();
124003
- symbols = tagSymbols.concat(symbols);
124004
124003
  completionKind = 1 /* Global */;
124005
124004
  keywordFilters = 0 /* None */;
124006
124005
  }
@@ -124265,7 +124264,7 @@ var ts;
124265
124264
  if (!attrsType)
124266
124265
  return 0 /* Continue */;
124267
124266
  var completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* Completions */);
124268
- symbols = filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties);
124267
+ symbols = ts.concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties));
124269
124268
  setSortTextToOptionalMember();
124270
124269
  completionKind = 3 /* MemberLike */;
124271
124270
  isNewIdentifierLocation = false;
@@ -124316,7 +124315,7 @@ var ts;
124316
124315
  var scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile;
124317
124316
  isInSnippetScope = isSnippetScope(scopeNode);
124318
124317
  var symbolMeanings = (isTypeOnly ? 0 /* None */ : 111551 /* Value */) | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */;
124319
- symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings);
124318
+ symbols = ts.concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
124320
124319
  ts.Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
124321
124320
  for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
124322
124321
  var symbol = symbols_1[_i];
@@ -124616,7 +124615,7 @@ var ts;
124616
124615
  var existingMembers = getPropertiesForCompletion(containerActualType, typeChecker);
124617
124616
  var existingMemberEscapedNames = new ts.Set();
124618
124617
  existingMembers.forEach(function (s) { return existingMemberEscapedNames.add(s.escapedName); });
124619
- symbols = ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); });
124618
+ symbols = ts.concatenate(symbols, ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); }));
124620
124619
  completionKind = 0 /* ObjectPropertyDeclaration */;
124621
124620
  isNewIdentifierLocation = true;
124622
124621
  return 1 /* Success */;
@@ -124698,7 +124697,7 @@ var ts;
124698
124697
  }
124699
124698
  if (typeMembers && typeMembers.length > 0) {
124700
124699
  // Add filtered items to the completion list
124701
- symbols = filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers));
124700
+ symbols = ts.concatenate(symbols, filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers)));
124702
124701
  }
124703
124702
  setSortTextToOptionalMember();
124704
124703
  return 1 /* Success */;
@@ -124733,7 +124732,7 @@ var ts;
124733
124732
  isNewIdentifierLocation = false;
124734
124733
  var exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
124735
124734
  var existing = new ts.Set(namedImportsOrExports.elements.filter(function (n) { return !isCurrentlyEditingNode(n); }).map(function (n) { return (n.propertyName || n.name).escapedText; }));
124736
- symbols = exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); });
124735
+ symbols = ts.concatenate(symbols, exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); }));
124737
124736
  return 1 /* Success */;
124738
124737
  }
124739
124738
  /**
@@ -124808,7 +124807,7 @@ var ts;
124808
124807
  (type === null || type === void 0 ? void 0 : type.symbol) && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) :
124809
124808
  type && typeChecker.getPropertiesOfType(type);
124810
124809
  });
124811
- symbols = filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags);
124810
+ symbols = ts.concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
124812
124811
  }
124813
124812
  return 1 /* Success */;
124814
124813
  }
@@ -290,7 +290,7 @@ var ts;
290
290
  // The following is baselined as a literal template type without intervention
291
291
  /** The version of the TypeScript compiler release */
292
292
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
293
- ts.version = "4.3.4";
293
+ ts.version = "4.3.5";
294
294
  /* @internal */
295
295
  var Comparison;
296
296
  (function (Comparison) {
@@ -124566,10 +124566,9 @@ var ts;
124566
124566
  getTypeScriptMemberSymbols();
124567
124567
  }
124568
124568
  else if (isRightOfOpenTag) {
124569
- var tagSymbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124570
- ts.Debug.assertEachIsDefined(tagSymbols, "getJsxIntrinsicTagNames() should all be defined");
124569
+ symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124570
+ ts.Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
124571
124571
  tryGetGlobalSymbols();
124572
- symbols = tagSymbols.concat(symbols);
124573
124572
  completionKind = 1 /* Global */;
124574
124573
  keywordFilters = 0 /* None */;
124575
124574
  }
@@ -124834,7 +124833,7 @@ var ts;
124834
124833
  if (!attrsType)
124835
124834
  return 0 /* Continue */;
124836
124835
  var completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* Completions */);
124837
- symbols = filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties);
124836
+ symbols = ts.concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties));
124838
124837
  setSortTextToOptionalMember();
124839
124838
  completionKind = 3 /* MemberLike */;
124840
124839
  isNewIdentifierLocation = false;
@@ -124885,7 +124884,7 @@ var ts;
124885
124884
  var scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile;
124886
124885
  isInSnippetScope = isSnippetScope(scopeNode);
124887
124886
  var symbolMeanings = (isTypeOnly ? 0 /* None */ : 111551 /* Value */) | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */;
124888
- symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings);
124887
+ symbols = ts.concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
124889
124888
  ts.Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
124890
124889
  for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
124891
124890
  var symbol = symbols_1[_i];
@@ -125185,7 +125184,7 @@ var ts;
125185
125184
  var existingMembers = getPropertiesForCompletion(containerActualType, typeChecker);
125186
125185
  var existingMemberEscapedNames = new ts.Set();
125187
125186
  existingMembers.forEach(function (s) { return existingMemberEscapedNames.add(s.escapedName); });
125188
- symbols = ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); });
125187
+ symbols = ts.concatenate(symbols, ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); }));
125189
125188
  completionKind = 0 /* ObjectPropertyDeclaration */;
125190
125189
  isNewIdentifierLocation = true;
125191
125190
  return 1 /* Success */;
@@ -125267,7 +125266,7 @@ var ts;
125267
125266
  }
125268
125267
  if (typeMembers && typeMembers.length > 0) {
125269
125268
  // Add filtered items to the completion list
125270
- symbols = filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers));
125269
+ symbols = ts.concatenate(symbols, filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers)));
125271
125270
  }
125272
125271
  setSortTextToOptionalMember();
125273
125272
  return 1 /* Success */;
@@ -125302,7 +125301,7 @@ var ts;
125302
125301
  isNewIdentifierLocation = false;
125303
125302
  var exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
125304
125303
  var existing = new ts.Set(namedImportsOrExports.elements.filter(function (n) { return !isCurrentlyEditingNode(n); }).map(function (n) { return (n.propertyName || n.name).escapedText; }));
125305
- symbols = exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); });
125304
+ symbols = ts.concatenate(symbols, exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); }));
125306
125305
  return 1 /* Success */;
125307
125306
  }
125308
125307
  /**
@@ -125377,7 +125376,7 @@ var ts;
125377
125376
  (type === null || type === void 0 ? void 0 : type.symbol) && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) :
125378
125377
  type && typeChecker.getPropertiesOfType(type);
125379
125378
  });
125380
- symbols = filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags);
125379
+ symbols = ts.concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
125381
125380
  }
125382
125381
  return 1 /* Success */;
125383
125382
  }
package/lib/typescript.js CHANGED
@@ -290,7 +290,7 @@ var ts;
290
290
  // The following is baselined as a literal template type without intervention
291
291
  /** The version of the TypeScript compiler release */
292
292
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
293
- ts.version = "4.3.4";
293
+ ts.version = "4.3.5";
294
294
  /* @internal */
295
295
  var Comparison;
296
296
  (function (Comparison) {
@@ -124566,10 +124566,9 @@ var ts;
124566
124566
  getTypeScriptMemberSymbols();
124567
124567
  }
124568
124568
  else if (isRightOfOpenTag) {
124569
- var tagSymbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124570
- ts.Debug.assertEachIsDefined(tagSymbols, "getJsxIntrinsicTagNames() should all be defined");
124569
+ symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124570
+ ts.Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
124571
124571
  tryGetGlobalSymbols();
124572
- symbols = tagSymbols.concat(symbols);
124573
124572
  completionKind = 1 /* Global */;
124574
124573
  keywordFilters = 0 /* None */;
124575
124574
  }
@@ -124834,7 +124833,7 @@ var ts;
124834
124833
  if (!attrsType)
124835
124834
  return 0 /* Continue */;
124836
124835
  var completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* Completions */);
124837
- symbols = filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties);
124836
+ symbols = ts.concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties));
124838
124837
  setSortTextToOptionalMember();
124839
124838
  completionKind = 3 /* MemberLike */;
124840
124839
  isNewIdentifierLocation = false;
@@ -124885,7 +124884,7 @@ var ts;
124885
124884
  var scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile;
124886
124885
  isInSnippetScope = isSnippetScope(scopeNode);
124887
124886
  var symbolMeanings = (isTypeOnly ? 0 /* None */ : 111551 /* Value */) | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */;
124888
- symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings);
124887
+ symbols = ts.concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
124889
124888
  ts.Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
124890
124889
  for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
124891
124890
  var symbol = symbols_1[_i];
@@ -125185,7 +125184,7 @@ var ts;
125185
125184
  var existingMembers = getPropertiesForCompletion(containerActualType, typeChecker);
125186
125185
  var existingMemberEscapedNames = new ts.Set();
125187
125186
  existingMembers.forEach(function (s) { return existingMemberEscapedNames.add(s.escapedName); });
125188
- symbols = ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); });
125187
+ symbols = ts.concatenate(symbols, ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); }));
125189
125188
  completionKind = 0 /* ObjectPropertyDeclaration */;
125190
125189
  isNewIdentifierLocation = true;
125191
125190
  return 1 /* Success */;
@@ -125267,7 +125266,7 @@ var ts;
125267
125266
  }
125268
125267
  if (typeMembers && typeMembers.length > 0) {
125269
125268
  // Add filtered items to the completion list
125270
- symbols = filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers));
125269
+ symbols = ts.concatenate(symbols, filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers)));
125271
125270
  }
125272
125271
  setSortTextToOptionalMember();
125273
125272
  return 1 /* Success */;
@@ -125302,7 +125301,7 @@ var ts;
125302
125301
  isNewIdentifierLocation = false;
125303
125302
  var exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
125304
125303
  var existing = new ts.Set(namedImportsOrExports.elements.filter(function (n) { return !isCurrentlyEditingNode(n); }).map(function (n) { return (n.propertyName || n.name).escapedText; }));
125305
- symbols = exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); });
125304
+ symbols = ts.concatenate(symbols, exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); }));
125306
125305
  return 1 /* Success */;
125307
125306
  }
125308
125307
  /**
@@ -125377,7 +125376,7 @@ var ts;
125377
125376
  (type === null || type === void 0 ? void 0 : type.symbol) && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) :
125378
125377
  type && typeChecker.getPropertiesOfType(type);
125379
125378
  });
125380
- symbols = filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags);
125379
+ symbols = ts.concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
125381
125380
  }
125382
125381
  return 1 /* Success */;
125383
125382
  }
@@ -290,7 +290,7 @@ var ts;
290
290
  // The following is baselined as a literal template type without intervention
291
291
  /** The version of the TypeScript compiler release */
292
292
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
293
- ts.version = "4.3.4";
293
+ ts.version = "4.3.5";
294
294
  /* @internal */
295
295
  var Comparison;
296
296
  (function (Comparison) {
@@ -124566,10 +124566,9 @@ var ts;
124566
124566
  getTypeScriptMemberSymbols();
124567
124567
  }
124568
124568
  else if (isRightOfOpenTag) {
124569
- var tagSymbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124570
- ts.Debug.assertEachIsDefined(tagSymbols, "getJsxIntrinsicTagNames() should all be defined");
124569
+ symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
124570
+ ts.Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
124571
124571
  tryGetGlobalSymbols();
124572
- symbols = tagSymbols.concat(symbols);
124573
124572
  completionKind = 1 /* Global */;
124574
124573
  keywordFilters = 0 /* None */;
124575
124574
  }
@@ -124834,7 +124833,7 @@ var ts;
124834
124833
  if (!attrsType)
124835
124834
  return 0 /* Continue */;
124836
124835
  var completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4 /* Completions */);
124837
- symbols = filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties);
124836
+ symbols = ts.concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties));
124838
124837
  setSortTextToOptionalMember();
124839
124838
  completionKind = 3 /* MemberLike */;
124840
124839
  isNewIdentifierLocation = false;
@@ -124885,7 +124884,7 @@ var ts;
124885
124884
  var scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile;
124886
124885
  isInSnippetScope = isSnippetScope(scopeNode);
124887
124886
  var symbolMeanings = (isTypeOnly ? 0 /* None */ : 111551 /* Value */) | 788968 /* Type */ | 1920 /* Namespace */ | 2097152 /* Alias */;
124888
- symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings);
124887
+ symbols = ts.concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
124889
124888
  ts.Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
124890
124889
  for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
124891
124890
  var symbol = symbols_1[_i];
@@ -125185,7 +125184,7 @@ var ts;
125185
125184
  var existingMembers = getPropertiesForCompletion(containerActualType, typeChecker);
125186
125185
  var existingMemberEscapedNames = new ts.Set();
125187
125186
  existingMembers.forEach(function (s) { return existingMemberEscapedNames.add(s.escapedName); });
125188
- symbols = ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); });
125187
+ symbols = ts.concatenate(symbols, ts.filter(members, function (s) { return !existingMemberEscapedNames.has(s.escapedName); }));
125189
125188
  completionKind = 0 /* ObjectPropertyDeclaration */;
125190
125189
  isNewIdentifierLocation = true;
125191
125190
  return 1 /* Success */;
@@ -125267,7 +125266,7 @@ var ts;
125267
125266
  }
125268
125267
  if (typeMembers && typeMembers.length > 0) {
125269
125268
  // Add filtered items to the completion list
125270
- symbols = filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers));
125269
+ symbols = ts.concatenate(symbols, filterObjectMembersList(typeMembers, ts.Debug.checkDefined(existingMembers)));
125271
125270
  }
125272
125271
  setSortTextToOptionalMember();
125273
125272
  return 1 /* Success */;
@@ -125302,7 +125301,7 @@ var ts;
125302
125301
  isNewIdentifierLocation = false;
125303
125302
  var exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
125304
125303
  var existing = new ts.Set(namedImportsOrExports.elements.filter(function (n) { return !isCurrentlyEditingNode(n); }).map(function (n) { return (n.propertyName || n.name).escapedText; }));
125305
- symbols = exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); });
125304
+ symbols = ts.concatenate(symbols, exports.filter(function (e) { return e.escapedName !== "default" /* Default */ && !existing.has(e.escapedName); }));
125306
125305
  return 1 /* Success */;
125307
125306
  }
125308
125307
  /**
@@ -125377,7 +125376,7 @@ var ts;
125377
125376
  (type === null || type === void 0 ? void 0 : type.symbol) && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) :
125378
125377
  type && typeChecker.getPropertiesOfType(type);
125379
125378
  });
125380
- symbols = filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags);
125379
+ symbols = ts.concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
125381
125380
  }
125382
125381
  return 1 /* Success */;
125383
125382
  }
@@ -85,7 +85,7 @@ var ts;
85
85
  // The following is baselined as a literal template type without intervention
86
86
  /** The version of the TypeScript compiler release */
87
87
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
88
- ts.version = "4.3.4";
88
+ ts.version = "4.3.5";
89
89
  /* @internal */
90
90
  var Comparison;
91
91
  (function (Comparison) {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "typescript",
3
3
  "author": "Microsoft Corp.",
4
4
  "homepage": "https://www.typescriptlang.org/",
5
- "version": "4.3.4",
5
+ "version": "4.3.5",
6
6
  "license": "Apache-2.0",
7
7
  "description": "TypeScript is a language for application scale JavaScript development",
8
8
  "keywords": [