UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 16.4 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 Platform from"../../../../core/platform/platform.js";import*as SDK from"../../../../core/sdk/sdk.js";import*as Bindings from"../../../../models/bindings/bindings.js";import*as Breakpoints from"../../../../models/breakpoints/breakpoints.js";import*as TextUtils from"../../../../models/text_utils/text_utils.js";import*as Workspace from"../../../../models/workspace/workspace.js";import*as UI from"../../legacy.js";const UIStrings={unknown:"(unknown)",auto:"auto",revealInS:"Reveal in {PH1}",reveal:"Reveal",openUsingS:"Open using {PH1}",linkHandling:"Link handling:"},str_=i18n.i18n.registerUIStrings("ui/legacy/components/utils/Linkifier.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_),instances=new Set;let decorator=null;const anchorsByUISourceCode=new WeakMap,infoByAnchor=new WeakMap,textByAnchor=new WeakMap,linkHandlers=new Map;let linkHandlerSettingInstance,linkContextMenuProviderInstance,linkHandlerSettingUIInstance;export class Linkifier{maxLength;anchorsByTarget;locationPoolByTarget;onLiveLocationUpdate;useLinkDecorator;constructor(e,n,t=(()=>{})){this.maxLength=e||UI.UIUtils.MaxLengthForDisplayedURLs,this.anchorsByTarget=new Map,this.locationPoolByTarget=new Map,this.onLiveLocationUpdate=t,this.useLinkDecorator=Boolean(n),instances.add(this),SDK.TargetManager.TargetManager.instance().observeTargets(this)}static setLinkDecorator(e){console.assert(!decorator,"Cannot re-register link decorator."),decorator=e,e.addEventListener(LinkDecorator.Events.LinkIconChanged,(function(e){const n=e.data,t=anchorsByUISourceCode.get(n)||[];for(const e of t)Linkifier.updateLinkDecorations(e)}));for(const e of instances)e.updateAllAnchorDecorations()}updateAllAnchorDecorations(){for(const e of this.anchorsByTarget.values())for(const n of e)Linkifier.updateLinkDecorations(n)}static bindUILocation(e,n){const t=Linkifier.linkInfo(e);if(!t)return;if(t.uiLocation=n,!n)return;const i=n.uiSourceCode;let o=anchorsByUISourceCode.get(i);o||(o=new Set,anchorsByUISourceCode.set(i,o)),o.add(e)}static unbindUILocation(e){const n=Linkifier.linkInfo(e);if(!n||!n.uiLocation)return;const t=n.uiLocation.uiSourceCode;n.uiLocation=null;const i=anchorsByUISourceCode.get(t);i&&i.delete(e)}static bindBreakpoint(e,n){const t=Linkifier.linkInfo(e);if(!t)return;const i=Breakpoints.BreakpointManager.BreakpointManager.instance().findBreakpoint(n);i&&(t.revealable=i)}static unbindBreakpoint(e){const n=Linkifier.linkInfo(e);n&&n.revealable&&(n.revealable=null)}targetAdded(e){this.anchorsByTarget.set(e,[]),this.locationPoolByTarget.set(e,new Bindings.LiveLocation.LiveLocationPool)}targetRemoved(e){const n=this.locationPoolByTarget.get(e);if(this.locationPoolByTarget.delete(e),!n)return;n.disposeAll();const t=this.anchorsByTarget.get(e);if(t){this.anchorsByTarget.delete(e);for(const e of t){const n=Linkifier.linkInfo(e);if(!n)continue;n.liveLocation=null,Linkifier.unbindUILocation(e);const t=n.fallback;t&&e.replaceWith(t)}}}maybeLinkifyScriptLocation(e,n,t,i,o){let r=null;const s={lineNumber:i,maxLength:this.maxLength,columnNumber:o?.columnNumber,showColumnNumber:Boolean(o?.showColumnNumber),className:o?.className,tabStop:o?.tabStop,inlineFrameIndex:o?.inlineFrameIndex??0,userMetric:o?.userMetric},{columnNumber:a,className:l=""}=s;if(t&&(r=Linkifier.linkifyURL(t,s)),!e||e.isDisposed())return r;const c=e.model(SDK.DebuggerModel.DebuggerModel);if(!c)return r;const d=n?c.createRawLocationByScriptId(n,i||0,a,s.inlineFrameIndex):c.createRawLocationByURL(t,i||0,a,s.inlineFrameIndex);if(!d)return r;const u={tabStop:o?.tabStop},{link:m,linkInfo:k}=Linkifier.createLink(r&&r.textContent?r.textContent:"",l,u);k.enableDecorator=this.useLinkDecorator,k.fallback=r,k.userMetric=o?.userMetric;const p=this.locationPoolByTarget.get(d.debuggerModel.target());if(!p)return r;const g={showColumnNumber:s.showColumnNumber??!1,revealBreakpoint:o?.revealBreakpoint},L=this.onLiveLocationUpdate;Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance().createLiveLocation(d,this.updateAnchor.bind(this,m,g),p).then((e=>{e&&(k.liveLocation=e,L())}));return this.anchorsByTarget.get(d.debuggerModel.target()).push(m),m}linkifyScriptLocation(e,n,t,i,o){const r=this.maybeLinkifyScriptLocation(e,n,t,i,o),s={lineNumber:i,maxLength:this.maxLength,className:o?.className,columnNumber:o?.columnNumber,showColumnNumber:Boolean(o?.showColumnNumber),inlineFrameIndex:o?.inlineFrameIndex??0,tabStop:o?.tabStop,userMetric:o?.userMetric};return r||Linkifier.linkifyURL(t,s)}linkifyRawLocation(e,n,t){return this.linkifyScriptLocation(e.debuggerModel.target(),e.scriptId,n,e.lineNumber,{columnNumber:e.columnNumber,className:t,inlineFrameIndex:e.inlineFrameIndex})}maybeLinkifyConsoleCallFrame(e,n,t){const i={...t,columnNumber:n.columnNumber,inlineFrameIndex:t?.inlineFrameIndex??0};return this.maybeLinkifyScriptLocation(e,n.scriptId,n.url,n.lineNumber,i)}linkifyStackTraceTopFrame(e,n){console.assert(n.callFrames.length>0);const{url:t,lineNumber:i,columnNumber:o}=n.callFrames[0],r=Linkifier.linkifyURL(t,{lineNumber:i,columnNumber:o,showColumnNumber:!1,inlineFrameIndex:0,maxLength:this.maxLength,preventClick:!0});if(!e)return r;const s=this.locationPoolByTarget.get(e);if(!s)return console.assert(e.isDisposed()),r;console.assert(!e.isDisposed());const a=e.model(SDK.DebuggerModel.DebuggerModel),{link:l,linkInfo:c}=Linkifier.createLink("","");c.enableDecorator=this.useLinkDecorator,c.fallback=r;const d=this.onLiveLocationUpdate;Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance().createStackTraceTopFrameLiveLocation(a.createRawLocationsByStackTrace(n),this.updateAnchor.bind(this,l,{showColumnNumber:!1}),s).then((e=>{c.liveLocation=e,d()}));return this.anchorsByTarget.get(e).push(l),l}linkifyCSSLocation(e,n){const{link:t,linkInfo:i}=Linkifier.createLink("",n||"",{tabStop:!0});i.enableDecorator=this.useLinkDecorator;const o=this.locationPoolByTarget.get(e.cssModel().target());if(!o)return t;const r=this.onLiveLocationUpdate;Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding.instance().createLiveLocation(e,this.updateAnchor.bind(this,t,{showColumnNumber:!1}),o).then((e=>{i.liveLocation=e,r()}));return this.anchorsByTarget.get(e.cssModel().target()).push(t),t}reset(){for(const e of[...this.anchorsByTarget.keys()])this.targetRemoved(e),this.targetAdded(e)}dispose(){for(const e of[...this.anchorsByTarget.keys()])this.targetRemoved(e);SDK.TargetManager.TargetManager.instance().unobserveTargets(this),instances.delete(this)}async updateAnchor(e,n,t){Linkifier.unbindUILocation(e),n.revealBreakpoint&&Linkifier.unbindBreakpoint(e);const i=await t.uiLocation();if(!i){if(t instanceof Bindings.CSSWorkspaceBinding.LiveLocation){const n=t.header();n&&n.ownerNode&&(e.addEventListener("click",(e=>{e.consume(!0),Common.Revealer.reveal(n.ownerNode||null)}),!1),Linkifier.setTrimmedText(e,"<style>"))}return}Linkifier.bindUILocation(e,i),n.revealBreakpoint&&Linkifier.bindBreakpoint(e,i);const o=i.linkText(!0,n.showColumnNumber);Linkifier.setTrimmedText(e,o,this.maxLength);let r=i.uiSourceCode.url();"application/wasm"===i.uiSourceCode.mimeType()?"number"==typeof i.columnNumber&&(r+=`:0x${i.columnNumber.toString(16)}`):(r+=":"+(i.lineNumber+1),n.showColumnNumber&&"number"==typeof i.columnNumber&&(r+=":"+(i.columnNumber+1))),UI.Tooltip.Tooltip.install(e,r),e.classList.toggle("ignore-list-link",await t.isIgnoreListed()),Linkifier.updateLinkDecorations(e)}setLiveLocationUpdateCallback(e){this.onLiveLocationUpdate=e}static updateLinkDecorations(e){const n=Linkifier.linkInfo(e);if(!n||!n.enableDecorator)return;if(!decorator||!n.uiLocation)return;n.icon&&n.icon.parentElement&&e.removeChild(n.icon);const t=decorator.linkIcon(n.uiLocation.uiSourceCode);t&&(t.style.setProperty("margin-right","2px"),e.insertBefore(t,e.firstChild)),n.icon=t}static linkifyURL(e,n){const t=(n=n||{showColumnNumber:!1,inlineFrameIndex:0}).text,i=n.className||"",o=n.lineNumber,r=n.columnNumber,s=n.showColumnNumber,a=n.preventClick,l=n.maxLength||UI.UIUtils.MaxLengthForDisplayedURLs,c=n.bypassURLTrimming;if(!e||e.trim().toLowerCase().startsWith("javascript:")){const n=document.createElement("span");return i&&(n.className=i),n.textContent=t||e||i18nString(UIStrings.unknown),n}let d=t||Bindings.ResourceUtils.displayNameForURL(e);"number"!=typeof o||t||(d+=":"+(o+1),s&&"number"==typeof r&&(d+=":"+(r+1)));const u={maxLength:l,title:d!==e?e:"",href:e,preventClick:a,tabStop:n.tabStop,bypassURLTrimming:c},{link:m,linkInfo:k}=Linkifier.createLink(d,i,u);return o&&(k.lineNumber=o),r&&(k.columnNumber=r),k.userMetric=n?.userMetric,m}static linkifyRevealable(e,n,t,i,o){const r={maxLength:UI.UIUtils.MaxLengthForDisplayedURLs,href:t,title:i},{link:s,linkInfo:a}=Linkifier.createLink(n,o||"",r);return a.revealable=e,s}static createLink(e,n,t={}){const{maxLength:i,title:o,href:r,preventClick:s,tabStop:a,bypassURLTrimming:l}=t,c=document.createElement("span");n&&(c.className=n),c.classList.add("devtools-link"),o&&UI.Tooltip.Tooltip.install(c,o),r&&(c.href=r),e instanceof HTMLElement?c.appendChild(e):l?(c.classList.add("devtools-link-styled-trim"),Linkifier.appendTextWithoutHashes(c,e)):Linkifier.setTrimmedText(c,e,i);const d={icon:null,enableDecorator:!1,uiLocation:null,liveLocation:null,url:r||null,lineNumber:null,columnNumber:null,inlineFrameIndex:0,revealable:null,fallback:null};return infoByAnchor.set(c,d),s?c.classList.add("devtools-link-prevent-click"):(c.addEventListener("click",(e=>{Linkifier.handleClick(e)&&e.consume(!0)}),!1),c.addEventListener("keydown",(e=>{"Enter"===e.key&&Linkifier.handleClick(e)&&e.consume(!0)}),!1)),UI.ARIAUtils.markAsLink(c),c.tabIndex=a?0:-1,{link:c,linkInfo:d}}static setTrimmedText(e,n,t){if(e.removeChildren(),t&&n.length>t){const i=function(e,n){let t=Math.floor(n/2),i=e.length-Math.ceil(n/2)+1;const o=e.codePointAt(i-1);void 0!==o&&o>=65536&&(i++,t++);const r=e.codePointAt(t-1);void 0!==r&&t>0&&r>=65536&&t--;return[e.substring(0,t),e.substring(t,i),e.substring(i)]}(n,t);Linkifier.appendTextWithoutHashes(e,i[0]),Linkifier.appendHiddenText(e,i[1]),Linkifier.appendTextWithoutHashes(e,i[2])}else Linkifier.appendTextWithoutHashes(e,n)}static appendTextWithoutHashes(e,n){const t=TextUtils.TextUtils.Utils.splitStringByRegexes(n,[/[a-f0-9]{20,}/g]);for(const n of t)-1===n.regexIndex?UI.UIUtils.createTextChild(e,n.value):(UI.UIUtils.createTextChild(e,n.value.substring(0,7)),Linkifier.appendHiddenText(e,n.value.substring(7)))}static appendHiddenText(e,n){const t=UI.UIUtils.createTextChild(e.createChild("span","devtools-link-ellipsis"),"…");textByAnchor.set(t,n)}static untruncatedNodeText(e){return textByAnchor.get(e)||e.textContent||""}static linkInfo(e){return e&&infoByAnchor.get(e)||null}static handleClick(e){const n=e.currentTarget;if(UI.UIUtils.isBeingEdited(e.target)||n.hasSelection())return!1;const t=Linkifier.linkInfo(n);return!!t&&Linkifier.invokeFirstAction(t)}static handleClickFromNewComponentLand(e){Linkifier.invokeFirstAction(e)}static invokeFirstAction(e){const n=Linkifier.linkActions(e);return!!n.length&&(n[0].handler.call(null),e.userMetric&&Host.userMetrics.actionTaken(e.userMetric),!0)}static linkHandlerSetting(){return linkHandlerSettingInstance||(linkHandlerSettingInstance=Common.Settings.Settings.instance().createSetting("openLinkHandler",i18nString(UIStrings.auto))),linkHandlerSettingInstance}static registerLinkHandler(e,n){linkHandlers.set(e,n),LinkHandlerSettingUI.instance().update()}static unregisterLinkHandler(e){linkHandlers.delete(e),LinkHandlerSettingUI.instance().update()}static uiLocation(e){const n=Linkifier.linkInfo(e);return n?n.uiLocation:null}static linkActions(e){const n=[];if(!e)return n;let t=Platform.DevToolsPath.EmptyUrlString,i=null;if(e.uiLocation)i=e.uiLocation,t=i.uiSourceCode.contentURL();else if(e.url){t=e.url;const n=Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(t)||Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(Common.ParsedURL.ParsedURL.urlWithoutHash(t));i=n?n.uiLocation(e.lineNumber||0,e.columnNumber||0):null}const o=t?Bindings.ResourceUtils.resourceForURL(t):null,r=i?i.uiSourceCode:o,s=e.revealable||i||o;if(s){const e=Common.Revealer.revealDestination(s);n.push({section:"reveal",title:e?i18nString(UIStrings.revealInS,{PH1:e}):i18nString(UIStrings.reveal),handler:()=>(s instanceof Breakpoints.BreakpointManager.BreakpointLocation&&Host.userMetrics.breakpointEditDialogRevealedFrom(5),Common.Revealer.reveal(s))})}if(r){const t=i?i.lineNumber:e.lineNumber||0;for(const e of linkHandlers.keys()){const i=linkHandlers.get(e);if(!i)continue;const o={section:"reveal",title:i18nString(UIStrings.openUsingS,{PH1:e}),handler:i.bind(null,r,t)};e===Linkifier.linkHandlerSetting().get()?n.unshift(o):n.push(o)}}if((o||e.url)&&(n.push({section:"reveal",title:UI.UIUtils.openLinkExternallyLabel(),handler:()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(t)}),n.push({section:"clipboard",title:UI.UIUtils.copyLinkAddressLabel(),handler:()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(t)})),i&&i.uiSourceCode){const e=i.uiSourceCode;n.push({section:"clipboard",title:UI.UIUtils.copyFileNameLabel(),handler:()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(e.displayName())})}return n}}export var LinkDecorator;!function(e){let n;!function(e){e.LinkIconChanged="LinkIconChanged"}(n=e.Events||(e.Events={}))}(LinkDecorator||(LinkDecorator={}));export class LinkContextMenuProvider{static instance(e={forceNew:null}){const{forceNew:n}=e;return linkContextMenuProviderInstance&&!n||(linkContextMenuProviderInstance=new LinkContextMenuProvider),linkContextMenuProviderInstance}appendApplicableItems(e,n,t){let i=t;for(;i&&!infoByAnchor.get(i);)i=i.parentNodeOrShadowHost();const o=i,r=Linkifier.linkInfo(o);if(!r)return;const s=Linkifier.linkActions(r);for(const e of s)n.section(e.section).appendItem(e.title,e.handler)}}export class LinkHandlerSettingUI{element;constructor(){this.element=document.createElement("select"),this.element.classList.add("chrome-select"),this.element.addEventListener("change",this.onChange.bind(this),!1),this.update()}static instance(e={forceNew:null}){const{forceNew:n}=e;return linkHandlerSettingUIInstance&&!n||(linkHandlerSettingUIInstance=new LinkHandlerSettingUI),linkHandlerSettingUIInstance}update(){this.element.removeChildren();const e=[...linkHandlers.keys()];e.unshift(i18nString(UIStrings.auto));for(const n of e){const e=document.createElement("option");e.textContent=n,e.selected=n===Linkifier.linkHandlerSetting().get(),this.element.appendChild(e)}this.element.disabled=e.length<=1}onChange(e){if(!e.target)return;const n=e.target.value;Linkifier.linkHandlerSetting().set(n)}settingElement(){return UI.SettingsUI.createCustomSetting(i18nString(UIStrings.linkHandling),this.element)}}let contentProviderContextMenuProviderInstance,listeningToNewEvents=!1;function listenForNewComponentLinkifierEvents(){listeningToNewEvents||(listeningToNewEvents=!0,window.addEventListener("linkifieractivated",(function(e){const n=e;Linkifier.handleClickFromNewComponentLand(n.data)})))}listenForNewComponentLinkifierEvents();export class ContentProviderContextMenuProvider{static instance(e={forceNew:null}){const{forceNew:n}=e;return contentProviderContextMenuProviderInstance&&!n||(contentProviderContextMenuProviderInstance=new ContentProviderContextMenuProvider),contentProviderContextMenuProviderInstance}appendApplicableItems(e,n,t){const i=t,o=i.contentURL();if(o){o.startsWith("file://")||n.revealSection().appendItem(UI.UIUtils.openLinkExternallyLabel(),(()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.openInNewTab(o.endsWith(":formatted")?Common.ParsedURL.ParsedURL.slice(o,0,o.lastIndexOf(":")):o)));for(const e of linkHandlers.keys()){const t=linkHandlers.get(e);t&&n.revealSection().appendItem(i18nString(UIStrings.openUsingS,{PH1:e}),t.bind(null,i,0))}i instanceof SDK.NetworkRequest.NetworkRequest||(n.clipboardSection().appendItem(UI.UIUtils.copyLinkAddressLabel(),(()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(o))),n.clipboardSection().appendItem(UI.UIUtils.copyFileNameLabel(),(()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(i.displayName()))))}}}