UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 7.86 kB
import*as Common from"../../core/common/common.js";import*as Host from"../../core/host/host.js";import*as Platform from"../../core/platform/platform.js";import*as TextUtils from"../text_utils/text_utils.js";import*as Workspace from"../workspace/workspace.js";import{Events}from"./IsolatedFileSystemManager.js";export class FileSystemWorkspaceBinding{isolatedFileSystemManager;workspace;eventListeners;boundFileSystems;constructor(e,t){this.isolatedFileSystemManager=e,this.workspace=t,this.eventListeners=[this.isolatedFileSystemManager.addEventListener(Events.FileSystemAdded,this.onFileSystemAdded,this),this.isolatedFileSystemManager.addEventListener(Events.FileSystemRemoved,this.onFileSystemRemoved,this),this.isolatedFileSystemManager.addEventListener(Events.FileSystemFilesChanged,this.fileSystemFilesChanged,this)],this.boundFileSystems=new Map,this.isolatedFileSystemManager.waitForFileSystems().then(this.onFileSystemsLoaded.bind(this))}static projectId(e){return e}static relativePath(e){const t=e.project().fileSystemBaseURL;return Common.ParsedURL.ParsedURL.split(Common.ParsedURL.ParsedURL.sliceUrlToEncodedPathString(e.url(),t.length),"/")}static tooltipForUISourceCode(e){return e.project().fileSystemInternal.tooltipForURL(e.url())}static fileSystemType(e){return e.fileSystemInternal.type()}static fileSystemSupportsAutomapping(e){return e.fileSystemInternal.supportsAutomapping()}static completeURL(e,t){const s=e;return Common.ParsedURL.ParsedURL.concatenate(s.fileSystemBaseURL,t)}static fileSystemPath(e){return e}fileSystemManager(){return this.isolatedFileSystemManager}onFileSystemsLoaded(e){for(const t of e)this.addFileSystem(t)}onFileSystemAdded(e){const t=e.data;this.addFileSystem(t)}addFileSystem(e){const t=new FileSystem(this,e,this.workspace);this.boundFileSystems.set(e.path(),t)}onFileSystemRemoved(e){const t=e.data,s=this.boundFileSystems.get(t.path());s&&s.dispose(),this.boundFileSystems.delete(t.path())}fileSystemFilesChanged(e){const t=e.data;for(const e of t.changed.keysArray()){const s=this.boundFileSystems.get(e);s&&t.changed.get(e).forEach((e=>s.fileChanged(e)))}for(const e of t.added.keysArray()){const s=this.boundFileSystems.get(e);s&&t.added.get(e).forEach((e=>s.fileChanged(e)))}for(const e of t.removed.keysArray()){const s=this.boundFileSystems.get(e);s&&t.removed.get(e).forEach((e=>s.removeUISourceCode(e)))}}dispose(){Common.EventTarget.removeEventListeners(this.eventListeners);for(const e of this.boundFileSystems.values())e.dispose(),this.boundFileSystems.delete(e.fileSystemInternal.path())}}export class FileSystem extends Workspace.Workspace.ProjectStore{fileSystemInternal;fileSystemBaseURL;fileSystemParentURL;fileSystemWorkspaceBinding;fileSystemPathInternal;creatingFilesGuard;constructor(e,t,s){const r=t.path(),n=FileSystemWorkspaceBinding.projectId(r);console.assert(!s.project(n));const i=r.substr(r.lastIndexOf("/")+1);super(s,n,Workspace.Workspace.projectTypes.FileSystem,i),this.fileSystemInternal=t,this.fileSystemBaseURL=Common.ParsedURL.ParsedURL.concatenate(this.fileSystemInternal.path(),"/"),this.fileSystemParentURL=Common.ParsedURL.ParsedURL.substr(this.fileSystemBaseURL,0,r.lastIndexOf("/")+1),this.fileSystemWorkspaceBinding=e,this.fileSystemPathInternal=r,this.creatingFilesGuard=new Set,s.addProject(this),this.populate()}fileSystemPath(){return this.fileSystemPathInternal}fileSystem(){return this.fileSystemInternal}mimeType(e){return this.fileSystemInternal.mimeFromPath(e.url())}initialGitFolders(){return this.fileSystemInternal.initialGitFolders().map((e=>Common.ParsedURL.ParsedURL.concatenate(this.fileSystemPathInternal,"/",e)))}filePathForUISourceCode(e){return Common.ParsedURL.ParsedURL.sliceUrlToEncodedPathString(e.url(),this.fileSystemPathInternal.length)}isServiceProject(){return!1}requestMetadata(e){const t=sourceCodeToMetadataMap.get(e);if(t)return t;const s=this.filePathForUISourceCode(e),r=this.fileSystemInternal.getMetadata(s).then((function(e){if(!e)return null;return new Workspace.UISourceCode.UISourceCodeMetadata(e.modificationTime,e.size)}));return sourceCodeToMetadataMap.set(e,r),r}requestFileBlob(e){return this.fileSystemInternal.requestFileBlob(this.filePathForUISourceCode(e))}requestFileContent(e){const t=this.filePathForUISourceCode(e);return this.fileSystemInternal.requestFileContent(t)}canSetFileContent(){return!0}async setFileContent(e,t,s){const r=this.filePathForUISourceCode(e);await this.fileSystemInternal.setFileContent(r,t,s)}fullDisplayName(e){const t=e.project().fileSystemParentURL;return e.url().substring(t.length)}canRename(){return!0}rename(e,t,s){if(t===e.name())return void s(!0,e.name(),e.url(),e.contentType());let r=this.filePathForUISourceCode(e);this.fileSystemInternal.renameFile(r,t,function(t,n){if(!t||!n)return void s(!1,n);console.assert(Boolean(n));const i=r.lastIndexOf("/"),o=Common.ParsedURL.ParsedURL.substr(r,0,i);r=Common.ParsedURL.ParsedURL.encodedFromParentPathAndName(o,n),r=Common.ParsedURL.ParsedURL.substr(r,1);const a=Common.ParsedURL.ParsedURL.concatenate(this.fileSystemBaseURL,r),l=this.fileSystemInternal.contentType(n);this.renameUISourceCode(e,n),s(!0,n,a,l)}.bind(this))}async searchInFileContent(e,t,s,r){const n=this.filePathForUISourceCode(e),{content:i}=await this.fileSystemInternal.requestFileContent(n);return i?TextUtils.TextUtils.performSearchInContent(i,t,s,r):[]}async findFilesMatchingSearchRequest(e,t,s){let r=t.map((e=>e.url()));const n=e.queries().slice();n.length||n.push(""),s.setTotalWork(n.length);for(const t of n){const n=await this.fileSystemInternal.searchInPath(e.isRegex()?"":t,s);n.sort(Platform.StringUtilities.naturalOrderComparator),r=Platform.ArrayUtilities.intersectOrdered(r,n,Platform.StringUtilities.naturalOrderComparator),s.incrementWorked(1)}const i=[];for(const e of r){const t=this.uiSourceCodeForURL(e);t&&i.push(t)}return s.done(),i}indexContent(e){this.fileSystemInternal.indexContent(e)}populate(){const e=this.fileSystemInternal.initialFilePaths();if(0===e.length)return;const t=performance.now();(function s(r){const n=Math.min(r+1e3,e.length);for(let t=r;t<n;++t)this.addFile(e[t]);n<e.length?window.setTimeout(s.bind(this,n),100):"filesystem"===this.type()&&Host.userMetrics.workspacesPopulated(performance.now()-t)}).call(this,0)}excludeFolder(e){let t=Common.ParsedURL.ParsedURL.sliceUrlToEncodedPathString(e,this.fileSystemBaseURL.length);t.startsWith("/")||(t=Common.ParsedURL.ParsedURL.prepend("/",t)),t.endsWith("/")||(t=Common.ParsedURL.ParsedURL.concatenate(t,"/")),this.fileSystemInternal.addExcludedFolder(t);for(const t of this.uiSourceCodes())t.url().startsWith(e)&&this.removeUISourceCode(t.url())}canExcludeFolder(e){return this.fileSystemInternal.canExcludeFolder(e)}canCreateFile(){return!0}async createFile(e,t,s,r){const n=this.fileSystemPathInternal+e+(e.endsWith("/")?"":"/")+t;this.creatingFilesGuard.add(n);const i=await this.fileSystemInternal.createFile(e,t);if(!i)return null;const o=this.addFile(i);return o.setContent(s,Boolean(r)),this.creatingFilesGuard.delete(n),o}deleteFile(e){const t=this.filePathForUISourceCode(e);this.fileSystemInternal.deleteFile(t).then((t=>{t&&this.removeUISourceCode(e.url())}))}remove(){this.fileSystemWorkspaceBinding.isolatedFileSystemManager.removeFileSystem(this.fileSystemInternal)}addFile(e){const t=this.fileSystemInternal.contentType(e),s=this.createUISourceCode(Common.ParsedURL.ParsedURL.concatenate(this.fileSystemBaseURL,e),t);return this.addUISourceCode(s),s}fileChanged(e){if(this.creatingFilesGuard.has(e))return;const t=this.uiSourceCodeForURL(e);if(t)sourceCodeToMetadataMap.delete(t),t.checkContentUpdated();else{const t=this.fileSystemInternal.contentType(e);this.addUISourceCode(this.createUISourceCode(e,t))}}tooltipForURL(e){return this.fileSystemInternal.tooltipForURL(e)}dispose(){this.removeProject()}}const sourceCodeToMetadataMap=new WeakMap;