UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 9.73 kB
import*as Common from"../../core/common/common.js";import*as Host from"../../core/host/host.js";import*as i18n from"../../core/i18n/i18n.js";import*as Root from"../../core/root/root.js";import*as SDK from"../../core/sdk/sdk.js";import*as Formatter from"../../models/formatter/formatter.js";import*as SourceMapScopes from"../../models/source_map_scopes/source_map_scopes.js";import*as CodeMirror from"../../third_party/codemirror.next/codemirror.next.js";import*as IconButton from"../../ui/components/icon_button/icon_button.js";import*as TextEditor from"../../ui/components/text_editor/text_editor.js";import*as ObjectUI from"../../ui/legacy/components/object_ui/object_ui.js";import*as UI from"../../ui/legacy/legacy.js";import{ConsolePanel}from"./ConsolePanel.js";import consolePromptStyles from"./consolePrompt.css.js";const{Direction:Direction}=TextEditor.TextEditorHistory,UIStrings={consolePrompt:"Console prompt",selfXssWarning:"Warning: Do not paste code you do not understand or have not checked yourself into the DevTools console. This could allow attackers to steal your identity or take control of your computer. Please type ''{PH1}'' below to allow pasting.",allowPasting:"allow pasting"},str_=i18n.i18n.registerUIStrings("panels/console/ConsolePrompt.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export class ConsolePrompt extends(Common.ObjectWrapper.eventMixin(UI.Widget.Widget)){addCompletionsFromHistory;historyInternal;initialText;editor;eagerPreviewElement;textChangeThrottler;formatter;requestPreviewBound;requestPreviewCurrent=0;innerPreviewElement;promptIcon;iconThrottler;eagerEvalSetting;previewRequestForTest;highlightingNode;#t;#e;#o=!1;constructor(){super(),this.addCompletionsFromHistory=!0,this.historyInternal=new TextEditor.AutocompleteHistory.AutocompleteHistory(Common.Settings.Settings.instance().createLocalSetting("consoleHistory",[])),this.initialText="",this.eagerPreviewElement=document.createElement("div"),this.eagerPreviewElement.classList.add("console-eager-preview"),this.textChangeThrottler=new Common.Throttler.Throttler(150),this.formatter=new ObjectUI.RemoteObjectPreviewFormatter.RemoteObjectPreviewFormatter,this.requestPreviewBound=this.requestPreview.bind(this),this.innerPreviewElement=this.eagerPreviewElement.createChild("div","console-eager-inner-preview");const t=new IconButton.Icon.Icon;t.data={iconName:"chevron-left-dot",color:"var(--icon-default)",width:"16px",height:"16px"},t.classList.add("preview-result-icon"),this.eagerPreviewElement.appendChild(t);const e=this.element.createChild("div","console-prompt-editor-container");this.element.appendChild(this.eagerPreviewElement),this.promptIcon=new IconButton.Icon.Icon,this.promptIcon.data={iconName:"chevron-right",color:"var(--icon-action)",width:"16px",height:"16px"},this.promptIcon.classList.add("console-prompt-icon"),this.element.appendChild(this.promptIcon),this.iconThrottler=new Common.Throttler.Throttler(0),this.eagerEvalSetting=Common.Settings.Settings.instance().moduleSetting("consoleEagerEval"),this.eagerEvalSetting.addChangeListener(this.eagerSettingChanged.bind(this)),this.eagerPreviewElement.classList.toggle("hidden",!this.eagerEvalSetting.get()),this.element.tabIndex=0,this.previewRequestForTest=null,this.highlightingNode=!1;const o=TextEditor.JavaScript.argumentHints();this.#t=o[0];const i=TextEditor.Config.DynamicSetting.bool("consoleAutocompleteOnEnter",[],TextEditor.Config.conservativeCompletion),r=[CodeMirror.keymap.of(this.editorKeymap()),CodeMirror.EditorView.updateListener.of((t=>this.editorUpdate(t))),o,i.instance(),TextEditor.Config.showCompletionHint,TextEditor.Config.baseConfiguration(this.initialText),TextEditor.Config.autocompletion.instance(),CodeMirror.javascript.javascriptLanguage.data.of({autocomplete:t=>this.addCompletionsFromHistory?this.#e.historyCompletions(t):null}),CodeMirror.EditorView.contentAttributes.of({"aria-label":i18nString(UIStrings.consolePrompt)}),CodeMirror.EditorView.lineWrapping,CodeMirror.autocompletion({aboveCursor:!0})];"true"!==Root.Runtime.Runtime.queryParam("noJavaScriptCompletion")?r.push(CodeMirror.javascript.javascript(),TextEditor.JavaScript.completion()):r.push(CodeMirror.javascript.javascriptLanguage);const n=this.initialText,s=CodeMirror.EditorState.create({doc:n,extensions:r});this.editor=new TextEditor.TextEditor.TextEditor(s),this.editor.addEventListener("keydown",(t=>{t.defaultPrevented&&t.stopPropagation()})),e.appendChild(this.editor),this.#e=new TextEditor.TextEditorHistory.TextEditorHistory(this.editor,this.historyInternal),this.hasFocus()&&this.focus(),this.element.removeAttribute("tabindex"),this.editorSetForTest(),Host.userMetrics.panelLoaded("console","DevTools.Launch.Console")}eagerSettingChanged(){const t=this.eagerEvalSetting.get();this.eagerPreviewElement.classList.toggle("hidden",!t),t&&this.requestPreview()}belowEditorElement(){return this.eagerPreviewElement}onTextChanged(){if(this.eagerEvalSetting.get()){const t=!TextEditor.Config.contentIncludingHint(this.editor.editor);this.previewRequestForTest=this.textChangeThrottler.schedule(this.requestPreviewBound,t)}this.updatePromptIcon(),this.dispatchEventToListeners("TextChanged")}async requestPreview(){const t=++this.requestPreviewCurrent,e=TextEditor.Config.contentIncludingHint(this.editor.editor).trim(),o=UI.Context.Context.instance().flavor(SDK.RuntimeModel.ExecutionContext),{preview:i,result:r}=await ObjectUI.JavaScriptREPL.JavaScriptREPL.evaluateAndBuildPreview(e,!0,!0,500);this.requestPreviewCurrent===t&&(this.innerPreviewElement.removeChildren(),i.deepTextContent()!==TextEditor.Config.contentIncludingHint(this.editor.editor).trim()&&this.innerPreviewElement.appendChild(i),r&&"object"in r&&r.object&&"node"===r.object.subtype?(this.highlightingNode=!0,SDK.OverlayModel.OverlayModel.highlightObjectAsDOMNode(r.object)):this.highlightingNode&&(this.highlightingNode=!1,SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight()),r&&o&&o.runtimeModel.releaseEvaluationResult(r))}wasShown(){super.wasShown(),this.registerCSSFiles([consolePromptStyles])}willHide(){this.highlightingNode&&(this.highlightingNode=!1,SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight())}history(){return this.historyInternal}clearAutocomplete(){CodeMirror.closeCompletion(this.editor.editor)}isCaretAtEndOfPrompt(){return this.editor.state.selection.main.head===this.editor.state.doc.length}moveCaretToEndOfPrompt(){this.editor.dispatch({selection:CodeMirror.EditorSelection.cursor(this.editor.state.doc.length)})}clear(){this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length}})}text(){return this.editor.state.doc.toString()}setAddCompletionsFromHistory(t){this.addCompletionsFromHistory=t}editorKeymap(){return[{key:"ArrowUp",run:()=>this.#e.moveHistory(-1)},{key:"ArrowDown",run:()=>this.#e.moveHistory(1)},{mac:"Ctrl-p",run:()=>this.#e.moveHistory(-1,!0)},{mac:"Ctrl-n",run:()=>this.#e.moveHistory(1,!0)},{key:"Escape",run:()=>TextEditor.JavaScript.closeArgumentsHintsTooltip(this.editor.editor,this.#t)},{key:"Ctrl-Enter",run:()=>(this.handleEnter(!0),!0)},{key:"Enter",run:()=>(this.handleEnter(),!0),shift:CodeMirror.insertNewlineAndIndent}]}async enterWillEvaluate(t){const{doc:e,selection:o}=this.editor.state;if(!e.length)return!1;if(t||o.main.head<e.length)return!0;const i=UI.Context.Context.instance().flavor(SDK.RuntimeModel.ExecutionContext),r=await TextEditor.JavaScript.isExpressionComplete(e.toString());return i===UI.Context.Context.instance().flavor(SDK.RuntimeModel.ExecutionContext)&&r}showSelfXssWarning(){Common.Console.Console.instance().warn(i18nString(UIStrings.selfXssWarning,{PH1:i18nString(UIStrings.allowPasting)})),this.#o=!0}async handleEnter(t){if(this.#o&&this.text()===i18nString(UIStrings.allowPasting))return Common.Console.Console.instance().log(this.text()),this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length},scrollIntoView:!0}),Common.Settings.Settings.instance().createSetting("disableSelfXssWarning",!1,Common.Settings.SettingStorageType.Synced).set(!0),void(this.#o=!1);await this.enterWillEvaluate(t)?(this.appendCommand(this.text(),!0),TextEditor.JavaScript.closeArgumentsHintsTooltip(this.editor.editor,this.#t),this.editor.dispatch({changes:{from:0,to:this.editor.state.doc.length},scrollIntoView:!0})):this.editor.state.doc.length?CodeMirror.insertNewlineAndIndent(this.editor.editor):this.editor.dispatch({scrollIntoView:!0})}updatePromptIcon(){this.iconThrottler.schedule((async()=>{this.promptIcon.classList.toggle("console-prompt-incomplete",!await this.enterWillEvaluate())}))}appendCommand(t,e){const o=UI.Context.Context.instance().flavor(SDK.RuntimeModel.ExecutionContext);if(o){const i=o,r=i.target().model(SDK.ConsoleModel.ConsoleModel);if(r){const o=r.addCommandMessage(i,t),n=ObjectUI.JavaScriptREPL.JavaScriptREPL.wrapObjectLiteral(t);this.evaluateCommandInConsole(i,o,n,e),ConsolePanel.instance().isShowing()&&Host.userMetrics.actionTaken(Host.UserMetrics.Action.CommandEvaluatedInConsolePanel)}}}async evaluateCommandInConsole(t,e,o,i){if(Root.Runtime.experiments.isEnabled("evaluateExpressionsWithSourceMaps")){const e=t.debuggerModel.selectedCallFrame();if(e){const t=await SourceMapScopes.NamesResolver.allVariablesInCallFrame(e);o=await this.substituteNames(o,t)}}await(t.target().model(SDK.ConsoleModel.ConsoleModel)?.evaluateCommandInConsole(t,e,o,i))}async substituteNames(t,e){try{return await Formatter.FormatterWorkerPool.formatterWorkerPool().javaScriptSubstitute(t,e)}catch{return t}}editorUpdate(t){t.docChanged||CodeMirror.selectedCompletion(t.state)!==CodeMirror.selectedCompletion(t.startState)?this.onTextChanged():t.selectionSet&&this.updatePromptIcon()}focus(){this.editor.focus()}editorSetForTest(){}}