Skip to content

Commit c9e2987

Browse files
authored
Make dev environment (#42)
1 parent b55d436 commit c9e2987

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+552
-286
lines changed

README.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ let g:LanguageClient_serverCommands = {
2626
\ }
2727
```
2828

29+
#### Monaco Editor([monaco-languageclient](https://github.com/TypeFox/monaco-languageclient))
30+
31+
https://github.com/joe-re/sql-language-server/blob/master/example/monaco_editor
32+
33+
It's also used to develop sql-language-server.
34+
You can follow [development section](#development) to check Mocaco Editor working.
35+
2936
## Usage
3037

3138
### CLI
@@ -111,7 +118,7 @@ Please restart sql-language-server process after create .sqllsrc.json.
111118
| Key | Description | value | required | default |
112119
| ------------ | ------------------------------------------------------------------------------------------------------------------------- | ----------------------- | -------- | --------------------------------- |
113120
| name | Connection name(free-form text) | | true | |
114-
| adapter | Database type | "mysql" #124; "postgres" #124; "sqlite3" | true | |
121+
| adapter | Database type | "mysql" or "postgres" or "sqlite3" | true | |
115122
| host | Database host | string | false | |
116123
| port | Database port | string | false | mysql:3306, postgres:5432 |
117124
| user | Database user | string | false | mysql:"root", postgres:"postgres" |
@@ -272,3 +279,30 @@ method: workspace/executeCommand
272279
command: fixAllFixableProblems
273280
arguments: string(document uri)
274281
```
282+
283+
## Contributing on sql-language-server
284+
285+
### Bug Repots and Feature Requests
286+
287+
[GitHub Issues](https://github.com/joe-re/sql-language-server/issues) are opening for asking question, reporting problems, and suggests improvement.
288+
289+
You can start a disccustion about new rule for SQLint there also.
290+
291+
### Development
292+
293+
Code contributions are always appreciated. Feel free to fork the repo and submit pull requests.
294+
295+
You can start to develop sql-language-server on docker-compose.
296+
Please follows below steps.
297+
298+
1. Setup docker-compose on your machine.
299+
- https://docs.docker.com/compose/install/
300+
2. Start development process on your docker.
301+
302+
```sh
303+
$ docker-compose up
304+
```
305+
306+
3. Open `http://localhost:3000` on your browser.
307+
308+

docker-compose.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
version: '3'
2+
services:
3+
assets:
4+
build:
5+
context: .
6+
dockerfile: dockerfile
7+
volumes:
8+
- .:/opt/sql-language-server:rw
9+
command: 'yarn dev' # 'tail -f /dev/null'
10+
ports:
11+
- '3000:3000'
12+
postgres:
13+
image: postgres:10
14+
restart: always
15+
environment:
16+
POSTGRES_DB: postgres_db
17+
POSTGRES_USER: sqlls
18+
POSTGRES_PASSWORD: sqlls
19+
volumes:
20+
- postgres:/var/lib/postgresql/data
21+
volumes:
22+
postgres:

dockerfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM node:12
2+
3+
COPY ./example /opt/sql-language-server/example
4+
COPY ./package.json yarn.lock /opt/sql-language-server/
5+
COPY ./packages/server/package.json /opt/sql-language-server/packages/server/
6+
COPY ./packages/sql-parser/package.json /opt/sql-language-server/packages/sql-parser/
7+
COPY ./packages/sqlint/package.json /opt/sql-language-server/packages/sqlint/
8+
WORKDIR /opt/sql-language-server
9+
RUN yarn

dockerfile_dev_example_server

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM node:12
2+
3+
COPY ./example /opt/sql-language-server/example
4+
COPY ./package.json yarn.lock /opt/sql-language-server/
5+
COPY ./packages/server/package.json /opt/sql-language-server/packages/server/
6+
COPY ./packages/sql-parser/package.json /opt/sql-language-server/packages/sql-parser/
7+
COPY ./packages/sqlint/package.json /opt/sql-language-server/packages/sqlint/
8+
WORKDIR /opt/sql-language-server
9+
RUN yarn

example/monaco_editor/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
dist

example/monaco_editor/.sqllsrc.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"adapter": "postgres",
3+
"host": "postgres",
4+
"port": 5432,
5+
"user": "sqlls",
6+
"password": "sqlls",
7+
"database": "postgres_db"
8+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"postgres": {
3+
"username": "sqlls",
4+
"password": "sqlls",
5+
"database": "postgres_db",
6+
"host": "postgres",
7+
"dialect": "postgres"
8+
},
9+
"mysql": {
10+
"username": "root",
11+
"password": null,
12+
"database": "database_test",
13+
"host": "127.0.0.1",
14+
"dialect": "mysql"
15+
}
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict';
2+
module.exports = {
3+
up: async (queryInterface, Sequelize) => {
4+
await queryInterface.createTable('Users', {
5+
id: {
6+
allowNull: false,
7+
autoIncrement: true,
8+
primaryKey: true,
9+
type: Sequelize.INTEGER
10+
},
11+
firstName: {
12+
type: Sequelize.STRING
13+
},
14+
lastName: {
15+
type: Sequelize.STRING
16+
},
17+
email: {
18+
type: Sequelize.STRING
19+
},
20+
createdAt: {
21+
allowNull: false,
22+
type: Sequelize.DATE
23+
},
24+
updatedAt: {
25+
allowNull: false,
26+
type: Sequelize.DATE
27+
}
28+
});
29+
},
30+
down: async (queryInterface, Sequelize) => {
31+
await queryInterface.dropTable('Users');
32+
}
33+
};

example/monaco_editor/models/index.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
'use strict';
2+
3+
const fs = require('fs');
4+
const path = require('path');
5+
const Sequelize = require('sequelize');
6+
const basename = path.basename(__filename);
7+
const env = process.env.NODE_ENV || 'development';
8+
const config = require(__dirname + '/../config/config.json')[env];
9+
const db = {};
10+
11+
let sequelize;
12+
if (config.use_env_variable) {
13+
sequelize = new Sequelize(process.env[config.use_env_variable], config);
14+
} else {
15+
sequelize = new Sequelize(config.database, config.username, config.password, config);
16+
}
17+
18+
fs
19+
.readdirSync(__dirname)
20+
.filter(file => {
21+
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
22+
})
23+
.forEach(file => {
24+
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
25+
db[model.name] = model;
26+
});
27+
28+
Object.keys(db).forEach(modelName => {
29+
if (db[modelName].associate) {
30+
db[modelName].associate(db);
31+
}
32+
});
33+
34+
db.sequelize = sequelize;
35+
db.Sequelize = Sequelize;
36+
37+
module.exports = db;

example/monaco_editor/models/user.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
const {
3+
Model
4+
} = require('sequelize');
5+
module.exports = (sequelize, DataTypes) => {
6+
class User extends Model {
7+
/**
8+
* Helper method for defining associations.
9+
* This method is not a part of Sequelize lifecycle.
10+
* The `models/index` file will call this method automatically.
11+
*/
12+
static associate(models) {
13+
// define association here
14+
}
15+
};
16+
User.init({
17+
firstName: DataTypes.STRING,
18+
lastName: DataTypes.STRING,
19+
email: DataTypes.STRING
20+
}, {
21+
sequelize,
22+
modelName: 'User',
23+
});
24+
return User;
25+
};

packages/server/example/monaco_editor/package.json renamed to example/monaco_editor/package.json

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
"main": "index.js",
66
"license": "MIT",
77
"scripts": {
8-
"compile": "tsc",
9-
"copy": "cp src/index.html lib/index.html",
10-
"build": "yarn build:server && yarn build:client",
11-
"build:client": "yarn compile && webpack && yarn run copy",
12-
"build:server": "cd ../../ && yarn",
13-
"start": "node lib/server.js"
8+
"tsc": "tsc",
9+
"tsc:watch": "tsc -w",
10+
"webpack:watch": "webpack -w",
11+
"copy": "cp src/index.html dist/index.html",
12+
"build": "yarn tsc && webpack && yarn run copy",
13+
"watch": "run-p copy webpack:watch",
14+
"start": "ts-node-dev --transpile-only ./src/server/server.ts"
1415
},
1516
"dependencies": {
1617
"express": "^4.17.1",
@@ -25,9 +26,17 @@
2526
"@types/ws": "^7.2.6",
2627
"css-loader": "^3.6.0",
2728
"file-loader": "^6.0.0",
29+
"npm-run-all": "^4.1.5",
30+
"sequelize": "^6.3.3",
31+
"sequelize-cli": "^6.2.0",
2832
"source-map-loader": "^1.0.1",
2933
"style-loader": "^1.2.1",
34+
"svelte": "^3.24.0",
35+
"svelte-loader": "^2.13.6",
36+
"ts-loader": "^7.0.5",
37+
"ts-node-dev": "^1.0.0-pre.50",
3038
"typescript": "^3.9.6",
39+
"wait-on": "^5.0.1",
3140
"webpack": "^4.43.0",
3241
"webpack-cli": "^3.3.12"
3342
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<script>
2+
import { executeFixAllFixableProblemsCommand } from './client'
3+
4+
const commands = [
5+
{ id: 'fixAllFixableProblems', text: 'fixAllFixableProblems' },
6+
// TODO
7+
// { id: 'switchDatabaseConnection', text: 'switchDatabaseConnection' },
8+
]
9+
10+
let command = commands[0]
11+
12+
function handleSubmitCommand() {
13+
if (command.id === 'fixAllFixableProblems') {
14+
executeFixAllFixableProblemsCommand()
15+
}
16+
}
17+
</script>
18+
19+
<h1>Monaco Language Client SQLLanguageServer Sample</h1>
20+
21+
<form on:submit|preventDefault={handleSubmitCommand}>
22+
<select bind:value={command}>
23+
{#each commands as command}
24+
<option value={command}>
25+
{command.text}
26+
</option>
27+
{/each}
28+
</select>
29+
<button type=submit>Submit</button>
30+
</form>
31+
32+
<div id="container" style="width:800px;height:600px;border:1px solid grey"></div>
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/// <reference types="monaco-editor-core/monaco"/>
2+
3+
import { listen, MessageConnection } from "vscode-ws-jsonrpc";
4+
import {
5+
MonacoLanguageClient,
6+
MonacoServices,
7+
createConnection,
8+
ExecuteCommandParams,
9+
} from "monaco-languageclient";
10+
import ReconnectingWebSocket from "reconnecting-websocket";
11+
import { URI } from 'vscode-uri'
12+
13+
let languageClient: MonacoLanguageClient;
14+
export function initClient() {
15+
monaco.languages.register({
16+
id: "sql",
17+
extensions: [".sql"],
18+
aliases: ["SQL", "sql"],
19+
mimetypes: ["application/json"],
20+
});
21+
22+
const value = `SELECT * FROM users`;
23+
const editor = monaco.editor.create(document.getElementById("container")!, {
24+
model: monaco.editor.createModel(
25+
value,
26+
"sql",
27+
monaco.Uri.parse("inmemory://model.sql")
28+
),
29+
glyphMargin: true,
30+
tabCompletion: "on",
31+
});
32+
33+
MonacoServices.install(editor);
34+
35+
const URL = "ws://localhost:3000/server";
36+
const webSocket = createWebSocket(URL) as WebSocket;
37+
listen({
38+
webSocket,
39+
onConnection: (connection) => {
40+
languageClient = createLanguageClient(connection);
41+
const disposable = languageClient.start();
42+
connection.onClose(() => disposable.dispose());
43+
},
44+
});
45+
46+
function createLanguageClient(
47+
connection: MessageConnection
48+
): MonacoLanguageClient {
49+
return new MonacoLanguageClient({
50+
name: "SQL Language Server MonacoClient",
51+
clientOptions: {
52+
documentSelector: ["sql"],
53+
workspaceFolder: {
54+
uri: URI.file('/opt/sql-language-server/example/monaco_editor'),
55+
name: 'workspace',
56+
index: 0
57+
}
58+
},
59+
connectionProvider: {
60+
get: (errorHandler, closeHandler) => {
61+
return Promise.resolve(
62+
createConnection(connection, errorHandler, closeHandler)
63+
);
64+
},
65+
},
66+
});
67+
}
68+
69+
function createWebSocket(url: string): ReconnectingWebSocket {
70+
const socketOptions = {
71+
maxReconnectionDelay: 10000,
72+
minReconnectionDelay: 1000,
73+
reconnectionDelayGrowFactor: 1.3,
74+
connectionTimeout: 10000,
75+
maxRetries: Infinity,
76+
debug: false,
77+
};
78+
return new ReconnectingWebSocket(url, [], socketOptions);
79+
}
80+
}
81+
82+
export function getLanguageClient() {
83+
return languageClient;
84+
}
85+
86+
export function executeFixAllFixableProblemsCommand() {
87+
const params: ExecuteCommandParams = {
88+
command: 'fixAllFixableProblems',
89+
arguments: ['inmemory://model.sql']
90+
}
91+
languageClient.sendRequest('workspace/executeCommand', params)
92+
}

0 commit comments

Comments
 (0)