@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 7.24 kB
JavaScript
import*as TextUtils from"../../models/text_utils/text_utils.js";import*as Common from"../common/common.js";import*as i18n from"../i18n/i18n.js";import{Location,COND_BREAKPOINT_SOURCE_URL,LOGPOINT_SOURCE_URL,Events}from"./DebuggerModel.js";import{ResourceTreeModel}from"./ResourceTreeModel.js";const UIStrings={scriptRemovedOrDeleted:"Script removed or deleted.",unableToFetchScriptSource:"Unable to fetch script source."},str_=i18n.i18n.registerUIStrings("core/sdk/Script.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);let scriptCacheInstance=null;export class Script{debuggerModel;scriptId;sourceURL;lineOffset;columnOffset;endLine;endColumn;executionContextId;hash;#e;#t;sourceMapURL;debugSymbols;hasSourceURL;contentLength;originStackTrace;#n;#r;#s;#i;isModule;constructor(e,t,n,r,s,i,o,c,a,u,d,h,l,m,g,f,p,I,S,b){this.debuggerModel=e,this.scriptId=t,this.sourceURL=n,this.lineOffset=r,this.columnOffset=s,this.endLine=i,this.endColumn=o,this.isModule=g,this.executionContextId=c,this.hash=a,this.#e=u,this.#t=d,this.sourceMapURL=h,this.debugSymbols=S,this.hasSourceURL=l,this.contentLength=m,this.originStackTrace=f,this.#n=p,this.#r=I,this.#s=null,this.#i=b}embedderName(){return this.#i}target(){return this.debuggerModel.target()}static trimSourceURLComment(e){let t=e.lastIndexOf("//# sourceURL=");if(-1===t&&(t=e.lastIndexOf("//@ sourceURL="),-1===t))return e;const n=e.lastIndexOf("\n",t);if(-1===n)return e;return e.substr(n+1).match(sourceURLRegex)?e.substr(0,n):e}isContentScript(){return this.#e}codeOffset(){return this.#n}isJavaScript(){return"JavaScript"===this.#r}isWasm(){return"WebAssembly"===this.#r}scriptLanguage(){return this.#r}executionContext(){return this.debuggerModel.runtimeModel().executionContext(this.executionContextId)}isLiveEdit(){return this.#t}contentURL(){return this.sourceURL}contentType(){return Common.ResourceType.resourceTypes.Script}async loadTextContent(){const e=await this.debuggerModel.target().debuggerAgent().invoke_getScriptSource({scriptId:this.scriptId});if(e.getError())throw new Error(e.getError());const{scriptSource:t,bytecode:n}=e;if(n)return{content:n,isEncoded:!0};let r=t||"";return this.hasSourceURL&&this.sourceURL.startsWith("snippet://")&&(r=Script.trimSourceURLComment(r)),{content:r,isEncoded:!1}}async loadWasmContent(){if(!this.isWasm())throw new Error("Not a wasm script");const e=await this.debuggerModel.target().debuggerAgent().invoke_disassembleWasmModule({scriptId:this.scriptId});if(e.getError())return this.loadTextContent();const{streamId:t,functionBodyOffsets:n,chunk:{lines:r,bytecodeOffsets:s}}=e,i=[],o=[];let c=r.reduce(((e,t)=>e+t.length+1),0);const a="<truncated>";if(t)for(;;){const e=await this.debuggerModel.target().debuggerAgent().invoke_nextWasmDisassemblyChunk({streamId:t});if(e.getError())throw new Error(e.getError());const{chunk:{lines:n,bytecodeOffsets:r}}=e;if(c+=n.reduce(((e,t)=>e+t.length+1),0),0===n.length)break;if(c>=999999989){i.push([a]),o.push([0]);break}i.push(n),o.push(r)}const u=[];for(let e=0;e<n.length;e+=2)u.push({start:n[e],end:n[e+1]});return{content:"",isEncoded:!1,wasmDisassemblyInfo:new Common.WasmDisassembly.WasmDisassembly(r.concat(...i),s.concat(...o),u)}}requestContent(){if(!this.#s){const e=65535;if(this.hash&&!this.#t&&this.contentLength>e){scriptCacheInstance||(scriptCacheInstance={cache:new Map,registry:new FinalizationRegistry((e=>scriptCacheInstance?.cache.delete(e)))});const e=[this.#r,this.contentLength,this.lineOffset,this.columnOffset,this.endLine,this.endColumn,this.#n,this.hash].join(":"),t=scriptCacheInstance.cache.get(e)?.deref();t?this.#s=t:(this.#s=this.requestContentInternal(),scriptCacheInstance.cache.set(e,new WeakRef(this.#s)),scriptCacheInstance.registry.register(this.#s,e))}else this.#s=this.requestContentInternal()}return this.#s}async requestContentInternal(){if(!this.scriptId)return{content:null,error:i18nString(UIStrings.scriptRemovedOrDeleted),isEncoded:!1};try{return this.isWasm()?await this.loadWasmContent():await this.loadTextContent()}catch(e){return{content:null,error:i18nString(UIStrings.unableToFetchScriptSource),isEncoded:!1}}}async getWasmBytecode(){const e=await this.debuggerModel.target().debuggerAgent().invoke_getWasmBytecode({scriptId:this.scriptId});return(await fetch(`data:application/wasm;base64,${e.bytecode}`)).arrayBuffer()}originalContentProvider(){return new TextUtils.StaticContentProvider.StaticContentProvider(this.contentURL(),this.contentType(),(()=>this.requestContent()))}async searchInContent(e,t,n){if(!this.scriptId)return[];return((await this.debuggerModel.target().debuggerAgent().invoke_searchInContent({scriptId:this.scriptId,query:e,caseSensitive:t,isRegex:n})).result||[]).map((e=>new TextUtils.ContentProvider.SearchMatch(e.lineNumber,e.lineContent)))}appendSourceURLCommentIfNeeded(e){return this.hasSourceURL?e+"\n //# sourceURL="+this.sourceURL:e}async editSource(e){e=Script.trimSourceURLComment(e),e=this.appendSourceURLCommentIfNeeded(e);const{content:t}=await this.requestContent();if(t===e)return{changed:!1,status:"Ok"};const n=await this.debuggerModel.target().debuggerAgent().invoke_setScriptSource({scriptId:this.scriptId,scriptSource:e,allowTopFrameEditing:!0});if(n.getError())throw new Error(`Script#editSource failed for script with id ${this.scriptId}: ${n.getError()}`);return n.getError()||"Ok"!==n.status||(this.#s=Promise.resolve({content:e,isEncoded:!1})),this.debuggerModel.dispatchEventToListeners(Events.ScriptSourceWasEdited,{script:this,status:n.status}),{changed:!0,status:n.status,exceptionDetails:n.exceptionDetails}}rawLocation(e,t){return this.containsLocation(e,t)?new Location(this.debuggerModel,this.scriptId,e,t):null}isInlineScript(){const e=!this.lineOffset&&!this.columnOffset;return!this.isWasm()&&Boolean(this.sourceURL)&&!e}isAnonymousScript(){return!this.sourceURL}async setBlackboxedRanges(e){return!(await this.debuggerModel.target().debuggerAgent().invoke_setBlackboxedRanges({scriptId:this.scriptId,positions:e})).getError()}containsLocation(e,t){const n=e===this.lineOffset&&t>=this.columnOffset||e>this.lineOffset,r=e<this.endLine||e===this.endLine&&t<=this.endColumn;return n&&r}get frameId(){return"string"!=typeof this[frameIdSymbol]&&(this[frameIdSymbol]=frameIdForScript(this)),this[frameIdSymbol]}get isBreakpointCondition(){return[COND_BREAKPOINT_SOURCE_URL,LOGPOINT_SOURCE_URL].includes(this.sourceURL)}createPageResourceLoadInitiator(){return{target:this.target(),frameId:this.frameId,initiatorUrl:this.embedderName()}}rawLocationToRelativeLocation(e){let{lineNumber:t,columnNumber:n}=e;return!this.hasSourceURL&&this.isInlineScript()&&(t-=this.lineOffset,0===t&&void 0!==n&&(n-=this.columnOffset)),{lineNumber:t,columnNumber:n}}relativeLocationToRawLocation(e){let{lineNumber:t,columnNumber:n}=e;return!this.hasSourceURL&&this.isInlineScript()&&(0===t&&void 0!==n&&(n+=this.columnOffset),t+=this.lineOffset),{lineNumber:t,columnNumber:n}}}const frameIdSymbol=Symbol("frameid");function frameIdForScript(e){const t=e.executionContext();if(t)return t.frameId||null;const n=e.debuggerModel.target().model(ResourceTreeModel);return n&&n.mainFrame?n.mainFrame.id:null}export const sourceURLRegex=/^[\040\t]*\/\/[@#] sourceURL=\s*(\S*?)\s*$/;