import { completeFromList } from '@codemirror/autocomplete' import { javascript, javascriptLanguage, localCompletionSource, scopeCompletionSource, snippets } from '@codemirror/lang-javascript' import { nodeJsScope } from './nodeScope.js' function extraScope(autoCompleteObject) { let data = autoCompleteObject if (typeof data === 'string') { try { data = JSON.parse(data) } catch { data = {} } } if (!data || typeof data !== 'object' || Array.isArray(data)) { return {} } return data } export function nodeScopeCompletionSource(autoCompleteObject) { return scopeCompletionSource({ ...nodeJsScope, ...extraScope(autoCompleteObject) }) } /** * Completions for mixed languages that mount `javascriptLanguage` * without `javascript()` (snippets + locals + Node globals). */ export function javascriptCompletionSources(autoCompleteObject) { return [ completeFromList(snippets), localCompletionSource, nodeScopeCompletionSource(autoCompleteObject) ] } /** * JavaScript language support with Node.js globals, snippets, and * local-variable completion. * @param {{ autoCompleteObject?: object|string }} [options] */ export function javascriptLang(options = {}) { const { autoCompleteObject } = options return [ javascript(), javascriptLanguage.data.of({ autocomplete: nodeScopeCompletionSource(autoCompleteObject) }) ] } export { nodeJsScope }