UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 9.47 kB
import*as Common from"../../core/common/common.js";import*as SDK from"../../core/sdk/sdk.js";import*as TextUtils from"../text_utils/text_utils.js";import*as Workspace from"../workspace/workspace.js";import{ContentProviderBasedProject}from"./ContentProviderBasedProject.js";import{CSSWorkspaceBinding}from"./CSSWorkspaceBinding.js";import{DebuggerWorkspaceBinding}from"./DebuggerWorkspaceBinding.js";import{NetworkProject}from"./NetworkProject.js";import{resourceMetadata}from"./ResourceUtils.js";const styleSheetRangeMap=new WeakMap,scriptRangeMap=new WeakMap,boundUISourceCodes=new WeakSet;function computeScriptRange(e){return new TextUtils.TextRange.TextRange(e.lineOffset,e.columnOffset,e.endLine,e.endColumn)}function computeStyleSheetRange(e){return new TextUtils.TextRange.TextRange(e.startLine,e.startColumn,e.endLine,e.endColumn)}export class ResourceMapping{workspace;#e;constructor(e,t){this.workspace=t,this.#e=new Map,e.observeModels(SDK.ResourceTreeModel.ResourceTreeModel,this)}modelAdded(e){const t=new ModelInfo(this.workspace,e);this.#e.set(e,t)}modelRemoved(e){const t=this.#e.get(e);t&&(t.dispose(),this.#e.delete(e))}infoForTarget(e){const t=e.model(SDK.ResourceTreeModel.ResourceTreeModel);return t&&this.#e.get(t)||null}uiSourceCodeForScript(e){const t=this.infoForTarget(e.debuggerModel.target());if(!t)return null;return t.getProject().uiSourceCodeForURL(e.sourceURL)}cssLocationToUILocation(e){const t=e.header();if(!t)return null;const o=this.infoForTarget(e.cssModel().target());if(!o)return null;const r=o.getProject().uiSourceCodeForURL(e.url);if(!r)return null;const s=styleSheetRangeMap.get(t)??computeStyleSheetRange(t),n=e.lineNumber+s.startLine-t.startLine;let i=e.columnNumber;return e.lineNumber===t.startLine&&(i+=s.startColumn-t.startColumn),r.uiLocation(n,i)}jsLocationToUILocation(e){const t=e.script();if(!t)return null;const o=this.infoForTarget(e.debuggerModel.target());if(!o)return null;const r=t.embedderName();if(!r)return null;const s=o.getProject().uiSourceCodeForURL(r);if(!s)return null;const{startLine:n,startColumn:i}=scriptRangeMap.get(t)??computeScriptRange(t);let{lineNumber:c,columnNumber:u}=e;return c===t.lineOffset&&(u+=i-t.columnOffset),c+=n-t.lineOffset,t.hasSourceURL&&(0===c&&(u+=t.columnOffset),c+=t.lineOffset),s.uiLocation(c,u)}uiLocationToJSLocations(e,t,o){if(!boundUISourceCodes.has(e))return[];const r=NetworkProject.targetForUISourceCode(e);if(!r)return[];const s=r.model(SDK.DebuggerModel.DebuggerModel);if(!s)return[];const n=[];for(const r of s.scripts()){if(r.embedderName()!==e.url())continue;const i=scriptRangeMap.get(r)??computeScriptRange(r);if(!i.containsLocation(t,o))continue;let c=t,u=o;r.hasSourceURL&&(c-=i.startLine,0===c&&(u-=i.startColumn)),n.push(s.createRawLocation(r,c,u))}return n}uiLocationRangeToJSLocationRanges(e,t){if(!boundUISourceCodes.has(e))return null;const o=NetworkProject.targetForUISourceCode(e);if(!o)return null;const r=o.model(SDK.DebuggerModel.DebuggerModel);if(!r)return null;const s=[];for(const o of r.scripts()){if(o.embedderName()!==e.url())continue;const n=(scriptRangeMap.get(o)??computeScriptRange(o)).intersection(t);if(n.isEmpty())continue;let{startLine:i,startColumn:c,endLine:u,endColumn:a}=n;o.hasSourceURL&&(i-=n.startLine,0===i&&(c-=n.startColumn),u-=n.startLine,0===u&&(a-=n.startColumn));const d=r.createRawLocation(o,i,c),l=r.createRawLocation(o,u,a);s.push({start:d,end:l})}return s}getMappedLines(e){if(!boundUISourceCodes.has(e))return null;const t=NetworkProject.targetForUISourceCode(e);if(!t)return null;const o=t.model(SDK.DebuggerModel.DebuggerModel);if(!o)return null;const r=new Set;for(const t of o.scripts()){if(t.embedderName()!==e.url())continue;const{startLine:o,endLine:s}=scriptRangeMap.get(t)??computeScriptRange(t);for(let e=o;e<=s;++e)r.add(e)}return r}uiLocationToCSSLocations(e){if(!boundUISourceCodes.has(e.uiSourceCode))return[];const t=NetworkProject.targetForUISourceCode(e.uiSourceCode);if(!t)return[];const o=t.model(SDK.CSSModel.CSSModel);return o?o.createRawLocationsByURL(e.uiSourceCode.url(),e.lineNumber,e.columnNumber):[]}resetForTest(e){const t=e.model(SDK.ResourceTreeModel.ResourceTreeModel),o=t?this.#e.get(t):null;o&&o.resetForTest()}}class ModelInfo{project;#t;#o;#r;constructor(e,t){const o=t.target();this.project=new ContentProviderBasedProject(e,"resources:"+o.id(),Workspace.Workspace.projectTypes.Network,"",!1),NetworkProject.setTargetForProject(this.project,o),this.#t=new Map;const r=o.model(SDK.CSSModel.CSSModel);console.assert(Boolean(r)),this.#o=r;for(const e of t.frames())for(const t of e.getResourcesMap().values())this.addResource(t);this.#r=[t.addEventListener(SDK.ResourceTreeModel.Events.ResourceAdded,this.resourceAdded,this),t.addEventListener(SDK.ResourceTreeModel.Events.FrameWillNavigate,this.frameWillNavigate,this),t.addEventListener(SDK.ResourceTreeModel.Events.FrameDetached,this.frameDetached,this),this.#o.addEventListener(SDK.CSSModel.Events.StyleSheetChanged,(e=>{this.styleSheetChanged(e)}),this)]}async styleSheetChanged(e){const t=this.#o.styleSheetHeaderForId(e.data.styleSheetId);if(!t||!t.isInline||t.isInline&&t.isMutable)return;const o=this.#t.get(t.resourceURL());o&&await o.styleSheetChanged(t,e.data.edit||null)}acceptsResource(e){const t=e.resourceType();return(t===Common.ResourceType.resourceTypes.Image||t===Common.ResourceType.resourceTypes.Font||t===Common.ResourceType.resourceTypes.Document||t===Common.ResourceType.resourceTypes.Manifest||t===Common.ResourceType.resourceTypes.Fetch||t===Common.ResourceType.resourceTypes.XHR)&&(!(t===Common.ResourceType.resourceTypes.Image&&e.mimeType&&!e.mimeType.startsWith("image"))&&(!(t===Common.ResourceType.resourceTypes.Font&&e.mimeType&&!e.mimeType.includes("font"))&&(t!==Common.ResourceType.resourceTypes.Image&&t!==Common.ResourceType.resourceTypes.Font||!e.contentURL().startsWith("data:"))))}resourceAdded(e){this.addResource(e.data)}addResource(e){if(!this.acceptsResource(e))return;let t=this.#t.get(e.url);t?t.addResource(e):(t=new Binding(this.project,e),this.#t.set(e.url,t))}removeFrameResources(e){for(const t of e.resources()){if(!this.acceptsResource(t))continue;const e=this.#t.get(t.url);e&&(1===e.resources.size?(e.dispose(),this.#t.delete(t.url)):e.removeResource(t))}}frameWillNavigate(e){this.removeFrameResources(e.data)}frameDetached(e){this.removeFrameResources(e.data.frame)}resetForTest(){for(const e of this.#t.values())e.dispose();this.#t.clear()}dispose(){Common.EventTarget.removeEventListeners(this.#r);for(const e of this.#t.values())e.dispose();this.#t.clear(),this.project.removeProject()}getProject(){return this.project}}class Binding{resources;#s;#n;#i;constructor(e,t){this.resources=new Set([t]),this.#s=e,this.#n=this.#s.createUISourceCode(t.url,t.contentType()),boundUISourceCodes.add(this.#n),t.frameId&&NetworkProject.setInitialFrameAttribution(this.#n,t.frameId),this.#s.addUISourceCodeWithProvider(this.#n,this,resourceMetadata(t),t.mimeType),this.#i=[],Promise.all([...this.inlineScripts().map((e=>DebuggerWorkspaceBinding.instance().updateLocations(e))),...this.inlineStyles().map((e=>CSSWorkspaceBinding.instance().updateLocations(e)))])}inlineStyles(){const e=NetworkProject.targetForUISourceCode(this.#n),t=[];if(!e)return t;const o=e.model(SDK.CSSModel.CSSModel);if(o)for(const e of o.getStyleSheetIdsForURL(this.#n.url())){const r=o.styleSheetHeaderForId(e);r&&t.push(r)}return t}inlineScripts(){const e=NetworkProject.targetForUISourceCode(this.#n);if(!e)return[];const t=e.model(SDK.DebuggerModel.DebuggerModel);return t?t.scripts().filter((e=>e.embedderName()===this.#n.url())):[]}async styleSheetChanged(e,t){if(this.#i.push({stylesheet:e,edit:t}),this.#i.length>1)return;const{content:o}=await this.#n.requestContent();null!==o&&await this.innerStyleSheetChanged(o),this.#i=[]}async innerStyleSheetChanged(e){const t=this.inlineScripts(),o=this.inlineStyles();let r=new TextUtils.Text.Text(e);for(const e of this.#i){const s=e.edit;if(!s)continue;const n=e.stylesheet,i=styleSheetRangeMap.get(n)??computeStyleSheetRange(n),c=s.oldRange.relativeFrom(i.startLine,i.startColumn),u=s.newRange.relativeFrom(i.startLine,i.startColumn);r=new TextUtils.Text.Text(r.replaceRange(c,s.newText));const a=[];for(const e of t){const t=scriptRangeMap.get(e)??computeScriptRange(e);t.follows(c)&&(scriptRangeMap.set(e,t.rebaseAfterTextEdit(c,u)),a.push(DebuggerWorkspaceBinding.instance().updateLocations(e)))}for(const e of o){const t=styleSheetRangeMap.get(e)??computeStyleSheetRange(e);t.follows(c)&&(styleSheetRangeMap.set(e,t.rebaseAfterTextEdit(c,u)),a.push(CSSWorkspaceBinding.instance().updateLocations(e)))}await Promise.all(a)}this.#n.addRevision(r.value())}addResource(e){this.resources.add(e),e.frameId&&NetworkProject.addFrameAttribution(this.#n,e.frameId)}removeResource(e){this.resources.delete(e),e.frameId&&NetworkProject.removeFrameAttribution(this.#n,e.frameId)}dispose(){this.#s.removeUISourceCode(this.#n.url()),Promise.all([...this.inlineScripts().map((e=>DebuggerWorkspaceBinding.instance().updateLocations(e))),...this.inlineStyles().map((e=>CSSWorkspaceBinding.instance().updateLocations(e)))])}firstResource(){return console.assert(this.resources.size>0),this.resources.values().next().value}contentURL(){return this.firstResource().contentURL()}contentType(){return this.firstResource().contentType()}requestContent(){return this.firstResource().requestContent()}searchInContent(e,t,o){return this.firstResource().searchInContent(e,t,o)}}