blob: 80275bfcf116314318d9f6f70ef115500052db47 [file] [log] [blame]
<template>
<div class="monaco-editor-main" v-loading="loading"></div>
</template>
<script>
import { loadScriptsAsync } from '../common/helper';
import { store } from '../common/store';
import { SCRIPT_URLS, URL_PARAMS } from '../common/config';
function loadTypes() {
return fetch(
('local' in URL_PARAMS
? SCRIPT_URLS.localEChartsDir
: SCRIPT_URLS.echartsDir.replace('{{version}}', store.echartsVersion)) +
'/types/dist/echarts.d.ts',
{
mode: 'cors'
}
)
.then((response) => response.text())
.then((code) => {
// validation settings
monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({
noSemanticValidation: false,
noSyntaxValidation: false
});
// compiler options
monaco.languages.typescript.typescriptDefaults.setCompilerOptions({
target: monaco.languages.typescript.ScriptTarget.ES6,
allowNonTsExtensions: true,
noResolve: false
});
// console.log('file:///node_modules/@types/' + res[i].path);
monaco.languages.typescript.typescriptDefaults.addExtraLib(
code,
// https://github.com/microsoft/monaco-editor/issues/667#issuecomment-468164794
'file:///node_modules/@types/echarts/echarts.d.ts'
);
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`
import * as echarts from './echarts';
// Export for UMD module.
export as namespace echarts
export = echarts;`,
// https://github.com/microsoft/monaco-editor/issues/667#issuecomment-468164794
'file:///node_modules/@types/echarts/index.d.ts'
);
monaco.languages.typescript.typescriptDefaults.addExtraLib(
`import * as echarts from 'echarts';
// Declare to global namespace.
declare global {
const ROOT_PATH: string
const $: any
const app: {
configParameters: {
[key: string]: {
options: Record<string, string> | string[]
} | {
min?: number
max?: number
}
},
config: {
onChange: () => void
[key: string]: string | number | Function
},
onresize: () => void,
[key: string]: any
};
const ecStat: any;
const d3: any;
const myChart: echarts.ECharts
let option: echarts.EChartsOption
const echarts: typeof echarts
}
`,
'file:///example.d.ts'
);
return;
});
}
function ensureMonacoAndTsTransformer() {
if (typeof monaco === 'undefined') {
return loadScriptsAsync([
SCRIPT_URLS.monacoDir + '/loader.js',
// Prebuilt TS transformer with surcrase
store.cdnRoot + '/js/example-transform-ts-bundle.js'
]).then(function () {
window.require.config({ paths: { vs: SCRIPT_URLS.monacoDir } });
return new Promise((resolve) => {
window.require(['vs/editor/editor.main'], function () {
loadTypes().then(() => {
// Disable AMD. Which will break other libs.
// FIXME
window.define.amd = null;
resolve();
});
});
});
});
}
return Promise.resolve();
}
export default {
props: ['initialCode'],
data() {
return {
shared: store,
loading: false
};
},
mounted() {
this.loading = true;
ensureMonacoAndTsTransformer().then(() => {
this.loading = false;
const model = monaco.editor.createModel(
this.initialCode || '',
'typescript',
// Should also be a file path so it can resolve the lib.
monaco.Uri.parse('file:///main.ts')
);
const editor = monaco.editor.create(this.$el, {
model,
fontFamily: `'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace`,
minimap: {
enabled: false
},
wordWrap: 'off',
automaticLayout: true
});
this._editor = editor;
if (this.initialCode) {
store.sourceCode = this.initialCode;
store.runCode = echartsExampleTransformTs(store.sourceCode);
}
editor.onDidChangeModelContent(() => {
store.sourceCode = editor.getValue();
store.runCode = echartsExampleTransformTs(store.sourceCode);
});
});
},
destroyed() {
if (this._editor) {
this._editor.getModel().dispose();
this._editor.dispose();
}
},
methods: {
setInitialCode(code) {
if (this._editor && code) {
// this._editor.setValue(code || '');
// https://github.com/microsoft/monaco-editor/issues/299#issuecomment-268423927
this._editor.executeEdits('replace', [
{
identifier: 'delete',
range: new monaco.Range(1, 1, 10000, 1),
text: '',
forceMoveMarkers: true
}
]);
this._editor.executeEdits('replace', [
{
identifier: 'insert',
range: new monaco.Range(1, 1, 1, 1),
text: code,
forceMoveMarkers: true
}
]);
this._editor.setSelection(new monaco.Range(0, 0, 0, 0));
// this._editor.setPosition(currentPosition);
}
}
},
watch: {
initialCode(newVal) {
this.setInitialCode(newVal);
}
}
};
</script>
<style lang="scss">
.monaco-editor-main {
font-family: 'Source Code Pro', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas',
monospace;
font-size: 12px;
padding: 0;
overflow-y: hidden;
// height: 100%;
// Fix safari
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
}
</style>