typescript 4.7.0-dev.20220329 → 4.7.0-dev.20220401

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.
@@ -89,7 +89,7 @@ var ts;
89
89
  // The following is baselined as a literal template type without intervention
90
90
  /** The version of the TypeScript compiler release */
91
91
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
92
- ts.version = ts.versionMajorMinor + ".0-dev.20220329";
92
+ ts.version = ts.versionMajorMinor + ".0-dev.20220401";
93
93
  /* @internal */
94
94
  var Comparison;
95
95
  (function (Comparison) {
@@ -9484,6 +9484,7 @@ var ts;
9484
9484
  An_expanded_version_of_this_information_showing_all_possible_compiler_options: diag(6928, ts.DiagnosticCategory.Message, "An_expanded_version_of_this_information_showing_all_possible_compiler_options_6928", "An expanded version of this information, showing all possible compiler options"),
9485
9485
  Compiles_the_current_project_with_additional_settings: diag(6929, ts.DiagnosticCategory.Message, "Compiles_the_current_project_with_additional_settings_6929", "Compiles the current project, with additional settings."),
9486
9486
  true_for_ES2022_and_above_including_ESNext: diag(6930, ts.DiagnosticCategory.Message, "true_for_ES2022_and_above_including_ESNext_6930", "`true` for ES2022 and above, including ESNext."),
9487
+ List_of_file_name_suffixes_to_search_when_resolving_a_module: diag(6931, ts.DiagnosticCategory.Error, "List_of_file_name_suffixes_to_search_when_resolving_a_module_6931", "List of file name suffixes to search when resolving a module."),
9487
9488
  Variable_0_implicitly_has_an_1_type: diag(7005, ts.DiagnosticCategory.Error, "Variable_0_implicitly_has_an_1_type_7005", "Variable '{0}' implicitly has an '{1}' type."),
9488
9489
  Parameter_0_implicitly_has_an_1_type: diag(7006, ts.DiagnosticCategory.Error, "Parameter_0_implicitly_has_an_1_type_7006", "Parameter '{0}' implicitly has an '{1}' type."),
9489
9490
  Member_0_implicitly_has_an_1_type: diag(7008, ts.DiagnosticCategory.Error, "Member_0_implicitly_has_an_1_type_7008", "Member '{0}' implicitly has an '{1}' type."),
@@ -39478,6 +39479,18 @@ var ts;
39478
39479
  description: ts.Diagnostics.Allow_accessing_UMD_globals_from_modules,
39479
39480
  defaultValueDescription: false,
39480
39481
  },
39482
+ {
39483
+ name: "moduleSuffixes",
39484
+ type: "list",
39485
+ element: {
39486
+ name: "suffix",
39487
+ type: "string",
39488
+ },
39489
+ listPreserveFalsyValues: true,
39490
+ affectsModuleResolution: true,
39491
+ category: ts.Diagnostics.Modules,
39492
+ description: ts.Diagnostics.List_of_file_name_suffixes_to_search_when_resolving_a_module,
39493
+ },
39481
39494
  // Source Maps
39482
39495
  {
39483
39496
  name: "sourceRoot",
@@ -41404,7 +41417,7 @@ var ts;
41404
41417
  if (option.type === "list") {
41405
41418
  var listOption_1 = option;
41406
41419
  if (listOption_1.element.isFilePath || !ts.isString(listOption_1.element.type)) {
41407
- return ts.filter(ts.map(value, function (v) { return normalizeOptionValue(listOption_1.element, basePath, v); }), function (v) { return !!v; });
41420
+ return ts.filter(ts.map(value, function (v) { return normalizeOptionValue(listOption_1.element, basePath, v); }), function (v) { return listOption_1.listPreserveFalsyValues ? true : !!v; });
41408
41421
  }
41409
41422
  return value;
41410
41423
  }
@@ -41445,7 +41458,7 @@ var ts;
41445
41458
  }
41446
41459
  }
41447
41460
  function convertJsonOptionOfListType(option, values, basePath, errors) {
41448
- return ts.filter(ts.map(values, function (v) { return convertJsonOption(option.element, v, basePath, errors); }), function (v) { return !!v; });
41461
+ return ts.filter(ts.map(values, function (v) { return convertJsonOption(option.element, v, basePath, errors); }), function (v) { return option.listPreserveFalsyValues ? true : !!v; });
41449
41462
  }
41450
41463
  /**
41451
41464
  * Tests for a path that ends in a recursive directory wildcard.
@@ -43071,6 +43084,15 @@ var ts;
43071
43084
  }
43072
43085
  /** Return the file if it exists. */
43073
43086
  function tryFile(fileName, onlyRecordFailures, state) {
43087
+ var _a, _b;
43088
+ if (!((_a = state.compilerOptions.moduleSuffixes) === null || _a === void 0 ? void 0 : _a.length)) {
43089
+ return tryFileLookup(fileName, onlyRecordFailures, state);
43090
+ }
43091
+ var ext = (_b = ts.tryGetExtensionFromPath(fileName)) !== null && _b !== void 0 ? _b : "";
43092
+ var fileNameNoExtension = ext ? ts.removeExtension(fileName, ext) : fileName;
43093
+ return ts.forEach(state.compilerOptions.moduleSuffixes, function (suffix) { return tryFileLookup(fileNameNoExtension + suffix + ext, onlyRecordFailures, state); });
43094
+ }
43095
+ function tryFileLookup(fileName, onlyRecordFailures, state) {
43074
43096
  if (!onlyRecordFailures) {
43075
43097
  if (state.host.fileExists(fileName)) {
43076
43098
  if (state.traceEnabled) {
@@ -47395,7 +47417,8 @@ var ts;
47395
47417
  CheckMode[CheckMode["SkipContextSensitive"] = 4] = "SkipContextSensitive";
47396
47418
  CheckMode[CheckMode["SkipGenericFunctions"] = 8] = "SkipGenericFunctions";
47397
47419
  CheckMode[CheckMode["IsForSignatureHelp"] = 16] = "IsForSignatureHelp";
47398
- CheckMode[CheckMode["RestBindingElement"] = 32] = "RestBindingElement";
47420
+ CheckMode[CheckMode["IsForStringLiteralArgumentCompletions"] = 32] = "IsForStringLiteralArgumentCompletions";
47421
+ CheckMode[CheckMode["RestBindingElement"] = 64] = "RestBindingElement";
47399
47422
  // e.g. in `const { a, ...rest } = foo`, when checking the type of `foo` to determine the type of `rest`,
47400
47423
  // we need to preserve generic types instead of substituting them for constraints
47401
47424
  })(CheckMode || (CheckMode = {}));
@@ -47733,26 +47756,10 @@ var ts;
47733
47756
  if (!node) {
47734
47757
  return undefined;
47735
47758
  }
47736
- var containingCall = ts.findAncestor(node, ts.isCallLikeExpression);
47737
- var containingCallResolvedSignature = containingCall && getNodeLinks(containingCall).resolvedSignature;
47738
- if (contextFlags & 4 /* Completions */ && containingCall) {
47739
- var toMarkSkip = node;
47740
- do {
47741
- getNodeLinks(toMarkSkip).skipDirectInference = true;
47742
- toMarkSkip = toMarkSkip.parent;
47743
- } while (toMarkSkip && toMarkSkip !== containingCall);
47744
- getNodeLinks(containingCall).resolvedSignature = undefined;
47745
- }
47746
- var result = getContextualType(node, contextFlags);
47747
- if (contextFlags & 4 /* Completions */ && containingCall) {
47748
- var toMarkSkip = node;
47749
- do {
47750
- getNodeLinks(toMarkSkip).skipDirectInference = undefined;
47751
- toMarkSkip = toMarkSkip.parent;
47752
- } while (toMarkSkip && toMarkSkip !== containingCall);
47753
- getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
47759
+ if (contextFlags & 4 /* Completions */) {
47760
+ return runWithInferenceBlockedFromSourceNode(node, function () { return getContextualType(node, contextFlags); });
47754
47761
  }
47755
- return result;
47762
+ return getContextualType(node, contextFlags);
47756
47763
  },
47757
47764
  getContextualTypeForObjectLiteralElement: function (nodeIn) {
47758
47765
  var node = ts.getParseTreeNode(nodeIn, ts.isObjectLiteralElementLike);
@@ -47772,6 +47779,9 @@ var ts;
47772
47779
  getResolvedSignature: function (node, candidatesOutArray, argumentCount) {
47773
47780
  return getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, 0 /* Normal */);
47774
47781
  },
47782
+ getResolvedSignatureForStringLiteralCompletions: function (call, editingArgument, candidatesOutArray) {
47783
+ return getResolvedSignatureWorker(call, candidatesOutArray, /*argumentCount*/ undefined, 32 /* IsForStringLiteralArgumentCompletions */, editingArgument);
47784
+ },
47775
47785
  getResolvedSignatureForSignatureHelp: function (node, candidatesOutArray, argumentCount) {
47776
47786
  return getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, 16 /* IsForSignatureHelp */);
47777
47787
  },
@@ -47924,10 +47934,34 @@ var ts;
47924
47934
  getTypeOnlyAliasDeclaration: getTypeOnlyAliasDeclaration,
47925
47935
  getMemberOverrideModifierStatus: getMemberOverrideModifierStatus,
47926
47936
  };
47927
- function getResolvedSignatureWorker(nodeIn, candidatesOutArray, argumentCount, checkMode) {
47937
+ function runWithInferenceBlockedFromSourceNode(node, fn) {
47938
+ var containingCall = ts.findAncestor(node, ts.isCallLikeExpression);
47939
+ var containingCallResolvedSignature = containingCall && getNodeLinks(containingCall).resolvedSignature;
47940
+ if (containingCall) {
47941
+ var toMarkSkip = node;
47942
+ do {
47943
+ getNodeLinks(toMarkSkip).skipDirectInference = true;
47944
+ toMarkSkip = toMarkSkip.parent;
47945
+ } while (toMarkSkip && toMarkSkip !== containingCall);
47946
+ getNodeLinks(containingCall).resolvedSignature = undefined;
47947
+ }
47948
+ var result = fn();
47949
+ if (containingCall) {
47950
+ var toMarkSkip = node;
47951
+ do {
47952
+ getNodeLinks(toMarkSkip).skipDirectInference = undefined;
47953
+ toMarkSkip = toMarkSkip.parent;
47954
+ } while (toMarkSkip && toMarkSkip !== containingCall);
47955
+ getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
47956
+ }
47957
+ return result;
47958
+ }
47959
+ function getResolvedSignatureWorker(nodeIn, candidatesOutArray, argumentCount, checkMode, editingArgument) {
47928
47960
  var node = ts.getParseTreeNode(nodeIn, ts.isCallLikeExpression);
47929
47961
  apparentArgumentCount = argumentCount;
47930
- var res = node ? getResolvedSignature(node, candidatesOutArray, checkMode) : undefined;
47962
+ var res = !node ? undefined :
47963
+ editingArgument ? runWithInferenceBlockedFromSourceNode(editingArgument, function () { return getResolvedSignature(node, candidatesOutArray, checkMode); }) :
47964
+ getResolvedSignature(node, candidatesOutArray, checkMode);
47931
47965
  apparentArgumentCount = undefined;
47932
47966
  return res;
47933
47967
  }
@@ -52054,7 +52088,15 @@ var ts;
52054
52088
  if (!ts.nodeIsSynthesized(node) && ts.getParseTreeNode(node) === node) {
52055
52089
  return node;
52056
52090
  }
52057
- return ts.setTextRange(ts.factory.cloneNode(ts.visitEachChild(node, deepCloneOrReuseNode, ts.nullTransformationContext)), node);
52091
+ return ts.setTextRange(ts.factory.cloneNode(ts.visitEachChild(node, deepCloneOrReuseNode, ts.nullTransformationContext, deepCloneOrReuseNodes)), node);
52092
+ }
52093
+ function deepCloneOrReuseNodes(nodes, visitor, test, start, count) {
52094
+ if (nodes && nodes.length === 0) {
52095
+ // Ensure we explicitly make a copy of an empty array; visitNodes will not do this unless the array has elements,
52096
+ // which can lead to us reusing the same empty NodeArray more than once within the same AST during type noding.
52097
+ return ts.setTextRange(ts.factory.createNodeArray(/*nodes*/ undefined, nodes.hasTrailingComma), nodes);
52098
+ }
52099
+ return ts.visitNodes(nodes, visitor, test, start, count);
52058
52100
  }
52059
52101
  }
52060
52102
  function createTypeNodeFromObjectType(type) {
@@ -55061,7 +55103,7 @@ var ts;
55061
55103
  }
55062
55104
  /** Return the inferred type for a binding element */
55063
55105
  function getTypeForBindingElement(declaration) {
55064
- var checkMode = declaration.dotDotDotToken ? 32 /* RestBindingElement */ : 0 /* Normal */;
55106
+ var checkMode = declaration.dotDotDotToken ? 64 /* RestBindingElement */ : 0 /* Normal */;
55065
55107
  var parentType = getTypeForBindingElementParent(declaration.parent.parent, checkMode);
55066
55108
  return parentType && getBindingElementTypeFromParentType(declaration, parentType);
55067
55109
  }
@@ -68189,7 +68231,7 @@ var ts;
68189
68231
  for (var _i = 0, properties_3 = properties; _i < properties_3.length; _i++) {
68190
68232
  var targetProp = properties_3[_i];
68191
68233
  var sourceProp = getPropertyOfType(source, targetProp.escapedName);
68192
- if (sourceProp) {
68234
+ if (sourceProp && !ts.some(sourceProp.declarations, hasSkipDirectInferenceFlag)) {
68193
68235
  inferFromTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
68194
68236
  }
68195
68237
  }
@@ -70663,7 +70705,7 @@ var ts;
70663
70705
  // as we want the type of a rest element to be generic when possible.
70664
70706
  var contextualType = (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) &&
70665
70707
  !((ts.isJsxOpeningElement(node.parent) || ts.isJsxSelfClosingElement(node.parent)) && node.parent.tagName === node) &&
70666
- (checkMode && checkMode & 32 /* RestBindingElement */ ?
70708
+ (checkMode && checkMode & 64 /* RestBindingElement */ ?
70667
70709
  getContextualType(node, 8 /* SkipBindingPatterns */)
70668
70710
  : getContextualType(node));
70669
70711
  return contextualType && !isGenericType(contextualType);
@@ -70784,7 +70826,7 @@ var ts;
70784
70826
  if (func.parameters.length >= 2 && isContextSensitiveFunctionOrObjectLiteralMethod(func)) {
70785
70827
  var contextualSignature = getContextualSignature(func);
70786
70828
  if (contextualSignature && contextualSignature.parameters.length === 1 && signatureHasRestParameter(contextualSignature)) {
70787
- var restType = getTypeOfSymbol(contextualSignature.parameters[0]);
70829
+ var restType = getReducedApparentType(getTypeOfSymbol(contextualSignature.parameters[0]));
70788
70830
  if (restType.flags & 1048576 /* Union */ && everyType(restType, isTupleType) && !isSymbolAssigned(symbol)) {
70789
70831
  var narrowedType = getFlowTypeOfReference(func, restType, restType, /*flowContainer*/ undefined, location.flowNode);
70790
70832
  var index = func.parameters.indexOf(declaration) - (ts.getThisParameter(func) ? 1 : 0);
@@ -71602,7 +71644,7 @@ var ts;
71602
71644
  var parent = declaration.parent.parent;
71603
71645
  var name = declaration.propertyName || declaration.name;
71604
71646
  var parentType = getContextualTypeForVariableLikeDeclaration(parent) ||
71605
- parent.kind !== 203 /* BindingElement */ && parent.initializer && checkDeclarationInitializer(parent, declaration.dotDotDotToken ? 32 /* RestBindingElement */ : 0 /* Normal */);
71647
+ parent.kind !== 203 /* BindingElement */ && parent.initializer && checkDeclarationInitializer(parent, declaration.dotDotDotToken ? 64 /* RestBindingElement */ : 0 /* Normal */);
71606
71648
  if (!parentType || ts.isBindingPattern(name) || ts.isComputedNonLiteralName(name))
71607
71649
  return undefined;
71608
71650
  if (parent.name.kind === 202 /* ArrayBindingPattern */) {
@@ -72089,9 +72131,14 @@ var ts;
72089
72131
  return instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper);
72090
72132
  }
72091
72133
  // For other purposes (e.g. determining whether to produce literal types) we only
72092
- // incorporate inferences made from the return type in a function call.
72134
+ // incorporate inferences made from the return type in a function call. We remove
72135
+ // the 'boolean' type from the contextual type such that contextually typed boolean
72136
+ // literals actually end up widening to 'boolean' (see #48363).
72093
72137
  if (inferenceContext.returnMapper) {
72094
- return instantiateInstantiableTypes(contextualType, inferenceContext.returnMapper);
72138
+ var type = instantiateInstantiableTypes(contextualType, inferenceContext.returnMapper);
72139
+ return type.flags & 1048576 /* Union */ && containsType(type.types, regularFalseType) && containsType(type.types, regularTrueType) ?
72140
+ filterType(type, function (t) { return t !== regularFalseType && t !== regularTrueType; }) :
72141
+ type;
72095
72142
  }
72096
72143
  }
72097
72144
  }
@@ -74656,7 +74703,7 @@ var ts;
74656
74703
  }
74657
74704
  for (var i = 0; i < argCount; i++) {
74658
74705
  var arg = args[i];
74659
- if (arg.kind !== 227 /* OmittedExpression */) {
74706
+ if (arg.kind !== 227 /* OmittedExpression */ && !(checkMode & 32 /* IsForStringLiteralArgumentCompletions */ && hasSkipDirectInferenceFlag(arg))) {
74660
74707
  var paramType = getTypeAtPosition(signature, i);
74661
74708
  var argType = checkExpressionWithContextualType(arg, paramType, context, checkMode);
74662
74709
  inferTypes(context.inferences, argType, paramType);
@@ -75341,7 +75388,7 @@ var ts;
75341
75388
  }
75342
75389
  }
75343
75390
  }
75344
- return getCandidateForOverloadFailure(node, candidates, args, !!candidatesOutArray);
75391
+ return getCandidateForOverloadFailure(node, candidates, args, !!candidatesOutArray, checkMode);
75345
75392
  function addImplementationSuccessElaboration(failed, diagnostic) {
75346
75393
  var _a, _b;
75347
75394
  var oldCandidatesForArgumentError = candidatesForArgumentError;
@@ -75442,14 +75489,14 @@ var ts;
75442
75489
  }
75443
75490
  }
75444
75491
  // No signature was applicable. We have already reported the errors for the invalid signature.
75445
- function getCandidateForOverloadFailure(node, candidates, args, hasCandidatesOutArray) {
75492
+ function getCandidateForOverloadFailure(node, candidates, args, hasCandidatesOutArray, checkMode) {
75446
75493
  ts.Debug.assert(candidates.length > 0); // Else should not have called this.
75447
75494
  checkNodeDeferred(node);
75448
75495
  // Normally we will combine overloads. Skip this if they have type parameters since that's hard to combine.
75449
75496
  // Don't do this if there is a `candidatesOutArray`,
75450
75497
  // because then we want the chosen best candidate to be one of the overloads, not a combination.
75451
75498
  return hasCandidatesOutArray || candidates.length === 1 || candidates.some(function (c) { return !!c.typeParameters; })
75452
- ? pickLongestCandidateSignature(node, candidates, args)
75499
+ ? pickLongestCandidateSignature(node, candidates, args, checkMode)
75453
75500
  : createUnionOfSignaturesForOverloadFailure(candidates);
75454
75501
  }
75455
75502
  function createUnionOfSignaturesForOverloadFailure(candidates) {
@@ -75497,7 +75544,7 @@ var ts;
75497
75544
  // This function is currently only used for erroneous overloads, so it's good enough to just use the first source.
75498
75545
  return createSymbolWithType(ts.first(sources), type);
75499
75546
  }
75500
- function pickLongestCandidateSignature(node, candidates, args) {
75547
+ function pickLongestCandidateSignature(node, candidates, args, checkMode) {
75501
75548
  // Pick the longest signature. This way we can get a contextual type for cases like:
75502
75549
  // declare function f(a: { xa: number; xb: number; }, b: number);
75503
75550
  // f({ |
@@ -75513,7 +75560,7 @@ var ts;
75513
75560
  var typeArgumentNodes = callLikeExpressionMayHaveTypeArguments(node) ? node.typeArguments : undefined;
75514
75561
  var instantiated = typeArgumentNodes
75515
75562
  ? createSignatureInstantiation(candidate, getTypeArgumentsFromNodes(typeArgumentNodes, typeParameters, ts.isInJSFile(node)))
75516
- : inferSignatureInstantiationForOverloadFailure(node, typeParameters, candidate, args);
75563
+ : inferSignatureInstantiationForOverloadFailure(node, typeParameters, candidate, args, checkMode);
75517
75564
  candidates[bestIndex] = instantiated;
75518
75565
  return instantiated;
75519
75566
  }
@@ -75527,9 +75574,9 @@ var ts;
75527
75574
  }
75528
75575
  return typeArguments;
75529
75576
  }
75530
- function inferSignatureInstantiationForOverloadFailure(node, typeParameters, candidate, args) {
75577
+ function inferSignatureInstantiationForOverloadFailure(node, typeParameters, candidate, args, checkMode) {
75531
75578
  var inferenceContext = createInferenceContext(typeParameters, candidate, /*flags*/ ts.isInJSFile(node) ? 2 /* AnyDefault */ : 0 /* None */);
75532
- var typeArgumentTypes = inferTypeArguments(node, candidate, args, 4 /* SkipContextSensitive */ | 8 /* SkipGenericFunctions */, inferenceContext);
75579
+ var typeArgumentTypes = inferTypeArguments(node, candidate, args, checkMode | 4 /* SkipContextSensitive */ | 8 /* SkipGenericFunctions */, inferenceContext);
75533
75580
  return createSignatureInstantiation(candidate, typeArgumentTypes);
75534
75581
  }
75535
75582
  function getLongestCandidateIndex(candidates, argsCount) {
@@ -81595,7 +81642,7 @@ var ts;
81595
81642
  }
81596
81643
  // check private/protected variable access
81597
81644
  var parent = node.parent.parent;
81598
- var parentCheckMode = node.dotDotDotToken ? 32 /* RestBindingElement */ : 0 /* Normal */;
81645
+ var parentCheckMode = node.dotDotDotToken ? 64 /* RestBindingElement */ : 0 /* Normal */;
81599
81646
  var parentType = getTypeForBindingElementParent(parent, parentCheckMode);
81600
81647
  var name = node.propertyName || node.name;
81601
81648
  if (parentType && !ts.isBindingPattern(name)) {
@@ -111100,6 +111147,7 @@ var ts;
111100
111147
  writeLine();
111101
111148
  decreaseIndent();
111102
111149
  }
111150
+ emitList(node, node.members, 2 /* PreserveLines */);
111103
111151
  writePunctuation("}");
111104
111152
  }
111105
111153
  function emitLiteralType(node) {
@@ -116693,6 +116741,13 @@ var ts;
116693
116741
  return "skip";
116694
116742
  }
116695
116743
  break;
116744
+ case 270 /* ImportSpecifier */:
116745
+ case 275 /* ExportSpecifier */:
116746
+ if (node.isTypeOnly) {
116747
+ diagnostics.push(createDiagnosticForNode(node, ts.Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, ts.isImportSpecifier(node) ? "import...type" : "export...type"));
116748
+ return "skip";
116749
+ }
116750
+ break;
116696
116751
  case 265 /* ImportEqualsDeclaration */:
116697
116752
  diagnostics.push(createDiagnosticForNode(node, ts.Diagnostics.import_can_only_be_used_in_TypeScript_files));
116698
116753
  return "skip";
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.7.0-dev.20220329",
5
+ "version": "4.7.0-dev.20220401",
6
6
  "license": "Apache-2.0",
7
7
  "description": "TypeScript is a language for application scale JavaScript development",
8
8
  "keywords": [