@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 9.65 kB
JavaScript
import*as TextUtils from"../../models/text_utils/text_utils.js";import*as Common from"../common/common.js";import*as Platform from"../platform/platform.js";import*as Root from"../root/root.js";export function parseSourceMap(e){return e.startsWith(")]}")&&(e=e.substring(e.indexOf("\n"))),65279===e.charCodeAt(0)&&(e=e.slice(1)),JSON.parse(e)}export class SourceMapEntry{lineNumber;columnNumber;sourceURL;sourceLineNumber;sourceColumnNumber;name;constructor(e,n,t,r,s,o){this.lineNumber=e,this.columnNumber=n,this.sourceURL=t,this.sourceLineNumber=r,this.sourceColumnNumber=s,this.name=o}static compare(e,n){return e.lineNumber!==n.lineNumber?e.lineNumber-n.lineNumber:e.columnNumber-n.columnNumber}}function comparePositions(e,n){return e.lineNumber-n.lineNumber||e.columnNumber-n.columnNumber}class ScopeTreeEntry{startLineNumber;startColumnNumber;endLineNumber;endColumnNumber;name;children=[];constructor(e,n,t,r,s){this.startLineNumber=e,this.startColumnNumber=n,this.endLineNumber=t,this.endColumnNumber=r,this.name=s}scopeName(){return this.name}start(){return{lineNumber:this.startLineNumber,columnNumber:this.startColumnNumber}}end(){return{lineNumber:this.endLineNumber,columnNumber:this.endColumnNumber}}}const base64Digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",base64Map=new Map;for(let e=0;e<64;++e)base64Map.set(base64Digits.charAt(e),e);const sourceMapToSourceList=new WeakMap;export class SourceMap{#e;#n;#t;#r;#s;#o;constructor(e,n,t){this.#e=t,this.#n=e,this.#t=n,this.#r=n.startsWith("data:")?e:n,this.#s=null,this.#o=new Map,"sections"in this.#e&&this.#e.sections.find((e=>"url"in e))&&Common.Console.Console.instance().warn(`SourceMap "${n}" contains unsupported "URL" field in one of its sections.`),this.eachSection(this.parseSources.bind(this))}compiledURL(){return this.#n}url(){return this.#t}sourceURLs(){return[...this.#o.keys()]}embeddedContentByURL(e){const n=this.#o.get(e);return n?n.content:null}findEntry(e,n){const t=this.mappings(),r=Platform.ArrayUtilities.upperBound(t,void 0,((t,r)=>e-r.lineNumber||n-r.columnNumber));return r?t[r-1]:null}findEntryRanges(e,n){const t=this.mappings(),r=Platform.ArrayUtilities.upperBound(t,void 0,((t,r)=>e-r.lineNumber||n-r.columnNumber));if(!r)return null;const s=r-1,o=t[s].sourceURL;if(!o)return null;const i=r<t.length?t[r].lineNumber:2**31-1,u=r<t.length?t[r].columnNumber:2**31-1,c=new TextUtils.TextRange.TextRange(t[s].lineNumber,t[s].columnNumber,i,u),a=this.reversedMappings(o),m=t[s].sourceLineNumber,l=t[s].sourceColumnNumber,p=Platform.ArrayUtilities.upperBound(a,void 0,((e,n)=>m-t[n].sourceLineNumber||l-t[n].sourceColumnNumber));if(!p)return null;const h=p<a.length?t[a[p]].sourceLineNumber:2**31-1,g=p<a.length?t[a[p]].sourceColumnNumber:2**31-1;return{range:c,sourceRange:new TextUtils.TextRange.TextRange(m,l,h,g),sourceURL:o}}sourceLineMapping(e,n,t){const r=this.mappings(),s=this.reversedMappings(e),o=Platform.ArrayUtilities.lowerBound(s,n,a),i=Platform.ArrayUtilities.upperBound(s,n,a);if(o>=s.length||r[s[o]].sourceLineNumber!==n)return null;const u=s.slice(o,i);if(!u.length)return null;const c=Platform.ArrayUtilities.lowerBound(u,t,((e,n)=>e-r[n].sourceColumnNumber));return c>=u.length?r[u[u.length-1]]:r[u[c]];function a(e,n){return e-r[n].sourceLineNumber}}findReverseIndices(e,n,t){const r=this.mappings(),s=this.reversedMappings(e),o=Platform.ArrayUtilities.upperBound(s,void 0,((e,s)=>n-r[s].sourceLineNumber||t-r[s].sourceColumnNumber));let i=o;for(;i>0&&r[s[i-1]].sourceLineNumber===r[s[o-1]].sourceLineNumber&&r[s[i-1]].sourceColumnNumber===r[s[o-1]].sourceColumnNumber;)--i;return s.slice(i,o)}findReverseEntries(e,n,t){const r=this.mappings();return this.findReverseIndices(e,n,t).map((e=>r[e]))}findReverseRanges(e,n,t){const r=this.mappings(),s=this.findReverseIndices(e,n,t),o=[];for(let e=0;e<s.length;++e){const n=s[e];let t=n+1;for(;e+1<s.length&&t===s[e+1];)++t,++e;const i=r[n].lineNumber,u=r[n].columnNumber,c=t<r.length?r[t].lineNumber:2**31-1,a=t<r.length?r[t].columnNumber:2**31-1;o.push(new TextUtils.TextRange.TextRange(i,u,c,a))}return o}mappings(){return this.#i(),this.#s??[]}reversedMappings(e){return this.#i(),this.#o.get(e)?.reverseMappings??[]}#i(){null===this.#s&&(this.#s=[],this.eachSection(this.parseMap.bind(this)),this.mappings().sort(SourceMapEntry.compare),this.#u(this.#s),this.#e=null)}#u(e){const n=new Map;for(let t=0;t<e.length;t++){const r=e[t].sourceURL;if(!r)continue;let s=n.get(r);s||(s=[],n.set(r,s)),s.push(t)}for(const[e,r]of n.entries()){const n=this.#o.get(e);n&&(r.sort(t),n.reverseMappings=r)}function t(n,t){const r=e[n],s=e[t];return r.sourceLineNumber-s.sourceLineNumber||r.sourceColumnNumber-s.sourceColumnNumber||r.lineNumber-s.lineNumber||r.columnNumber-s.columnNumber}}eachSection(e){if(this.#e)if("sections"in this.#e)for(const n of this.#e.sections)"map"in n&&e(n.map,n.offset.line,n.offset.column);else e(this.#e,0,0)}parseSources(e){const n=[],t=e.sourceRoot??"",r=new Set(e.x_google_ignoreList);for(let s=0;s<e.sources.length;++s){let o=e.sources[s];Common.ParsedURL.ParsedURL.isRelativeURL(o)&&(o=t&&!t.endsWith("/")&&o&&!o.startsWith("/")?t.concat("/",o):t.concat(o));const i=Common.ParsedURL.ParsedURL.completeURL(this.#r,o)||o,u=e.sourcesContent&&e.sourcesContent[s];if(n.push(i),!this.#o.has(i)){const e=u??null,n=r.has(s);this.#o.set(i,{content:e,ignoreListHint:n,reverseMappings:null,scopeTree:null})}}sourceMapToSourceList.set(e,n)}parseMap(e,n,t){let r=0,s=0,o=0,i=0;const u=sourceMapToSourceList.get(e),c=e.names??[],a=new SourceMap.StringCharIterator(e.mappings);let m=u&&u[r];for(;;){if(","===a.peek())a.next();else{for(;";"===a.peek();)n+=1,t=0,a.next();if(!a.hasNext())break}if(t+=this.decodeVLQ(a),!a.hasNext()||this.isSeparator(a.peek())){this.mappings().push(new SourceMapEntry(n,t));continue}const e=this.decodeVLQ(a);e&&(r+=e,u&&(m=u[r])),s+=this.decodeVLQ(a),o+=this.decodeVLQ(a),a.hasNext()&&!this.isSeparator(a.peek())?(i+=this.decodeVLQ(a),this.mappings().push(new SourceMapEntry(n,t,m,s,o,c[i]))):this.mappings().push(new SourceMapEntry(n,t,m,s,o))}Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.USE_SOURCE_MAP_SCOPES)&&this.parseScopes(e)}parseScopes(e){if(!e.x_com_bloomberg_sourcesFunctionMappings)return;const n=sourceMapToSourceList.get(e);if(!n)return;const t=e.names??[],r=e.x_com_bloomberg_sourcesFunctionMappings;for(let e=0;e<n?.length;e++){if(!r[e]||!n[e])continue;const s=this.#o.get(n[e]);if(!s)continue;const o=r[e];let i=0,u=0,c=0,a=0,m=0;const l=new SourceMap.StringCharIterator(o),p=[];let h=!0;for(;l.hasNext();){if(h)h=!1;else{if(","!==l.peek())return;l.next()}i+=this.decodeVLQ(l),u+=this.decodeVLQ(l),c+=this.decodeVLQ(l),a+=this.decodeVLQ(l),m+=this.decodeVLQ(l),p.push(new ScopeTreeEntry(u,c,a,m,t[i]??"<invalid>"))}s.scopeTree=this.buildScopeTree(p)}}buildScopeTree(e){const n=[];e.sort(((e,n)=>comparePositions(e.start(),n.start())));const t=[];for(const r of e){const e=r.start();for(;t.length>0;){if(!(comparePositions(t[t.length-1].end(),e)<0))break;t.pop()}t.length>0?t[t.length-1].children.push(r):n.push(r),t.push(r)}return n}findScopeEntry(e,n,t){const r=this.#o.get(e);if(!r||!r.scopeTree)return null;const s={lineNumber:n,columnNumber:t};let o=null;for(;;){const e=(o?.children??r.scopeTree).find((e=>comparePositions(e.start(),s)<=0&&comparePositions(s,e.end())<=0));if(!e)return o;o=e}}isSeparator(e){return","===e||";"===e}decodeVLQ(e){let n=0,t=0,r=SourceMap._VLQ_CONTINUATION_MASK;for(;r&SourceMap._VLQ_CONTINUATION_MASK;)r=base64Map.get(e.next())||0,n+=(r&SourceMap._VLQ_BASE_MASK)<<t,t+=SourceMap._VLQ_BASE_SHIFT;const s=1&n;return n>>=1,s?-n:n}reverseMapTextRanges(e,n){const t=this.reversedMappings(e),r=this.mappings();if(0===t.length)return[];let s=Platform.ArrayUtilities.lowerBound(t,n,(({startLine:e,startColumn:n},t)=>{const{sourceLineNumber:s,sourceColumnNumber:o}=r[t];return e-s||n-o}));for(;s===t.length||s>0&&(r[t[s]].sourceLineNumber>n.startLine||r[t[s]].sourceColumnNumber>n.startColumn);)s--;let o=s+1;for(;o<t.length;++o){const{sourceLineNumber:e,sourceColumnNumber:s}=r[t[o]];if(!(e<n.endLine||e===n.endLine&&s<n.endColumn))break}const i=[];for(let e=s;e<o;++e){const n=t[e],s=n+1,o=TextUtils.TextRange.TextRange.createUnboundedFromLocation(r[n].lineNumber,r[n].columnNumber);s<r.length&&(o.endLine=r[s].lineNumber,o.endColumn=r[s].columnNumber),i.push(o)}i.sort(TextUtils.TextRange.TextRange.comparator);let u=0;for(let e=1;e<i.length;++e)i[u].immediatelyPrecedes(i[e])?(i[u].endLine=i[e].endLine,i[u].endColumn=i[e].endColumn):i[++u]=i[e];return i.length=u+1,i}mapsOrigin(){const e=this.mappings();if(e.length>0){const n=e[0];return 0===n?.lineNumber||0===n.columnNumber}return!1}hasIgnoreListHint(e){return this.#o.get(e)?.ignoreListHint??!1}findRanges(e,n){const t=this.mappings(),r=[];if(!t.length)return[];let s=null;0===t[0].lineNumber&&0===t[0].columnNumber||!n?.isStartMatching||(s=TextUtils.TextRange.TextRange.createUnboundedFromLocation(0,0),r.push(s));for(const{sourceURL:n,lineNumber:o,columnNumber:i}of t){const t=n&&e(n);s||!t?s&&!t&&(s.endLine=o,s.endColumn=i,s=null):(s=TextUtils.TextRange.TextRange.createUnboundedFromLocation(o,i),r.push(s))}return r}compatibleForURL(e,n){return this.embeddedContentByURL(e)===n.embeddedContentByURL(e)&&this.hasIgnoreListHint(e)===n.hasIgnoreListHint(e)}}!function(e){e._VLQ_BASE_SHIFT=5,e._VLQ_BASE_MASK=31,e._VLQ_CONTINUATION_MASK=32;e.StringCharIterator=class{string;position;constructor(e){this.string=e,this.position=0}next(){return this.string.charAt(this.position++)}peek(){return this.string.charAt(this.position)}hasNext(){return this.position<this.string.length}}}(SourceMap||(SourceMap={}));