monaco-sql-languages
Version:
SQL languages for the Monaco Editor, based on monaco-languages.
258 lines (189 loc) • 8.19 kB
Markdown
# Monaco SQL Languages
[![NPM version][npm-image]][npm-url] [![NPM downloads][download-img]][download-url]
[npm-image]: https://img.shields.io/npm/v/monaco-sql-languages.svg?style=flat-square
[npm-url]: https://www.npmjs.com/package/monaco-sql-languages
[download-img]: https://img.shields.io/npm/dm/monaco-sql-languages.svg?style=flat
[download-url]: https://www.npmjs.com/package/monaco-sql-languages
English | [简体中文](./README-zh_CN.md)
This project is based on the SQL language project of Monaco Editor, which was forked from the [monaco-languages](https://github.com/microsoft/monaco-languages).The difference is that Monaco SQL Languages supports various SQL languages and the corresponding advanced features for the **Big Data field**.
<br/>
## Feature highlights
- Code Highlighting
- Syntax Validation
- Code Completion
> Powered By [dt-sql-parser](https://github.com/DTStack/dt-sql-parser)
<br/>
## Online Preview
<https://dtstack.github.io/monaco-sql-languages/>
> Powered By [molecule](https://github.com/DTStack/molecule).
<br/>
## Supported SQL Languages
- MySQL
- Flink
- Spark
- Hive
- Trino (Presto)
- PostgreSQL
- Impala
<br/>
## Installing
```bash
npm install monaco-sql-languages
```
> Tips: Monaco SQL Languages is only guaranteed to work stably on `monaco-editor@0.31.0` for now.
<br/>
## Integrating
- [Integrating the ESM version of Monaco SQL Languages](./documents/integrate-esm.md)
<br/>
## Usage
1. **Import language contributions**
> Tips: If integrated via MonacoEditorWebpackPlugin, it will help us to import contribution files automatically. Otherwise, you need to import the contribution files manually.
```typescript
import 'monaco-sql-languages/esm/languages/mysql/mysql.contribution';
import 'monaco-sql-languages/esm/languages/flink/flink.contribution';
import 'monaco-sql-languages/esm/languages/spark/spark.contribution';
import 'monaco-sql-languages/esm/languages/hive/hive.contribution';
import 'monaco-sql-languages/esm/languages/trino/trino.contribution';
import 'monaco-sql-languages/esm/languages/pgsql/pgsql.contribution';
import 'monaco-sql-languages/esm/languages/impala/impala.contribution';
// Or you can import all language contributions at once.
// import 'monaco-sql-languages/esm/all.contributions';
```
2. **Setup language features**
You can setup language features via `setupLanguageFeatures`. For example, setup code completion feature of flinkSQL language.
```typescript
import { LanguageIdEnum, setupLanguageFeatures } from 'monaco-sql-languages';
setupLanguageFeatures(LanguageIdEnum.FLINK, {
completionItems: {
enable: true,
triggerCharacters: [' ', '.'],
completionService: //... ,
}
});
```
By default, Monaco SQL Languages only provides keyword autocompletion, and you can customize your completionItem list via `completionService`.
```typescript
import { languages } from 'monaco-editor/esm/vs/editor/editor.api';
import {
setupLanguageFeatures,
LanguageIdEnum,
CompletionService,
ICompletionItem,
EntityContextType
} from 'monaco-sql-languages';
const completionService: CompletionService = function (
model,
position,
completionContext,
suggestions, // syntax context info at caretPosition
entities // tables, columns in the syntax context of the editor text
) {
return new Promise((resolve, reject) => {
if (!suggestions) {
return Promise.resolve([]);
}
const { keywords, syntax } = suggestions;
const keywordsCompletionItems: ICompletionItem[] = keywords.map((kw) => ({
label: kw,
kind: languages.CompletionItemKind.Keyword,
detail: 'keyword',
sortText: '2' + kw
}));
let syntaxCompletionItems: ICompletionItem[] = [];
syntax.forEach((item) => {
if (item.syntaxContextType === EntityContextType.DATABASE) {
const databaseCompletions: ICompletionItem[] = []; // some completions about databaseName
syntaxCompletionItems = [...syntaxCompletionItems, ...databaseCompletions];
}
if (item.syntaxContextType === EntityContextType.TABLE) {
const tableCompletions: ICompletionItem[] = []; // some completions about tableName
syntaxCompletionItems = [...syntaxCompletionItems, ...tableCompletions];
}
});
resolve([...syntaxCompletionItems, ...keywordsCompletionItems]);
});
};
setupLanguageFeatures(LanguageIdEnum.FLINK, {
completionItems: {
enable: true,
completionService: //... ,
}
});
```
3. **Create the Monaco Editor instance and specify the language you need**
```typescript
import { LanguageIdEnum } from 'monaco-sql-languages';
monaco.editor.create(document.getElementById('container'), {
value: 'select * from tb_test',
language: LanguageIdEnum.FLINK // languageId
});
```
<br/>
## Monaco Theme
> Monaco SQL Languages plan to support more themes in the future.
Monaco SQL Languages provides built-in Monaco Theme that is named `vsPlusTheme`. `vsPlusTheme` inspired by vscode default plus colorTheme and it contains three styles of themes inside:
- `darkTheme`: Inherited from monaco built-in theme `vs-dark`;
- `lightTheme`: Inherited from monaco built-in theme `vs`;
- `hcBlackTheme`: Inherited from monaco built-in theme `hc-black`;
**Use Monaco SQL Languages built-in vsPlusTheme**
```typescript
import { vsPlusTheme } from 'monaco-sql-languages';
import { editor } from 'monaco-editor';
// import themeData and defineTheme, you can customize the theme name, e.g. sql-dark
editor.defineTheme('sql-dark', vsPlusTheme.darkThemeData);
editor.defineTheme('sql-light', vsPlusTheme.lightThemeData);
editor.defineTheme('sql-hc', vsPlusTheme.hcBlackThemeData);
// specify the theme you have defined
editor.create(null as any, {
theme: 'sql-dark',
language: 'flinksql'
});
```
**Customize your own Monaco theme**
```typescript
import { TokenClassConsts, postfixTokenClass } from 'monaco-sql-languages';
// Customize the various tokens style
const myThemeData: editor.IStandaloneThemeData = {
base: 'vs-dark',
inherit: true,
rules: [
{ token: postfixTokenClass(TokenClassConsts.COMMENT), foreground: '6a9955' },
{ token: postfixTokenClass(TokenClassConsts.IDENTIFIER), foreground: '9cdcfe' },
{ token: postfixTokenClass(TokenClassConsts.KEYWORD), foreground: '569cd6' },
{ token: postfixTokenClass(TokenClassConsts.NUMBER), foreground: 'b5cea8' },
{ token: postfixTokenClass(TokenClassConsts.STRING), foreground: 'ce9178' },
{ token: postfixTokenClass(TokenClassConsts.TYPE), foreground: '4ec9b0' }
],
colors: {}
};
// Define the monaco theme
editor.defineTheme('my-theme', myThemeData);
```
> `postfixTokenClass` is not required in most cases, but since Monaco SQL Languages has `tokenPostfix: 'sql'` internally set for all SQL languages, in some cases your custom style may not work if you don't use `postfixTokenClassClass` to handle `TokenClassConsts.*`.
<br/>
## Dev: cheat sheet
- initial setup
```bash
pnpm install
```
- open the dev web
```bash
pnpm watch-esm
cd website
pnpm install
pnpm dev
```
- build
```bash
pnpm build
```
- run test
```
pnpm test
```
<br/>
## Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
<br/>
## License
[MIT](https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md)