From 75564b34cc6aff204a33e2d5ccd5d339c28373f5 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 8 Mar 2018 19:10:23 -0500 Subject: [PATCH] Switch Atom packages to TS --- atom-extensions/atom-bosh/.gitignore | 1 + .../lib/{main.js => bosh-yaml-client.ts} | 25 +- atom-extensions/atom-bosh/lib/main.ts | 3 + atom-extensions/atom-bosh/package.json | 24 +- atom-extensions/atom-bosh/properties.json | 2 +- atom-extensions/atom-bosh/tsconfig.json | 17 ++ atom-extensions/atom-bosh/tslint.json | 31 +++ .../atom-cf-manifest-yaml/.gitignore | 1 + .../atom-cf-manifest-yaml/lib/main.ts | 3 + ...in.js => manifest-yaml-language-client.ts} | 15 +- .../atom-cf-manifest-yaml/package.json | 16 +- .../atom-cf-manifest-yaml/properties.json | 2 +- .../atom-cf-manifest-yaml/tsconfig.json | 17 ++ .../atom-cf-manifest-yaml/tslint.json | 31 +++ atom-extensions/atom-commons/.babelrc | 15 -- atom-extensions/atom-commons/lib/index.js | 4 - .../lib/java-process-language-client.js | 217 ------------------ .../lib/java-process-language-client.ts | 163 +++++++++++++ atom-extensions/atom-commons/lib/main.ts | 10 + .../atom-commons/lib/sts-adapter.js | 20 -- .../atom-commons/lib/sts-adapter.ts | 38 +++ atom-extensions/atom-commons/package.json | 61 ++--- atom-extensions/atom-commons/tsconfig.json | 17 ++ atom-extensions/atom-commons/tslint.json | 31 +++ atom-extensions/atom-concourse/.gitignore | 1 + .../{main.js => concourse-ci-yaml-client.ts} | 15 +- atom-extensions/atom-concourse/lib/main.ts | 3 + atom-extensions/atom-concourse/package.json | 16 +- atom-extensions/atom-concourse/tsconfig.json | 17 ++ atom-extensions/atom-concourse/tslint.json | 31 +++ atom-extensions/atom-spring-boot/.gitignore | 1 + .../atom-spring-boot/lib/boot-sts-adapter.ts | 56 +++++ atom-extensions/atom-spring-boot/lib/main.js | 128 ----------- atom-extensions/atom-spring-boot/lib/main.ts | 3 + .../lib/spring-boot-language-client.ts | 75 ++++++ atom-extensions/atom-spring-boot/package.json | 17 +- .../atom-spring-boot/properties.json | 2 +- .../atom-spring-boot/tsconfig.json | 17 ++ atom-extensions/atom-spring-boot/tslint.json | 31 +++ concourse/tasks/build-atom-package.sh | 3 + 40 files changed, 700 insertions(+), 480 deletions(-) rename atom-extensions/atom-bosh/lib/{main.js => bosh-yaml-client.ts} (63%) create mode 100644 atom-extensions/atom-bosh/lib/main.ts create mode 100644 atom-extensions/atom-bosh/tsconfig.json create mode 100644 atom-extensions/atom-bosh/tslint.json create mode 100644 atom-extensions/atom-cf-manifest-yaml/lib/main.ts rename atom-extensions/atom-cf-manifest-yaml/lib/{main.js => manifest-yaml-language-client.ts} (70%) create mode 100644 atom-extensions/atom-cf-manifest-yaml/tsconfig.json create mode 100644 atom-extensions/atom-cf-manifest-yaml/tslint.json delete mode 100644 atom-extensions/atom-commons/.babelrc delete mode 100644 atom-extensions/atom-commons/lib/index.js delete mode 100644 atom-extensions/atom-commons/lib/java-process-language-client.js create mode 100644 atom-extensions/atom-commons/lib/java-process-language-client.ts create mode 100644 atom-extensions/atom-commons/lib/main.ts delete mode 100644 atom-extensions/atom-commons/lib/sts-adapter.js create mode 100644 atom-extensions/atom-commons/lib/sts-adapter.ts create mode 100644 atom-extensions/atom-commons/tsconfig.json create mode 100644 atom-extensions/atom-commons/tslint.json rename atom-extensions/atom-concourse/lib/{main.js => concourse-ci-yaml-client.ts} (73%) create mode 100644 atom-extensions/atom-concourse/lib/main.ts create mode 100644 atom-extensions/atom-concourse/tsconfig.json create mode 100644 atom-extensions/atom-concourse/tslint.json create mode 100644 atom-extensions/atom-spring-boot/lib/boot-sts-adapter.ts delete mode 100644 atom-extensions/atom-spring-boot/lib/main.js create mode 100644 atom-extensions/atom-spring-boot/lib/main.ts create mode 100644 atom-extensions/atom-spring-boot/lib/spring-boot-language-client.ts create mode 100644 atom-extensions/atom-spring-boot/tsconfig.json create mode 100644 atom-extensions/atom-spring-boot/tslint.json diff --git a/atom-extensions/atom-bosh/.gitignore b/atom-extensions/atom-bosh/.gitignore index 51786ff67..0b79f4de1 100644 --- a/atom-extensions/atom-bosh/.gitignore +++ b/atom-extensions/atom-bosh/.gitignore @@ -1,6 +1,7 @@ /.idea /node_modules /server +/build *.tgz *.iml *.log \ No newline at end of file diff --git a/atom-extensions/atom-bosh/lib/main.js b/atom-extensions/atom-bosh/lib/bosh-yaml-client.ts similarity index 63% rename from atom-extensions/atom-bosh/lib/main.js rename to atom-extensions/atom-bosh/lib/bosh-yaml-client.ts index 9549d9dd2..de10801b7 100644 --- a/atom-extensions/atom-bosh/lib/main.js +++ b/atom-extensions/atom-bosh/lib/bosh-yaml-client.ts @@ -1,21 +1,22 @@ -const path = require('path'); -const { JavaProcessLanguageClient } = require('@pivotal-tools/atom-languageclient-commons'); -const PROPERTIES = require('../properties.json'); +import * as path from 'path'; +import {JavaProcessLanguageClient} from '@pivotal-tools/atom-languageclient-commons'; +import {ActiveServer} from 'atom-languageclient'; +import {JVM} from '@pivotal-tools/jvm-launch-utils'; -class BoshYamlClient extends JavaProcessLanguageClient { + +export class BoshYamlClient extends JavaProcessLanguageClient { constructor() { //noinspection JSAnnotator super( - PROPERTIES.jarUrl, path.join(__dirname, '..', 'server'), 'bosh-language-server.jar' - ); + ); } - postInitialization(server) { + postInitialization(server: ActiveServer) { this.sendConfig(server); - this._disposable.add(atom.config.observe('bosh-yaml', () => this.sendConfig(server))); + (this)._disposable.add(atom.config.observe('bosh-yaml', () => this.sendConfig(server))); } getGrammarScopes() { @@ -37,7 +38,7 @@ class BoshYamlClient extends JavaProcessLanguageClient { super.activate(); } - launchVmArgs(jvm) { + launchVmArgs(jvm: JVM): Promise { return Promise.resolve([ '-Dorg.slf4j.simpleLogger.logFile=bosh-yaml.log', '-Dorg.slf4j.simpleLogger.defaultLogLevel=debug', @@ -45,10 +46,8 @@ class BoshYamlClient extends JavaProcessLanguageClient { } - sendConfig(server) { + sendConfig(server: ActiveServer) { server.connection.didChangeConfiguration({ settings: atom.config.get('bosh-yaml') }); } -} - -module.exports = new BoshYamlClient(); +} \ No newline at end of file diff --git a/atom-extensions/atom-bosh/lib/main.ts b/atom-extensions/atom-bosh/lib/main.ts new file mode 100644 index 000000000..6d7c31622 --- /dev/null +++ b/atom-extensions/atom-bosh/lib/main.ts @@ -0,0 +1,3 @@ +import {BoshYamlClient} from './bosh-yaml-client'; + +module.exports = new BoshYamlClient(); \ No newline at end of file diff --git a/atom-extensions/atom-bosh/package.json b/atom-extensions/atom-bosh/package.json index fbf34bace..852e1d429 100644 --- a/atom-extensions/atom-bosh/package.json +++ b/atom-extensions/atom-bosh/package.json @@ -1,26 +1,23 @@ { "name": "bosh-yaml", - "main": "./lib/main", "version": "0.1.5", "description": "Provides validation and content assist for various Bosh configuration files", "repository": "https://github.com/spring-projects/atom-bosh", "icon": "icon.png", "license": "MIT", "engines": { - "atom": ">=1.21.0" + "atom": ">=1.24.0" }, + "main": "./build/main", + "types": "./build/main.d.ts", "files": [ "grammars/", "settings/", "lib/", + "build/", "server/", "properties.json" ], - "dependencies": { - "atom-package-deps": "^4.6.0", - "download": "^6.2.5", - "@pivotal-tools/atom-languageclient-commons": "0.0.2" - }, "configSchema": { "bosh": { "type": "object", @@ -50,11 +47,22 @@ } } }, + "dependencies": { + "atom-package-deps": "^4.6.0", + "download": "^6.2.5", + "@pivotal-tools/atom-languageclient-commons": "0.0.4" + }, "devDependencies": { + "typescript": "^2.7.2", + "tslint": "^5.9.1", "coffeelint": "^1.10.1" }, "scripts": { - "clean": "rm -fr node_modules", + "clean": "rm -fr build", + "compile": "tsc", + "build": "npm run clean && npm run compile ", + "watch": "tsc -watch", + "lint": "tslint -c tslint.json 'lib/**/*.ts'", "postinstall": "node script.js" }, "package-deps": [ diff --git a/atom-extensions/atom-bosh/properties.json b/atom-extensions/atom-bosh/properties.json index d588ead1d..e705c39ea 100644 --- a/atom-extensions/atom-bosh/properties.json +++ b/atom-extensions/atom-bosh/properties.json @@ -1,3 +1,3 @@ { - "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/bosh-language-server-0.0.10-201711061741.jar" + "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/bosh-language-server-0.1.5-201803080105.jar" } diff --git a/atom-extensions/atom-bosh/tsconfig.json b/atom-extensions/atom-bosh/tsconfig.json new file mode 100644 index 000000000..a333b271b --- /dev/null +++ b/atom-extensions/atom-bosh/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "build", + "lib": ["es7", "dom"], + "declaration": true, + "inlineSources": true, + "inlineSourceMap": true, + "strictNullChecks": true, + "noImplicitAny": true, + "baseUrl": "./" + }, + "include": [ + "lib/**/*.ts" + ] +} \ No newline at end of file diff --git a/atom-extensions/atom-bosh/tslint.json b/atom-extensions/atom-bosh/tslint.json new file mode 100644 index 000000000..068b76067 --- /dev/null +++ b/atom-extensions/atom-bosh/tslint.json @@ -0,0 +1,31 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "quotemark": false, + "object-literal-sort-keys": false, + "ordered-imports": false, + "member-ordering": false, + "one-line": false, + "interface-name": false, + "variable-name": false, + "max-classes-per-file": false, + "no-unused-expression": false, + "no-empty": false, + "one-variable-per-declaration": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast", + "check-module" + ] + }, + "rulesDirectory": [] +} \ No newline at end of file diff --git a/atom-extensions/atom-cf-manifest-yaml/.gitignore b/atom-extensions/atom-cf-manifest-yaml/.gitignore index 51786ff67..0b79f4de1 100644 --- a/atom-extensions/atom-cf-manifest-yaml/.gitignore +++ b/atom-extensions/atom-cf-manifest-yaml/.gitignore @@ -1,6 +1,7 @@ /.idea /node_modules /server +/build *.tgz *.iml *.log \ No newline at end of file diff --git a/atom-extensions/atom-cf-manifest-yaml/lib/main.ts b/atom-extensions/atom-cf-manifest-yaml/lib/main.ts new file mode 100644 index 000000000..c8920a147 --- /dev/null +++ b/atom-extensions/atom-cf-manifest-yaml/lib/main.ts @@ -0,0 +1,3 @@ +import {ManifestYamlLanguageClient} from './manifest-yaml-language-client'; + +module.exports = new ManifestYamlLanguageClient(); \ No newline at end of file diff --git a/atom-extensions/atom-cf-manifest-yaml/lib/main.js b/atom-extensions/atom-cf-manifest-yaml/lib/manifest-yaml-language-client.ts similarity index 70% rename from atom-extensions/atom-cf-manifest-yaml/lib/main.js rename to atom-extensions/atom-cf-manifest-yaml/lib/manifest-yaml-language-client.ts index 929218105..b8c3c2821 100644 --- a/atom-extensions/atom-cf-manifest-yaml/lib/main.js +++ b/atom-extensions/atom-cf-manifest-yaml/lib/manifest-yaml-language-client.ts @@ -1,13 +1,12 @@ -const path = require('path'); -const { JavaProcessLanguageClient } = require('@pivotal-tools/atom-languageclient-commons'); -const PROPERTIES = require('../properties.json'); +import * as path from 'path'; +import { JavaProcessLanguageClient } from '@pivotal-tools/atom-languageclient-commons'; +import {JVM} from '@pivotal-tools/jvm-launch-utils'; -class ManifestYamlLanguageClient extends JavaProcessLanguageClient { +export class ManifestYamlLanguageClient extends JavaProcessLanguageClient { constructor() { //noinspection JSAnnotator super( - PROPERTIES.jarUrl, path.join(__dirname, '..', 'server'), 'cf-manifest-language-server.jar' ); @@ -33,7 +32,7 @@ class ManifestYamlLanguageClient extends JavaProcessLanguageClient { super.activate(); } - launchVmArgs(version) { + launchVmArgs(jvm: JVM) { return Promise.resolve([ '-Dorg.slf4j.simpleLogger.logFile=manifest-yaml.log', '-Dorg.slf4j.simpleLogger.defaultLogLevel=debug', @@ -41,6 +40,4 @@ class ManifestYamlLanguageClient extends JavaProcessLanguageClient { } -} - -module.exports = new ManifestYamlLanguageClient(); +} \ No newline at end of file diff --git a/atom-extensions/atom-cf-manifest-yaml/package.json b/atom-extensions/atom-cf-manifest-yaml/package.json index 24b9e9506..36faca44a 100644 --- a/atom-extensions/atom-cf-manifest-yaml/package.json +++ b/atom-extensions/atom-cf-manifest-yaml/package.json @@ -1,31 +1,39 @@ { "name": "cf-manifest-yaml", - "main": "./lib/main", "version": "0.1.5", "description": "Cloud Foundry Deployment Manifest YAML support for Atom", "repository": "https://github.com/spring-projects/atom-cf-manifest-yaml", "icon": "icon.png", "license": "MIT", "engines": { - "atom": ">=1.21.0" + "atom": ">=1.24.0" }, + "main": "./build/main", + "types": "./build/main.d.ts", "files": [ "grammars/", "settings/", "lib/", + "build/", "server/", "properties.json" ], "dependencies": { "atom-package-deps": "^4.6.0", "download": "^6.2.5", - "@pivotal-tools/atom-languageclient-commons": "0.0.2" + "@pivotal-tools/atom-languageclient-commons": "0.0.4" }, "devDependencies": { + "typescript": "^2.7.2", + "tslint": "^5.9.1", "coffeelint": "^1.10.1" }, "scripts": { - "clean": "rm -fr node_modules", + "clean": "rm -fr build", + "compile": "tsc", + "build": "npm run clean && npm run compile ", + "watch": "tsc -watch", + "lint": "tslint -c tslint.json 'lib/**/*.ts'", "postinstall": "node script.js" }, "package-deps": [ diff --git a/atom-extensions/atom-cf-manifest-yaml/properties.json b/atom-extensions/atom-cf-manifest-yaml/properties.json index e1897ba1a..8b84198ce 100644 --- a/atom-extensions/atom-cf-manifest-yaml/properties.json +++ b/atom-extensions/atom-cf-manifest-yaml/properties.json @@ -1,3 +1,3 @@ { - "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/manifest-yaml-language-server-0.0.10-201711061741.jar" + "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/manifest-yaml-language-server-0.1.5-201803080105.jar" } diff --git a/atom-extensions/atom-cf-manifest-yaml/tsconfig.json b/atom-extensions/atom-cf-manifest-yaml/tsconfig.json new file mode 100644 index 000000000..a333b271b --- /dev/null +++ b/atom-extensions/atom-cf-manifest-yaml/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "build", + "lib": ["es7", "dom"], + "declaration": true, + "inlineSources": true, + "inlineSourceMap": true, + "strictNullChecks": true, + "noImplicitAny": true, + "baseUrl": "./" + }, + "include": [ + "lib/**/*.ts" + ] +} \ No newline at end of file diff --git a/atom-extensions/atom-cf-manifest-yaml/tslint.json b/atom-extensions/atom-cf-manifest-yaml/tslint.json new file mode 100644 index 000000000..068b76067 --- /dev/null +++ b/atom-extensions/atom-cf-manifest-yaml/tslint.json @@ -0,0 +1,31 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "quotemark": false, + "object-literal-sort-keys": false, + "ordered-imports": false, + "member-ordering": false, + "one-line": false, + "interface-name": false, + "variable-name": false, + "max-classes-per-file": false, + "no-unused-expression": false, + "no-empty": false, + "one-variable-per-declaration": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast", + "check-module" + ] + }, + "rulesDirectory": [] +} \ No newline at end of file diff --git a/atom-extensions/atom-commons/.babelrc b/atom-extensions/atom-commons/.babelrc deleted file mode 100644 index 3b514bd56..000000000 --- a/atom-extensions/atom-commons/.babelrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "sourceMap": "inline", - "plugins": [ - ["add-module-exports", {}], - ["transform-async-to-generator", {}], - ["transform-decorators-legacy", {}], - ["transform-class-properties", {}], - ["transform-es2015-modules-commonjs", {"strictMode": false}], - ["transform-export-extensions", {}], - ["transform-do-expressions", {}], - ["transform-function-bind", {}], - ["transform-object-rest-spread", {}], - ["transform-flow-strip-types", {}], - ] -} \ No newline at end of file diff --git a/atom-extensions/atom-commons/lib/index.js b/atom-extensions/atom-commons/lib/index.js deleted file mode 100644 index e2b2e7c79..000000000 --- a/atom-extensions/atom-commons/lib/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import { JavaProcessLanguageClient } from './java-process-language-client'; -import { StsAdapter } from './sts-adapter'; - -export { JavaProcessLanguageClient, StsAdapter }; \ No newline at end of file diff --git a/atom-extensions/atom-commons/lib/java-process-language-client.js b/atom-extensions/atom-commons/lib/java-process-language-client.js deleted file mode 100644 index 173e53433..000000000 --- a/atom-extensions/atom-commons/lib/java-process-language-client.js +++ /dev/null @@ -1,217 +0,0 @@ -const cp = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const url = require('url'); -const remote = require('remote-file-size'); -const PortFinder = require('portfinder'); -const net = require('net'); -const rpc = require('vscode-jsonrpc'); -const {AutoLanguageClient, DownloadFile} = require('atom-languageclient'); -const { Disposable } = require('atom'); -import { StsAdapter } from './sts-adapter'; - -import {findJdk, findJvm} from '@pivotal-tools/jvm-launch-utils'; - -export class JavaProcessLanguageClient extends AutoLanguageClient { - - DEBUG = false; - - constructor(serverDownloadUrl, serverHome, serverLauncherJar) { - super(); - - this.serverHome = serverHome; - this.serverDownloadUrl = serverDownloadUrl; - this.serverLauncherJar = serverLauncherJar; - } - - getServerJar() { - return path.resolve(this.serverHome, this.serverLauncherJar); - } - - showErrorMessage(detail, desc) { - const notification = atom.notifications.addError('Cannot start Language Server', { - dismissable: true, - detail: detail, - description: desc, - buttons: [{ - text: 'OK', - onDidClick: () => { - notification.dismiss() - }, - }] - }); - return Promise.reject(new Error(detail)); - } - - getInitializeParams(projectPath, process) { - const initParams = super.getInitializeParams(projectPath, process); - initParams.capabilities = { - workspace: { - executeCommand: { - } - } - }; - return initParams; - } - - startServerProcess () { - // //TODO: Remove when debugging is over - atom.config.set('core.debugLSP', true); - - let childProcess; - - if (this.DEBUG) { - return this.connectToLS(); - } - - return new Promise((resolve, reject) => { - let basePort = Math.floor(Math.random() * 10000) + 40000; - PortFinder.getPort({port: basePort}, (err, port) => { - this.server = net.createServer(socket => { - this.socket = socket; - resolve(childProcess); - }); - - this.server.listen(port, 'localhost', () => { - this.launchProcess(port).then(p => childProcess = p); - }); - }); - }); - } - - connectToLS() { - return new Promise(resolve => { - this.socket = net.connect({ - port: 5007 - }); - resolve({ - pid: -1, - kill: function() { - console.log('fake shutdown'); - } - }) - }); - } - - // Start adapters that are not shared between servers - startExclusiveAdapters(server) { - super.startExclusiveAdapters(server); - - const stsAdapter = this.createStsAdapter() || new StsAdapter(); - server.connection._onRequest({method: 'sts/moveCursor'}, params => stsAdapter.onMoveCursor(params)); - server.connection._onNotification({method: 'sts/progress'}, params => stsAdapter.onProgress(params)); - server.connection._onNotification({method: 'sts/highlight'}, params => stsAdapter.onHighlight(params)); - } - - preferJdk() { - return false; - } - - findJvm() { - return this.preferJdk() ? findJdk() : findJvm(); - } - - launchProcess(port) { - return this.findJvm() - .catch(error => { - return this.showErrorMessage("Error trying to find JVM", ""+error); - }) - .then(jvm => { - if (!jvm) { - return this.showErrorMessage("Couldn't locate java in $JAVA_HOME or $PATH"); - } - let version = jvm.getMajorVersion(); - if (version<8) { - return this.showErrorMessage( - 'No compatible Java Runtime Environment found', - 'The Java Runtime Environment is either below version "1.8" or is missing from the system' - ); - } - return this.launchVmArgs(jvm).then(args => { - args.push(`-Dserver.port=${port}`); - return this.doLaunchProcess( - jvm, - this.getServerJar(), - port, - args - ); - }); - }); - } - - launchVmArgs(jvm) { - return Promise.resolve([]); - } - - doLaunchProcess(jvm, launcher, port, args=[]) { - let vmArgs = args.concat([ - // Atom doesn't have lazy completion proposals support - completionItem/resolve message. Disable lazy completions - '-Dlsp.lazy.completions.disable=true', - '-Dlsp.completions.indentation.enable=true', - '-Dlsp.yaml.completions.errors.disable=true', - ]); - - this.logger.debug(`starting "${jvm.getJavaExecutable()} ${vmArgs.join('\n')}\n-jar ${launcher}"`); - return jvm.jarLaunch(launcher, vmArgs, { cwd: this.serverHome }); - } - - installServer () { - const localFileName = this.getServerJar(); - this.logger.log(`Downloading ${this.serverDownloadUrl} to ${localFileName}`); - return this.fileExists(this.serverHome) - .then(doesExist => { if (!doesExist) fs.mkdir(this.serverHome) }) - .then(() => this.remoteFileSize(this.serverDownloadUrl)) - .then((size) => DownloadFile(this.serverDownloadUrl, localFileName, (bytesDone, percent) => this.handleDownlaodPercentChange(bytesDone, size, percent), size)) - .then(() => this.fileExists(this.getServerJar())) - .then(doesExist => { if (!doesExist) throw Error(`Failed to install the ${this.getServerName()} language server`) }) - .then(() => this.handleServerInstalled()) - .then(() => Promise.resolve(true)); - } - - handleDownlaodPercentChange(bytesDone, size, percent) { - - } - - handleServerInstalled() { - - } - - preInitialization(connection) { - connection.onCustom('language/status', (e) => this.updateStatusBar(`${e.type.replace(/^Started$/, '')} ${e.message}`)); - } - - remoteFileSize(url) { - return new Promise((resolve, reject) => { - remote(url, (e,s) => { - if (e) { - reject(e); - } else { - resolve(s); - } - }); - }); - } - - fileExists (path) { - return new Promise((resolve, reject) => { - fs.access(path, fs.R_OK, error => { - resolve(!error || error.code !== 'ENOENT'); - }) - }) - } - - // Late wire-up of listeners after initialize method has been sent - postInitialization(server) { - server.disposable.add(new Disposable(() => { - if (this.server) { - this.server.close() - } - })); - } - - createStsAdapter() { - - } - -} - diff --git a/atom-extensions/atom-commons/lib/java-process-language-client.ts b/atom-extensions/atom-commons/lib/java-process-language-client.ts new file mode 100644 index 000000000..1006a7e43 --- /dev/null +++ b/atom-extensions/atom-commons/lib/java-process-language-client.ts @@ -0,0 +1,163 @@ +import * as path from 'path'; +import {getPort} from 'portfinder'; +import {Server, createServer, connect} from 'net'; +import {AtomEnvironment, Disposable} from 'atom'; +import {HighlightParams, ProgressParams, CursorMovementParams, StsAdapter} from './sts-adapter'; +import {ActiveServer, LanguageServerProcess} from 'atom-languageclient'; +import {AutoLanguageClient} from 'atom-languageclient'; +import {findJdk, findJvm, JVM} from '@pivotal-tools/jvm-launch-utils'; +import {InitializeParams} from 'vscode-languageserver-protocol'; + +export class JavaProcessLanguageClient extends AutoLanguageClient { + + DEBUG = false; + + private server: Server; + + constructor(protected serverHome: string, protected serverLauncherJar: string) { + super(); + } + + getServerJar(): string { + return path.resolve(this.serverHome, this.serverLauncherJar); + } + + showErrorMessage(detail: string, desc?: string): Promise { + const atomEnv: AtomEnvironment = atom; + const notification = atomEnv.notifications.addError('Cannot start Language Server', { + dismissable: true, + detail: detail, + description: desc, + buttons: [{ + text: 'OK', + onDidClick: () => { + notification.dismiss() + }, + }] + }); + return Promise.reject(new Error(detail)); + } + + protected getInitializeParams(projectPath: string, process: LanguageServerProcess): InitializeParams { + const initParams = super.getInitializeParams(projectPath, process); + initParams.capabilities = { + workspace: { + executeCommand: { + } + } + }; + return super.getInitializeParams(projectPath, process); + } + + protected startServerProcess(projectPath: string): LanguageServerProcess | Promise { + // TODO: Remove when debugging is over + const atomEnv: AtomEnvironment = atom; + atomEnv.config.set('core.debugLSP', true); + + let childProcess: LanguageServerProcess; + + if (this.DEBUG) { + return this.connectToLS(); + } + + return new Promise((resolve, reject) => { + let basePort = Math.floor(Math.random() * 10000) + 40000; + getPort({port: basePort}, (err, port) => { + this.server = createServer(socket => { + this.socket = socket; + resolve(childProcess); + }); + + this.server.listen(port, 'localhost', () => { + this.launchProcess(port).then(p => childProcess = p); + }); + }); + }); + } + + private connectToLS(): LanguageServerProcess | Promise { + return new Promise(resolve => { + this.socket = connect({ + port: 5007 + }); + resolve( { + pid: -1, + kill: () => { + console.log('fake shutdown'); + } + }) + }); + } + + // Start adapters that are not shared between servers + protected postInitialization(server: ActiveServer): void { + const stsAdapter = this.createStsAdapter() || new StsAdapter(); + (server.connection)._onRequest({method: 'sts/moveCursor'}, (params: CursorMovementParams) => stsAdapter.onMoveCursor(params)); + server.connection.onCustom('sts/progress', (params: ProgressParams) => stsAdapter.onProgress(params)); + server.connection.onCustom('sts/highlight', (params: HighlightParams) => stsAdapter.onHighlight(params)); + + server.disposable.add(new Disposable(() => { + if (this.server) { + this.server.close() + } + })); + + } + + preferJdk(): boolean { + return false; + } + + findJvm(): Promise { + return this.preferJdk() ? findJdk() : findJvm(); + } + + private launchProcess(port: number): Promise { + return this.findJvm() + .catch(error => { + return this.showErrorMessage("Error trying to find JVM", ""+error); + }) + .then(jvm => { + if (!jvm) { + return this.showErrorMessage("Couldn't locate java in $JAVA_HOME or $PATH"); + } + let version = jvm.getMajorVersion(); + if (version<8) { + return this.showErrorMessage( + 'No compatible Java Runtime Environment found', + 'The Java Runtime Environment is either below version "1.8" or is missing from the system' + ); + } + return this.launchVmArgs(jvm).then(args => { + args.push(`-Dserver.port=${port}`); + return this.doLaunchProcess( + jvm, + this.getServerJar(), + args + ); + }); + }); + } + + protected launchVmArgs(jvm: JVM): Promise { + return Promise.resolve([]); + } + + private doLaunchProcess(jvm: JVM, launcher: string, args: string[] =[]): LanguageServerProcess { + let vmArgs = args.concat([ + // Atom doesn't have lazy completion proposals support - completionItem/resolve message. Disable lazy completions + '-Dsts.lsp.client=atom', + '-Dlsp.completions.indentation.enable=true', + '-Dlsp.yaml.completions.errors.disable=true', + ]); + + this.logger.debug(`starting "${jvm.getJavaExecutable()} ${vmArgs.join('\n')}\n-jar ${launcher}"`); + return jvm.jarLaunch(launcher, vmArgs, { cwd: this.serverHome }); + } + + createStsAdapter(): StsAdapter | null { + return null; + } + +} + diff --git a/atom-extensions/atom-commons/lib/main.ts b/atom-extensions/atom-commons/lib/main.ts new file mode 100644 index 000000000..a196c7880 --- /dev/null +++ b/atom-extensions/atom-commons/lib/main.ts @@ -0,0 +1,10 @@ +import {JavaProcessLanguageClient} from './java-process-language-client'; +import {StsAdapter, CursorMovementParams, HighlightParams, ProgressParams} from './sts-adapter'; + +export { + JavaProcessLanguageClient, + StsAdapter, + CursorMovementParams, + HighlightParams, + ProgressParams +} \ No newline at end of file diff --git a/atom-extensions/atom-commons/lib/sts-adapter.js b/atom-extensions/atom-commons/lib/sts-adapter.js deleted file mode 100644 index 45c7e12ea..000000000 --- a/atom-extensions/atom-commons/lib/sts-adapter.js +++ /dev/null @@ -1,20 +0,0 @@ -import {Convert} from 'atom-languageclient'; - -export class StsAdapter { - - constructor() {} - - findEditors(uri) { - return atom.workspace.getTextEditors() - .filter(e => e && e.getPath() && Convert.pathToUri(e.getPath()) === uri); - } - - onMoveCursor(params) { - findEditors(params.uri).forEach(e => e.setCursorScreenPosition(Convert.positionToPoint(params.position))); - return { applied: true}; - } - - onProgress(params) {} - - onHighlight(params) {} -} diff --git a/atom-extensions/atom-commons/lib/sts-adapter.ts b/atom-extensions/atom-commons/lib/sts-adapter.ts new file mode 100644 index 000000000..649632c56 --- /dev/null +++ b/atom-extensions/atom-commons/lib/sts-adapter.ts @@ -0,0 +1,38 @@ +import {Convert} from 'atom-languageclient'; +import {AtomEnvironment, TextEditor} from 'atom'; +import {Position, Range, TextDocumentIdentifier} from 'vscode-languageserver-protocol'; + +export class StsAdapter { + + constructor() {} + + findEditors(uri: string): TextEditor[] { + const atomEnv: AtomEnvironment = atom; + return atomEnv.workspace.getTextEditors() + .filter(e => e && e.getPath() && Convert.pathToUri(e.getPath() || '') === uri); + } + + onMoveCursor(params: CursorMovementParams): any { + this.findEditors(params.uri).forEach(e => e.setCursorScreenPosition(Convert.positionToPoint(params.position))); + return {applied: true}; + } + + onProgress(params: ProgressParams): void {} + + onHighlight(params: HighlightParams): void {} +} + +export interface CursorMovementParams { + readonly uri: string; + readonly position: Position; +} + +export interface ProgressParams { + readonly id: string; + readonly statusMsg: string; +} + +export interface HighlightParams { + readonly doc: TextDocumentIdentifier; + readonly ranges: Range[]; +} diff --git a/atom-extensions/atom-commons/package.json b/atom-extensions/atom-commons/package.json index 6652e0363..9ddbb592b 100644 --- a/atom-extensions/atom-commons/package.json +++ b/atom-extensions/atom-commons/package.json @@ -1,56 +1,35 @@ { "name": "@pivotal-tools/atom-languageclient-commons", - "version": "0.0.2", + "version": "0.0.4", "description": "Atom language client commons for STS4 language servers", "repository": "https://github.com/spring-projects/sts4", "license": "MIT", "engines": { - "atom": ">=1.17.0" + "atom": ">=1.24.0" }, - "dependencies": { - "@pivotal-tools/jvm-launch-utils": "0.0.11", - "atom-languageclient": "0.8.0", - "decompress": "^4.2.0", - "portfinder": "^1.0.13", - "postinstall-build": "5.0.1", - "remote-file-size": "^3.0.3" - }, - "main": "./build/lib/index", + "main": "./build/main", + "types": "./build/main.d.ts", "files": [ - "build/" + "build/", + "lib/" ], "scripts": { "clean": "rm -rf build", - "compile": "babel lib --out-dir build/lib", - "postinstall": "postinstall-build --only-as-dependency build \"npm run compile\"", - "prepublish": "npm run clean && npm run compile", - "watch": "babel lib --out-dir build/lib -w" + "compile": "tsc", + "watch": "tsc -watch", + "lint": "tslint -c tslint.json 'lib/**/*.ts'", + "prepublish": "npm run clean && npm run compile" + }, + "dependencies": { + "@pivotal-tools/jvm-launch-utils": "0.0.11", + "atom-languageclient": "0.9.2", + "portfinder": "^1.0.13", + "@types/atom": "^1.24.1", + "@types/node": "^8.0.41", + "vscode-languageserver-protocol": "3.6.0-next.5" }, - "atomTranspilers": [ - { - "glob": "{lib}/**/*.js", - "transpiler": "atom-babel6-transpiler", - "options": { - "cacheKeyFiles": [ - "package.json", - ".babelrc" - ] - } - } - ], "devDependencies": { - "atom-babel6-transpiler": "0.0.3", - "babel-cli": "^6.24.0", - "babel-core": "6.22.1", - "babel-plugin-add-module-exports": "0.2.1", - "babel-plugin-transform-async-to-generator": "6.22.0", - "babel-plugin-transform-class-properties": "6.23.0", - "babel-plugin-transform-decorators-legacy": "1.3.4", - "babel-plugin-transform-do-expressions": "6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "6.23.0", - "babel-plugin-transform-export-extensions": "6.22.0", - "babel-plugin-transform-flow-strip-types": "6.22.0", - "babel-plugin-transform-function-bind": "6.22.0", - "babel-plugin-transform-object-rest-spread": "6.23.0" + "tslint": "^5.9.1", + "typescript": "^2.7.2" } } diff --git a/atom-extensions/atom-commons/tsconfig.json b/atom-extensions/atom-commons/tsconfig.json new file mode 100644 index 000000000..b22a85ff1 --- /dev/null +++ b/atom-extensions/atom-commons/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "build", + "lib": ["es7", "dom"], + "declaration": true, + "inlineSources": true, + "inlineSourceMap": true, + "strictNullChecks": true, + "noImplicitAny": true, + "baseUrl": "./" + }, + "include": [ + "lib/**/*.ts", + ] +} \ No newline at end of file diff --git a/atom-extensions/atom-commons/tslint.json b/atom-extensions/atom-commons/tslint.json new file mode 100644 index 000000000..068b76067 --- /dev/null +++ b/atom-extensions/atom-commons/tslint.json @@ -0,0 +1,31 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "quotemark": false, + "object-literal-sort-keys": false, + "ordered-imports": false, + "member-ordering": false, + "one-line": false, + "interface-name": false, + "variable-name": false, + "max-classes-per-file": false, + "no-unused-expression": false, + "no-empty": false, + "one-variable-per-declaration": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast", + "check-module" + ] + }, + "rulesDirectory": [] +} \ No newline at end of file diff --git a/atom-extensions/atom-concourse/.gitignore b/atom-extensions/atom-concourse/.gitignore index 0dd84018c..9ad2c10c9 100644 --- a/atom-extensions/atom-concourse/.gitignore +++ b/atom-extensions/atom-concourse/.gitignore @@ -1,6 +1,7 @@ /.idea /node_modules /server +/build *.tgz *iml *.log \ No newline at end of file diff --git a/atom-extensions/atom-concourse/lib/main.js b/atom-extensions/atom-concourse/lib/concourse-ci-yaml-client.ts similarity index 73% rename from atom-extensions/atom-concourse/lib/main.js rename to atom-extensions/atom-concourse/lib/concourse-ci-yaml-client.ts index d8f0ff835..b075a8779 100644 --- a/atom-extensions/atom-concourse/lib/main.js +++ b/atom-extensions/atom-concourse/lib/concourse-ci-yaml-client.ts @@ -1,13 +1,12 @@ -const path = require('path'); -const { JavaProcessLanguageClient } = require('@pivotal-tools/atom-languageclient-commons'); -const PROPERTIES = require('../properties.json'); +import * as path from 'path'; +import { JavaProcessLanguageClient } from '@pivotal-tools/atom-languageclient-commons'; +import {JVM} from '@pivotal-tools/jvm-launch-utils'; -class ConcourseCiYamlClient extends JavaProcessLanguageClient { +export class ConcourseCiYamlClient extends JavaProcessLanguageClient { constructor() { //noinspection JSAnnotator super( - PROPERTIES.jarUrl, path.join(__dirname, '..', 'server'), 'concourse-language-server.jar' ); @@ -33,7 +32,7 @@ class ConcourseCiYamlClient extends JavaProcessLanguageClient { super.activate(); } - launchVmArgs(jvm) { + launchVmArgs(jvm: JVM) { return Promise.resolve([ '-Dorg.slf4j.simpleLogger.logFile=concourse-ci-yaml.log', '-Dorg.slf4j.simpleLogger.defaultLogLevel=debug', @@ -41,6 +40,4 @@ class ConcourseCiYamlClient extends JavaProcessLanguageClient { } -} - -module.exports = new ConcourseCiYamlClient(); +} \ No newline at end of file diff --git a/atom-extensions/atom-concourse/lib/main.ts b/atom-extensions/atom-concourse/lib/main.ts new file mode 100644 index 000000000..d441a0d1d --- /dev/null +++ b/atom-extensions/atom-concourse/lib/main.ts @@ -0,0 +1,3 @@ +import {ConcourseCiYamlClient} from './concourse-ci-yaml-client'; + +module.exports = new ConcourseCiYamlClient(); \ No newline at end of file diff --git a/atom-extensions/atom-concourse/package.json b/atom-extensions/atom-concourse/package.json index 80dcea653..e34da2604 100644 --- a/atom-extensions/atom-concourse/package.json +++ b/atom-extensions/atom-concourse/package.json @@ -1,17 +1,19 @@ { "name": "concourse-pipeline-yaml", - "main": "./lib/main", "version": "0.1.5", "description": "Provides validation and content assist for Concourse CI pipeline and task configuration yml files", "repository": "https://github.com/spring-projects/atom-concourse", "icon": "icon.png", "license": "MIT", "engines": { - "atom": ">=1.21.0" + "atom": ">=1.24.0" }, + "main": "./build/main", + "types": "./build/main.d.ts", "files": [ "grammars/", "settings/", + "build/", "lib/", "server/", "properties.json" @@ -19,13 +21,19 @@ "dependencies": { "atom-package-deps": "^4.6.0", "download": "^6.2.5", - "@pivotal-tools/atom-languageclient-commons": "0.0.2" + "@pivotal-tools/atom-languageclient-commons": "0.0.4" }, "devDependencies": { + "typescript": "^2.7.2", + "tslint": "^5.9.1", "coffeelint": "^1.10.1" }, "scripts": { - "clean": "rm -fr node_modules", + "clean": "rm -fr build", + "compile": "tsc", + "build": "npm run clean && npm run compile ", + "watch": "tsc -watch", + "lint": "tslint -c tslint.json 'lib/**/*.ts'", "postinstall": "node script.js" }, "package-deps": [ diff --git a/atom-extensions/atom-concourse/tsconfig.json b/atom-extensions/atom-concourse/tsconfig.json new file mode 100644 index 000000000..a333b271b --- /dev/null +++ b/atom-extensions/atom-concourse/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "build", + "lib": ["es7", "dom"], + "declaration": true, + "inlineSources": true, + "inlineSourceMap": true, + "strictNullChecks": true, + "noImplicitAny": true, + "baseUrl": "./" + }, + "include": [ + "lib/**/*.ts" + ] +} \ No newline at end of file diff --git a/atom-extensions/atom-concourse/tslint.json b/atom-extensions/atom-concourse/tslint.json new file mode 100644 index 000000000..068b76067 --- /dev/null +++ b/atom-extensions/atom-concourse/tslint.json @@ -0,0 +1,31 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "quotemark": false, + "object-literal-sort-keys": false, + "ordered-imports": false, + "member-ordering": false, + "one-line": false, + "interface-name": false, + "variable-name": false, + "max-classes-per-file": false, + "no-unused-expression": false, + "no-empty": false, + "one-variable-per-declaration": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast", + "check-module" + ] + }, + "rulesDirectory": [] +} \ No newline at end of file diff --git a/atom-extensions/atom-spring-boot/.gitignore b/atom-extensions/atom-spring-boot/.gitignore index 38d57c0ad..2e6ca2885 100644 --- a/atom-extensions/atom-spring-boot/.gitignore +++ b/atom-extensions/atom-spring-boot/.gitignore @@ -1,3 +1,4 @@ .idea/ server/ node_modules/ +build/ diff --git a/atom-extensions/atom-spring-boot/lib/boot-sts-adapter.ts b/atom-extensions/atom-spring-boot/lib/boot-sts-adapter.ts new file mode 100644 index 000000000..d028a686f --- /dev/null +++ b/atom-extensions/atom-spring-boot/lib/boot-sts-adapter.ts @@ -0,0 +1,56 @@ +import {StsAdapter, HighlightParams} from '@pivotal-tools/atom-languageclient-commons'; +import {Convert} from 'atom-languageclient'; +import { Range } from 'vscode-languageserver-protocol'; +import {TextEditor} from 'atom'; + +const BOOT_DATA_MARKER_TYPE: any = 'BootApp-Hint'; +const BOOT_HINT_GUTTER_NAME = 'boot-hint-gutter'; + +export class BootStsAdapter extends StsAdapter { + + constructor() { + super(); + } + + onHighlight(params: HighlightParams) { + this.findEditors(params.doc.uri).forEach(editor => this.markHintsForEditor(editor, params.ranges)); + } + + private markHintsForEditor(editor: TextEditor, ranges: Range[]) { + editor.findMarkers(BOOT_DATA_MARKER_TYPE).forEach(m => m.destroy()); + if (Array.isArray(ranges)) { + ranges.forEach(range => this.createHintMarker(editor, range)); + } + const gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); + if (gutter) { + if (!ranges || !ranges.length) { + gutter.hide(); + } else if (!gutter.isVisible()) { + gutter.show(); + } + } + } + + private createHintMarker(editor: TextEditor, range: Range) { + // Create marker model + const marker = editor.markBufferRange(Convert.lsRangeToAtomRange(range), BOOT_DATA_MARKER_TYPE); + + // Marker around the text in the editor + editor.decorateMarker(marker, { + type: 'highlight', + class: 'boot-hint' + }); + + // Marker in the diagnostic gutter + let gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); + if (!gutter) { + gutter = editor.addGutter({ + name: BOOT_HINT_GUTTER_NAME, + visible: false, + }); + } + const iconElement = document.createElement('span'); + iconElement.setAttribute('class', 'gutter-boot-hint'); + gutter.decorateMarker(marker, {item: iconElement}); + } +} \ No newline at end of file diff --git a/atom-extensions/atom-spring-boot/lib/main.js b/atom-extensions/atom-spring-boot/lib/main.js deleted file mode 100644 index 9e78051d2..000000000 --- a/atom-extensions/atom-spring-boot/lib/main.js +++ /dev/null @@ -1,128 +0,0 @@ -const path = require('path'); -const { JavaProcessLanguageClient, StsAdapter } = require('@pivotal-tools/atom-languageclient-commons'); -const { Convert } = require('atom-languageclient'); -const PROPERTIES = require('../properties.json'); - -const BOOT_DATA_MARKER_TYPE = 'BootApp-Hint'; -const BOOT_HINT_GUTTER_NAME = 'boot-hint-gutter'; - -class SpringBootLanguageClient extends JavaProcessLanguageClient { - - constructor() { - //noinspection JSAnnotator - super( - PROPERTIES.jarUrl, - path.join(__dirname, '..', 'server'), - 'spring-boot-language-server.jar' - ); - // this.DEBUG = true; - } - - postInitialization(server) { - this.sendConfig(server); - this._disposable.add(atom.config.observe('boot-java', () => this.sendConfig(server))); - } - - sendConfig(server) { - server.connection.didChangeConfiguration({ settings: {'boot-java': atom.config.get('boot-java') }}); - } - - getGrammarScopes() { - return ['source.java', 'source.boot-properties', 'source.boot-properties-yaml']; - } - - getLanguageName() { - return 'spring-boot'; - } - - getServerName() { - return 'Spring Boot'; - } - - activate() { - require('atom-package-deps') - .install('spring-boot') - .then(() => console.debug('All dependencies installed, good to go')); - super.activate(); - } - - preferJdk() { - return true; - } - - launchVmArgs(jvm) { - let vmargs = [ - // '-Xdebug', - // '-agentlib:jdwp=transport=dt_socket,server=y,address=7999,suspend=n', - '-Dorg.slf4j.simpleLogger.logFile=boot-java.log', - '-Dorg.slf4j.simpleLogger.defaultLogLevel=debug', - ]; - if (!jvm.isJdk()) { - this.showErrorMessage( - '"Boot-Java" Package Functionality Limited', - 'JAVA_HOME or PATH environment variable seems to point to a JRE. A JDK is required, hence Boot Hints are unavailable.' - ); - } - return Promise.resolve(vmargs); - } - - createStsAdapter() { - return new BootStsAdapter(); - } - - filterChangeWatchedFiles(filePath) { - return filePath.endsWith('.gradle') || filePath.endsWith(path.join('', 'pom.xml')); - } - -} - -class BootStsAdapter extends StsAdapter { - - constructor() { - super(); - } - - onHighlight(params) { - this.findEditors(params.doc.uri).forEach(editor => this.markHintsForEditor(editor, params.ranges)); - } - - markHintsForEditor(editor, ranges) { - editor.findMarkers(BOOT_DATA_MARKER_TYPE).forEach(m => m.destroy()); - if (Array.isArray(ranges)) { - ranges.forEach(range => this.createHintMarker(editor, range)); - } - const gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); - if (gutter) { - if (!ranges || !ranges.length) { - gutter.hide(); - } else if (!gutter.isVisible()) { - gutter.show(); - } - } - } - - createHintMarker(editor, range) { - // Create marker model - const marker = editor.markBufferRange(Convert.lsRangeToAtomRange(range), BOOT_DATA_MARKER_TYPE); - - // Marker around the text in the editor - editor.decorateMarker(marker, { - type: 'highlight', - class: 'boot-hint' - }); - - // Marker in the diagnostic gutter - let gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); - if (!gutter) { - gutter = editor.addGutter({ - name: BOOT_HINT_GUTTER_NAME, - visible: false, - }); - } - const iconElement = document.createElement('span'); - iconElement.setAttribute('class', 'gutter-boot-hint'); - gutter.decorateMarker(marker, {item: iconElement}); - } -} - -module.exports = new SpringBootLanguageClient(); diff --git a/atom-extensions/atom-spring-boot/lib/main.ts b/atom-extensions/atom-spring-boot/lib/main.ts new file mode 100644 index 000000000..d99dbed3a --- /dev/null +++ b/atom-extensions/atom-spring-boot/lib/main.ts @@ -0,0 +1,3 @@ +import {SpringBootLanguageClient} from './spring-boot-language-client'; + +module.exports = new SpringBootLanguageClient(); \ No newline at end of file diff --git a/atom-extensions/atom-spring-boot/lib/spring-boot-language-client.ts b/atom-extensions/atom-spring-boot/lib/spring-boot-language-client.ts new file mode 100644 index 000000000..1979d840e --- /dev/null +++ b/atom-extensions/atom-spring-boot/lib/spring-boot-language-client.ts @@ -0,0 +1,75 @@ +import * as path from 'path'; +import {JavaProcessLanguageClient} from '@pivotal-tools/atom-languageclient-commons'; +import {BootStsAdapter} from './boot-sts-adapter'; +import {ActiveServer} from 'atom-languageclient'; +import {JVM} from '@pivotal-tools/jvm-launch-utils'; + +export class SpringBootLanguageClient extends JavaProcessLanguageClient { + + constructor() { + //noinspection JSAnnotator + super( + path.join(__dirname, '..', 'server'), + 'spring-boot-language-server.jar' + ); + // this.DEBUG = true; + } + + protected postInitialization(server: ActiveServer) { + super.postInitialization(server); + this.sendConfig(server); + (this)._disposable.add(atom.config.observe('boot-java', () => this.sendConfig(server))); + } + + private sendConfig(server: ActiveServer) { + server.connection.didChangeConfiguration({ settings: {'boot-java': atom.config.get('boot-java') }}); + } + + getGrammarScopes() { + return ['source.java', 'source.boot-properties', 'source.boot-properties-yaml']; + } + + getLanguageName() { + return 'spring-boot'; + } + + getServerName() { + return 'Spring Boot'; + } + + activate() { + require('atom-package-deps') + .install('spring-boot') + .then(() => console.debug('All dependencies installed, good to go')); + super.activate(); + } + + preferJdk() { + return true; + } + + launchVmArgs(jvm: JVM) { + let vmargs = [ + // '-Xdebug', + // '-agentlib:jdwp=transport=dt_socket,server=y,address=7999,suspend=n', + '-Dorg.slf4j.simpleLogger.logFile=boot-java.log', + '-Dorg.slf4j.simpleLogger.defaultLogLevel=debug', + ]; + if (!jvm.isJdk()) { + this.showErrorMessage( + '"Boot-Java" Package Functionality Limited', + 'JAVA_HOME or PATH environment variable seems to point to a JRE. A JDK is required, hence Boot Hints are unavailable.' + ); + } + return Promise.resolve(vmargs); + } + + createStsAdapter() { + return new BootStsAdapter(); + } + + filterChangeWatchedFiles(filePath: string) { + return filePath.endsWith('.gradle') || filePath.endsWith(path.join('', 'pom.xml')); + } + +} diff --git a/atom-extensions/atom-spring-boot/package.json b/atom-extensions/atom-spring-boot/package.json index 1d034d6a9..81d663a7d 100644 --- a/atom-extensions/atom-spring-boot/package.json +++ b/atom-extensions/atom-spring-boot/package.json @@ -1,17 +1,19 @@ { "name": "spring-boot", - "main": "./lib/main", "version": "0.1.5", "description": "Spring Boot support for Atom", "repository": "https://github.com/spring-projects/atom-spring-boot", "icon": "icon.png", "license": "MIT", "engines": { - "atom": ">=1.21.0" + "atom": ">=1.24.0" }, + "main": "./build/main", + "types": "./build/main.d.ts", "files": [ "grammars/", "settings/", + "build/", "lib/", "server/", "styles/", @@ -25,16 +27,21 @@ } }, "dependencies": { - "@pivotal-tools/atom-languageclient-commons": "0.0.2", - "atom-languageclient": "0.8.0", + "@pivotal-tools/atom-languageclient-commons": "0.0.4", "atom-package-deps": "^4.6.0", "download": "^6.2.5" }, "devDependencies": { + "typescript": "^2.7.2", + "tslint": "^5.9.1", "coffeelint": "^1.10.1" }, "scripts": { - "clean": "rm -fr node_modules", + "clean": "rm -rf build", + "compile": "tsc", + "build": "npm run clean && npm run compile ", + "watch": "tsc -watch", + "lint": "tslint -c tslint.json 'lib/**/*.ts'", "postinstall": "node script.js" }, "package-deps": [ diff --git a/atom-extensions/atom-spring-boot/properties.json b/atom-extensions/atom-spring-boot/properties.json index fc5866d86..5f72a3b34 100644 --- a/atom-extensions/atom-spring-boot/properties.json +++ b/atom-extensions/atom-spring-boot/properties.json @@ -1,3 +1,3 @@ { - "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/spring-boot-language-server-0.1.5-201803022113.jar" + "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/spring-boot-language-server-0.1.5-201803051440.jar" } diff --git a/atom-extensions/atom-spring-boot/tsconfig.json b/atom-extensions/atom-spring-boot/tsconfig.json new file mode 100644 index 000000000..a333b271b --- /dev/null +++ b/atom-extensions/atom-spring-boot/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "build", + "lib": ["es7", "dom"], + "declaration": true, + "inlineSources": true, + "inlineSourceMap": true, + "strictNullChecks": true, + "noImplicitAny": true, + "baseUrl": "./" + }, + "include": [ + "lib/**/*.ts" + ] +} \ No newline at end of file diff --git a/atom-extensions/atom-spring-boot/tslint.json b/atom-extensions/atom-spring-boot/tslint.json new file mode 100644 index 000000000..068b76067 --- /dev/null +++ b/atom-extensions/atom-spring-boot/tslint.json @@ -0,0 +1,31 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "quotemark": false, + "object-literal-sort-keys": false, + "ordered-imports": false, + "member-ordering": false, + "one-line": false, + "interface-name": false, + "variable-name": false, + "max-classes-per-file": false, + "no-unused-expression": false, + "no-empty": false, + "one-variable-per-declaration": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast", + "check-module" + ] + }, + "rulesDirectory": [] +} \ No newline at end of file diff --git a/concourse/tasks/build-atom-package.sh b/concourse/tasks/build-atom-package.sh index bee5a4075..ebb7b06b3 100755 --- a/concourse/tasks/build-atom-package.sh +++ b/concourse/tasks/build-atom-package.sh @@ -11,6 +11,7 @@ fatjar_version=`cat fatjar/version` #cd $atom_commons #npm install +#npm run build cd $atom_package @@ -24,6 +25,8 @@ EOF npm install +npm run build + # push code to release repository cd $workdir