Sorry this took a while.
Over the weekend I played around with the NodeJS API to implement this approach for empty folders in NFS.
Here’s some brief context about the NFS implementation:
An NFS container is a mutable data that stores a list of entries where the key is the file name and the value is the location(dataMap) of a file which is stored as immutable data.
Since this container is a mutable data, we can perform general MData operations on it too. So, for an empty folder, we create a new mutable data instance, serialize it and store it as an entry with the folder name as key and the serialized instance as the value.
We can code the application to handle files and folders differently
Here’s a snippet using the NodeJS API:
// Initialize mutable data
const typeTag = 15000;
md = await safeApp.mutableData.newRandomPublic(typeTag);
await md.quickSetup({});
// Emulate root folder as NFS and insert a file
const nfs = await md.emulateAs('NFS');
const content = '<html><body><h1>WebSite</h1></body></html>';
const fileName = 'page1.html';
const fileContext = await nfs.create(content);
await nfs.insert(fileName, fileContext);
// Initialize new mutable data. This will be an empty sub-folder
let newMd = await safeApp.mutableData.newRandomPublic(typeTag);
await newMd.quickSetup({});
// Serialize the sub-folder info and store it in the root folder
const folderName = "page2";
const serialisedMD = await newMd.serialise();
const mutation = await safeApp.mutableData.newMutation();
await mutation.insert(folderName, serialisedMD);
await md.applyEntriesMutation(mutation);
// Fetch the sub-folder info and deserialize it to get the md object
const entries = await md.getEntries();
const value = await entries.get('page2');
const emptyFolderMd = await safeApp.mutableData.fromSerial(value.buf);
// Emulate the folder as NFS and add a file
const cssFolder = await emptyFolderMd.emulateAs('NFS');
const newFile = await nfs.create(content);
await cssFolder.insert('page2.html', newFile);
// Print the XOR URLs to view them in the MData viewer
const rootInfo = await md.getNameAndTag();
console.log("Root folder: " + rootInfo.xorUrl);
const cssFolderInfo = await newMd.getNameAndTag();
console.log("CSS folder info: " + cssFolderInfo.xorUrl);
I hope this helps!