UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 4.68 kB
import*as i18n from"../../core/i18n/i18n.js";import*as SDK from"../../core/sdk/sdk.js";import*as CodeMirror from"../../third_party/codemirror.next/codemirror.next.js";import*as SourceFrame from"../../ui/legacy/components/source_frame/source_frame.js";import*as UI from"../../ui/legacy/legacy.js";import*as Coverage from"../coverage/coverage.js";import{Plugin}from"./Plugin.js";const UIStrings={clickToShowCoveragePanel:"Click to show Coverage Panel",showDetails:"Show Details",coverageS:"Coverage: {PH1}",coverageNa:"Coverage: n/a"},str_=i18n.i18n.registerUIStrings("panels/sources/CoveragePlugin.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export class CoveragePlugin extends Plugin{originalSourceCode;infoInToolbar;model;coverage;constructor(e){super(e),this.originalSourceCode=this.uiSourceCode,this.infoInToolbar=new UI.Toolbar.ToolbarButton(i18nString(UIStrings.clickToShowCoveragePanel)),this.infoInToolbar.setSecondary(),this.infoInToolbar.addEventListener(UI.Toolbar.ToolbarButton.Events.Click,(()=>{UI.ViewManager.ViewManager.instance().showView("coverage")}));const r=SDK.TargetManager.TargetManager.instance().primaryPageTarget();r&&(this.model=r.model(Coverage.CoverageModel.CoverageModel),this.model&&(this.model.addEventListener(Coverage.CoverageModel.Events.CoverageReset,this.handleReset,this),this.coverage=this.model.getCoverageForUrl(this.originalSourceCode.url()),this.coverage&&this.coverage.addEventListener(Coverage.CoverageModel.URLCoverageInfo.Events.SizesChanged,this.handleCoverageSizesChanged,this))),this.updateStats()}dispose(){this.coverage&&this.coverage.removeEventListener(Coverage.CoverageModel.URLCoverageInfo.Events.SizesChanged,this.handleCoverageSizesChanged,this),this.model&&this.model.removeEventListener(Coverage.CoverageModel.Events.CoverageReset,this.handleReset,this)}static accepts(e){return e.contentType().isDocumentOrScriptOrStyleSheet()}handleReset(){this.coverage=null,this.updateStats()}handleCoverageSizesChanged(){this.updateStats()}updateStats(){if(this.coverage){this.infoInToolbar.setTitle(i18nString(UIStrings.showDetails));const e=new Intl.NumberFormat(i18n.DevToolsLocale.DevToolsLocale.instance().locale,{style:"percent",maximumFractionDigits:1});this.infoInToolbar.setText(i18nString(UIStrings.coverageS,{PH1:e.format(this.coverage.usedPercentage())}))}else this.infoInToolbar.setTitle(i18nString(UIStrings.clickToShowCoveragePanel)),this.infoInToolbar.setText(i18nString(UIStrings.coverageNa))}rightToolbarItems(){return[this.infoInToolbar]}editorExtension(){return coverageCompartment.of([])}getCoverageManager(){return this.uiSourceCode.getDecorationData(SourceFrame.SourceFrame.DecoratorType.COVERAGE)}editorInitialized(e){this.getCoverageManager()&&this.startDecoUpdate(e)}decorationChanged(e,r){e===SourceFrame.SourceFrame.DecoratorType.COVERAGE&&this.startDecoUpdate(r)}startDecoUpdate(e){const r=this.getCoverageManager();(r?r.usageByLine(this.uiSourceCode):Promise.resolve([])).then((r=>{const o=Boolean(e.state.field(coverageState,!1));r.length?o?e.dispatch({effects:setCoverageState.of(r)}):e.dispatch({effects:coverageCompartment.reconfigure([coverageState.init((e=>markersFromCoverageData(r,e))),coverageGutter(this.uiSourceCode.url()),theme])}):o&&e.dispatch({effects:coverageCompartment.reconfigure([])})}))}}const coveredMarker=new class extends CodeMirror.GutterMarker{elementClass="cm-coverageUsed"},notCoveredMarker=new class extends CodeMirror.GutterMarker{elementClass="cm-coverageUnused"};function markersFromCoverageData(e,r){const o=new CodeMirror.RangeSetBuilder;for(let t=0;t<e.length;t++){const a=e[t];if(void 0!==a&&t<r.doc.lines){const e=r.doc.line(t+1).from;o.add(e,e,a?coveredMarker:notCoveredMarker)}}return o.finish()}const setCoverageState=CodeMirror.StateEffect.define(),coverageState=CodeMirror.StateField.define({create:()=>CodeMirror.RangeSet.empty,update:(e,r)=>r.effects.reduce(((e,o)=>o.is(setCoverageState)?markersFromCoverageData(o.value,r.state):e),e.map(r.changes))});function coverageGutter(e){return CodeMirror.gutter({markers:e=>e.state.field(coverageState),domEventHandlers:{click:()=>(UI.ViewManager.ViewManager.instance().showView("coverage").then((()=>{const e=UI.ViewManager.ViewManager.instance().view("coverage");return e&&e.widget()})).then((r=>{const o=e.match(/(.*):formatted$/),t=o&&o[1]||e;r.selectCoverageItemByUrl(t)})),!0)},class:"cm-coverageGutter"})}const coverageCompartment=new CodeMirror.Compartment,theme=CodeMirror.EditorView.baseTheme({".cm-coverageGutter":{width:"5px",marginLeft:"3px"},".cm-coverageUnused":{backgroundColor:"var(--color-accent-red)"},".cm-coverageUsed":{backgroundColor:"var(--color-coverage-used)"}});