function registerSql()

in amoro-web/src/utils/editor.ts [26:124]


function registerSql() {
  // SQL keyword hints
  monaco.languages.registerCompletionItemProvider('sql', {
    provideCompletionItems: (model, position) => {
      const textUntilPosition = model.getValueInRange({
        startLineNumber: position.lineNumber,
        startColumn: 1,
        endLineNumber: position.lineNumber,
        endColumn: position.column,
      })
      const match = textUntilPosition.match(/(\S+)$/)
      const suggestions: monaco.languages.CompletionItem[] = []
      if (match) {
        const matchStr = match[0].toUpperCase()
        sqlLanguage.keywords.forEach((item: string) => {
          if (item.startsWith(matchStr)) {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Keyword,
              insertText: item,
            } as monaco.languages.CompletionItem)
          }
        })
        sqlLanguage.operators.forEach((item: string) => {
          if (item.startsWith(matchStr)) {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Operator,
              insertText: item,
            } as monaco.languages.CompletionItem)
          }
        })
        sqlLanguage.builtinFunctions.forEach((item: string) => {
          if (item.startsWith(matchStr)) {
            suggestions.push({
              label: item,
              kind: monaco.languages.CompletionItemKind.Function,
              insertText: item,
            } as monaco.languages.CompletionItem)
          }
        })
      }
      return {
        suggestions: Array.from(new Set(suggestions)),
      }
    },
  })

  // format SQL
  monaco.languages.registerDocumentFormattingEditProvider('sql', {
    provideDocumentFormattingEdits(model) {
      const formatted = sqlFormatter.format(model.getValue())
      return [{
        range: model.getFullModelRange(),
        text: formatted.replace(/\s-\s/g, '-'),
      }]
    },
  })

  const themeData: any = {
    base: 'vs',
    inherit: !1,
    colors: {
      'editorHoverWidget.background': '#FAFAFA',
      'editorHoverWidget.border': '#DEDEDE',
      'editor.lineHighlightBackground': '#EFF8FF',
      'editor.selectionBackground': '#D5D5EF',
      'editorLineNumber.foreground': '#999999',
      'editorSuggestWidget.background': '#FFFFFF',
      'editorSuggestWidget.selectedBackground': '#EFF8FF',
    },
    rules: [{
      token: 'comment',
      foreground: '8E908C',
    }, {
      token: 'comments',
      foreground: '8E908C',
    }, {
      token: 'keyword',
      foreground: '8959A8',
    }, {
      token: 'predefined',
      foreground: '11B7BE',
    }, {
      token: 'doubleString',
      foreground: 'AB1010',
    }, {
      token: 'singleString',
      foreground: 'AB1010',
    }, {
      token: 'number',
      foreground: 'AB1010',
    }, {
      token: 'string.sql',
      foreground: '718C00',
    }],
  }
  monaco.editor.defineTheme('arcticSql', themeData)
}