Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/core/src/features/virtual-drive/folder/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from "./virtualFolder";
export * from "./virtualFolderLink";
export * from "./virtualFolderLink";
export * from "./virtualLazyFolder";
14 changes: 14 additions & 0 deletions packages/core/src/features/virtual-drive/folder/virtualFolder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,10 @@ export class VirtualFolder<E extends VirtualBaseEvents = VirtualBaseEvents> exte
this.confirmChanges();
}

async loadContent(): Promise<void> {
return Promise.resolve()
}

/**
* Returns all files inside this folder.
* @param showHidden - Whether to include hidden files.
Expand All @@ -383,6 +387,11 @@ export class VirtualFolder<E extends VirtualBaseEvents = VirtualBaseEvents> exte
);
}

async getFilesAsync(showHidden = false): Promise<VirtualFile[]> {
await this.loadContent();
return this.getFiles(showHidden);
}

/**
* Returns all sub-folders inside this folder.
* @param showHidden - Whether to include hidden folders.
Expand All @@ -396,6 +405,11 @@ export class VirtualFolder<E extends VirtualBaseEvents = VirtualBaseEvents> exte
);
}

async getSubFoldersAsync(showHidden = false): Promise<VirtualFolder[]> {
await this.loadContent();
return this.getSubFolders(showHidden);
}

/**
* Returns the amount of files and sub-folders inside this folder.
* @param includeHidden - Whether to include hidden files and folders in the count.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { VirtualBase, VirtualBaseEvents } from "../virtualBase";
import { VirtualFile } from "../file";
import { VirtualFolder } from "./virtualFolder";

export class VirtualLazyFolder<E extends VirtualBaseEvents = VirtualBaseEvents> extends VirtualFolder<E> {
private hasPopulated = false;
private content: Promise<void> = Promise.resolve()

constructor(name: string, type?: number) {
super(name, type);
}

/**
* Override this method to populate the folder with files and sub-folders.
* Called once, the first time the folder's contents are requested.
*/
onPopulate(): Promise<void> {
return Promise.resolve();
}

loadContent(): Promise<void> {
if (this.hasPopulated) {
return this.content
}

this.hasPopulated = true
this.content = this.onPopulate().then(() => {
this.emit(VirtualBase.UPDATE_EVENT);
});

return this.content
}

getFiles(showHidden = false): VirtualFile[] {
this.loadContent();
return super.getFiles(showHidden);
}

getSubFolders(showHidden = false): VirtualFolder[] {
this.loadContent();
return super.getSubFolders(showHidden);
}
}
26 changes: 25 additions & 1 deletion packages/core/test/features/virtual-drive/virtualDrive.utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SystemManager, VirtualBase, VirtualFile, VirtualFolder, VirtualRoot } from "../../../src/features";
import { SystemManager, VirtualBase, VirtualFile, VirtualFolder, VirtualRoot, VirtualLazyFolder } from "../../../src/features";

export class MockVirtualFile extends VirtualFile {

Expand Down Expand Up @@ -31,4 +31,28 @@ export class MockVirtualRoot extends VirtualRoot {
this.init();
}

}

export class MockVirtualLazyFolder extends VirtualLazyFolder {
private resolve!: () => void;
readonly populated: Promise<void>;
private onPopulateCallback: (Folder: MockVirtualLazyFolder) => void

constructor(name: string, onPopulateCallback: (Folder: MockVirtualLazyFolder) => void = () => {}) {
super(name);
this.onPopulateCallback = onPopulateCallback
this.populated = new Promise((resolve) => {
this.resolve = resolve;
});
}

override onPopulate(): Promise<void> {
return this.populated.then(() =>{
this.onPopulateCallback(this)
})
}

completePopulation() {
this.resolve();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { test as base, expect } from "vitest";
import { extend } from "@prozilla-os/dev-tools";
import { VirtualLazyFolder } from "../../../dist/main";

Check warning on line 3 in packages/core/test/features/virtual-drive/virtualLazyFolder.test.ts

View workflow job for this annotation

GitHub Actions / Run unit tests

'VirtualLazyFolder' is defined but never used. Allowed unused vars must match /^_/u
import { MockVirtualFile, MockVirtualLazyFolder } from "./virtualDrive.utils";
import { beforeEach } from "vitest";

const test = extend(base)

let mockVirtualLazyFolder: MockVirtualLazyFolder;

beforeEach(() => {
mockVirtualLazyFolder = new MockVirtualLazyFolder("foo", (f) => {
f.addFile(new MockVirtualFile("test", "txt"));
});
});

test("getFilesAsync()", async () => {
const mockFilesPromise = mockVirtualLazyFolder.getFilesAsync();
expect(mockVirtualLazyFolder.getFiles()).toStrictEqual([]);

mockVirtualLazyFolder.completePopulation();
const mockFiles = await mockFilesPromise;
expect(mockFiles).toHaveLength(1)
});

test("onPopulate", async () => {
const mockPromise1 = mockVirtualLazyFolder.loadContent()
const mockPromise2 = mockVirtualLazyFolder.loadContent()
expect(mockPromise1).toBe(mockPromise2);
});
Loading