diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 733e3158593df..5bbd74d6f47f4 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -294,6 +294,11 @@ namespace ts { name: "allowJs", type: "boolean", description: Diagnostics.Allow_javascript_files_to_be_compiled + }, + { + name: "noImplicitUseStrict", + type: "boolean", + description: Diagnostics.Do_not_emit_use_strict_directives_in_module_output } ]; diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 05d207664f02c..1a8a53d517c10 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1,4 +1,4 @@ - { +{ "Unterminated string literal.": { "category": "Error", "code": 1002 @@ -2171,6 +2171,7 @@ "category": "Error", "code": 5059 }, + "Concatenate and emit output to single file.": { "category": "Message", @@ -2216,10 +2217,10 @@ "category": "Message", "code": 6011 }, - "Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES2015' (experimental)": { - "category": "Message", - "code": 6015 - }, + "Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES2015' (experimental)": { + "category": "Message", + "code": 6015 + }, "Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'": { "category": "Message", "code": 6016 @@ -2445,6 +2446,10 @@ "category": "Message", "code": 6084 }, + "Do not emit 'use strict' directives in module output.": { + "category": "Message", + "code": 6112 + }, "Variable '{0}' implicitly has an '{1}' type.": { "category": "Error", @@ -2632,23 +2637,23 @@ "code": 17004 }, "A constructor cannot contain a 'super' call when its class extends 'null'": { - "category": "Error", - "code": 17005 + "category": "Error", + "code": 17005 }, "An unary expression with the '{0}' operator is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses.": { - "category": "Error", - "code": 17006 + "category": "Error", + "code": 17006 }, "A type assertion expression is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses.": { - "category": "Error", - "code": 17007 + "category": "Error", + "code": 17007 }, "JSX element '{0}' has no corresponding closing tag.": { - "category": "Error", - "code": 17008 + "category": "Error", + "code": 17008 }, "'super' must be called before accessing 'this' in the constructor of a derived class.": { - "category": "Error", - "code": 17009 + "category": "Error", + "code": 17009 } -} +} \ No newline at end of file diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index f0ce9fdd8b576..72614756fb79c 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -7268,7 +7268,7 @@ const _super = (function (geti, seti) { write(`], function(${exportFunctionForFile}, ${contextObjectForFile}) {`); writeLine(); increaseIndent(); - const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ true, /*ensureUseStrict*/ true); + const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ true, /*ensureUseStrict*/ !compilerOptions.noImplicitUseStrict); writeLine(); write(`var __moduleName = ${contextObjectForFile} && ${contextObjectForFile}.id;`); writeLine(); @@ -7374,7 +7374,7 @@ const _super = (function (geti, seti) { writeModuleName(node, emitRelativePathAsModuleName); emitAMDDependencies(node, /*includeNonAmdDependencies*/ true, emitRelativePathAsModuleName); increaseIndent(); - const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ true, /*ensureUseStrict*/ true); + const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ true, /*ensureUseStrict*/!compilerOptions.noImplicitUseStrict); emitExportStarHelper(); emitCaptureThisForNodeIfNecessary(node); emitLinesStartingAt(node.statements, startIndex); @@ -7386,7 +7386,7 @@ const _super = (function (geti, seti) { } function emitCommonJSModule(node: SourceFile) { - const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ false, /*ensureUseStrict*/ true); + const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ false, /*ensureUseStrict*/ !compilerOptions.noImplicitUseStrict); emitEmitHelpers(node); collectExternalModuleInfo(node); emitExportStarHelper(); @@ -7415,7 +7415,7 @@ const _super = (function (geti, seti) { })(`); emitAMDFactoryHeader(dependencyNames); increaseIndent(); - const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ true, /*ensureUseStrict*/ true); + const startIndex = emitDirectivePrologues(node.statements, /*startWithNewLine*/ true, /*ensureUseStrict*/ !compilerOptions.noImplicitUseStrict); emitExportStarHelper(); emitCaptureThisForNodeIfNecessary(node); emitLinesStartingAt(node.statements, startIndex); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 737c4a7587b1c..31ff055f986a2 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2435,6 +2435,7 @@ namespace ts { forceConsistentCasingInFileNames?: boolean; allowSyntheticDefaultImports?: boolean; allowJs?: boolean; + noImplicitUseStrict?: boolean; /* @internal */ stripInternal?: boolean; // Skip checking lib.d.ts to help speed up tests. diff --git a/tests/baselines/reference/noImplicitUseStrict_amd.js b/tests/baselines/reference/noImplicitUseStrict_amd.js new file mode 100644 index 0000000000000..ac15f548c4741 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_amd.js @@ -0,0 +1,8 @@ +//// [noImplicitUseStrict_amd.ts] + +export var x = 0; + +//// [noImplicitUseStrict_amd.js] +define(["require", "exports"], function (require, exports) { + exports.x = 0; +}); diff --git a/tests/baselines/reference/noImplicitUseStrict_amd.symbols b/tests/baselines/reference/noImplicitUseStrict_amd.symbols new file mode 100644 index 0000000000000..de1faa2213c0d --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_amd.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/noImplicitUseStrict_amd.ts === + +export var x = 0; +>x : Symbol(x, Decl(noImplicitUseStrict_amd.ts, 1, 10)) + diff --git a/tests/baselines/reference/noImplicitUseStrict_amd.types b/tests/baselines/reference/noImplicitUseStrict_amd.types new file mode 100644 index 0000000000000..c9e1b5749dc0c --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_amd.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/noImplicitUseStrict_amd.ts === + +export var x = 0; +>x : number +>0 : number + diff --git a/tests/baselines/reference/noImplicitUseStrict_commonjs.js b/tests/baselines/reference/noImplicitUseStrict_commonjs.js new file mode 100644 index 0000000000000..9c726938f043a --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_commonjs.js @@ -0,0 +1,6 @@ +//// [noImplicitUseStrict_commonjs.ts] + +export var x = 0; + +//// [noImplicitUseStrict_commonjs.js] +exports.x = 0; diff --git a/tests/baselines/reference/noImplicitUseStrict_commonjs.symbols b/tests/baselines/reference/noImplicitUseStrict_commonjs.symbols new file mode 100644 index 0000000000000..af53dc272d255 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_commonjs.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/noImplicitUseStrict_commonjs.ts === + +export var x = 0; +>x : Symbol(x, Decl(noImplicitUseStrict_commonjs.ts, 1, 10)) + diff --git a/tests/baselines/reference/noImplicitUseStrict_commonjs.types b/tests/baselines/reference/noImplicitUseStrict_commonjs.types new file mode 100644 index 0000000000000..9999d3b94ba01 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_commonjs.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/noImplicitUseStrict_commonjs.ts === + +export var x = 0; +>x : number +>0 : number + diff --git a/tests/baselines/reference/noImplicitUseStrict_es6.js b/tests/baselines/reference/noImplicitUseStrict_es6.js new file mode 100644 index 0000000000000..27dbbc7ea7957 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_es6.js @@ -0,0 +1,6 @@ +//// [noImplicitUseStrict_es6.ts] + +export var x = 0; + +//// [noImplicitUseStrict_es6.js] +export var x = 0; diff --git a/tests/baselines/reference/noImplicitUseStrict_es6.symbols b/tests/baselines/reference/noImplicitUseStrict_es6.symbols new file mode 100644 index 0000000000000..31bc1904ff987 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_es6.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/noImplicitUseStrict_es6.ts === + +export var x = 0; +>x : Symbol(x, Decl(noImplicitUseStrict_es6.ts, 1, 10)) + diff --git a/tests/baselines/reference/noImplicitUseStrict_es6.types b/tests/baselines/reference/noImplicitUseStrict_es6.types new file mode 100644 index 0000000000000..838c7316be059 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_es6.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/noImplicitUseStrict_es6.ts === + +export var x = 0; +>x : number +>0 : number + diff --git a/tests/baselines/reference/noImplicitUseStrict_system.js b/tests/baselines/reference/noImplicitUseStrict_system.js new file mode 100644 index 0000000000000..cf5a7e1b26173 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_system.js @@ -0,0 +1,15 @@ +//// [noImplicitUseStrict_system.ts] + +export var x = 0; + +//// [noImplicitUseStrict_system.js] +System.register([], function(exports_1, context_1) { + var __moduleName = context_1 && context_1.id; + var x; + return { + setters:[], + execute: function() { + exports_1("x", x = 0); + } + } +}); diff --git a/tests/baselines/reference/noImplicitUseStrict_system.symbols b/tests/baselines/reference/noImplicitUseStrict_system.symbols new file mode 100644 index 0000000000000..62b89a6593da1 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_system.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/noImplicitUseStrict_system.ts === + +export var x = 0; +>x : Symbol(x, Decl(noImplicitUseStrict_system.ts, 1, 10)) + diff --git a/tests/baselines/reference/noImplicitUseStrict_system.types b/tests/baselines/reference/noImplicitUseStrict_system.types new file mode 100644 index 0000000000000..1da563f938b28 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_system.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/noImplicitUseStrict_system.ts === + +export var x = 0; +>x : number +>0 : number + diff --git a/tests/baselines/reference/noImplicitUseStrict_umd.js b/tests/baselines/reference/noImplicitUseStrict_umd.js new file mode 100644 index 0000000000000..ca252daeb9d4c --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_umd.js @@ -0,0 +1,15 @@ +//// [noImplicitUseStrict_umd.ts] + +export var x = 0; + +//// [noImplicitUseStrict_umd.js] +(function (factory) { + if (typeof module === 'object' && typeof module.exports === 'object') { + var v = factory(require, exports); if (v !== undefined) module.exports = v; + } + else if (typeof define === 'function' && define.amd) { + define(["require", "exports"], factory); + } +})(function (require, exports) { + exports.x = 0; +}); diff --git a/tests/baselines/reference/noImplicitUseStrict_umd.symbols b/tests/baselines/reference/noImplicitUseStrict_umd.symbols new file mode 100644 index 0000000000000..a72a251ad09a5 --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_umd.symbols @@ -0,0 +1,5 @@ +=== tests/cases/compiler/noImplicitUseStrict_umd.ts === + +export var x = 0; +>x : Symbol(x, Decl(noImplicitUseStrict_umd.ts, 1, 10)) + diff --git a/tests/baselines/reference/noImplicitUseStrict_umd.types b/tests/baselines/reference/noImplicitUseStrict_umd.types new file mode 100644 index 0000000000000..6a3fd6ece773a --- /dev/null +++ b/tests/baselines/reference/noImplicitUseStrict_umd.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/noImplicitUseStrict_umd.ts === + +export var x = 0; +>x : number +>0 : number + diff --git a/tests/cases/compiler/noImplicitUseStrict_amd.ts b/tests/cases/compiler/noImplicitUseStrict_amd.ts new file mode 100644 index 0000000000000..3a2a4760221c6 --- /dev/null +++ b/tests/cases/compiler/noImplicitUseStrict_amd.ts @@ -0,0 +1,4 @@ +// @module: amd +// @noImplicitUseStrict: true + +export var x = 0; \ No newline at end of file diff --git a/tests/cases/compiler/noImplicitUseStrict_commonjs.ts b/tests/cases/compiler/noImplicitUseStrict_commonjs.ts new file mode 100644 index 0000000000000..f8377dba07abe --- /dev/null +++ b/tests/cases/compiler/noImplicitUseStrict_commonjs.ts @@ -0,0 +1,4 @@ +// @module: commonjs +// @noImplicitUseStrict: true + +export var x = 0; \ No newline at end of file diff --git a/tests/cases/compiler/noImplicitUseStrict_es6.ts b/tests/cases/compiler/noImplicitUseStrict_es6.ts new file mode 100644 index 0000000000000..f56b0fd902146 --- /dev/null +++ b/tests/cases/compiler/noImplicitUseStrict_es6.ts @@ -0,0 +1,5 @@ +// @module: es6 +// @target: es6 +// @noImplicitUseStrict: true + +export var x = 0; \ No newline at end of file diff --git a/tests/cases/compiler/noImplicitUseStrict_system.ts b/tests/cases/compiler/noImplicitUseStrict_system.ts new file mode 100644 index 0000000000000..37ff5de469d1d --- /dev/null +++ b/tests/cases/compiler/noImplicitUseStrict_system.ts @@ -0,0 +1,4 @@ +// @module: system +// @noImplicitUseStrict: true + +export var x = 0; \ No newline at end of file diff --git a/tests/cases/compiler/noImplicitUseStrict_umd.ts b/tests/cases/compiler/noImplicitUseStrict_umd.ts new file mode 100644 index 0000000000000..f26f2ee2aff6f --- /dev/null +++ b/tests/cases/compiler/noImplicitUseStrict_umd.ts @@ -0,0 +1,4 @@ +// @module: umd +// @noImplicitUseStrict: true + +export var x = 0; \ No newline at end of file