UNPKG

grunt-ts

Version:

Compile and manage your TypeScript project

197 lines 8.39 kB
'use strict'; var csproj2ts = require('csproj2ts'); var path = require('path'); var utils = require('./utils'); var es6_promise_1 = require('es6-promise'); var _ = require('lodash'); var templateProcessor = null; function resolveVSOptionsAsync(applyTo, taskOptions, targetOptions, theTemplateProcessor) { templateProcessor = theTemplateProcessor; return new es6_promise_1.Promise(function (resolve, reject) { { var vsTask = getVSSettings(taskOptions), vsTarget = getVSSettings(targetOptions); var vs = null; if (vsTask) { vs = vsTask; } if (vsTarget) { if (!vs) { vs = vsTarget; } if (vsTarget.project) { vs.project = vsTarget.project; } if (vsTarget.config) { vs.config = vsTarget.config; } if (vsTarget.ignoreFiles) { vs.ignoreFiles = vsTarget.ignoreFiles; } if (vsTarget.ignoreSettings) { vs.ignoreSettings = vsTarget.ignoreSettings; } } if (vs) { applyTo.vs = vs; if (typeof applyTo.vs.project === 'string') { applyTo.vs.project = templateProcessor(applyTo.vs.project, {}); } if (typeof applyTo.vs.config === 'string') { applyTo.vs.config = templateProcessor(applyTo.vs.config, {}); } } } if (applyTo.vs) { return csproj2ts.getTypeScriptSettings({ ProjectFileName: applyTo.vs.project, ActiveConfiguration: applyTo.vs.config || undefined }).then(function (vsConfig) { try { applyTo = applyVSOptions(applyTo, vsConfig); applyTo = resolve_out_and_outDir(applyTo, taskOptions, targetOptions); return resolve(applyTo); } catch (ex) { return reject(ex); } }).catch(function (error) { if (error.errno === 34) { applyTo.errors.push('In target "' + applyTo.targetName + '" - could not find VS project at "' + error.path + '".'); } else { applyTo.errors.push('In target "' + applyTo.targetName + '". Error #' + error.errno + '. ' + error); } return reject(error); }); } return resolve(applyTo); }); } exports.resolveVSOptionsAsync = resolveVSOptionsAsync; function resolve_out_and_outDir(options, taskOptions, targetOptions) { if (options.CompilationTasks && options.CompilationTasks.length > 0) { options.CompilationTasks.forEach(function (compilationTask) { [taskOptions, targetOptions].forEach(function (optionSet) { if (optionSet && optionSet.out) { compilationTask.out = optionSet.out; } if (optionSet && optionSet.outDir) { compilationTask.outDir = optionSet.outDir; } }); }); } return options; } function applyVSOptions(options, vsSettings) { var ignoreFiles = false, ignoreSettings = false; if (typeof options.vs !== 'string') { var vsOptions = options.vs; ignoreFiles = !!vsOptions.ignoreFiles; ignoreSettings = !!vsOptions.ignoreSettings; } if (!ignoreFiles) { if (options.CompilationTasks.length === 0) { options.CompilationTasks.push({ src: [] }); } var src = options.CompilationTasks[0].src; var absolutePathToVSProjectFolder = path.resolve(vsSettings.VSProjectDetails.ProjectFileName, '..'); var gruntfileFolder = path.resolve('.'); _.map(_.uniq(vsSettings.files), function (file) { var absolutePathToFile = path.normalize(path.join(absolutePathToVSProjectFolder, file)); var relativePathToFileFromGruntfile = path.relative(gruntfileFolder, absolutePathToFile).replace(new RegExp('\\' + path.sep, 'g'), '/'); if (src.indexOf(absolutePathToFile) === -1 && src.indexOf(relativePathToFileFromGruntfile) === -1) { src.push(relativePathToFileFromGruntfile); } }); } if (!ignoreSettings) { options = applyVSSettings(options, vsSettings); } return options; } function relativePathToVSProjectFolderFromGruntfile(settings) { return path.resolve(settings.VSProjectDetails.ProjectFileName, '..'); } function applyVSSettings(options, vsSettings) { // TODO: support TypeScript 1.5 VS options. var simpleVSSettingsToGruntTSMappings = { 'EmitBOM': 'emitBom', 'EmitDecoratorMetadata': 'emitDecoratorMetadata', 'ExperimentalAsyncFunctions': 'experimentalAsyncFunctions', 'ExperimentalDecorators': 'experimentalDecorators', 'GeneratesDeclarations': 'declaration', 'InlineSourceMap': 'inlineSourceMap', 'InlineSources': 'inlineSources', 'IsolatedModules': 'isolatedModules', 'JSXEmit': 'jsx', 'MapRoot': 'mapRoot', 'ModuleKind': 'module', 'ModuleResolution': 'moduleResolution', 'NewLine': 'newLine', 'NoEmitOnError': 'noEmitOnError', 'NoEmitHelpers': 'NoEmitHelpers', 'NoImplicitAny': 'noImplicitAny', 'NoLib': 'noLib', 'NoResolve': 'noResolve', // OutFile and OutDir are resolved elsewhere 'PreserveConstEnums': 'preserveConstEnums', 'RemoveComments': 'removeComments', 'RootDir': 'rootDir', 'SourceMap': 'sourceMap', 'SourceRoot': 'sourceRoot', 'SuppressImplicitAnyIndexErrors': 'suppressImplicitAnyIndexErrors', 'SuppressExcessPropertyErrors': 'suppressExcessPropertyErrors', 'Target': 'target' }; for (var item in simpleVSSettingsToGruntTSMappings) { if (!(simpleVSSettingsToGruntTSMappings[item] in options) && utils.hasValue(vsSettings[item])) { options[simpleVSSettingsToGruntTSMappings[item]] = vsSettings[item]; } } if (!('module' in options) && utils.hasValue(vsSettings.ModuleKind)) { options.module = vsSettings.ModuleKind; if (options.module === 'none') { options.module = undefined; } } var gruntfileToProject = relativePathToVSProjectFolderFromGruntfile(vsSettings); if (utils.hasValue(vsSettings.OutDir) && vsSettings.OutDir !== '') { options.CompilationTasks.forEach(function (item) { var absolutePath = path.resolve(gruntfileToProject, vsSettings.OutDir); item.outDir = utils.enclosePathInQuotesIfRequired(path.relative(path.resolve('.'), absolutePath).replace(new RegExp('\\' + path.sep, 'g'), '/')); }); } if (utils.hasValue(vsSettings.OutFile) && vsSettings.OutFile !== '') { options.CompilationTasks.forEach(function (item) { var absolutePath = path.resolve(gruntfileToProject, vsSettings.OutFile); item.out = utils.enclosePathInQuotesIfRequired(path.relative(path.resolve('.'), absolutePath).replace(new RegExp('\\' + path.sep, 'g'), '/')); }); } return options; } function getVSSettings(rawTargetOptions) { var vs = null; if (rawTargetOptions && rawTargetOptions.vs) { var targetvs = rawTargetOptions.vs; if (typeof targetvs === 'string') { vs = { project: targetvs, config: '', ignoreFiles: false, ignoreSettings: false }; } else { vs = { project: targetvs.project || '', config: targetvs.config || '', ignoreFiles: targetvs.ignoreFiles || false, ignoreSettings: targetvs.ignoreSettings || false }; } } return vs; } //# sourceMappingURL=visualStudioOptionsResolver.js.map