diff --git a/vscode-extensions/pom.xml b/vscode-extensions/pom.xml index 42d31f2e7..d0abfc259 100644 --- a/vscode-extensions/pom.xml +++ b/vscode-extensions/pom.xml @@ -12,6 +12,7 @@ commons vscode-boot-properties + vscode-boot-java vscode-manifest-yaml vscode-concourse diff --git a/vscode-extensions/vscode-boot-java/.classpath b/vscode-extensions/vscode-boot-java/.classpath new file mode 100644 index 000000000..d46faf10e --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.classpath @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vscode-extensions/vscode-boot-java/.gitignore b/vscode-extensions/vscode-boot-java/.gitignore new file mode 100644 index 000000000..e0fd3a462 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.gitignore @@ -0,0 +1,17 @@ +out +node_modules +target +*.log +*.log.* +classpath.txt +*.vsix +repo +.idea +*.iml +.DS_Store +**/.DS_Store +src/test/resources/test-projects/**/.classpath +src/test/resources/test-projects/**/.project +src/test/resources/test-projects/**/.factorypath +src/test/resources/test-projects/**/.settings/** +src/test/resources/test-projects/**/bin/** \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/.project b/vscode-extensions/vscode-boot-java/.project new file mode 100644 index 000000000..c0cec16d7 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.project @@ -0,0 +1,23 @@ + + + vscode-boot-java + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..cdfe4f1b6 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..714351aec --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/vscode-extensions/vscode-boot-java/.vscode/launch.json b/vscode-extensions/vscode-boot-java/.vscode/launch.json new file mode 100644 index 000000000..52ebf9f9e --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscode/launch.json @@ -0,0 +1,28 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +{ + "version": "0.1.0", + "configurations": [ + { + "name": "Launch Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], + "stopOnEntry": false, + "sourceMaps": true, + "outDir": "${workspaceRoot}/out/lib", + "preLaunchTask": "npm" + }, + { + "name": "Launch Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ], + "stopOnEntry": false, + "sourceMaps": true, + "outDir": "${workspaceRoot}/out/test", + "preLaunchTask": "npm" + } + ] +} diff --git a/vscode-extensions/vscode-boot-java/.vscode/settings.json b/vscode-extensions/vscode-boot-java/.vscode/settings.json new file mode 100644 index 000000000..c5592bee9 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscode/settings.json @@ -0,0 +1,12 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": true, // set this to true to hide the "out" folder with the compiled JS files + "node_modules": false, + "target": true + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + "typescript.tsdk": "./node_modules/typescript/lib" // we want to use the TS server from our node_modules folder to control its version +} \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/.vscode/tasks.json b/vscode-extensions/vscode-boot-java/.vscode/tasks.json new file mode 100644 index 000000000..1cbb9fd45 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscode/tasks.json @@ -0,0 +1,30 @@ +// Available variables which can be used inside of strings. +// ${workspaceRoot}: the root folder of the team +// ${file}: the current opened file +// ${fileBasename}: the current opened file's basename +// ${fileDirname}: the current opened file's dirname +// ${fileExtname}: the current opened file's extension +// ${cwd}: the current working directory of the spawned process + +// A task runner that calls a custom npm script that compiles the extension. +{ + "version": "0.1.0", + + // we want to run npm + "command": "npm", + + // the command is a shell script + "isShellCommand": true, + + // show the output window only if unrecognized errors occur. + "showOutput": "silent", + + // we run the custom script "compile" as defined in package.json + "args": ["run", "compile"], //, "--loglevel", "silent"], + + // The tsc compiler is started in watching mode + "isWatching": true, + + // use the standard tsc in watch mode problem matcher to find compile problems in the output. + "problemMatcher": "$tsc-watch" +} \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/.vscodeignore b/vscode-extensions/vscode-boot-java/.vscodeignore new file mode 100644 index 000000000..37a538825 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscodeignore @@ -0,0 +1,30 @@ +# IDE configs +.vscode/** +.idea/** +*.iml +javaconfig.json +classpath.txt +tsconfig.json +tsd.json +*.xml + +# Logs +*.log* + +# Sources +typings/** +src/** +test/** +lib/** +!lib/javaconfig.schema.json +repo/** +scripts/** + +# Compiler output +out/test/** +target/** +!target/vscode-boot-properties-*.jar + +# Extensions +.gitignore +**/*.map diff --git a/vscode-extensions/vscode-boot-java/README.md b/vscode-extensions/vscode-boot-java/README.md new file mode 100644 index 000000000..fd3d73970 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/README.md @@ -0,0 +1,73 @@ +# VS Code Language Server for Spring Boot Application Properties + +VSCode extension and Language Server providing support for working with Spring Boot apps in Java. + +## Installation: + +Currently this plugin is not distributed via vscode marketplace. You can only install +it from a .vsix file. You can download it here: + + TODO: add link + +To install it: + +- open vscode. +- press `CTRL-SHIFT-P` and search for VSIX +- select `Extension: Install from VSIX` + +## Usage: + +The extension will automatically activate when you edit files with the following +name patterns: + + - `*.java` => activates support for Java files + +# Developer notes + +## Bulding and Running + +This project consists of three pieces: + + - a vscode-extension which is a language-server client implemented in TypeScript. + - commons-vscode: a local npm module with some utilities implemented in TypeScript. + - a language server implemented in Java. + +To build all these pieces you normally only need to run: + + npm install + +**However, the first time you build** it might fail trying to +find the `commons-vscode` module on npm central. Once we publish a stable +version of that module on npm central that will no longer be a problem. +Until that time, you can work around this by doing a one time manual +run of the `preinstall` script prior to running `npm install`: + + ./scripts/preinstall.sh + npm install + +Now you can open the client-app in vscode. From the root of this project. + + code . + +To launch the language server in a vscode runtime, press F5. + +## Debugging + +To debug the language server, open `lib/Main.ts` and edit to set the +`DEBUG` option to `true`. When you laucnh the app next by pressing +`F5` it will launch with debug options being passed to the JVM. + +You can then connect a 'Remote Java' Eclipse debugger on port 8000. + +## Packaging as a vscode extension + +First make sure the stuff is all built locally: + + ./scripts/preinstall.sh # only needed if this is the first build. + npm install + +Then package it: + + npm run vsce-package + +This produces a `.vsix` file which you can install directly into vscode. \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/lib/.gitignore b/vscode-extensions/vscode-boot-java/lib/.gitignore new file mode 100644 index 000000000..a6c7c2852 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/lib/.gitignore @@ -0,0 +1 @@ +*.js diff --git a/vscode-extensions/vscode-boot-java/lib/Main.ts b/vscode-extensions/vscode-boot-java/lib/Main.ts new file mode 100644 index 000000000..30b7d2bbc --- /dev/null +++ b/vscode-extensions/vscode-boot-java/lib/Main.ts @@ -0,0 +1,37 @@ +'use strict'; +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below + +import * as VSCode from 'vscode'; +import * as Path from 'path'; +import * as FS from 'fs'; +import * as Net from 'net'; +import * as ChildProcess from 'child_process'; +import {LanguageClient, LanguageClientOptions, SettingMonitor, ServerOptions, StreamInfo} from 'vscode-languageclient'; +import {TextDocument} from 'vscode'; + +import * as commons from 'commons-vscode'; + +/** Called when extension is activated */ +export function activate(context: VSCode.ExtensionContext) { + let options : commons.ActivatorOptions = { + DEBUG: true, + extensionId: 'vscode-boot-java', + fatJarFile: 'target/vscode-boot-java-0.0.1-SNAPSHOT.jar', + clientOptions: { + // HACK!!! documentSelector only takes string|string[] where string is language id, but DocumentFilter object is passed instead + // Reasons: + // 1. documentSelector is just passed over to functions like #registerHoverProvider(documentSelector, ...) that take documentSelector + // parameter in string | DocumentFilter | string[] | DocumentFilter[] format + // 2. Combination of non string|string[] documentSelector parameter and synchronize.textDocumentFilter function makes doc synchronization + // events pass on to Language Server only for documents for which function passed via textDocumentFilter property return true + + // TODO: Remove cast ones https://github.com/Microsoft/vscode-languageserver-node/issues/9 is resolved + documentSelector: ['java'], + synchronize: { + configurationSection: 'vscode-boot-java' + } + } + }; + commons.activate(options, context); +} diff --git a/vscode-extensions/vscode-boot-java/package.json b/vscode-extensions/vscode-boot-java/package.json new file mode 100644 index 000000000..95367b315 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/package.json @@ -0,0 +1,47 @@ +{ + "name": "vscode-boot-java", + "displayName": "Spring Boot Java Support", + "description": "Provides validation, content assist, and more working with Spring Boot applications Java code", + "icon": "spring-boot-logo.png", + "version": "0.0.1", + "publisher": "Pivotal", + "repository": { + "type": "git", + "url": "https://github.com/spring-projects/sts4.git" + }, + "license": "EPL-1.0", + "engines": { + "npm": "^3.0.0", + "vscode": "^1.5.0" + }, + "categories": [ + "Languages", + "Linters" + ], + "keywords": [ + "java", "spring-boot" + ], + "activationEvents": [ + "onLanguage:ini", + "onLanguage:java" + ], + "main": "./out/lib/Main", + "scripts": { + "prepublish": "tsc -p .", + "clean": "rm -fr node_modules out *.vsix", + "compile": "tsc -watch -p ./", + "preinstall": "./scripts/preinstall.sh", + "postinstall": "node ./node_modules/vscode/bin/install", + "vsce-package": "vsce package" + }, + "dependencies": { + "vscode-languageclient": "2.5.x", + "commons-vscode": "^0.0.1" + }, + "devDependencies": { + "vsce": "^1.17.0", + "typescript": "^2.0.x", + "@types/node": "^6.0.40", + "vscode": "^1.0.0" + } +} diff --git a/vscode-extensions/vscode-boot-java/pom.xml b/vscode-extensions/vscode-boot-java/pom.xml new file mode 100644 index 000000000..af357ead1 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/pom.xml @@ -0,0 +1,94 @@ + + + 4.0.0 + vscode-boot-java + jar + + + org.springframework.ide.vscode + commons-parent + 0.0.1-SNAPSHOT + ../commons/pom.xml + + + + + + oss-sonatype + oss-sonatype + https://oss.sonatype.org/content/repositories/snapshots/ + + true + + + + + + + distribution-repository + Temporary Staging Repository + file://${basedir}/dist + + + + + + org.springframework.ide.vscode + commons-maven + ${project.version} + + + org.springframework.ide.vscode + commons-language-server + ${project.version} + + + + + org.springframework.ide.vscode + language-server-test-harness + ${project.version} + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.4.1.RELEASE + + + + repackage + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + + test-projects/** + + + + + + diff --git a/vscode-extensions/vscode-boot-java/scripts/preinstall.sh b/vscode-extensions/vscode-boot-java/scripts/preinstall.sh new file mode 100755 index 000000000..15b18c87f --- /dev/null +++ b/vscode-extensions/vscode-boot-java/scripts/preinstall.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e +(cd ../commons-vscode ; npm install) +npm install ../commons-vscode +../mvnw -U -f ../pom.xml -pl vscode-boot-java -am clean install diff --git a/vscode-extensions/vscode-boot-java/spring-boot-logo.png b/vscode-extensions/vscode-boot-java/spring-boot-logo.png new file mode 100644 index 000000000..0ccdef63a Binary files /dev/null and b/vscode-extensions/vscode-boot-java/spring-boot-logo.png differ diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java new file mode 100644 index 000000000..1aadcdd72 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java; + +import org.eclipse.lsp4j.CompletionOptions; +import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.TextDocumentSyncKind; +import org.springframework.ide.vscode.boot.java.completions.BootJavaCompletionEngine; +import org.springframework.ide.vscode.boot.java.completions.BootJavaReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; +import org.springframework.ide.vscode.commons.languageserver.java.DefaultJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; +import org.springframework.ide.vscode.commons.maven.JavaProjectWithClasspathFileFinderStrategy; +import org.springframework.ide.vscode.commons.maven.MavenProjectFinderStrategy; +import org.springframework.ide.vscode.commons.util.text.TextDocument; + +/** + * Language Server for Spring Boot Application Properties files + * + * @author Martin Lippert + */ +public class BootJavaLanguageServer extends SimpleLanguageServer { + + public static final JavaProjectFinder DEFAULT_PROJECT_FINDER = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] { + new MavenProjectFinderStrategy(), + new JavaProjectWithClasspathFileFinderStrategy() + }); + + private final JavaProjectFinder javaProjectFinder; + private final VscodeCompletionEngineAdapter completionEngine; + + public BootJavaLanguageServer(JavaProjectFinder javaProjectFinder) { + this.javaProjectFinder = javaProjectFinder; + SimpleTextDocumentService documents = getTextDocumentService(); + + IReconcileEngine reconcileEngine = new BootJavaReconcileEngine(); + documents.onDidChangeContent(params -> { + TextDocument doc = params.getDocument(); + validateWith(doc, reconcileEngine); + }); + + ICompletionEngine bootCompletionEngine = new BootJavaCompletionEngine(); + completionEngine = new VscodeCompletionEngineAdapter(this, bootCompletionEngine); + completionEngine.setMaxCompletionsNumber(100); + documents.onCompletion(completionEngine::getCompletions); + documents.onCompletionResolve(completionEngine::resolveCompletion); + } + + public void setMaxCompletionsNumber(int number) { + completionEngine.setMaxCompletionsNumber(number); + } + + @Override + protected ServerCapabilities getServerCapabilities() { + ServerCapabilities c = new ServerCapabilities(); + + c.setTextDocumentSync(TextDocumentSyncKind.Incremental); + CompletionOptions completionProvider = new CompletionOptions(); + completionProvider.setResolveProvider(false); + c.setCompletionProvider(completionProvider); + + return c; + } + +} diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java new file mode 100644 index 000000000..73e1103bd --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java; + +import java.io.IOException; + +import org.springframework.ide.vscode.commons.languageserver.LaunguageServerApp; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; + +/** + * Starts up Language Server process + * + * @author Martin Lippert + */ +public class Main { + + public static void main(String[] args) throws IOException { + LaunguageServerApp.start(() -> { + JavaProjectFinder javaProjectFinder = BootJavaLanguageServer.DEFAULT_PROJECT_FINDER; + SimpleLanguageServer server = new BootJavaLanguageServer(javaProjectFinder); + return server; + }); + } + +} diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java new file mode 100644 index 000000000..7f4877c3f --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java @@ -0,0 +1,62 @@ +package org.springframework.ide.vscode.boot.java.completions; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.eclipse.lsp4j.CompletionItemKind; +import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; +import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.Renderables; +import org.springframework.ide.vscode.commons.util.text.IDocument; + +public class BootJavaCompletionEngine implements ICompletionEngine { + + @Override + public Collection getCompletions(IDocument document, int offset) throws Exception { + List completions = new ArrayList<>(); + + ICompletionProposal proposal = new ICompletionProposal() { + + @Override + public DocumentEdits getTextEdit() { + DocumentEdits edits = new DocumentEdits(document); + edits.insert(0, "my noew java code from spring boot completions!!!"); + + return edits; + } + + @Override + public String getLabel() { + return "Do a great Spring Boot Java Code completion"; + } + + @Override + public CompletionItemKind getKind() { + return CompletionItemKind.Text; + } + + @Override + public Renderable getDocumentation() { + return Renderables.text("this describes the Boot Java completion in more detail"); + } + + @Override + public String getDetail() { + return "and here are the details"; + } + + @Override + public ICompletionProposal deemphasize() { + return null; + } + }; + + completions.add(proposal); + + return completions; + } + +} diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java new file mode 100644 index 000000000..a7be7f3f1 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java @@ -0,0 +1,13 @@ +package org.springframework.ide.vscode.boot.java.completions; + +import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.util.text.IDocument; + +public class BootJavaReconcileEngine implements IReconcileEngine { + + @Override + public void reconcile(IDocument doc, IProblemCollector problemCollector) { + } + +} diff --git a/vscode-extensions/vscode-boot-java/tsconfig.json b/vscode-extensions/vscode-boot-java/tsconfig.json new file mode 100644 index 000000000..1905ffea7 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + "target": "es6", + "lib": [ + "es6" + ], + "declaration": true, + "outDir": "out", + "sourceMap": true, + "rootDir": "." + }, + "include": [ + "typings/*.d.ts", + "lib/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file