mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
Adds project init
This commit is contained in:
parent
e3d3cc920f
commit
38f4c2dc8d
20
Jakefile.js
20
Jakefile.js
@ -141,7 +141,9 @@ var harnessSources = harnessCoreSources.concat([
|
||||
"session.ts",
|
||||
"versionCache.ts",
|
||||
"convertToBase64.ts",
|
||||
"transpile.ts"
|
||||
"transpile.ts",
|
||||
"projectInit.ts",
|
||||
"jsonWithCommentsAndTrailingCommas.ts"
|
||||
].map(function (f) {
|
||||
return path.join(unittestsDirectory, f);
|
||||
})).concat([
|
||||
@ -339,10 +341,10 @@ file(diagnosticInfoMapTs, [processDiagnosticMessagesJs, diagnosticMessagesJson],
|
||||
complete();
|
||||
});
|
||||
ex.run();
|
||||
}, {async: true});
|
||||
}, {async: true});
|
||||
|
||||
desc("Generates a diagnostic file in TypeScript based on an input JSON file");
|
||||
task("generate-diagnostics", [diagnosticInfoMapTs]);
|
||||
task("generate-diagnostics", [diagnosticInfoMapTs]);
|
||||
|
||||
|
||||
// Publish nightly
|
||||
@ -479,11 +481,11 @@ file(specMd, [word2mdJs, specWord], function () {
|
||||
child_process.exec(cmd, function () {
|
||||
complete();
|
||||
});
|
||||
}, {async: true});
|
||||
}, {async: true});
|
||||
|
||||
|
||||
desc("Generates a Markdown version of the Language Specification");
|
||||
task("generate-spec", [specMd]);
|
||||
task("generate-spec", [specMd]);
|
||||
|
||||
|
||||
// Makes a new LKG. This target does not build anything, but errors if not all the outputs are present in the built/local directory
|
||||
@ -615,7 +617,7 @@ task("runtests", ["tests", builtLocalDirectory], function() {
|
||||
exec(cmd, deleteTemporaryProjectOutput);
|
||||
}, {async: true});
|
||||
|
||||
desc("Generates code coverage data via instanbul");
|
||||
desc("Generates code coverage data via instanbul");
|
||||
task("generate-code-coverage", ["tests", builtLocalDirectory], function () {
|
||||
var cmd = 'istanbul cover node_modules/mocha/bin/_mocha -- -R min -t ' + testTimeout + ' ' + run;
|
||||
console.log(cmd);
|
||||
@ -658,7 +660,7 @@ task("runtests-browser", ["tests", "browserify", builtLocalDirectory], function(
|
||||
function getDiffTool() {
|
||||
var program = process.env['DIFF']
|
||||
if (!program) {
|
||||
fail("Add the 'DIFF' environment variable to the path of the program you want to use.");
|
||||
fail("Add the 'DIFF' environment variable to the path of the program you want to use.");
|
||||
}
|
||||
return program;
|
||||
}
|
||||
@ -667,14 +669,14 @@ function getDiffTool() {
|
||||
desc("Diffs the compiler baselines using the diff tool specified by the 'DIFF' environment variable");
|
||||
task('diff', function () {
|
||||
var cmd = '"' + getDiffTool() + '" ' + refBaseline + ' ' + localBaseline;
|
||||
console.log(cmd);
|
||||
console.log(cmd);
|
||||
exec(cmd);
|
||||
}, {async: true});
|
||||
|
||||
desc("Diffs the RWC baselines using the diff tool specified by the 'DIFF' environment variable");
|
||||
task('diff-rwc', function () {
|
||||
var cmd = '"' + getDiffTool() + '" ' + refRwcBaseline + ' ' + localRwcBaseline;
|
||||
console.log(cmd);
|
||||
console.log(cmd);
|
||||
exec(cmd);
|
||||
}, {async: true});
|
||||
|
||||
|
||||
@ -30,6 +30,11 @@ namespace ts {
|
||||
type: "boolean",
|
||||
description: Diagnostics.Print_this_message,
|
||||
},
|
||||
{
|
||||
name: "init",
|
||||
type: "boolean",
|
||||
description: Diagnostics.Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file,
|
||||
},
|
||||
{
|
||||
name: "inlineSourceMap",
|
||||
type: "boolean",
|
||||
@ -221,19 +226,36 @@ namespace ts {
|
||||
}
|
||||
];
|
||||
|
||||
export function parseCommandLine(commandLine: string[]): ParsedCommandLine {
|
||||
let options: CompilerOptions = {};
|
||||
let fileNames: string[] = [];
|
||||
let errors: Diagnostic[] = [];
|
||||
let shortOptionNames: Map<string> = {};
|
||||
let optionNameMap: Map<CommandLineOption> = {};
|
||||
export interface OptionNameMap {
|
||||
optionNameMap: Map<CommandLineOption>;
|
||||
shortOptionNames: Map<string>;
|
||||
}
|
||||
|
||||
let optionNameMapCache: OptionNameMap;
|
||||
export function getOptionNameMap(): OptionNameMap {
|
||||
if (optionNameMapCache) {
|
||||
return optionNameMapCache;
|
||||
}
|
||||
|
||||
let optionNameMap: Map<CommandLineOption> = {};
|
||||
let shortOptionNames: Map<string> = {};
|
||||
forEach(optionDeclarations, option => {
|
||||
optionNameMap[option.name.toLowerCase()] = option;
|
||||
if (option.shortName) {
|
||||
shortOptionNames[option.shortName] = option.name;
|
||||
}
|
||||
});
|
||||
|
||||
optionNameMapCache = { optionNameMap, shortOptionNames };
|
||||
return optionNameMapCache;
|
||||
}
|
||||
|
||||
export function parseCommandLine(commandLine: string[]): ParsedCommandLine {
|
||||
let options: CompilerOptions = {};
|
||||
let fileNames: string[] = [];
|
||||
let errors: Diagnostic[] = [];
|
||||
let { optionNameMap, shortOptionNames } = getOptionNameMap();
|
||||
|
||||
parseStrings(commandLine);
|
||||
return {
|
||||
options,
|
||||
@ -345,6 +367,107 @@ namespace ts {
|
||||
return parseConfigFileText(fileName, text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove whitespace, comments and trailing commas from JSON text.
|
||||
* @param text JSON text string.
|
||||
*/
|
||||
function stripJsonTrivia(text: string): string {
|
||||
let ch: number;
|
||||
let pos = 0;
|
||||
let end = text.length - 1;
|
||||
let result = '';
|
||||
let pendingCommaInsertion = false;
|
||||
|
||||
while (pos <= end) {
|
||||
ch = text.charCodeAt(pos);
|
||||
|
||||
if(isWhiteSpace(ch) || isLineBreak(ch)) {
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(ch === CharacterCodes.slash) {
|
||||
if (text.charCodeAt(pos + 1) === CharacterCodes.slash) {
|
||||
pos += 2;
|
||||
|
||||
while (pos <= end) {
|
||||
if (isLineBreak(text.charCodeAt(pos))) {
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (text.charCodeAt(pos + 1) === CharacterCodes.asterisk) {
|
||||
pos += 2;
|
||||
|
||||
while (pos <= end) {
|
||||
ch = text.charCodeAt(pos);
|
||||
|
||||
if (ch === CharacterCodes.asterisk &&
|
||||
text.charCodeAt(pos + 1) === CharacterCodes.slash) {
|
||||
|
||||
pos += 2;
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (pendingCommaInsertion) {
|
||||
if (ch !== CharacterCodes.closeBracket &&
|
||||
ch !== CharacterCodes.closeBrace) {
|
||||
|
||||
result += ',';
|
||||
}
|
||||
pendingCommaInsertion = false;
|
||||
}
|
||||
|
||||
switch (ch) {
|
||||
case CharacterCodes.comma:
|
||||
pendingCommaInsertion = true;
|
||||
break;
|
||||
|
||||
case CharacterCodes.doubleQuote:
|
||||
result += text[pos];
|
||||
pos++;
|
||||
|
||||
while (pos <= end) {
|
||||
ch = text.charCodeAt(pos);
|
||||
if (ch === CharacterCodes.backslash) {
|
||||
switch (text.charCodeAt(pos + 1)) {
|
||||
case CharacterCodes.doubleQuote:
|
||||
result += "\\\"";
|
||||
pos += 2;
|
||||
continue;
|
||||
case CharacterCodes.backslash:
|
||||
result += "\\\\";
|
||||
pos += 2;
|
||||
continue;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
result += text[pos];
|
||||
|
||||
if (ch === CharacterCodes.doubleQuote) {
|
||||
break;
|
||||
}
|
||||
|
||||
pos++;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
result += text[pos];
|
||||
}
|
||||
|
||||
pos++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the text of the tsconfig.json file
|
||||
* @param fileName The path to the config file
|
||||
@ -352,6 +475,7 @@ namespace ts {
|
||||
*/
|
||||
export function parseConfigFileText(fileName: string, jsonText: string): { config?: any; error?: Diagnostic } {
|
||||
try {
|
||||
jsonText = stripJsonTrivia(jsonText);
|
||||
return { config: /\S/.test(jsonText) ? JSON.parse(jsonText) : {} };
|
||||
}
|
||||
catch (e) {
|
||||
@ -425,7 +549,7 @@ namespace ts {
|
||||
}
|
||||
else {
|
||||
let exclude = json["exclude"] instanceof Array ? map(<string[]>json["exclude"], normalizeSlashes) : undefined;
|
||||
let sysFiles = host.readDirectory(basePath, ".ts", exclude).concat(host.readDirectory(basePath, ".tsx", exclude));
|
||||
let sysFiles = host.readDirectory(basePath, ".ts", exclude).concat(host.readDirectory(basePath, ".tsx", exclude));
|
||||
for (let i = 0; i < sysFiles.length; i++) {
|
||||
let name = sysFiles[i];
|
||||
if (fileExtensionIs(name, ".d.ts")) {
|
||||
|
||||
@ -517,6 +517,7 @@ namespace ts {
|
||||
Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5049, category: DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'." },
|
||||
Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5050, category: DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified with option 'inlineSourceMap'." },
|
||||
Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: { code: 5051, category: DiagnosticCategory.Error, key: "Option 'inlineSources' can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided." },
|
||||
You_already_have_a_tsconfig_json_file_defined: { code: 5052, category: DiagnosticCategory.Error, key: "You already have a tsconfig.json file defined." },
|
||||
Concatenate_and_emit_output_to_single_file: { code: 6001, category: DiagnosticCategory.Message, key: "Concatenate and emit output to single file." },
|
||||
Generates_corresponding_d_ts_file: { code: 6002, category: DiagnosticCategory.Message, key: "Generates corresponding '.d.ts' file." },
|
||||
Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: { code: 6003, category: DiagnosticCategory.Message, key: "Specifies the location where debugger should locate map files instead of generated locations." },
|
||||
@ -572,6 +573,7 @@ namespace ts {
|
||||
Enables_experimental_support_for_emitting_type_metadata_for_decorators: { code: 6066, category: DiagnosticCategory.Message, key: "Enables experimental support for emitting type metadata for decorators." },
|
||||
Option_experimentalAsyncFunctions_cannot_be_specified_when_targeting_ES5_or_lower: { code: 6067, category: DiagnosticCategory.Message, key: "Option 'experimentalAsyncFunctions' cannot be specified when targeting ES5 or lower." },
|
||||
Enables_experimental_support_for_ES7_async_functions: { code: 6068, category: DiagnosticCategory.Message, key: "Enables experimental support for ES7 async functions." },
|
||||
Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file: { code: 6069, category: DiagnosticCategory.Message, key: "Initializes a TypeScript project and creates a tsconfig.json file." },
|
||||
Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
|
||||
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
|
||||
Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
|
||||
|
||||
@ -161,7 +161,7 @@
|
||||
},
|
||||
"Type '{0}' is not a valid async function return type.": {
|
||||
"category": "Error",
|
||||
"code": 1055
|
||||
"code": 1055
|
||||
},
|
||||
"Accessors are only available when targeting ECMAScript 5 and higher.": {
|
||||
"category": "Error",
|
||||
@ -2057,6 +2057,10 @@
|
||||
"category": "Error",
|
||||
"code": 5051
|
||||
},
|
||||
"You already have a tsconfig.json file defined.": {
|
||||
"category": "Error",
|
||||
"code": 5052
|
||||
},
|
||||
|
||||
"Concatenate and emit output to single file.": {
|
||||
"category": "Message",
|
||||
@ -2278,6 +2282,10 @@
|
||||
"category": "Message",
|
||||
"code": 6068
|
||||
},
|
||||
"Initializes a TypeScript project and creates a tsconfig.json file.": {
|
||||
"category": "Message",
|
||||
"code": 6069
|
||||
},
|
||||
|
||||
"Variable '{0}' implicitly has an '{1}' type.": {
|
||||
"category": "Error",
|
||||
|
||||
@ -3,6 +3,190 @@
|
||||
|
||||
/* @internal */
|
||||
namespace ts {
|
||||
export const defaultInitCompilerOptions: CompilerOptions = {
|
||||
module: ModuleKind.CommonJS,
|
||||
target: ScriptTarget.ES3,
|
||||
noImplicitAny: true,
|
||||
outDir: "built",
|
||||
rootDir: ".",
|
||||
sourceMap: false,
|
||||
}
|
||||
|
||||
export function buildConfigFile(writer: EmitTextWriter, compilerOptions: CompilerOptions, fileNames?: string[], excludes?: string[]) {
|
||||
compilerOptions = extend(compilerOptions, defaultInitCompilerOptions);
|
||||
let { write, writeLine, increaseIndent, decreaseIndent } = writer;
|
||||
let { optionNameMap } = getOptionNameMap();
|
||||
writeTsConfigDotJsonFile();
|
||||
|
||||
function writeTsConfigDotJsonFile() {
|
||||
write("{");
|
||||
writeLine();
|
||||
increaseIndent();
|
||||
writeCompilerOptions();
|
||||
if (fileNames) {
|
||||
write(",");
|
||||
writeLine();
|
||||
writeFileNames();
|
||||
}
|
||||
if (excludes) {
|
||||
write(",");
|
||||
writeLine();
|
||||
writeExcludeOptions();
|
||||
}
|
||||
writeLine();
|
||||
decreaseIndent();
|
||||
write("}");
|
||||
}
|
||||
|
||||
function writeCompilerOptions() {
|
||||
write(`"compilerOptions": {`);
|
||||
writeLine();
|
||||
increaseIndent();
|
||||
|
||||
for (var option in compilerOptions) {
|
||||
switch (option) {
|
||||
case "init":
|
||||
case "watch":
|
||||
case "help":
|
||||
case "version":
|
||||
continue;
|
||||
|
||||
case "module":
|
||||
case "target":
|
||||
case "newLine":
|
||||
writeComplexCompilerOption(option);
|
||||
break;
|
||||
|
||||
default:
|
||||
writeSimpleCompilerOption(option);
|
||||
}
|
||||
}
|
||||
|
||||
decreaseIndent();
|
||||
write("}");
|
||||
}
|
||||
|
||||
function writeOptionalOptionDescription(option: string) {
|
||||
option = option.toLowerCase();
|
||||
if (optionNameMap[option].description &&
|
||||
optionNameMap[option].description.key) {
|
||||
|
||||
write(`// ${optionNameMap[option].description.key}`);
|
||||
writeLine();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write simple compiler option. A simple compiler option is an option
|
||||
* with boolean or non string set value.
|
||||
*/
|
||||
function writeSimpleCompilerOption(option: string) {
|
||||
writeOptionalOptionDescription(option);
|
||||
|
||||
write(`"${option}": `);
|
||||
if (typeof compilerOptions[option] === "string") {
|
||||
write(`"${compilerOptions[option]}",`);
|
||||
writeLine();
|
||||
}
|
||||
else {
|
||||
if (compilerOptions[option]) {
|
||||
write("true,");
|
||||
}
|
||||
else {
|
||||
write("false,");
|
||||
}
|
||||
writeLine();
|
||||
}
|
||||
}
|
||||
|
||||
function writeComplexCompilerOption(option: string) {
|
||||
writeOptionalOptionDescription(option);
|
||||
|
||||
outer: switch (option) {
|
||||
case "module":
|
||||
var moduleValue: string;
|
||||
switch (compilerOptions.module) {
|
||||
case ModuleKind.None:
|
||||
break outer;
|
||||
case ModuleKind.CommonJS:
|
||||
moduleValue = "commonjs";
|
||||
break;
|
||||
case ModuleKind.System:
|
||||
moduleValue = "system";
|
||||
break;
|
||||
case ModuleKind.UMD:
|
||||
moduleValue = "umd";
|
||||
break;
|
||||
default:
|
||||
moduleValue = "amd";
|
||||
break;
|
||||
}
|
||||
write(`"module": "${moduleValue}",`);
|
||||
writeLine();
|
||||
break;
|
||||
|
||||
case "target":
|
||||
var targetValue: string;
|
||||
switch (compilerOptions.target) {
|
||||
case ScriptTarget.ES5:
|
||||
targetValue = "es5";
|
||||
break;
|
||||
case ScriptTarget.ES6:
|
||||
targetValue = "es6";
|
||||
break;
|
||||
default:
|
||||
targetValue = "es3";
|
||||
break;
|
||||
}
|
||||
write(`"target": "${targetValue}",`);
|
||||
writeLine();
|
||||
break;
|
||||
|
||||
case "newLine":
|
||||
var newlineValue: string;
|
||||
switch (compilerOptions.newLine) {
|
||||
case NewLineKind.CarriageReturnLineFeed:
|
||||
newlineValue = "CRLF";
|
||||
break;
|
||||
default:
|
||||
newlineValue = "LF";
|
||||
break;
|
||||
}
|
||||
write(`"newLine": "${newlineValue}",`);
|
||||
writeLine();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function writeFileNames() {
|
||||
write(`"files": [`);
|
||||
writeLine();
|
||||
increaseIndent();
|
||||
|
||||
for (let fileName of fileNames) {
|
||||
write(`"${fileName}",`);
|
||||
writeLine();
|
||||
}
|
||||
|
||||
decreaseIndent();
|
||||
write("]");
|
||||
}
|
||||
|
||||
function writeExcludeOptions() {
|
||||
write(`"exclude": [`);
|
||||
writeLine();
|
||||
increaseIndent();
|
||||
|
||||
for (let exclude of excludes) {
|
||||
write(`"${exclude}",`);
|
||||
writeLine();
|
||||
}
|
||||
|
||||
decreaseIndent();
|
||||
write("]");
|
||||
}
|
||||
}
|
||||
|
||||
export function isExternalModuleOrDeclarationFile(sourceFile: SourceFile) {
|
||||
return isExternalModule(sourceFile) || isDeclarationFile(sourceFile);
|
||||
}
|
||||
@ -124,11 +308,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
|
||||
function emitJavaScript(jsFilePath: string, root?: SourceFile) {
|
||||
let writer = createTextWriter(newLine);
|
||||
let write = writer.write;
|
||||
let writeTextOfNode = writer.writeTextOfNode;
|
||||
let writeLine = writer.writeLine;
|
||||
let increaseIndent = writer.increaseIndent;
|
||||
let decreaseIndent = writer.decreaseIndent;
|
||||
let { write, writeTextOfNode, writeLine, increaseIndent, decreaseIndent } = writer;
|
||||
|
||||
let currentSourceFile: SourceFile;
|
||||
// name of an exporter function if file is a System external module
|
||||
@ -2070,7 +2250,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
emit(node.name);
|
||||
decreaseIndentIf(indentedBeforeDot, indentedAfterDot);
|
||||
}
|
||||
|
||||
|
||||
function emitQualifiedName(node: QualifiedName) {
|
||||
emit(node.left);
|
||||
write(".");
|
||||
@ -2093,12 +2273,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
else {
|
||||
emitEntityNameAsExpression(node.left, /*useFallback*/ false);
|
||||
}
|
||||
|
||||
|
||||
write(".");
|
||||
emitNodeWithoutSourceMap(node.right);
|
||||
}
|
||||
|
||||
function emitEntityNameAsExpression(node: EntityName, useFallback: boolean) {
|
||||
|
||||
function emitEntityNameAsExpression(node: EntityName, useFallback: boolean) {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.Identifier:
|
||||
if (useFallback) {
|
||||
@ -2106,10 +2286,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
emitExpressionIdentifier(<Identifier>node);
|
||||
write(" !== 'undefined' && ");
|
||||
}
|
||||
|
||||
|
||||
emitExpressionIdentifier(<Identifier>node);
|
||||
break;
|
||||
|
||||
|
||||
case SyntaxKind.QualifiedName:
|
||||
emitQualifiedNameAsExpression(<QualifiedName>node, useFallback);
|
||||
break;
|
||||
@ -3020,7 +3200,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
if (compilerOptions.module === ModuleKind.CommonJS || compilerOptions.module === ModuleKind.AMD || compilerOptions.module === ModuleKind.UMD) {
|
||||
if (!currentSourceFile.symbol.exports["___esModule"]) {
|
||||
if (languageVersion === ScriptTarget.ES5) {
|
||||
// default value of configurable, enumerable, writable are `false`.
|
||||
// default value of configurable, enumerable, writable are `false`.
|
||||
write("Object.defineProperty(exports, \"__esModule\", { value: true });");
|
||||
writeLine();
|
||||
}
|
||||
@ -4250,7 +4430,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
if (ctor) {
|
||||
// Emit all the directive prologues (like "use strict"). These have to come before
|
||||
// any other preamble code we write (like parameter initializers).
|
||||
startIndex = emitDirectivePrologues(ctor.body.statements, /*startWithNewLine*/ true);
|
||||
startIndex = emitDirectivePrologues(ctor.body.statements, /*startWithNewLine*/ true);
|
||||
emitDetachedComments(ctor.body.statements);
|
||||
}
|
||||
emitCaptureThisForNodeIfNecessary(node);
|
||||
@ -4821,7 +5001,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/** Serializes the type of a declaration to an appropriate JS constructor value. Used by the __metadata decorator for a class member. */
|
||||
function emitSerializedTypeOfNode(node: Node) {
|
||||
// serialization of the type of a declaration uses the following rules:
|
||||
@ -4832,39 +5012,39 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
// * The serialized type of an AccessorDeclaration is the serialized type of the return type annotation of its getter or parameter type annotation of its setter.
|
||||
// * The serialized type of any other FunctionLikeDeclaration is "Function".
|
||||
// * The serialized type of any other node is "void 0".
|
||||
//
|
||||
//
|
||||
// For rules on serializing type annotations, see `serializeTypeNode`.
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.ClassDeclaration:
|
||||
write("Function");
|
||||
return;
|
||||
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
emitSerializedTypeNode((<PropertyDeclaration>node).type);
|
||||
return;
|
||||
|
||||
case SyntaxKind.Parameter:
|
||||
|
||||
case SyntaxKind.Parameter:
|
||||
emitSerializedTypeNode((<ParameterDeclaration>node).type);
|
||||
return;
|
||||
|
||||
case SyntaxKind.GetAccessor:
|
||||
|
||||
case SyntaxKind.GetAccessor:
|
||||
emitSerializedTypeNode((<AccessorDeclaration>node).type);
|
||||
return;
|
||||
|
||||
case SyntaxKind.SetAccessor:
|
||||
|
||||
case SyntaxKind.SetAccessor:
|
||||
emitSerializedTypeNode(getSetAccessorTypeAnnotationNode(<AccessorDeclaration>node));
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (isFunctionLike(node)) {
|
||||
write("Function");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
write("void 0");
|
||||
}
|
||||
|
||||
|
||||
function emitSerializedTypeNode(node: TypeNode) {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.VoidKeyword:
|
||||
@ -4874,17 +5054,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
case SyntaxKind.ParenthesizedType:
|
||||
emitSerializedTypeNode((<ParenthesizedTypeNode>node).type);
|
||||
return;
|
||||
|
||||
|
||||
case SyntaxKind.FunctionType:
|
||||
case SyntaxKind.ConstructorType:
|
||||
write("Function");
|
||||
return;
|
||||
|
||||
|
||||
case SyntaxKind.ArrayType:
|
||||
case SyntaxKind.TupleType:
|
||||
write("Array");
|
||||
return;
|
||||
|
||||
|
||||
case SyntaxKind.TypePredicate:
|
||||
case SyntaxKind.BooleanKeyword:
|
||||
write("Boolean");
|
||||
@ -4894,11 +5074,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
case SyntaxKind.StringLiteral:
|
||||
write("String");
|
||||
return;
|
||||
|
||||
|
||||
case SyntaxKind.NumberKeyword:
|
||||
write("Number");
|
||||
return;
|
||||
|
||||
|
||||
case SyntaxKind.SymbolKeyword:
|
||||
write("Symbol");
|
||||
return;
|
||||
@ -4906,22 +5086,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
case SyntaxKind.TypeReference:
|
||||
emitSerializedTypeReferenceNode(<TypeReferenceNode>node);
|
||||
return;
|
||||
|
||||
|
||||
case SyntaxKind.TypeQuery:
|
||||
case SyntaxKind.TypeLiteral:
|
||||
case SyntaxKind.UnionType:
|
||||
case SyntaxKind.IntersectionType:
|
||||
case SyntaxKind.AnyKeyword:
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
Debug.fail("Cannot serialize unexpected type node.");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
write("Object");
|
||||
}
|
||||
|
||||
|
||||
/** Serializes a TypeReferenceNode to an appropriate JS constructor value. Used by the __metadata decorator. */
|
||||
function emitSerializedTypeReferenceNode(node: TypeReferenceNode) {
|
||||
let typeName = node.typeName;
|
||||
@ -4941,27 +5121,27 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
case TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue:
|
||||
emitEntityNameAsExpression(typeName, /*useFallback*/ false);
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.VoidType:
|
||||
write("void 0");
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.BooleanType:
|
||||
write("Boolean");
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.NumberLikeType:
|
||||
write("Number");
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.StringLikeType:
|
||||
write("String");
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.ArrayLikeType:
|
||||
write("Array");
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.ESSymbolType:
|
||||
if (languageVersion < ScriptTarget.ES6) {
|
||||
write("typeof Symbol === 'function' ? Symbol : Object");
|
||||
@ -4970,24 +5150,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
write("Symbol");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.TypeWithCallSignature:
|
||||
write("Function");
|
||||
break;
|
||||
|
||||
|
||||
case TypeReferenceSerializationKind.ObjectType:
|
||||
write("Object");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Serializes the parameter types of a function or the constructor of a class. Used by the __metadata decorator for a method or set accessor. */
|
||||
function emitSerializedParameterTypesOfNode(node: Node) {
|
||||
// serialization of parameter types uses the following rules:
|
||||
//
|
||||
// * If the declaration is a class, the parameters of the first constructor with a body are used.
|
||||
// * If the declaration is function-like and has a body, the parameters of the function are used.
|
||||
//
|
||||
//
|
||||
// For the rules on serializing the type of each parameter declaration, see `serializeTypeOfDeclaration`.
|
||||
if (node) {
|
||||
var valueDeclaration: FunctionLikeDeclaration;
|
||||
@ -4997,7 +5177,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
else if (isFunctionLike(node) && nodeIsPresent((<FunctionLikeDeclaration>node).body)) {
|
||||
valueDeclaration = <FunctionLikeDeclaration>node;
|
||||
}
|
||||
|
||||
|
||||
if (valueDeclaration) {
|
||||
var parameters = valueDeclaration.parameters;
|
||||
var parameterCount = parameters.length;
|
||||
@ -5006,7 +5186,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
if (i > 0) {
|
||||
write(", ");
|
||||
}
|
||||
|
||||
|
||||
if (parameters[i].dotDotDotToken) {
|
||||
var parameterType = parameters[i].type;
|
||||
if (parameterType.kind === SyntaxKind.ArrayType) {
|
||||
@ -5018,7 +5198,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
else {
|
||||
parameterType = undefined;
|
||||
}
|
||||
|
||||
|
||||
emitSerializedTypeNode(parameterType);
|
||||
}
|
||||
else {
|
||||
@ -5029,18 +5209,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Serializes the return type of function. Used by the __metadata decorator for a method. */
|
||||
function emitSerializedReturnTypeOfNode(node: Node): string | string[] {
|
||||
if (node && isFunctionLike(node)) {
|
||||
emitSerializedTypeNode((<FunctionLikeDeclaration>node).type);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
write("void 0");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function emitSerializedTypeMetadata(node: Declaration, writeComma: boolean): number {
|
||||
// This method emits the serialized type metadata for a decorator target.
|
||||
// The caller should have already tested whether the node has decorators.
|
||||
@ -5070,7 +5250,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
if (writeComma || argumentsWritten) {
|
||||
write(", ");
|
||||
}
|
||||
|
||||
|
||||
writeLine();
|
||||
write("__metadata('design:returntype', ");
|
||||
emitSerializedReturnTypeOfNode(node);
|
||||
@ -5078,10 +5258,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
argumentsWritten++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return argumentsWritten;
|
||||
}
|
||||
|
||||
|
||||
function emitInterfaceDeclaration(node: InterfaceDeclaration) {
|
||||
emitOnlyPinnedOrTripleSlashComments(node);
|
||||
}
|
||||
@ -5430,18 +5610,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
(!isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node))) {
|
||||
emitLeadingComments(node);
|
||||
emitStart(node);
|
||||
|
||||
|
||||
// variable declaration for import-equals declaration can be hoisted in system modules
|
||||
// in this case 'var' should be omitted and emit should contain only initialization
|
||||
let variableDeclarationIsHoisted = shouldHoistVariable(node, /*checkIfSourceFileLevelDecl*/ true);
|
||||
|
||||
|
||||
// is it top level export import v = a.b.c in system module?
|
||||
// if yes - it needs to be rewritten as exporter('v', v = a.b.c)
|
||||
let isExported = isSourceFileLevelDeclarationInSystemJsModule(node, /*isExported*/ true);
|
||||
|
||||
|
||||
if (!variableDeclarationIsHoisted) {
|
||||
Debug.assert(!isExported);
|
||||
|
||||
|
||||
if (isES6ExportedDeclaration(node)) {
|
||||
write("export ");
|
||||
write("var ");
|
||||
@ -5450,8 +5630,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
write("var ");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (isExported) {
|
||||
write(`${exportFunctionForFile}("`);
|
||||
emitNodeWithoutSourceMap(node.name);
|
||||
@ -5465,8 +5645,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
if (isExported) {
|
||||
write(")");
|
||||
}
|
||||
|
||||
write(";");
|
||||
|
||||
write(";");
|
||||
emitEnd(node);
|
||||
emitExportImportAssignments(node);
|
||||
emitTrailingComments(node);
|
||||
@ -5992,12 +6172,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (isInternalModuleImportEqualsDeclaration(node)) {
|
||||
if (!hoistedVars) {
|
||||
hoistedVars = [];
|
||||
}
|
||||
|
||||
|
||||
hoistedVars.push(node.name);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -26,6 +26,12 @@ namespace ts {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
export function writeConfigFile(file: string, compilerOptions: CompilerOptions, fileNames: string[]): void {
|
||||
let writer = createTextWriter("\n");
|
||||
buildConfigFile(writer, compilerOptions, fileNames, ["node_modules"]);
|
||||
sys.writeFile(file, writer.getText());
|
||||
}
|
||||
|
||||
export function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost {
|
||||
let currentDirectory: string;
|
||||
let existingDirectories: Map<boolean> = {};
|
||||
|
||||
@ -144,6 +144,17 @@ namespace ts {
|
||||
let hostGetSourceFile: typeof compilerHost.getSourceFile; // getSourceFile method from default host
|
||||
let timerHandle: number; // Handle for 0.25s wait timer
|
||||
|
||||
if (commandLine.options.init) {
|
||||
let file = `${sys.getCurrentDirectory()}/tsconfig.json`;
|
||||
if (sys.fileExists(file)) {
|
||||
reportDiagnostic(createCompilerDiagnostic(Diagnostics.You_already_have_a_tsconfig_json_file_defined));
|
||||
}
|
||||
else {
|
||||
writeConfigFile(file, commandLine.options, commandLine.fileNames);
|
||||
}
|
||||
return sys.exit(ExitStatus.Success);
|
||||
}
|
||||
|
||||
if (commandLine.options.locale) {
|
||||
if (!isJSONSupported()) {
|
||||
reportDiagnostic(createCompilerDiagnostic(Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"));
|
||||
|
||||
@ -1529,8 +1529,8 @@ namespace ts {
|
||||
export interface SymbolAccessiblityResult extends SymbolVisibilityResult {
|
||||
errorModuleName?: string; // If the symbol is not visible from module, module's name
|
||||
}
|
||||
|
||||
/** Indicates how to serialize the name for a TypeReferenceNode when emitting decorator
|
||||
|
||||
/** Indicates how to serialize the name for a TypeReferenceNode when emitting decorator
|
||||
* metadata */
|
||||
/* @internal */
|
||||
export enum TypeReferenceSerializationKind {
|
||||
@ -1574,7 +1574,7 @@ namespace ts {
|
||||
getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): number;
|
||||
getBlockScopedVariableId(node: Identifier): number;
|
||||
getReferencedValueDeclaration(reference: Identifier): Declaration;
|
||||
getTypeReferenceSerializationKind(node: TypeReferenceNode): TypeReferenceSerializationKind;
|
||||
getTypeReferenceSerializationKind(node: TypeReferenceNode): TypeReferenceSerializationKind;
|
||||
}
|
||||
|
||||
export const enum SymbolFlags {
|
||||
@ -1777,10 +1777,10 @@ namespace ts {
|
||||
StringLike = String | StringLiteral,
|
||||
NumberLike = Number | Enum,
|
||||
ObjectType = Class | Interface | Reference | Tuple | Anonymous,
|
||||
UnionOrIntersection = Union | Intersection,
|
||||
UnionOrIntersection = Union | Intersection,
|
||||
StructuredType = ObjectType | Union | Intersection,
|
||||
/* @internal */
|
||||
RequiresWidening = ContainsUndefinedOrNull | ContainsObjectLiteral
|
||||
RequiresWidening = ContainsUndefinedOrNull | ContainsObjectLiteral
|
||||
}
|
||||
|
||||
// Properties common to all types
|
||||
@ -1989,6 +1989,7 @@ namespace ts {
|
||||
diagnostics?: boolean;
|
||||
emitBOM?: boolean;
|
||||
help?: boolean;
|
||||
init?: boolean;
|
||||
inlineSourceMap?: boolean;
|
||||
inlineSources?: boolean;
|
||||
jsx?: JsxEmit;
|
||||
@ -2073,7 +2074,6 @@ namespace ts {
|
||||
errors: Diagnostic[];
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export interface CommandLineOption {
|
||||
name: string;
|
||||
type: string | Map<number>; // "string", "number", "boolean", or an object literal mapping named values to actual values
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user