From c86e07bc0f2f875e3953ee651871830351d38452 Mon Sep 17 00:00:00 2001 From: Eugene Zolenko Date: Thu, 5 Jul 2018 14:39:45 -0600 Subject: [PATCH] - fix for invisible declaration files, #95 --- README.md | 368 +++++++++++++++++++++++----------------------- package-lock.json | 16 +- package.json | 6 +- src/host.ts | 285 +++++++++++++++++------------------ tsconfig.json | 48 +++--- 5 files changed, 362 insertions(+), 361 deletions(-) diff --git a/README.md b/README.md index 70010c34..9654cac8 100644 --- a/README.md +++ b/README.md @@ -1,185 +1,183 @@ -# rollup-plugin-typescript2 - -[![npm-version](https://img.shields.io/npm/v/rollup-plugin-typescript2.svg?maxAge=2592000)](https://npmjs.org/package/rollup-plugin-typescript2) -![npm-dependencies](https://img.shields.io/david/ezolenko/rollup-plugin-typescript2.svg?maxAge=2592000) -![npm-monthly-downloads](https://img.shields.io/npm/dm/rollup-plugin-typescript2.svg?maxAge=2592000) -[![Codeship Status](https://app.codeship.com/projects/fe9cf8f0-e8d4-0134-ec88-4e3d33dcd7ed/status?branch=master)](https://app.codeship.com/projects/207445) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/e19b72ab9658405bbfb32dd6d65d1856)](https://www.codacy.com/app/zolenkoe/rollup-plugin-typescript2?utm_source=github.com&utm_medium=referral&utm_content=ezolenko/rollup-plugin-typescript2&utm_campaign=Badge_Grade) - -Rollup plugin for typescript with compiler errors. - -This is a rewrite of original rollup-plugin-typescript, starting and borrowing from [this fork](https://github.com/alexlur/rollup-plugin-typescript). - -This version is somewhat slower than original, but it will print out typescript syntactic and semantic diagnostic messages (the main reason for using typescript after all). - -## Usage - -```js -// rollup.config.js -import typescript from 'rollup-plugin-typescript2'; - -export default { - entry: './main.ts', - - plugins: [ - typescript(/*{ plugin options }*/) - ] -} -``` - -The plugin inherits all compiler options and file lists from your `tsconfig.json` file. If your tsconfig has another name or another relative path from the root directory, see `tsconfigDefaults`, `tsconfig` and `tsconfigOverride` options below. This also allows for passing in different tsconfig files depending on your build target. - -#### Some compiler options are forced - -* `noEmitHelpers`: false -* `importHelpers`: true -* `noResolve`: false -* `noEmit`: false -* `inlineSourceMap`: false (see [#71](https://github.com/ezolenko/rollup-plugin-typescript2/issues/71)) -* `outDir`: `./placeholder` in cache root, see [83](https://github.com/ezolenko/rollup-plugin-typescript2/issues/83) and [Microsoft/TypeScript/issues/24715](https://github.com/Microsoft/TypeScript/issues/24715) -* `declarationDir`: `process.cwd()` (*only if `useTsconfigDeclarationDir` is false in the plugin options*) -* `moduleResolution`: `node` (*`classic` is [deprecated](https://www.typescriptlang.org/docs/handbook/module-resolution.html). It also breaks this plugin, see [#12](https://github.com/ezolenko/rollup-plugin-typescript2/issues/12) and [#14](https://github.com/ezolenko/rollup-plugin-typescript2/issues/14)*) - -#### Some compiler options have more than one compatible value. - -* `module`: defaults to `ES2015`, other valid value is `ESNext` (required for dynamic imports, see [#54](https://github.com/ezolenko/rollup-plugin-typescript2/issues/54)). - -### Compatibility - -#### rollup-plugin-node-resolve - -Must be before this plugin in the plugin list, especially when `browser: true` option is used, see [#66](https://github.com/ezolenko/rollup-plugin-typescript2/issues/66) - -#### rollup-plugin-commonjs - -See explanation for `rollupCommonJSResolveHack` option below. - -### Plugin options - -* `tsconfigDefaults`: `{}` - - The object passed as `tsconfigDefaults` will be merged with loaded `tsconfig.json`. Final config passed to typescript will be the result of values in `tsconfigDefaults` replaced by values in loaded `tsconfig.json`, replaced by values in `tsconfigOverride` and then replaced by hard `compilerOptions` overrides on top of that (see above). - - For simplicity and other tools' sake, try to minimize usage of defaults and overrides and keep everything in `tsconfig.json` file (tsconfigs can themselves be chained, so save some turtles). - - ```js - let defaults = { compilerOptions: { declaration: true } }; - let override = { compilerOptions: { declaration: false } }; - - // ... - plugins: [ - typescript({ - tsconfigDefaults: defaults, - tsconfig: "tsconfig.json", - tsconfigOverride: override - }) - ] - ``` - - This is a [deep merge](https://lodash.com/docs/4.17.4#merge) (objects are merged, arrays are concatenated, primitives are replaced, etc), increase `verbosity` to 3 and look for `parsed tsconfig` if you get something unexpected. - -* `tsconfig`: `undefined` - - Path to `tsconfig.json`. Set this if your tsconfig has another name or relative location from the project directory. By default will try to load `./tsconfig.json`, but will not fail if file is missing unless the value is set explicitly. - -* `tsconfigOverride`: `{}` - - See `tsconfigDefaults`. - -* `check`: true - - Set to false to avoid doing any diagnostic checks on the code. - -* `verbosity`: 1 - - - 0 -- Error - - 1 -- Warning - - 2 -- Info - - 3 -- Debug - -* `clean`: false - - Set to true for clean build (wipes out cache on every build). - -* `cacheRoot`: `./.rts2_cache` - - Path to cache. Defaults to a folder in the current directory. Can be safely moved out with something like `${require('temp-dir')}/.rpt2_cache`, but watch out for multiple concurrent builds of the same repo. - -* `include`: `[ "*.ts+(|x)", "**/*.ts+(|x)" ]` - - By default passes all .ts files through typescript compiler. - -* `exclude`: `[ "*.d.ts", "**/*.d.ts" ]` - - But excludes type definitions. - -* `abortOnError`: true - - Bail out on first syntactic or semantic error. In some cases setting this to false will result in exception in rollup itself (for example for unresolvable imports). - -* `rollupCommonJSResolveHack`: false - - On windows typescript resolver favors POSIX path, while commonjs plugin (and maybe others?) uses native path as module id. This can result in `namedExports` being ignored if rollup happened to use typescript's resolution. Set to true to pass resolved module path through `resolve()` to match up with `rollup-plugin-commonjs`. - -* `useTsconfigDeclarationDir`: false - - If true, declaration files will be emitted in the directory given in the tsconfig. If false, the declaration files will be placed inside the destination directory given in the Rollup configuration. - -* `typescript`: typescript module installed with the plugin - - When typescript version installed by the plugin (latest 2.x) is unacceptable, you can import your own typescript module and pass it in as `typescript: require("typescript")`. Must be 2.0+, things might break if transpiler interfaces changed enough from what the plugin was built against. - -* `transformers`: `undefined` - - **experimental**, typescript 2.4.1+ - - Transformers will likely be available in tsconfig eventually, so this is not a stable interface, see [Microsoft/TypeScript/issues/14419](https://github.com/Microsoft/TypeScript/issues/14419). - - For example, integrating [kimamula/ts-transformer-keys](https://github.com/kimamula/ts-transformer-keys): - - ```js - const keysTransformer = require('ts-transformer-keys/transformer').default; - const transformer = (service) => - { - before: [ keysTransformer(service.getProgram()) ], - after: [] - }; - - // ... - plugins: [ - typescript({ transformers: [transformer] }) - ] - ``` - -### Declarations - -This plugin respects `declaration: true` in your `tsconfig.json` file. When set, it will emit `*.d.ts` files for your bundle. The resulting file(s) can then be used with the `types` property in your `package.json` file as described [here](https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html). -By default, the declaration files will be located in the same directory as the generated Rollup bundle. If you want to override this behavior and instead use the declarationDir set `useTsconfigDeclarationDir` to `true` in the plugin options. - -### Watch mode - -The way typescript handles type-only imports and ambient types effectively hides them from rollup watch, because import statements are not generated and changing them doesn't trigger a rebuild. - -Otherwise the plugin should work in watch mode. Make sure to run a normal build after watch session to catch any type errors. - -### Version - -This plugin currently requires TypeScript `2.4+`. - -### Rollup version - -This plugin currently requires rollup `0.50+`. - -### Reporting bugs - -Report any bugs on github: . - -Attach your `tsconfig.json`, `package.json` (for versions of dependencies), rollup script and anything else that could influence module resolution, ambient types and typescript compilation. - -Check if problem is reproducible after running `npm prune` to clear any rogue types from npm_modules (by default typescript grabs all ambient types). - -Check if you get the same problem with `clean` option set to true (might indicate a bug in the cache). - -If makes sense, check if running `tsc` directly produces similar results. - -Attach plugin output with `verbosity` option set to 3 (this will list all files being transpiled and their imports). +# rollup-plugin-typescript2 + +[![npm-version](https://img.shields.io/npm/v/rollup-plugin-typescript2.svg?maxAge=2592000)](https://npmjs.org/package/rollup-plugin-typescript2) +![npm-dependencies](https://img.shields.io/david/ezolenko/rollup-plugin-typescript2.svg?maxAge=2592000) +![npm-monthly-downloads](https://img.shields.io/npm/dm/rollup-plugin-typescript2.svg?maxAge=2592000) +[![Codeship Status](https://app.codeship.com/projects/fe9cf8f0-e8d4-0134-ec88-4e3d33dcd7ed/status?branch=master)](https://app.codeship.com/projects/207445) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/e19b72ab9658405bbfb32dd6d65d1856)](https://www.codacy.com/app/zolenkoe/rollup-plugin-typescript2?utm_source=github.com&utm_medium=referral&utm_content=ezolenko/rollup-plugin-typescript2&utm_campaign=Badge_Grade) + +Rollup plugin for typescript with compiler errors. + +This is a rewrite of original rollup-plugin-typescript, starting and borrowing from [this fork](https://github.com/alexlur/rollup-plugin-typescript). + +This version is somewhat slower than original, but it will print out typescript syntactic and semantic diagnostic messages (the main reason for using typescript after all). + +## Usage + +```js +// rollup.config.js +import typescript from 'rollup-plugin-typescript2'; + +export default { + entry: './main.ts', + + plugins: [ + typescript(/*{ plugin options }*/) + ] +} +``` + +The plugin inherits all compiler options and file lists from your `tsconfig.json` file. If your tsconfig has another name or another relative path from the root directory, see `tsconfigDefaults`, `tsconfig` and `tsconfigOverride` options below. This also allows for passing in different tsconfig files depending on your build target. + +#### Some compiler options are forced + +* `noEmitHelpers`: false +* `importHelpers`: true +* `noResolve`: false +* `noEmit`: false +* `inlineSourceMap`: false (see [#71](https://github.com/ezolenko/rollup-plugin-typescript2/issues/71)) +* `outDir`: `./placeholder` in cache root, see [83](https://github.com/ezolenko/rollup-plugin-typescript2/issues/83) and [Microsoft/TypeScript/issues/24715](https://github.com/Microsoft/TypeScript/issues/24715) +* `declarationDir`: `process.cwd()` (*only if `useTsconfigDeclarationDir` is false in the plugin options*) +* `moduleResolution`: `node` (*`classic` is [deprecated](https://www.typescriptlang.org/docs/handbook/module-resolution.html). It also breaks this plugin, see [#12](https://github.com/ezolenko/rollup-plugin-typescript2/issues/12) and [#14](https://github.com/ezolenko/rollup-plugin-typescript2/issues/14)*) + +#### Some compiler options have more than one compatible value. + +* `module`: defaults to `ES2015`, other valid value is `ESNext` (required for dynamic imports, see [#54](https://github.com/ezolenko/rollup-plugin-typescript2/issues/54)). + +### Compatibility + +#### rollup-plugin-node-resolve + +Must be before this plugin in the plugin list, especially when `browser: true` option is used, see [#66](https://github.com/ezolenko/rollup-plugin-typescript2/issues/66) + +#### rollup-plugin-commonjs + +See explanation for `rollupCommonJSResolveHack` option below. + +### Plugin options + +* `tsconfigDefaults`: `{}` + + The object passed as `tsconfigDefaults` will be merged with loaded `tsconfig.json`. Final config passed to typescript will be the result of values in `tsconfigDefaults` replaced by values in loaded `tsconfig.json`, replaced by values in `tsconfigOverride` and then replaced by hard `compilerOptions` overrides on top of that (see above). + + For simplicity and other tools' sake, try to minimize usage of defaults and overrides and keep everything in `tsconfig.json` file (tsconfigs can themselves be chained, so save some turtles). + + ```js + let defaults = { compilerOptions: { declaration: true } }; + let override = { compilerOptions: { declaration: false } }; + + // ... + plugins: [ + typescript({ + tsconfigDefaults: defaults, + tsconfig: "tsconfig.json", + tsconfigOverride: override + }) + ] + ``` + + This is a [deep merge](https://lodash.com/docs/4.17.4#merge) (objects are merged, arrays are concatenated, primitives are replaced, etc), increase `verbosity` to 3 and look for `parsed tsconfig` if you get something unexpected. + +* `tsconfig`: `undefined` + + Path to `tsconfig.json`. Set this if your tsconfig has another name or relative location from the project directory. By default will try to load `./tsconfig.json`, but will not fail if file is missing unless the value is set explicitly. + +* `tsconfigOverride`: `{}` + + See `tsconfigDefaults`. + +* `check`: true + + Set to false to avoid doing any diagnostic checks on the code. + +* `verbosity`: 1 + + - 0 -- Error + - 1 -- Warning + - 2 -- Info + - 3 -- Debug + +* `clean`: false + + Set to true for clean build (wipes out cache on every build). + +* `cacheRoot`: `./.rts2_cache` + + Path to cache. Defaults to a folder in the current directory. Can be safely moved out with something like `${require('temp-dir')}/.rpt2_cache`, but watch out for multiple concurrent builds of the same repo. + +* `include`: `[ "*.ts+(|x)", "**/*.ts+(|x)" ]` + + By default passes all .ts files through typescript compiler. + +* `exclude`: `[ "*.d.ts", "**/*.d.ts" ]` + + But excludes type definitions. + +* `abortOnError`: true + + Bail out on first syntactic or semantic error. In some cases setting this to false will result in exception in rollup itself (for example for unresolvable imports). + +* `rollupCommonJSResolveHack`: false + + On windows typescript resolver favors POSIX path, while commonjs plugin (and maybe others?) uses native path as module id. This can result in `namedExports` being ignored if rollup happened to use typescript's resolution. Set to true to pass resolved module path through `resolve()` to match up with `rollup-plugin-commonjs`. + +* `useTsconfigDeclarationDir`: false + + If true, declaration files will be emitted in the directory given in the tsconfig. If false, the declaration files will be placed inside the destination directory given in the Rollup configuration. + +* `typescript`: typescript module installed with the plugin + + When typescript version installed by the plugin (latest 2.x) is unacceptable, you can import your own typescript module and pass it in as `typescript: require("typescript")`. Must be 2.0+, things might break if transpiler interfaces changed enough from what the plugin was built against. + +* `transformers`: `undefined` + + **experimental**, typescript 2.4.1+ + + Transformers will likely be available in tsconfig eventually, so this is not a stable interface, see [Microsoft/TypeScript/issues/14419](https://github.com/Microsoft/TypeScript/issues/14419). + + For example, integrating [kimamula/ts-transformer-keys](https://github.com/kimamula/ts-transformer-keys): + + ```js + const keysTransformer = require('ts-transformer-keys/transformer').default; + const transformer = (service) => + { + before: [ keysTransformer(service.getProgram()) ], + after: [] + }; + + // ... + plugins: [ + typescript({ transformers: [transformer] }) + ] + ``` + +### Declarations + +This plugin respects `declaration: true` in your `tsconfig.json` file. When set, it will emit `*.d.ts` files for your bundle. The resulting file(s) can then be used with the `types` property in your `package.json` file as described [here](https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html). +By default, the declaration files will be located in the same directory as the generated Rollup bundle. If you want to override this behavior and instead use the declarationDir set `useTsconfigDeclarationDir` to `true` in the plugin options. + +### Watch mode + +The way typescript handles type-only imports and ambient types effectively hides them from rollup watch, because import statements are not generated and changing them doesn't trigger a rebuild. + +Otherwise the plugin should work in watch mode. Make sure to run a normal build after watch session to catch any type errors. + +### Requirements + +TypeScript `2.4+` +Rollup `0.50+` +Node `6.4.0+` (basic es6 support) + +### Reporting bugs + +Report any bugs on github: . + +Attach your `tsconfig.json`, `package.json` (for versions of dependencies), rollup script and anything else that could influence module resolution, ambient types and typescript compilation. + +Check if problem is reproducible after running `npm prune` to clear any rogue types from npm_modules (by default typescript grabs all ambient types). + +Check if you get the same problem with `clean` option set to true (might indicate a bug in the cache). + +If makes sense, check if running `tsc` directly produces similar results. + +Attach plugin output with `verbosity` option set to 3 (this will list all files being transpiled and their imports). diff --git a/package-lock.json b/package-lock.json index d0b60f9e..f7500314 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "rollup-plugin-typescript2", - "version": "0.15.1", + "version": "0.15.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -940,9 +940,9 @@ } }, "rollup": { - "version": "0.59.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.59.4.tgz", - "integrity": "sha512-ISiMqq/aJa+57QxX2MRcvLESHdJ7wSavmr6U1euMr+6UgFe6KM+3QANrYy8LQofwhTC1I7BcAdlLnDiaODs1BA==", + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.62.0.tgz", + "integrity": "sha512-mZS0aIGfYzuJySJD78znu9/hCJsNfBzg4lDuZGMj0hFVcYHt2evNRHv8aqiu9/w6z6Qn8AQoVl4iyEjDmisGeA==", "dev": true, "requires": { "@types/estree": "0.0.39", @@ -1002,7 +1002,7 @@ } }, "rollup-plugin-typescript2": { - "version": "github:ezolenko/rollup-plugin-typescript2#d289d3f7259d246e03f364f3ca784f1fa08f5e3c", + "version": "github:ezolenko/rollup-plugin-typescript2#707c6fc300ce5b6ed4d11992b8e466f328fa88b2", "dev": true, "requires": { "fs-extra": "5.0.0", @@ -1981,9 +1981,9 @@ } }, "typescript": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", - "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", "dev": true }, "universalify": { diff --git a/package.json b/package.json index 06507aaa..f0d1cb68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rollup-plugin-typescript2", - "version": "0.15.2", + "version": "0.16.0", "description": "Seamless integration between Rollup and TypeScript. Now with errors.", "main": "dist/rollup-plugin-typescript2.cjs.js", "module": "dist/rollup-plugin-typescript2.es.js", @@ -40,7 +40,7 @@ "typescript": ">=2.4.0" }, "devDependencies": { - "typescript": "^2.9.1", + "typescript": "^2.9.2", "object-hash": "^1.3.0", "colors": "^1.2.4", "graphlib": "^2.1.5", @@ -53,7 +53,7 @@ "@types/object-hash": "^1.2.0", "@types/resolve": "^0.0.8", "rimraf": "^2.6.2", - "rollup": "^0.59.4", + "rollup": "^0.62.0", "rollup-plugin-typescript2": "github:ezolenko/rollup-plugin-typescript2#master", "rollup-plugin-node-resolve": "^3.3.0", "rollup-plugin-commonjs": "^9.1.3", diff --git a/src/host.ts b/src/host.ts index 8e54a530..aecb4f44 100644 --- a/src/host.ts +++ b/src/host.ts @@ -1,141 +1,144 @@ -import { tsModule } from "./tsproxy"; -import * as tsTypes from "typescript"; -import { existsSync } from "fs"; -import * as _ from "lodash"; -import { normalize } from "./normalize"; -import { TransformerFactoryCreator } from "./ioptions"; - -export class LanguageServiceHost implements tsTypes.LanguageServiceHost -{ - private cwd = process.cwd(); - private snapshots: { [fileName: string]: tsTypes.IScriptSnapshot } = {}; - private versions: { [fileName: string]: number } = {}; - private service?: tsTypes.LanguageService; - - constructor(private parsedConfig: tsTypes.ParsedCommandLine, private transformers: TransformerFactoryCreator[]) - { - } - - public reset() - { - this.snapshots = {}; - this.versions = {}; - } - - public setLanguageService(service: tsTypes.LanguageService) - { - this.service = service; - } - - public setSnapshot(fileName: string, data: string): tsTypes.IScriptSnapshot - { - fileName = normalize(fileName); - - const snapshot = tsModule.ScriptSnapshot.fromString(data); - this.snapshots[fileName] = snapshot; - this.versions[fileName] = (this.versions[fileName] || 0) + 1; - return snapshot; - } - - public getScriptSnapshot(fileName: string): tsTypes.IScriptSnapshot | undefined - { - fileName = normalize(fileName); - - if (_.has(this.snapshots, fileName)) - return this.snapshots[fileName]; - - if (existsSync(fileName)) - { - this.snapshots[fileName] = tsModule.ScriptSnapshot.fromString(tsModule.sys.readFile(fileName)!); - this.versions[fileName] = (this.versions[fileName] || 0) + 1; - return this.snapshots[fileName]; - } - - return undefined; - } - - public getCurrentDirectory() - { - return this.cwd; - } - - public getScriptVersion(fileName: string) - { - fileName = normalize(fileName); - - return (this.versions[fileName] || 0).toString(); - } - - public getScriptFileNames() - { - return Object.keys(this.snapshots); - } - - public getCompilationSettings(): tsTypes.CompilerOptions - { - return this.parsedConfig.options; - } - - public getDefaultLibFileName(opts: tsTypes.CompilerOptions) - { - return tsModule.getDefaultLibFilePath(opts); - } - - public useCaseSensitiveFileNames(): boolean - { - return tsModule.sys.useCaseSensitiveFileNames; - } - - public readDirectory(path: string, extensions?: string[], exclude?: string[], include?: string[]): string[] - { - return tsModule.sys.readDirectory(path, extensions, exclude, include); - } - - public readFile(path: string, encoding?: string): string | undefined - { - return tsModule.sys.readFile(path, encoding); - } - - public fileExists(path: string): boolean - { - return tsModule.sys.fileExists(path); - } - - public getTypeRootsVersion(): number - { - return 0; - } - - public directoryExists(directoryName: string): boolean - { - return tsModule.sys.directoryExists(directoryName); - } - - public getDirectories(directoryName: string): string[] - { - return tsModule.sys.getDirectories(directoryName); - } - - public getCustomTransformers(): tsTypes.CustomTransformers | undefined - { - if (this.service === undefined || this.transformers === undefined || this.transformers.length === 0) - return undefined; - - const transformer: tsTypes.CustomTransformers = - { - before: [], - after: [], - }; - - for (const creator of this.transformers) - { - const factory = creator(this.service); - if (factory.before) - transformer.before = _.concat(transformer.before!, factory.before); - if (factory.after) - transformer.after = _.concat(transformer.after!, factory.after); - } - - return transformer; - } -} +import { tsModule } from "./tsproxy"; +import * as tsTypes from "typescript"; +import { existsSync } from "fs"; +import * as _ from "lodash"; +import { normalize } from "./normalize"; +import { TransformerFactoryCreator } from "./ioptions"; + +export class LanguageServiceHost implements tsTypes.LanguageServiceHost +{ + private cwd = process.cwd(); + private snapshots: { [fileName: string]: tsTypes.IScriptSnapshot } = {}; + private versions: { [fileName: string]: number } = {}; + private service?: tsTypes.LanguageService; + private fileNames: Set; + + constructor(private parsedConfig: tsTypes.ParsedCommandLine, private transformers: TransformerFactoryCreator[]) + { + this.fileNames = new Set(parsedConfig.fileNames); + } + + public reset() + { + this.snapshots = {}; + this.versions = {}; + } + + public setLanguageService(service: tsTypes.LanguageService) + { + this.service = service; + } + + public setSnapshot(fileName: string, data: string): tsTypes.IScriptSnapshot + { + fileName = normalize(fileName); + + const snapshot = tsModule.ScriptSnapshot.fromString(data); + this.snapshots[fileName] = snapshot; + this.versions[fileName] = (this.versions[fileName] || 0) + 1; + this.fileNames.add(fileName); + return snapshot; + } + + public getScriptSnapshot(fileName: string): tsTypes.IScriptSnapshot | undefined + { + fileName = normalize(fileName); + + if (_.has(this.snapshots, fileName)) + return this.snapshots[fileName]; + + if (existsSync(fileName)) + { + this.snapshots[fileName] = tsModule.ScriptSnapshot.fromString(tsModule.sys.readFile(fileName)!); + this.versions[fileName] = (this.versions[fileName] || 0) + 1; + return this.snapshots[fileName]; + } + + return undefined; + } + + public getCurrentDirectory() + { + return this.cwd; + } + + public getScriptVersion(fileName: string) + { + fileName = normalize(fileName); + + return (this.versions[fileName] || 0).toString(); + } + + public getScriptFileNames() + { + return Array.from(this.fileNames.values()); + } + + public getCompilationSettings(): tsTypes.CompilerOptions + { + return this.parsedConfig.options; + } + + public getDefaultLibFileName(opts: tsTypes.CompilerOptions) + { + return tsModule.getDefaultLibFilePath(opts); + } + + public useCaseSensitiveFileNames(): boolean + { + return tsModule.sys.useCaseSensitiveFileNames; + } + + public readDirectory(path: string, extensions?: string[], exclude?: string[], include?: string[]): string[] + { + return tsModule.sys.readDirectory(path, extensions, exclude, include); + } + + public readFile(path: string, encoding?: string): string | undefined + { + return tsModule.sys.readFile(path, encoding); + } + + public fileExists(path: string): boolean + { + return tsModule.sys.fileExists(path); + } + + public getTypeRootsVersion(): number + { + return 0; + } + + public directoryExists(directoryName: string): boolean + { + return tsModule.sys.directoryExists(directoryName); + } + + public getDirectories(directoryName: string): string[] + { + return tsModule.sys.getDirectories(directoryName); + } + + public getCustomTransformers(): tsTypes.CustomTransformers | undefined + { + if (this.service === undefined || this.transformers === undefined || this.transformers.length === 0) + return undefined; + + const transformer: tsTypes.CustomTransformers = + { + before: [], + after: [], + }; + + for (const creator of this.transformers) + { + const factory = creator(this.service); + if (factory.before) + transformer.before = _.concat(transformer.before!, factory.before); + if (factory.after) + transformer.after = _.concat(transformer.after!, factory.after); + } + + return transformer; + } +} diff --git a/tsconfig.json b/tsconfig.json index a0d22d51..4810b129 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,25 @@ -{ - "compilerOptions": { - "target": "es5", - "noImplicitAny": true, - "sourceMap": true, - "noUnusedParameters": true, - "noUnusedLocals": true, - "noImplicitThis": true, - "diagnostics": true, - "listFiles": true, - "pretty": true, - "moduleResolution": "node", - "noEmitOnError": false, - "strictNullChecks": true, - "forceConsistentCasingInFileNames": true, - "noImplicitReturns": true, - "declaration": true, - "declarationMap": true, - "strict": true, - "outDir": "./build" - }, - "include": [ - "src/**/*.ts" - ] +{ + "compilerOptions": { + "target": "es6", + "noImplicitAny": true, + "sourceMap": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "noImplicitThis": true, + "diagnostics": true, + "listFiles": true, + "pretty": true, + "moduleResolution": "node", + "noEmitOnError": false, + "strictNullChecks": true, + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "declaration": true, + "declarationMap": true, + "strict": true, + "outDir": "./build" + }, + "include": [ + "src/**/*.ts" + ] } \ No newline at end of file