iobroker.javascript
Version:
Rules Engine for ioBroker
2 lines (1 loc) • 13.3 kB
JavaScript
import{j as r}from"./createSvgIcon-DPvF8xqu.js";import{a as f}from"./iobroker_javascript__loadShare__react__loadShare__.mjs-CTZOFJS2.js";import{_ as S,a as w,b,h as C,i as y,Q as T,o as k,a0 as E}from"./iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-QWG5Arqe.js";import{n as D,X as O}from"./index-C49cpVll.js";import{_ as u}from"./iobroker_javascript__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-DkBjPSMw.js";import"./iobroker_javascript__loadShare__react__loadShare__.mjs_commonjs-proxy-CE9lvhW8.js";import"./iobroker_javascript__loadShare__prop_mf_2_types__loadShare__.mjs-BCtSFofY.js";function v(m){return/^script\.js\.global\./.test(m)}let N=0;function L(m){const t=/\x1b\[[0-9;]*m/g;return m.replace(t,"")}class V extends f.Component{monacoDiv=null;editor=null;monaco=window.monaco;get monacoTS(){var t,i;return(i=(t=this.monaco)==null?void 0:t.languages)==null?void 0:i.typescript}insert="";originalCode;runningInstancesStr;monacoCounter=0;location;breakpoints;lastSearch="";typings={};decorations=[];triggerPrettier;contentChangeDisposable=null;mouseDownDisposable=null;constructor(t){super(t),this.state={name:"current",isDark:t.isDark||!1,language:t.language||"javascript",readOnly:t.readOnly||!1,alive:!0,check:!1,searchText:this.props.searchText||"",typingsLoaded:!1,showError:null},this.triggerPrettier=t.triggerPrettier,this.runningInstancesStr=JSON.stringify(this.props.runningInstances),this.originalCode=t.code||"",this.monacoDiv=f.createRef()}waitForMonaco(t){var e,s,o,n;let i=!!((s=(e=this.monacoTS)==null?void 0:e.typescriptDefaults)!=null&&s.getCompilerOptions);if(!i||!this.props.runningInstances){if(this.monaco=window.monaco,i=!!((n=(o=this.monacoTS)==null?void 0:o.typescriptDefaults)!=null&&n.getCompilerOptions),this.monacoCounter++,!i&&this.monacoCounter<20){console.log("wait for monaco loaded"),setTimeout(()=>this.waitForMonaco(t),200);return}this.monacoCounter>=20&&console.error("Cannot load monaco!")}else t&&t()}loadTypings(t){if(!this.editor)return;t||=this.props.runningInstances;const i=t&&Object.keys(t).find(e=>t==null?void 0:t[e]);i&&this.props.socket.sendTo(i.replace("system.adapter.",""),"loadTypings",null).then(e=>{this.setState({alive:!0,check:!0,typingsLoaded:!0}),this.setTypeCheck(!0),e.typings?(this.typings=e.typings,this.setEditorTypings(this.state.name)):console.error(`failed to load typings: ${e.error}`)})}componentDidMount(){var e,s,o,n,c,l,a,d;let t=!!((s=(e=this.monacoTS)==null?void 0:e.typescriptDefaults)!=null&&s.getCompilerOptions);if((!t||!this.props.runningInstances)&&(this.monaco=window.monaco,t=!!((n=(o=this.monacoTS)==null?void 0:o.typescriptDefaults)!=null&&n.getCompilerOptions),!t)){console.log("wait for monaco loaded..."),this.waitForMonaco(()=>this.componentDidMount());return}if(!this.editor&&t&&this.monaco){console.log("Init editor"),(l=(c=this.props).onRegisterSelect)==null||l.call(c,()=>{var p;if(this.editor){const g=this.editor.getSelection();if(g)return(p=this.editor.getModel())==null?void 0:p.getValueInRange(g)}});const h=this.monacoTS.typescriptDefaults.getCompilerOptions();h.allowJs=!0,h.checkJs=this.props.checkJs!==!1,h.noLib=!0,h.lib=[],h.useUnknownInCatchVariables=!1,h.moduleResolution=this.monacoTS.ModuleResolutionKind.NodeJs,h.target=this.monacoTS.ScriptTarget.ESNext,h.module=this.monacoTS.ModuleKind.ESNext,h.allowNonTsExtensions=!0,this.monacoTS.typescriptDefaults.setCompilerOptions(h),this.setTypeCheck(!1),(a=this.monacoDiv)!=null&&a.current&&(this.editor=this.monaco.editor.create((d=this.monacoDiv)==null?void 0:d.current,{lineNumbers:"on",scrollBeyondLastLine:!1,automaticLayout:!0,glyphMargin:!!this.props.breakpoints,colorDecorators:!0}),this.contentChangeDisposable=this.editor.onDidChangeModelContent(()=>this.onChange()),this.loadTypings(),this.props.onForceSave&&this.editor.addCommand(this.monaco.KeyMod.CtrlCmd|this.monaco.KeyCode.KeyS,()=>this.props.onForceSave&&this.props.onForceSave()),setTimeout(()=>{this.highlightText(this.state.searchText),this.location=this.props.location||void 0,this.breakpoints=this.props.breakpoints,this.showDecorators()}))}const i={selectOnLineNumbers:!0,scrollBeyondLastLine:!1,automaticLayout:!0,readOnly:this.state.readOnly,language:this.state.language,isDark:this.state.isDark};this.setEditorOptions(i),this.editor&&(this.editor.focus(),this.editor.setValue(this.originalCode),this.props.onToggleBreakpoint&&(this.mouseDownDisposable=this.editor.onMouseDown(h=>{var g;const p=h.target;this.props.onToggleBreakpoint&&((g=p.detail)==null?void 0:g.glyphMarginLeft)!==void 0&&p.position&&this.props.onToggleBreakpoint(p.position.lineNumber-1)})))}setEditorOptions(t){var i;t&&(t.language&&this.setEditorLanguage(t.language),this.editor&&(t.readOnly!==void 0&&this.editor.updateOptions({readOnly:t.readOnly}),t.lineWrap!==void 0&&this.editor.updateOptions({wordWrap:t.lineWrap?"on":"off"})),t.typeCheck!==void 0&&this.setTypeCheck(t.typeCheck),t.isDark!==void 0&&((i=this.monaco)==null||i.editor.setTheme(t.isDark?"vs-dark":"vs")))}componentWillUnmount(){var t,i,e,s;(t=this.contentChangeDisposable)==null||t.dispose(),this.contentChangeDisposable=null,(i=this.mouseDownDisposable)==null||i.dispose(),this.mouseDownDisposable=null,this.editor&&((s=(e=this.props).onRegisterSelect)==null||s.call(e,null),this.editor.dispose(),this.editor=null)}async doPrettier(){var e,s,o,n;const t=this.props.runningInstances&&Object.keys(this.props.runningInstances).find(c=>{var l;return(l=this.props.runningInstances)==null?void 0:l[c]});if(!t){window.alert(u.I18n.t("No script adapter instance found to format the code"));return}const i=await this.props.socket.sendTo(t.replace("system.adapter.",""),"prettier",{code:(e=this.editor)==null?void 0:e.getValue(),type:this.state.language});i.error?this.setState({showError:{title:u.I18n.t("Error formatting code"),message:L(i.error)}}):i.code&&((s=this.editor)==null||s.setValue(i.code),(n=(o=this.props).onChange)==null||n.call(o,i.code),this.showDecorators())}setEditorLanguage(t){var e,s;if(!this.editor)return;const i=this.editor.getModel();if(i){const o=i.getValue(),n=i.uri.path,c=typeof n=="string"&&n.includes(".")?n.substring(0,n.lastIndexOf(".")):"index",l=t==="javascript"?"js":t==="typescript"?"ts":t;i.dispose();const a=t==="javascript"||t==="typescript"?"typescript":t,d=(e=this.monaco)==null?void 0:e.editor.createModel(o,a,this.monaco.Uri.from({scheme:window.location.protocol.replace(":",""),path:`${c}${N++}.${l}`}));d&&(this.editor.setModel(d),(s=this.contentChangeDisposable)==null||s.dispose(),this.contentChangeDisposable=this.editor.onDidChangeModelContent(()=>this.onChange()))}}setTypeCheck(t){var e,s;const i={noSemanticValidation:!this.state.alive||!t,noSyntaxValidation:!this.state.alive};(e=this.monacoTS)==null||e.typescriptDefaults.setDiagnosticsOptions(i),(s=this.monacoTS)==null||s.javascriptDefaults.setDiagnosticsOptions({noSemanticValidation:!this.state.alive||!t,noSyntaxValidation:!this.state.alive})}setEditorTypings(t=""){var o,n,c,l;const i=v(t),e=`${t}.d.ts`,s=[];for(const a of Object.keys(this.typings))i&&(a==="global.d.ts"||a.startsWith("script.js.global")&&a!==e)||s.push({filePath:a,content:this.typings[a]});if((n=(o=this.monacoTS)==null?void 0:o.typescriptDefaults)!=null&&n.setExtraLibs)this.monacoTS.typescriptDefaults.setExtraLibs(s);else if((l=(c=this.monacoTS)==null?void 0:c.typescriptDefaults)!=null&&l.addExtraLib){const a=this.monacoTS.typescriptDefaults.getExtraLibs();s.forEach(d=>{!a[d.filePath]&&this.monaco&&this.monacoTS.typescriptDefaults.addExtraLib(d.content,d.filePath)})}}insertTextIntoEditor(t){if(!this.editor||!this.monaco)return;const i=this.editor.getSelection();if(i){const e=new this.monaco.Range(i.startLineNumber,i.startColumn,i.endLineNumber,i.endColumn);this.editor.executeEdits("",[{range:e,text:t,forceMoveMarkers:!0}])}this.editor.focus()}highlightText(t){var e;if(!this.editor||!this.monaco)return;const i=t?(e=this.editor.getModel())==null?void 0:e.findMatches(t,!0,!1,!1,null,!0):void 0;if(i!=null&&i.length)i.forEach(s=>{var o;return(o=this.editor)==null?void 0:o.setSelection(s.range)}),this.editor.revealLine(i[0].range.startLineNumber);else{const s=this.editor.getPosition();if(s){const o=s.lineNumber,n=s.column;this.editor.setSelection(new this.monaco.Range(o,n,o,n))}}}showDecorators(){var i;const t=[];if(this.location&&this.monaco&&(t.push({range:new this.monaco.Range(this.location.lineNumber+1,(this.location.columnNumber||0)+1,this.location.lineNumber+1,1e3),options:{isWholeLine:!1,className:this.props.isDark?"monacoCurrentLineDark":"monacoCurrentLine"}}),t.push({range:new this.monaco.Range(this.location.lineNumber+1,0,this.location.lineNumber+1,0),options:{isWholeLine:!0,className:this.props.isDark?"monacoCurrentFullLineDark":"monacoCurrentFullLine"}})),(i=this.breakpoints)==null||i.forEach(e=>{this.monaco&&t.push({range:new this.monaco.Range(e.location.lineNumber+1,0,e.location.lineNumber+1,100),options:{isWholeLine:!0,glyphMarginClassName:this.props.isDark?"monacoBreakPointDark":"monacoBreakPoint"}})}),this.editor){const e=this.editor.getModel();e&&(this.decorations=e.deltaDecorations(this.decorations,t))}}initNewScript(t,i){var e;this.setState({name:t}),this.originalCode=i||"",(e=this.editor)==null||e.setValue(i||""),this.highlightText(this.lastSearch),this.showDecorators(),this.setEditorTypings(t)}scrollToLineIfNeeded(t){if(this.editor){const i=this.editor.getVisibleRanges();(!i||!i[0]||i[0].startLineNumber>t||t>i[0].endLineNumber)&&this.editor.revealLineInCenter(t)}}UNSAFE_componentWillReceiveProps(t){const i={};this.state.name!==t.name&&this.initNewScript(t.name,t.code),JSON.stringify(t.runningInstances)!==this.runningInstancesStr&&(this.runningInstancesStr=JSON.stringify(t.runningInstances),this.state.typingsLoaded||this.loadTypings(t.runningInstances)),this.editor&&!t.changed&&(t.code!==this.originalCode||t.code!==this.editor.getValue())&&(this.originalCode=t.code||"",this.editor.setValue(this.originalCode),this.showDecorators(),this.location&&this.scrollToLineIfNeeded(this.location.lineNumber+1)),t.searchText!==this.lastSearch&&(this.lastSearch=t.searchText||"",this.highlightText(this.lastSearch)),JSON.stringify(t.location)!==JSON.stringify(this.location)&&JSON.stringify(t.breakpoints)!==JSON.stringify(this.breakpoints)?(this.location=t.location||void 0,this.breakpoints=t.breakpoints,this.showDecorators(),this.editor&&this.location&&this.scrollToLineIfNeeded(this.location.lineNumber+1)):JSON.stringify(t.breakpoints)!==JSON.stringify(this.breakpoints)?(this.breakpoints=t.breakpoints,this.showDecorators()):JSON.stringify(t.location)!==JSON.stringify(this.location)&&(this.location=t.location||void 0,this.showDecorators(),this.editor&&this.location&&this.scrollToLineIfNeeded(this.location.lineNumber+1)),this.state.language!==(t.language||"javascript")?(this.setState({language:t.language||"javascript"}),i.language=t.language||"javascript"):this.state.readOnly!==(t.readOnly||!1)?(this.setState({readOnly:t.readOnly||!1}),i.readOnly=t.readOnly):this.state.isDark!==(t.isDark||!1)&&(this.setState({isDark:t.isDark||!1}),i.isDark=t.isDark),this.setEditorOptions(i),this.insert!==t.insert&&(this.insert=t.insert||"",this.insert&&(console.log(`Insert text: ${this.insert}`),setTimeout(e=>{this.insertTextIntoEditor(e),setTimeout(()=>this.props.onInserted&&this.props.onInserted(),100)},100,this.insert)))}onChange(){var t,i;!this.props.readOnly&&this.editor&&((i=(t=this.props).onChange)==null||i.call(t,this.editor.getValue()))}renderErrorDialog(){return this.state.showError?this.state.showError.full?r.jsxs(S,{open:!0,maxWidth:"md",onClose:()=>this.setState({showError:null}),children:[r.jsx(w,{children:this.state.showError.title||u.I18n.t("Error")}),r.jsx(b,{children:r.jsx("pre",{children:r.jsx("code",{children:this.state.showError.message})})}),r.jsx(C,{children:r.jsxs(y,{variant:"contained",startIcon:r.jsx(D,{}),onClick:()=>this.setState({showError:null}),children:[u.I18n.t("Close")," "]})})]}):r.jsx(T,{open:!0,autoHideDuration:5e3,onClose:()=>this.setState({showError:null}),message:this.state.showError.title,action:r.jsxs(f.Fragment,{children:[r.jsx(y,{color:"secondary",size:"small",onClick:()=>this.setState({showError:{...this.state.showError,full:!0}}),children:u.I18n.t("More")}),r.jsx(k,{size:"small","aria-label":"close",color:"inherit",onClick:()=>this.setState({showError:null}),children:r.jsx(D,{fontSize:"small"})})]})}):null}render(){var t;return!((t=this.monacoTS)!=null&&t.typescriptDefaults)||!this.props.runningInstances?(setTimeout(()=>{this.monaco=window.monaco,this.forceUpdate()},200),null):(this.props.triggerPrettier!==this.triggerPrettier&&(this.triggerPrettier=this.props.triggerPrettier,setTimeout(()=>this.doPrettier().catch(i=>console.error("Error formatting code:",i)),50)),r.jsxs("div",{ref:this.monacoDiv,style:{...this.props.style,width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:[this.renderErrorDialog(),!this.state.check&&r.jsx(E,{size:"small",title:u.I18n.t("Check is not active, because javascript adapter is disabled"),style:{bottom:10,right:10,opacity:.5,position:"absolute",zIndex:1,background:"red",color:"white"},color:"secondary",children:r.jsx(O,{})})]}))}}export{V as default};