UNPKG

create-iking-admin

Version:

金合技术中台脚手架

129 lines (115 loc) 3.9 kB
import { paramType } from 'iking-utils' import type { IRange, languages, editor as MEditor } from 'monaco-editor' import type * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api' export type Monaco = typeof monacoEditor export type languageType = 'plaintext' | 'html' | 'javascript' | 'json' | 'sql' | 'xml' | 'java' | 'typescript' export const defaultOpts: MEditor.IStandaloneEditorConstructionOptions = { automaticLayout: true, contextmenu: false, fixedOverflowWidgets: true, fontFamily: 'Menlo-Regular, Monaco, Menlo, Consolas, "Ubuntu Mono", monospace', formatOnPaste: true, formatOnType: true, insertSpaces: true, lineDecorationsWidth: 7, lineHeight: 15, lineNumbersMinChars: 3, minimap: { enabled: false }, quickSuggestions: false, readOnly: false, roundedSelection: false, scrollBeyondLastLine: false, scrollbar: { verticalScrollbarSize: 6, horizontalScrollbarSize: 6, alwaysConsumeMouseWheel: false, arrowSize: 0 }, snippetSuggestions: 'none', tabSize: 2, theme: 'vs-dark', wordBasedSuggestions: false, wordWrap: 'on', cursorStyle: 'line', selectOnLineNumbers: true, autoIndent: 'advanced', glyphMargin: false, // renderIndentGuides: true, renderLineHighlight: 'line', renderWhitespace: 'none', scrollBeyondLastColumn: 2 } export const registerDatavDarkTheme = (monaco: Monaco) => { const themeName = 'datav-dark-theme' monaco.editor.defineTheme(themeName, { base: 'vs-dark', inherit: true, rules: [ { token: 'key', foreground: 'dddddd' }, { token: 'string.key.json', foreground: 'dddddd' }, { token: 'string.value.json', foreground: 'b4e98c' } ], colors: { 'editor.background': '#0e1013', 'editor.lineHighlightBackground': '#1f2329', 'editorLineNumber.foreground': '#576369', 'editorCursor.foreground': '#2483ff' } }) return themeName } type CompletionItem = languages.CompletionItem let suggestLabels: string[] = [] const createSuggestions = (monaco: Monaco, range: IRange) => { const suggestions: CompletionItem[] = [] for (let i = 0; i < suggestLabels.length; i++) { const id = suggestLabels[i] suggestions.push({ label: `:${id}`, insertText: id, kind: monaco.languages.CompletionItemKind.Variable, detail: 'CallbackId', range }) } return suggestions } const registerCompletionMap = new Map() export const registerApiCompletion = (monaco: Monaco, languageId: languageType, callbackIds: string[]) => { if (callbackIds && callbackIds.length > 0) { suggestLabels = callbackIds if (registerCompletionMap.has(languageId)) return registerCompletionMap.set(languageId, 1) monaco.languages.registerCompletionItemProvider(languageId, { triggerCharacters: [':'], provideCompletionItems(model, position) { const word = model.getWordUntilPosition(position) const range = { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, startColumn: word.startColumn, endColumn: word.endColumn } return { suggestions: createSuggestions(monaco, range) } } }) } } export const handleInputCode = (languageId: languageType, code: string | any[] | object) => { let val = code if (paramType.isObject(val) || paramType.isArray(val)) val = JSON.stringify(val, null, 2) return paramType.isString(val) ? val : `${val}` } export const formatDocument = (editor: MEditor.IStandaloneCodeEditor, languageId: languageType) => { if (languageId === 'sql') // todo editor.getAction('editor.action.formatDocument')!.run() else editor.getAction('editor.action.formatDocument')!.run() }