open-consul/ui-v2/app/utils/editor/lint.js

39 lines
1.0 KiB
JavaScript

/*global CodeMirror*/
// CodeMirror doesn't seem to have anyway to hook into whether a mode
// has already loaded, or when a mode has finished loading
// follow more or less what CodeMirror does but doesn't expose
// see codemirror/addon/mode/loadmode.js
export const createLoader = function(
$$ = document.getElementsByTagName.bind(document),
CM = CodeMirror
) {
CM.registerHelper('lint', 'ruby', function(text) {
return [];
});
return function(editor, mode, cb) {
let scripts = [...$$('script')];
const loaded = scripts.find(function(item) {
return item.src.indexOf(`/codemirror/mode/${mode}/${mode}.js`) !== -1;
});
CM.autoLoadMode(editor, mode);
if (loaded) {
cb();
} else {
scripts = [...$$('script')];
CM.on(scripts[0], 'load', function() {
cb();
});
}
};
};
const load = createLoader();
export default function(editor, mode) {
load(editor, mode, function() {
if (editor.getValue().trim().length) {
editor.performLint();
}
});
}