diff --git a/postinstall.js b/postinstall.js index 5e2cd1f..4bee859 100644 --- a/postinstall.js +++ b/postinstall.js @@ -7,78 +7,100 @@ var upgrader = require("./tsconfig-upgrader"); var projectDir = hook.findProjectDir(); if (projectDir) { - var tsconfigPath = path.join(projectDir, "tsconfig.json"); - var hasModules30 = upgrader.hasModules30(projectDir); - if (fs.existsSync(tsconfigPath)) { - upgrader.migrateTsConfig(tsconfigPath, projectDir); - } else { - createTsconfig(tsconfigPath); - } - - if (!hasModules30) { - createReferenceFile(); - } - - installTypescript({force: hasModules30}); + const tsconfigPath = path.join(projectDir, "tsconfig.json"); + if (fs.existsSync(tsconfigPath)) { + upgrader.migrateTsConfig(tsconfigPath, projectDir); + } else { + createTsconfig(tsconfigPath); + } + + const hasModules30 = upgrader.hasModules30(projectDir); + if (!hasModules30) { + createReferenceFile(); + } + + installTypescript(hasModules30); } function createReferenceFile() { - var referenceFilePath = path.join(projectDir, "references.d.ts"), - content = "/// Needed for autocompletion and compilation."; + var referenceFilePath = path.join(projectDir, "references.d.ts"), + content = "/// Needed for autocompletion and compilation."; - if (!fs.existsSync(referenceFilePath)) { - fs.appendFileSync(referenceFilePath, content); - } + if (!fs.existsSync(referenceFilePath)) { + fs.appendFileSync(referenceFilePath, content); + } } function createTsconfig(tsconfigPath) { - var tsconfig = {}; + var tsconfig = {}; - tsconfig.compilerOptions = { - module: "commonjs", - target: "es5", - experimentalDecorators: true, - emitDecoratorMetadata: true, - noEmitHelpers: true, - noEmitOnError: true, - }; - upgrader.migrateProject(tsconfig, tsconfigPath, projectDir); + tsconfig.compilerOptions = { + module: "commonjs", + target: "es5", + experimentalDecorators: true, + emitDecoratorMetadata: true, + noEmitHelpers: true, + noEmitOnError: true, + }; + upgrader.migrateProject(tsconfig, tsconfigPath, projectDir); - tsconfig.exclude = ["node_modules", "platforms", "**/*.aot.ts"]; + tsconfig.exclude = ["node_modules", "platforms", "**/*.aot.ts"]; - fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 4)); + fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 4)); } function getProjectTypeScriptVersion() { - try { - var packageJsonPath = path.join(projectDir, "package.json"), - packageJsonContent = fs.readFileSync(packageJsonPath, "utf8"), - jsonContent = JSON.parse(packageJsonContent); + try { + var packageJsonPath = path.join(projectDir, "package.json"), + packageJsonContent = fs.readFileSync(packageJsonPath, "utf8"), + jsonContent = JSON.parse(packageJsonContent); - return (jsonContent.dependencies && jsonContent.dependencies.typescript) || + return (jsonContent.dependencies && jsonContent.dependencies.typescript) || (jsonContent.devDependencies && jsonContent.devDependencies.typescript); - } catch (err) { - console.error(err); - return null; - } + } catch (err) { + console.error(err); + return null; + } } -function installTypescript({force = false} = {}) { - const installedTypeScriptVersion = getProjectTypeScriptVersion(); +function installTypescript(hasModules30) { + const installedTypeScriptVersion = getProjectTypeScriptVersion(); + const force = shouldInstallLatest(installedTypeScriptVersion, hasModules30); - if (installedTypeScriptVersion && !force) { - console.log("Project already targets TypeScript " + installedTypeScriptVersion); - } else { - const command = force ? "npm install -D typescript@latest" : "npm update -D typescript"; + if (installedTypeScriptVersion && !force) { + console.log(`Project already targets TypeScript ${installedTypeScriptVersion}`); + } else { + const command = force ? + "npm install -D typescript@latest" : + "npm install -D -E typescript@2.1.6"; // install exactly 2.1.6 console.log("Installing TypeScript..."); - require("child_process").exec(command, { cwd: projectDir }, function (err, stdout, stderr) { - if (err) { - console.warn("npm: " + err.toString()); - } - process.stdout.write(stdout); - process.stderr.write(stderr); - }); - } + require("child_process").exec(command, { cwd: projectDir }, (err, stdout, stderr) => { + if (err) { + console.warn(`npm: ${err.toString()}`); + } + + process.stdout.write(stdout); + process.stderr.write(stderr); + }); + } +} + +function shouldInstallLatest(tsVersion, hasModules30) { + if (!hasModules30) { + return false; + } + + const justVersion = clearPatch(tsVersion); + return !tsVersion || + tsVersion === "2.2.0" || + justVersion[0] < 2 || // ex. 1.8.10 + justVersion[2] < 2; // ex. 2.1.6 +} + +function clearPatch(version) { + return version && (version.startsWith("~") || version.startsWith("^")) ? + version.substring(1) : + version; }