diff --git a/README.md b/README.md index f0aaffb5..ca892f5b 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,13 @@ let g:LanguageClient_serverCommands = { \ } ``` +#### Monaco Editor([monaco-languageclient](https://github.com/TypeFox/monaco-languageclient)) + +https://github.com/joe-re/sql-language-server/blob/master/example/monaco_editor + +It's also used to develop sql-language-server. +You can follow [development section](#development) to check Mocaco Editor working. + ## Usage ### CLI @@ -111,7 +118,7 @@ Please restart sql-language-server process after create .sqllsrc.json. | Key | Description | value | required | default | | ------------ | ------------------------------------------------------------------------------------------------------------------------- | ----------------------- | -------- | --------------------------------- | | name | Connection name(free-form text) | | true | | -| adapter | Database type | "mysql" #124; "postgres" #124; "sqlite3" | true | | +| adapter | Database type | "mysql" or "postgres" or "sqlite3" | true | | | host | Database host | string | false | | | port | Database port | string | false | mysql:3306, postgres:5432 | | user | Database user | string | false | mysql:"root", postgres:"postgres" | @@ -272,3 +279,30 @@ method: workspace/executeCommand command: fixAllFixableProblems arguments: string(document uri) ``` + +## Contributing on sql-language-server + +### Bug Repots and Feature Requests + +[GitHub Issues](https://github.com/joe-re/sql-language-server/issues) are opening for asking question, reporting problems, and suggests improvement. + +You can start a disccustion about new rule for SQLint there also. + +### Development + +Code contributions are always appreciated. Feel free to fork the repo and submit pull requests. + +You can start to develop sql-language-server on docker-compose. +Please follows below steps. + +1. Setup docker-compose on your machine. + - https://docs.docker.com/compose/install/ +2. Start development process on your docker. + +```sh +$ docker-compose up +``` + +3. Open `http://localhost:3000` on your browser. + + diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..71c70eca --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,22 @@ +version: '3' +services: + assets: + build: + context: . + dockerfile: dockerfile + volumes: + - .:/opt/sql-language-server:rw + command: 'yarn dev' # 'tail -f /dev/null' + ports: + - '3000:3000' + postgres: + image: postgres:10 + restart: always + environment: + POSTGRES_DB: postgres_db + POSTGRES_USER: sqlls + POSTGRES_PASSWORD: sqlls + volumes: + - postgres:/var/lib/postgresql/data +volumes: + postgres: \ No newline at end of file diff --git a/dockerfile b/dockerfile new file mode 100644 index 00000000..c0ea9b8a --- /dev/null +++ b/dockerfile @@ -0,0 +1,9 @@ +FROM node:12 + +COPY ./example /opt/sql-language-server/example +COPY ./package.json yarn.lock /opt/sql-language-server/ +COPY ./packages/server/package.json /opt/sql-language-server/packages/server/ +COPY ./packages/sql-parser/package.json /opt/sql-language-server/packages/sql-parser/ +COPY ./packages/sqlint/package.json /opt/sql-language-server/packages/sqlint/ +WORKDIR /opt/sql-language-server +RUN yarn \ No newline at end of file diff --git a/dockerfile_dev_example_server b/dockerfile_dev_example_server new file mode 100644 index 00000000..c0ea9b8a --- /dev/null +++ b/dockerfile_dev_example_server @@ -0,0 +1,9 @@ +FROM node:12 + +COPY ./example /opt/sql-language-server/example +COPY ./package.json yarn.lock /opt/sql-language-server/ +COPY ./packages/server/package.json /opt/sql-language-server/packages/server/ +COPY ./packages/sql-parser/package.json /opt/sql-language-server/packages/sql-parser/ +COPY ./packages/sqlint/package.json /opt/sql-language-server/packages/sqlint/ +WORKDIR /opt/sql-language-server +RUN yarn \ No newline at end of file diff --git a/example/monaco_editor/.gitignore b/example/monaco_editor/.gitignore new file mode 100644 index 00000000..1521c8b7 --- /dev/null +++ b/example/monaco_editor/.gitignore @@ -0,0 +1 @@ +dist diff --git a/example/monaco_editor/.sqllsrc.json b/example/monaco_editor/.sqllsrc.json new file mode 100644 index 00000000..0ce72c88 --- /dev/null +++ b/example/monaco_editor/.sqllsrc.json @@ -0,0 +1,8 @@ +{ + "adapter": "postgres", + "host": "postgres", + "port": 5432, + "user": "sqlls", + "password": "sqlls", + "database": "postgres_db" +} \ No newline at end of file diff --git a/packages/server/example/monaco_editor/README.md b/example/monaco_editor/README.md similarity index 100% rename from packages/server/example/monaco_editor/README.md rename to example/monaco_editor/README.md diff --git a/example/monaco_editor/config/config.json b/example/monaco_editor/config/config.json new file mode 100644 index 00000000..b5c97da4 --- /dev/null +++ b/example/monaco_editor/config/config.json @@ -0,0 +1,16 @@ +{ + "postgres": { + "username": "sqlls", + "password": "sqlls", + "database": "postgres_db", + "host": "postgres", + "dialect": "postgres" + }, + "mysql": { + "username": "root", + "password": null, + "database": "database_test", + "host": "127.0.0.1", + "dialect": "mysql" + } +} diff --git a/example/monaco_editor/migrations/20200715005652-create-user.js b/example/monaco_editor/migrations/20200715005652-create-user.js new file mode 100644 index 00000000..d007022a --- /dev/null +++ b/example/monaco_editor/migrations/20200715005652-create-user.js @@ -0,0 +1,33 @@ +'use strict'; +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.createTable('Users', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + firstName: { + type: Sequelize.STRING + }, + lastName: { + type: Sequelize.STRING + }, + email: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + down: async (queryInterface, Sequelize) => { + await queryInterface.dropTable('Users'); + } +}; \ No newline at end of file diff --git a/example/monaco_editor/models/index.js b/example/monaco_editor/models/index.js new file mode 100644 index 00000000..33f09e77 --- /dev/null +++ b/example/monaco_editor/models/index.js @@ -0,0 +1,37 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const Sequelize = require('sequelize'); +const basename = path.basename(__filename); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/config.json')[env]; +const db = {}; + +let sequelize; +if (config.use_env_variable) { + sequelize = new Sequelize(process.env[config.use_env_variable], config); +} else { + sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(file => { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + }) + .forEach(file => { + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/example/monaco_editor/models/user.js b/example/monaco_editor/models/user.js new file mode 100644 index 00000000..b4d44cf9 --- /dev/null +++ b/example/monaco_editor/models/user.js @@ -0,0 +1,25 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class User extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + }; + User.init({ + firstName: DataTypes.STRING, + lastName: DataTypes.STRING, + email: DataTypes.STRING + }, { + sequelize, + modelName: 'User', + }); + return User; +}; \ No newline at end of file diff --git a/packages/server/example/monaco_editor/package.json b/example/monaco_editor/package.json similarity index 56% rename from packages/server/example/monaco_editor/package.json rename to example/monaco_editor/package.json index cbbcc5b7..979787da 100644 --- a/packages/server/example/monaco_editor/package.json +++ b/example/monaco_editor/package.json @@ -5,12 +5,13 @@ "main": "index.js", "license": "MIT", "scripts": { - "compile": "tsc", - "copy": "cp src/index.html lib/index.html", - "build": "yarn build:server && yarn build:client", - "build:client": "yarn compile && webpack && yarn run copy", - "build:server": "cd ../../ && yarn", - "start": "node lib/server.js" + "tsc": "tsc", + "tsc:watch": "tsc -w", + "webpack:watch": "webpack -w", + "copy": "cp src/index.html dist/index.html", + "build": "yarn tsc && webpack && yarn run copy", + "watch": "run-p copy webpack:watch", + "start": "ts-node-dev --transpile-only ./src/server/server.ts" }, "dependencies": { "express": "^4.17.1", @@ -25,9 +26,17 @@ "@types/ws": "^7.2.6", "css-loader": "^3.6.0", "file-loader": "^6.0.0", + "npm-run-all": "^4.1.5", + "sequelize": "^6.3.3", + "sequelize-cli": "^6.2.0", "source-map-loader": "^1.0.1", "style-loader": "^1.2.1", + "svelte": "^3.24.0", + "svelte-loader": "^2.13.6", + "ts-loader": "^7.0.5", + "ts-node-dev": "^1.0.0-pre.50", "typescript": "^3.9.6", + "wait-on": "^5.0.1", "webpack": "^4.43.0", "webpack-cli": "^3.3.12" } diff --git a/example/monaco_editor/src/client/App.svelte b/example/monaco_editor/src/client/App.svelte new file mode 100644 index 00000000..5fe5517a --- /dev/null +++ b/example/monaco_editor/src/client/App.svelte @@ -0,0 +1,32 @@ + + +

Monaco Language Client SQLLanguageServer Sample

+ +
+ + +
+ +
\ No newline at end of file diff --git a/example/monaco_editor/src/client/client.ts b/example/monaco_editor/src/client/client.ts new file mode 100644 index 00000000..6b931b12 --- /dev/null +++ b/example/monaco_editor/src/client/client.ts @@ -0,0 +1,92 @@ +/// + +import { listen, MessageConnection } from "vscode-ws-jsonrpc"; +import { + MonacoLanguageClient, + MonacoServices, + createConnection, + ExecuteCommandParams, +} from "monaco-languageclient"; +import ReconnectingWebSocket from "reconnecting-websocket"; +import { URI } from 'vscode-uri' + +let languageClient: MonacoLanguageClient; +export function initClient() { + monaco.languages.register({ + id: "sql", + extensions: [".sql"], + aliases: ["SQL", "sql"], + mimetypes: ["application/json"], + }); + + const value = `SELECT * FROM users`; + const editor = monaco.editor.create(document.getElementById("container")!, { + model: monaco.editor.createModel( + value, + "sql", + monaco.Uri.parse("inmemory://model.sql") + ), + glyphMargin: true, + tabCompletion: "on", + }); + + MonacoServices.install(editor); + + const URL = "ws://localhost:3000/server"; + const webSocket = createWebSocket(URL) as WebSocket; + listen({ + webSocket, + onConnection: (connection) => { + languageClient = createLanguageClient(connection); + const disposable = languageClient.start(); + connection.onClose(() => disposable.dispose()); + }, + }); + + function createLanguageClient( + connection: MessageConnection + ): MonacoLanguageClient { + return new MonacoLanguageClient({ + name: "SQL Language Server MonacoClient", + clientOptions: { + documentSelector: ["sql"], + workspaceFolder: { + uri: URI.file('/opt/sql-language-server/example/monaco_editor'), + name: 'workspace', + index: 0 + } + }, + connectionProvider: { + get: (errorHandler, closeHandler) => { + return Promise.resolve( + createConnection(connection, errorHandler, closeHandler) + ); + }, + }, + }); + } + + function createWebSocket(url: string): ReconnectingWebSocket { + const socketOptions = { + maxReconnectionDelay: 10000, + minReconnectionDelay: 1000, + reconnectionDelayGrowFactor: 1.3, + connectionTimeout: 10000, + maxRetries: Infinity, + debug: false, + }; + return new ReconnectingWebSocket(url, [], socketOptions); + } +} + +export function getLanguageClient() { + return languageClient; +} + +export function executeFixAllFixableProblemsCommand() { + const params: ExecuteCommandParams = { + command: 'fixAllFixableProblems', + arguments: ['inmemory://model.sql'] + } + languageClient.sendRequest('workspace/executeCommand', params) +} diff --git a/example/monaco_editor/src/client/index.ts b/example/monaco_editor/src/client/index.ts new file mode 100644 index 00000000..6a7210d9 --- /dev/null +++ b/example/monaco_editor/src/client/index.ts @@ -0,0 +1,17 @@ +import App from './App.svelte'; +import { initClient } from './client' + +require('monaco-editor-core'); +(self as any).MonacoEnvironment = { + getWorkerUrl: () => './editor.worker.bundle.js' +} + +const app = new App({ + target: document.body, +}); + +(window as any).app = app; + +initClient() + +// export default app; \ No newline at end of file diff --git a/example/monaco_editor/src/client/main.ts b/example/monaco_editor/src/client/main.ts new file mode 100644 index 00000000..f1279e06 --- /dev/null +++ b/example/monaco_editor/src/client/main.ts @@ -0,0 +1,2 @@ + +require('./client'); \ No newline at end of file diff --git a/packages/server/example/monaco_editor/src/index.html b/example/monaco_editor/src/index.html similarity index 100% rename from packages/server/example/monaco_editor/src/index.html rename to example/monaco_editor/src/index.html diff --git a/packages/server/example/monaco_editor/src/launchServer.ts b/example/monaco_editor/src/server/launchServer.ts similarity index 91% rename from packages/server/example/monaco_editor/src/launchServer.ts rename to example/monaco_editor/src/server/launchServer.ts index 70faa3e3..231383ed 100644 --- a/packages/server/example/monaco_editor/src/launchServer.ts +++ b/example/monaco_editor/src/server/launchServer.ts @@ -1,9 +1,8 @@ import * as path from "path"; import * as rpc from "vscode-ws-jsonrpc"; -import * as server from "vscode-ws-jsonrpc/lib/server"; import * as lsp from "vscode-languageserver"; import { createConnection } from 'vscode-languageserver'; -import { createServerWithConnection } from '../../../dist_index/index' +import { createServerWithConnection } from 'sql-language-server/src/index' export function launchServer(socket: rpc.IWebSocket) { const reader = new rpc.WebSocketMessageReader(socket); diff --git a/packages/server/example/monaco_editor/src/server.ts b/example/monaco_editor/src/server/server.ts similarity index 74% rename from packages/server/example/monaco_editor/src/server.ts rename to example/monaco_editor/src/server/server.ts index 674ee6f4..ee31d092 100644 --- a/packages/server/example/monaco_editor/src/server.ts +++ b/example/monaco_editor/src/server/server.ts @@ -1,10 +1,10 @@ -import * as express from "express"; -import * as ws from "ws"; -import * as http from "http"; -import * as net from "net"; -import * as url from "url"; -import * as rpc from "vscode-ws-jsonrpc"; -import { launchServer } from './launchServer' +import express from "express"; +import ws from "ws"; +import http from "http"; +import net from "net"; +import url from "url"; +import rpc from "vscode-ws-jsonrpc"; +import { launchServer } from "./launchServer"; process.on("uncaughtException", function (err: any) { console.error("Uncaught Exception: ", err.toString()); @@ -14,7 +14,7 @@ process.on("uncaughtException", function (err: any) { }); const app = express(); -app.use(express.static(__dirname)); +app.use(express.static(`${process.cwd()}/dist`)); const server = app.listen(3000); @@ -43,12 +43,11 @@ server.on( }; if (webSocket.readyState === webSocket.OPEN) { console.log("ready to launch server"); - launchServer(socket) + launchServer(socket); } else { webSocket.on("open", () => { - // launch(socket) - console.log("ready to raunch server2"); - launchServer(socket) + console.log("ready to launch server"); + launchServer(socket); }); } }); diff --git a/example/monaco_editor/tsconfig.json b/example/monaco_editor/tsconfig.json new file mode 100644 index 00000000..bcefcf6f --- /dev/null +++ b/example/monaco_editor/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "strict": true, + "target": "ES2015", + "module": "CommonJS", + "moduleResolution": "Node", + "outDir": "dist", + "skipLibCheck": true, + "sourceMap": true, + "declarationMap": true, + "inlineSources": false, + "esModuleInterop": true, + "declaration": true, + "stripInternal": true, + "lib": [ + "es2016", + "dom" + ], + }, + "include": [ + "src" + ], + "exclude": [ "node_modules" ] +} + diff --git a/example/monaco_editor/webpack.config.js b/example/monaco_editor/webpack.config.js new file mode 100644 index 00000000..af55e4c7 --- /dev/null +++ b/example/monaco_editor/webpack.config.js @@ -0,0 +1,68 @@ +const path = require('path') +const src = path.resolve(__dirname, 'src/client') +const dist = path.resolve(__dirname, 'dist') + +const client = { + entry: { + main: path.resolve(src, 'index.ts'), + 'editor.worker': 'monaco-editor-core/esm/vs/editor/editor.worker.js' + }, + output: { + filename: '[name].bundle.js', + path: dist + }, + target: 'web', + mode: 'development', + node: { + fs: 'empty', + child_process: 'empty', + net: 'empty', + crypto: 'empty' + }, + resolve: { + alias: { + 'vscode': require.resolve('monaco-languageclient/lib/vscode-compatibility') + }, + extensions: ['.js', '.json', '.ttf', '.ts', '.svelte'] + }, + devtool: 'source-map', + module: { + rules: [{ + test: /\.svelte$/, + use: { + loader: 'svelte-loader' + } + }, + { + test: /\.ts$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true + }, + } + ], + exclude: /node_modules/ + }, + { + test: /\.css$/i, + use: ['style-loader', 'css-loader'] + }, + { + test: /\.ttf$/, + use: ['file-loader'] + }, + { + test: /\.js$/, + enforce: 'pre', + loader: 'source-map-loader', + exclude: /node_modules/ + }] + }, + watchOptions: { + poll: 1000 + } +} + +module.exports = [client] \ No newline at end of file diff --git a/package.json b/package.json index 74052bfa..e752dfff 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,16 @@ "license": "MIT", "publisher": "joe-re", "scripts": { - "postinstall": "npm i sqlite3 electron-rebuild", "compile": "npm run compile:client && npm run compile:server", "compile:client": "cd ./packages/client && yarn run compile", "compile:server": "cd ./packages/server && yarn run compile", "watch": "run-p watch:client watch:server", "watch:client": "cd ./packages/client && yarn run watch", - "watch:server": "cd ./packages/server && yarn run watch", + "watch:sqlint": "cd ./packages/sqlint && yarn run watch", + "watch:server": "wait-on ./packages/sqlint/dist/src/index.js && cd ./packages/server && yarn run watch:index", + "watch:dev-server:client": "cd ./example/monaco_editor && yarn run webpack:watch", + "watch:dev-server:server": "wait-on ./packages/server/dist/src/index.js && cd ./example/monaco_editor && yarn run start", + "dev": "run-p watch:sqlint watch:server watch:dev-server:client watch:dev-server:server", "vscode:prepublish": "yarn run compile" }, "engines": { @@ -51,10 +54,12 @@ }, "private": true, "workspaces": [ - "packages/*" + "packages/*", + "example/monaco_editor/*" ], "devDependencies": { - "npm-run-all": "^4.1.3" + "npm-run-all": "^4.1.3", + "wait-on": "^5.0.1" }, "dependencies": { "electron-rebuild": "^1.11.0", diff --git a/packages/server/bin/cli.ts b/packages/server/bin/cli.ts index 903dbf9d..d3701d18 100644 --- a/packages/server/bin/cli.ts +++ b/packages/server/bin/cli.ts @@ -1,5 +1,5 @@ import yargs from 'yargs' -import { createServer } from '../createServer' +import { createServer } from '../src/createServer' const cli = yargs .usage('SQL Language Server Command Line Interface') diff --git a/packages/server/example/monaco_editor/.gitignore b/packages/server/example/monaco_editor/.gitignore deleted file mode 100644 index a65b4177..00000000 --- a/packages/server/example/monaco_editor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -lib diff --git a/packages/server/example/monaco_editor/src/client.ts b/packages/server/example/monaco_editor/src/client.ts deleted file mode 100644 index d9fb531e..00000000 --- a/packages/server/example/monaco_editor/src/client.ts +++ /dev/null @@ -1,70 +0,0 @@ -/// - -import { listen, MessageConnection } from "vscode-ws-jsonrpc"; -import { - MonacoLanguageClient, - MonacoServices, - createConnection, -} from "monaco-languageclient"; -import ReconnectingWebSocket from "reconnecting-websocket"; - -monaco.languages.register({ - id: "sql", - extensions: [".sql"], - aliases: ["SQL", "sql"], - mimetypes: ["application/json"], -}); - -const value = `SELECT * FROM users`; -const editor = monaco.editor.create(document.getElementById("container")!, { - model: monaco.editor.createModel( - value, - "sql", - monaco.Uri.parse("inmemory://model.sql"), - ), - glyphMargin: true, - tabCompletion: 'on' -}); - -MonacoServices.install(editor); - -const URL = "ws://localhost:3000/server"; -const webSocket = createWebSocket(URL) as WebSocket; -listen({ - webSocket, - onConnection: (connection) => { - const languageClient = createLanguageClient(connection); - const disposable = languageClient.start(); - connection.onClose(() => disposable.dispose()); - }, -}); - -function createLanguageClient( - connection: MessageConnection -): MonacoLanguageClient { - return new MonacoLanguageClient({ - name: "SQL Language Server MonacoClient", - clientOptions: { - documentSelector: ["sql"], - }, - connectionProvider: { - get: (errorHandler, closeHandler) => { - return Promise.resolve( - createConnection(connection, errorHandler, closeHandler) - ); - }, - }, - }); -} - -function createWebSocket(url: string): ReconnectingWebSocket { - const socketOptions = { - maxReconnectionDelay: 10000, - minReconnectionDelay: 1000, - reconnectionDelayGrowFactor: 1.3, - connectionTimeout: 10000, - maxRetries: Infinity, - debug: false, - }; - return new ReconnectingWebSocket(url, [], socketOptions); -} diff --git a/packages/server/example/monaco_editor/src/main.ts b/packages/server/example/monaco_editor/src/main.ts deleted file mode 100644 index 837ac53a..00000000 --- a/packages/server/example/monaco_editor/src/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -require('monaco-editor-core'); -(self as any).MonacoEnvironment = { - getWorkerUrl: () => './editor.worker.bundle.js' -} -require('./client'); \ No newline at end of file diff --git a/packages/server/example/monaco_editor/tsconfig.json b/packages/server/example/monaco_editor/tsconfig.json deleted file mode 100644 index 45f39d63..00000000 --- a/packages/server/example/monaco_editor/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "outDir": "lib", - "skipLibCheck": true, - "sourceMap": true, - "declarationMap": true, - "inlineSources": false, - "declaration": true, - "stripInternal": true, - "lib": [ - "es2016", - "dom" - ], - }, - "include": [ - "src" - ], - "exclude": [ "node_modules" ] -} \ No newline at end of file diff --git a/packages/server/example/monaco_editor/webpack.config.js b/packages/server/example/monaco_editor/webpack.config.js deleted file mode 100644 index 10057874..00000000 --- a/packages/server/example/monaco_editor/webpack.config.js +++ /dev/null @@ -1,42 +0,0 @@ -const path = require('path') -const lib = path.resolve(__dirname, 'lib') - -module.exports = { - entry: { - main: path.resolve(lib, 'main.js'), - 'editor.worker': 'monaco-editor-core/esm/vs/editor/editor.worker.js' - }, - output: { - filename: '[name].bundle.js', - path: lib - }, - target: 'web', - node: { - fs: 'empty', - child_process: 'empty', - net: 'empty', - crypto: 'empty' - }, - resolve: { - alias: { - 'vscode': require.resolve('monaco-languageclient/lib/vscode-compatibility') - }, - extensions: ['.js', '.json', '.ttf'] - }, - devtool: 'source-map', - module: { - rules: [{ - test: /\.css$/i, - use: ['style-loader', 'css-loader'] - }, - { - test: /\.ttf$/, - use: ['file-loader'] - }, - { - test: /\.js$/, - enforce: 'pre', - loader: 'source-map-loader' - }] - } -} \ No newline at end of file diff --git a/packages/server/package.json b/packages/server/package.json index 53997ea2..465ccd03 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,24 +1,24 @@ { "name": "sql-language-server", "version": "0.10.0", - "main": "dist_index/index.js", + "main": "dist/src/index.js", "bin": { - "sql-language-server": "./dist/cli.js" + "sql-language-server": "./dist/bin/cli.js" }, "license": "MIT", "scripts": { - "compile:cli": "rm -rf dist && rollup -c", - "compile:index": "rm -rf dist_index && rollup -c rollup.index.config.js", - "compile:sqlint": "cd ../sqlint && yarn && yarn build", - "clean": "rm -rf dist dist_index", - "watch": "rollup -c -w", + "compile:cli": "rollup -c", + "compile:index": "tsc -p .", + "clean": "rm -rf dist", + "watch:cli": "rollup -c -w", + "watch:index": "tsc -w", "test": "jest", - "prepublish": "yarn compile:sqlint && yarn compile:cli && yarn compile:index" + "_prepare": "yarn compile:sqlint && yarn compile:cli && yarn compile:index" }, + "type": "module", "files": [ "package.json", - "dist", - "dist_index" + "dist" ], "dependencies": { "@types/pg": "^7.4.10", @@ -31,7 +31,8 @@ "vscode-languageclient": "^6.1.3", "vscode-languageserver": "^6.1.1", "vscode-languageserver-textdocument": "^1.0.1", - "yargs": "^12.0.1" + "yargs": "^12.0.1", + "sqlint": "^0.9.2" }, "devDependencies": { "@rollup/plugin-commonjs": "^11.1.0", diff --git a/packages/server/rollup.config.js b/packages/server/rollup.config.js index fd51c3b7..6fddddf4 100644 --- a/packages/server/rollup.config.js +++ b/packages/server/rollup.config.js @@ -13,7 +13,7 @@ export default { sourcemap: true }, plugins: [ - typescript(), + typescript({ tsconfig: 'tsconfig.cli.json' }), json(), resolve({ preferBuiltins: false diff --git a/packages/server/rollup.index.config.js b/packages/server/rollup.index.config.js deleted file mode 100644 index c15c214f..00000000 --- a/packages/server/rollup.index.config.js +++ /dev/null @@ -1,32 +0,0 @@ -import typescript from '@rollup/plugin-typescript'; -import commonjs from "@rollup/plugin-commonjs"; -import json from "@rollup/plugin-json"; -import replace from "@rollup/plugin-replace"; -import resolve from '@rollup/plugin-node-resolve'; - -export default { - input: 'index.ts', - output: { - dir: 'dist_index', - format: 'cjs', - sourcemap: true - }, - plugins: [ - typescript({ tsconfig: 'tsconfig.index.json' }), - json(), - resolve({ - preferBuiltins: false - }), - replace({ - delimiters: ['', ''], - values: { - 'require(\'readable-stream/transform\')': 'require(\'stream\').Transform', - 'require("readable-stream/transform")': 'require("stream").Transform', - 'readable-stream': 'stream' - } - }), - commonjs({ - ignore: ['pg-native' , './native'] - }) - ] -}; diff --git a/packages/server/SettingStore.ts b/packages/server/src/SettingStore.ts similarity index 98% rename from packages/server/SettingStore.ts rename to packages/server/src/SettingStore.ts index c3cefbd0..40162988 100644 --- a/packages/server/SettingStore.ts +++ b/packages/server/src/SettingStore.ts @@ -15,7 +15,7 @@ export type SSHConfig = { } export type Settings = { name: string | null, - adapter: 'mysql' | 'postgresql' | 'sqlite3' | null, + adapter: 'mysql' | 'postgresql' | 'postgres' | 'sqlite3' | null, host: string | null port: number | null user: string | null diff --git a/packages/server/ambient.d.ts b/packages/server/src/ambient.d.ts similarity index 100% rename from packages/server/ambient.d.ts rename to packages/server/src/ambient.d.ts diff --git a/packages/server/cache.ts b/packages/server/src/cache.ts similarity index 100% rename from packages/server/cache.ts rename to packages/server/src/cache.ts diff --git a/packages/server/complete.ts b/packages/server/src/complete.ts similarity index 100% rename from packages/server/complete.ts rename to packages/server/src/complete.ts diff --git a/packages/server/createConnection.ts b/packages/server/src/createConnection.ts similarity index 100% rename from packages/server/createConnection.ts rename to packages/server/src/createConnection.ts diff --git a/packages/server/createDiagnostics.ts b/packages/server/src/createDiagnostics.ts similarity index 95% rename from packages/server/createDiagnostics.ts rename to packages/server/src/createDiagnostics.ts index 992dd69d..3565d24c 100644 --- a/packages/server/createDiagnostics.ts +++ b/packages/server/src/createDiagnostics.ts @@ -2,8 +2,7 @@ import { parse } from '@joe-re/sql-parser' import log4js from 'log4js'; import { PublishDiagnosticsParams, Diagnostic } from 'vscode-languageserver' import { DiagnosticSeverity }from 'vscode-languageserver-types' -import { lint, ErrorLevel } from 'sqlint' -import { LintResult } from 'sqlint/src/cli/lint' +import { lint, ErrorLevel, LintResult } from 'sqlint' import cache, { LintCache } from './cache' const logger = log4js.getLogger() diff --git a/packages/server/createServer.ts b/packages/server/src/createServer.ts similarity index 100% rename from packages/server/createServer.ts rename to packages/server/src/createServer.ts diff --git a/packages/server/database_libs/AbstractClient.ts b/packages/server/src/database_libs/AbstractClient.ts similarity index 100% rename from packages/server/database_libs/AbstractClient.ts rename to packages/server/src/database_libs/AbstractClient.ts diff --git a/packages/server/database_libs/MysqlClient.ts b/packages/server/src/database_libs/MysqlClient.ts similarity index 100% rename from packages/server/database_libs/MysqlClient.ts rename to packages/server/src/database_libs/MysqlClient.ts diff --git a/packages/server/database_libs/PostgresClient.ts b/packages/server/src/database_libs/PostgresClient.ts similarity index 98% rename from packages/server/database_libs/PostgresClient.ts rename to packages/server/src/database_libs/PostgresClient.ts index c97f0f35..9134aceb 100644 --- a/packages/server/database_libs/PostgresClient.ts +++ b/packages/server/src/database_libs/PostgresClient.ts @@ -67,7 +67,7 @@ export default class PosgresClient extends AbstractClient { LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum LEFT JOIN pg_type t ON a.atttypid = t.oid LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation - WHERE a.attrelid = '${tableName}'::regclass + WHERE a.attrelid = '"${tableName}"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum ` diff --git a/packages/server/database_libs/Sqlite3Client.ts b/packages/server/src/database_libs/Sqlite3Client.ts similarity index 100% rename from packages/server/database_libs/Sqlite3Client.ts rename to packages/server/src/database_libs/Sqlite3Client.ts diff --git a/packages/server/database_libs/getDatabaseClient.ts b/packages/server/src/database_libs/getDatabaseClient.ts similarity index 90% rename from packages/server/database_libs/getDatabaseClient.ts rename to packages/server/src/database_libs/getDatabaseClient.ts index 40b38013..bcfc5606 100644 --- a/packages/server/database_libs/getDatabaseClient.ts +++ b/packages/server/src/database_libs/getDatabaseClient.ts @@ -7,6 +7,7 @@ import Sqlite3Client from './Sqlite3Client' export default function getDatabaseClient(settings: Settings): AbstractClient { switch (settings.adapter) { case 'mysql': return new MysqlClient(settings) + case 'postgres': return new PostgresClient(settings) case 'postgresql': return new PostgresClient(settings) case 'sqlite3': return new Sqlite3Client(settings) default: throw new Error(`not support ${settings.adapter}`) diff --git a/packages/server/index.ts b/packages/server/src/index.ts similarity index 100% rename from packages/server/index.ts rename to packages/server/src/index.ts diff --git a/packages/server/initializeLogging.ts b/packages/server/src/initializeLogging.ts similarity index 100% rename from packages/server/initializeLogging.ts rename to packages/server/src/initializeLogging.ts diff --git a/packages/server/tsconfig.cli.json b/packages/server/tsconfig.cli.json new file mode 100644 index 00000000..20377ba5 --- /dev/null +++ b/packages/server/tsconfig.cli.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "target": "es2017", + "module": "es6", + "lib": [ "es2018", "es2019" ], + "moduleResolution": "node", + "esModuleInterop": true, + "outDir": "dist", + "declaration": true, + "baseUrl": ".", + }, + "include": [ + "bin/**/*", + "src/**/*", + ], + "exclude": [ + "node_modules" + ] + } + + \ No newline at end of file diff --git a/packages/server/tsconfig.index.json b/packages/server/tsconfig.index.json deleted file mode 100644 index f34fdb90..00000000 --- a/packages/server/tsconfig.index.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "noUnusedLocals": true, - "noUnusedParameters": true, - "strict": true, - "target": "es2017", - "module": "es6", - "lib": [ "es2018", "es2019" ], - "moduleResolution": "node", - "sourceMap": true, - "esModuleInterop": true, - "outDir": "dist_index", - "declaration": true - }, - "exclude": [ - "node_modules", - "example" - ] -} diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index b5460c9a..ecd01f4e 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -1,19 +1,24 @@ { - "compilerOptions": { - "noUnusedLocals": true, - "noUnusedParameters": true, - "strict": true, - "target": "es2017", - "module": "es6", - "lib": [ "es2018", "es2019" ], - "moduleResolution": "node", - "sourceMap": true, - "esModuleInterop": true, - "outDir": "dist", - "declaration": true - }, - "exclude": [ - "node_modules", - "example" - ] -} + "compilerOptions": { + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "target": "es2017", + "module": "CommonJS", + "lib": [ "es2018", "es2019" ], + "moduleResolution": "node", + "esModuleInterop": true, + "outDir": "dist", + "declaration": true, + "baseUrl": ".", + }, + "include": [ + "bin/**/*", + "src/**/*", + ], + "exclude": [ + "node_modules" + ] + } + + \ No newline at end of file diff --git a/packages/sqlint/bin/cli.js b/packages/sqlint/bin/cli.js index a6e2cddb..cef80674 100755 --- a/packages/sqlint/bin/cli.js +++ b/packages/sqlint/bin/cli.js @@ -1,7 +1,7 @@ #!/usr/bin/env node const yargs = require('yargs') -const commands = require('../dist/index') +const commands = require('../dist/src/index') function readStdin() { return new Promise((resolve, reject) => { diff --git a/packages/sqlint/package.json b/packages/sqlint/package.json index 6a1abff6..f2a1d3be 100644 --- a/packages/sqlint/package.json +++ b/packages/sqlint/package.json @@ -1,15 +1,15 @@ { "name": "sqlint", "version": "0.9.2", - "main": "dist/index", + "main": "dist/src/index", "bin": { "sqlint": "bin/cli.js" }, "author": "joe-re", "license": "MIT", "scripts": { - "build": "rm -rf dist && rollup -c", - "watch": "rollup -c -w", + "build": "tsc -p .", + "watch": "tsc -w", "test": "jest", "prepublish": "yarn run build" }, @@ -27,14 +27,10 @@ "yargs": "^15.3.1" }, "devDependencies": { - "@rollup/plugin-commonjs": "^12.0.0", - "@rollup/plugin-node-resolve": "^8.0.0", - "@rollup/plugin-typescript": "^4.1.2", "@types/ajv": "^1.0.0", "@types/js-yaml": "^3.12.4", "@types/node": "^14.0.5", "@types/yargs": "^15.0.5", - "rollup": "^2.12.0", "ts-jest": "^26.0.0", "typescript": "^3.9.3" } diff --git a/packages/sqlint/rollup.config.js b/packages/sqlint/rollup.config.js deleted file mode 100644 index 05c23b52..00000000 --- a/packages/sqlint/rollup.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import typescript from '@rollup/plugin-typescript' -import commonjs from "@rollup/plugin-commonjs" -import json from "@rollup/plugin-json" -import resolve from '@rollup/plugin-node-resolve' - -export default { - input: 'src/index.ts', - output: { - dir: 'dist', - format: 'cjs', - sourcemap: true - }, - plugins: [ - typescript(), - json(), - resolve({ preferBuiltins: false }), - commonjs() - ] -} \ No newline at end of file diff --git a/packages/sqlint/tsconfig.json b/packages/sqlint/tsconfig.json index ef50d9a1..be803cba 100644 --- a/packages/sqlint/tsconfig.json +++ b/packages/sqlint/tsconfig.json @@ -4,7 +4,7 @@ "noUnusedParameters": true, "strict": true, "target": "es2017", - "module": "es6", + "module": "CommonJS", "lib": [ "es2018", "es2019" ], "moduleResolution": "node", "sourceMap": true, diff --git a/tsconfig.json b/tsconfig.json index 7daf1dfd..589a764b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,22 @@ { "compilerOptions": { + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, "target": "es2017", - "module": "commonjs", - "lib": [ "dom", "es2018", "es2019" ], - "strict": false, + "module": "es6", + "lib": [ "es2018", "es2019" ], "moduleResolution": "node", "esModuleInterop": true, - "sourceMap": true, - "outDir": "./out" + "baseUrl": ".", + "paths": { + "@sql-language-server/sqlint": ["packages/sqlint/dist"] + } }, - "exclude": ["node_modules", "server", "test"] + "include": ["../sqlint"], + "exclude": [ + "node_modules", + "example" + ] } +