вторник, 2 февраля 2016 г.

Настройка TypeScript + Grunt

1. В папку с проектом установить модули

npm install grunt
npm install grunt-contrib-watch
npm install grunt-typescript
npm install grunt-ts
npm install grunt-tslint
npm install grunt-jsbeautifier
npm install grunt-newer

2. Создать файл Gruntfile.js с кодом

module.exports = function (grunt) {

    var tsFiles = ['./js/**/*.ts'];

    grunt.initConfig({

        // Скомпилироать файлы TypeScript в JavaScript
        typescript: {
            base: {
                  src: tsFiles
                , dest: '' // '' - компиляция в разные файлы или './js/single.js' - компиляция в единый файл
                , options: {
                      module: 'amd' // 'amd' или 'commonjs'
                    , target: 'es3' // 'es6', 'es5' или 'es3' (по умолчанию)
                    , sourceMap: false // true, false - создавать ли файл '.map'
                    , module: 'amd' // генерация кода модулей в стиле: 'commonjs' (по умолчанию), 'amd', 'system' или 'umd'
                    , noImplicitAny: false // true // true, false - предупреждать ли о наличи в коде переменных и фунций с типом ':any'
                    , removeComments: false // true, false - удалять ли комментарии из итогового файла
                    , preserveConstEnums: false // true, false - не стирать определение const enum в генерируемом коде
                    , suppressImplicitAnyIndexErrors: true // true, false - подавлять ли сообщения об ошибках типа noImplicitAny для индексируемых объектов
                    , noEmitOnError: true // true (по умолчанию), false - не компилировать файл, если во время его проверки найдена ошибка
                    , declaration: false // true, false - создавать ли соотвествующий файл .d.ts
                    , nolib: true // true, false - не включать по умолчанию файл lib.d.ts в global declarations
                    , noResolve: false // true, false - не добавлять сслыку описание (///reference) или module import в список компилируемых файлов
                    , experimentalDecorators: true // true, false - включить экспермментальную поддержку декораторов из ES7
                    , emitDecoratorMetadata: true // true, false - сгенерировать метаданные для декораторов
                    , newLine: 'CRLF' // 'CRLF' (windows), 'LF' (unix) - тип переноса строк в компилируемых файлах
                    , inlineSourceMap: false // true, false - сгенерировать один файл source map вместо нескольких отдельных файлов
                    , inlineSources: false // true, false - сгенирировать инлайновый source map внутри единого файла (требует, чтобы был inlineSourceMap: true)
                    , noEmitHelpers: true // true, false - не генерировать вспомогательные функции в компилируемых файлах подобных '__extends'
                    , keepDirectoryHierarchy: true // true, false
                    /*
                    , references: [ // set auto reference libraries
                          'core' // lib.core.d.ts
                        , 'dom' // lib.dom.d.ts
                        , 'scriptHost' // lib.scriptHost.d.ts
                        , 'webworker' // lib.webworker.d.ts
                        //, 'path/to/reference/files/** /*.d.ts'
                    ]
                    , watch: { //{} или false
                          path: 'path/to/typescript/files' // или ['path/to/typescript/file1', 'path/to/typescript/file2']
                        , before: ['beforetask'] // ['clean']
                        , after: ['aftertask'] // ['minify']
                        , atBegin: true // true, false (по умолчания) - запустить ли задачи вместе с вотчером
                      }
                    */
                }
            }
         }

        // Другой компилятор TypeScript в JavaScript
        , ts: {
              default : {
                  src: ['js/test/module1.ts', 'js/test/module2.ts', 'js/test/module3.ts'] // ['js/**/*.ts']
                // , out: 'js/test/main.js'
                , options: {
                          declaration: false // true | false (default) - Generates a .d.ts definitions file for compiled TypeScript files
                        , emitDecoratorMetadata: false // true | false (default) - Emit metadata for type/parameter decorators.
                        , experimentalDecorators: false // true | false (default) - Enables experimental support for ES7 decorators
                        , inlineSourceMap: false // true | false (default) - Emit a single file that includes source maps instead of emitting a separate .js.map file.
                        , inlineSources: false // true | false (default) - Emit the TypeScript source alongside the sourcemaps within a single file. Requires inlineSourceMap to be set.
                        , isolatedModules: false // true | false (default) - Ensures that the output is safe to only emit single files by making cases that break single-file transpilation an error
                        , mapRoot: '' // '/maps' - Specifies the location where debugger should locate map files instead of generated locations.
                        , module: 'amd' // 'amd' (default) | 'commonjs' | 'system' | 'umd' | '' - Specify module style for code generation
                        , newLine: 'CRLF' // 'CRLF' | 'LF' | '' (default) -  Explicitly specify newline character (CRLF or LF); if omitted, uses OS default.
                        , noEmit: false // true | false (default) - Check, but do not emit JS, even in the absence of errors.
                        , noEmitHelpers: true // true | false (default) - Do not generate custom helper functions like __extends in compiled output.
                        , noImplicitAny: false // true | false (default) - Warn on expressions and declarations with an implied any type.
                        , noResolve: true // true | false (default) - Do not add triple-slash references or module import targets to the compilation context.
                        , out: '' // '' - компиляция в разные файлы или './js/single.js' - компиляция в единый файл - Concatenate and emit output to a single file.
                        , outDir: '' // 'dist' - Redirect output structure to the directory.
                        , preserveConstEnums: false // true | false (default) - Const enums will be kept as enums in the emitted JS.
                        , removeComments: false // true (default)| false - Configures if comments should be included in the output
                        , sourceMap: false // true (default) | false - Generates corresponding .map file
                        , sourceRoot: '' // '/dev' - Specifies the location where debugger should locate TypeScript files instead of source locations.
                        , suppressImplicitAnyIndexErrors:  false // true | false (default) - If set to true, TypeScript will allow access to properties of an object by string indexer when noImplicitAny is active, even if TypeScript doesn't know about them. This setting has no effect unless noImplicitAny is active.
                        , target: 'es3' // 'es3' | 'es5' (default) | 'es6' - Specify ECMAScript target version: 'es3', 'es5', or 'es6'
                  }
              }
          }

        // Проверить оформление кода в TypeScript-файлах
        , tslint: {
              options: {
                  configuration: grunt.file.readJSON('tslint.json')
              }
            , all: {
                  src: tsFiles
              }
        }

        // Форматирование кода JavaScript
        , 'jsbeautifier' : {
              files : ['js/**/*.js']
            , options : {
                js: {
                        braceStyle: 'collapse'
                      , breakChainedMethods: false
                      , e4x: false
                      , evalCode: false
                      , indentChar: ' '
                      , indentLevel: 0
                      , indentSize: 4
                      , indentWithTabs: false
                      , jslintHappy: true
                      , keepArrayIndentation: false
                      , keepFunctionIndentation: false
                      , maxPreserveNewlines: 10
                      , preserveNewlines: true
                      , spaceBeforeConditional: true
                      , spaceInParen: false
                      , unescapeStrings: false
                      , wrapLineLength: 0
                      , endWithNewline: false
                  }
              }
          }

        // Начать отслеживание изменений кода файлов
        , watch: {
              scripts: {
                  files: tsFiles
                , tasks: [
                    // 'newer:tslint'
                    //, 'typescript'
                      'ts'
                    , 'jsbeautifier'
                  ]
              }
          }

    });

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-typescript');
    grunt.loadNpmTasks('grunt-ts');
    grunt.loadNpmTasks('grunt-tslint');
    grunt.loadNpmTasks('grunt-jsbeautifier');
    grunt.loadNpmTasks('grunt-newer');

    grunt.registerTask('default', [
        //  'newer:tslint'
        //, 'typescript'
          'ts'
        , 'jsbeautifier'
        , 'watch'
    ]);

};

3. Создать файл rungrunt.js с кодом

require('grunt').cli();

4. Создать файл tsling.json с кодом

{
  "rules": {
      "ban": false
    , "class-name": true
    , "comment-format": [true, "check-space"]
    , "curly": true
    , "eofline": false
    , "forin": true
    , "indent": [true, "spaces"]
    , "jsdoc-format": true
    , "label-position": true
    , "label-undefined": true
    , "max-line-length": [true, 500]
    , "member-access": true
    , "member-ordering": [
          true
        , "public-before-private"
        , "static-before-instance"
        , "variables-before-functions"
      ]
    , "no-any": true
    , "no-arg": true
    , "no-bitwise": true
    , "no-console": [
          true
        , "debug"
        , "info"
        , "time"
        , "timeEnd"
        , "trace"
      ]
    , "no-consecutive-blank-lines": true
    , "no-construct": true
    , "no-constructor-vars": true
    , "no-debugger": false
    , "no-duplicate-key": true
    , "no-duplicate-variable": true
    , "no-empty": true
    , "no-eval": true
    , "no-internal-module": true
    , "no-string-literal": false
    , "no-trailing-comma": true
    , "no-trailing-whitespace": true
    , "no-unreachable": true
    , "no-unused-expression": true
    , "no-unused-variable": true
    , "no-use-before-declare": true
    , "one-line": [
          true
        , "check-open-brace"
        , "check-catch"
        , "check-else"
        , "check-whitespace"
      ]
    , "quotemark": [true, "single"]
    , "radix": true
    , "semicolon": true
    , "switch-default": true
    , "triple-equals": [true, "allow-null-check"]
    , "typedef": [
          true
        , "call-signature"
        , "parameter"
        , "property"
        , "variable-declaration"
        , "member-variable-declarations"
      ]
    , "typedef-whitespace": [
          true
        , {
              "call-signature": "nospace"
            , "index-signature": "nospace"
            , "parameter": "nospace"
            , "property-declaration": "nospace"
            , "variable-declaration": "nospace"
        }
      ]
    , "variable-name": false
    , "whitespace": [
          true
        , "check-branch"
        , "check-decl"
        , "check-module"
        , "check-operator"
        , "check-separator"
      ]
  }
}

5. Поместить исходные TypeScript-файлы в папку js

js/module-1.ts
js/module-2.ts

6. Скомпилировать TypeScript-файлы в JavaScript-файлы командой

node rungrunt.js

Комментариев нет:

Отправить комментарий