feat: expose plugin data storage bridge

This commit is contained in:
mirivlad 2026-06-29 04:27:22 +08:00
parent 874b7c7ffb
commit 7363313f1e
3 changed files with 56 additions and 2 deletions

View File

@ -232,6 +232,31 @@ export function createPluginAPI(pluginId) {
} }
}, },
storage: {
data: {
read: function(name) {
assertActive('storage.data.read(' + name + ')');
if (!name) {
throw new Error('storage.data.read requires a name');
}
return callBackend(pluginId, 'storage.data.read(' + name + ')', function() {
return App.ReadPluginDataJSON(pluginId, name);
}).then(function(data) {
return data || {};
});
},
write: function(name, data) {
assertActive('storage.data.write(' + name + ')');
if (!name) {
throw new Error('storage.data.write requires a name');
}
return callBackendErrorString(pluginId, 'storage.data.write(' + name + ')', function() {
return App.WritePluginDataJSON(pluginId, name, data || {});
});
}
}
},
files: { files: {
list: function(relativeDir) { list: function(relativeDir) {
assertActive('files.list'); assertActive('files.list');

View File

@ -216,6 +216,7 @@
var pluginSettings = { var pluginSettings = {
'verstak.platform-test': { savedText: 'initial value' } 'verstak.platform-test': { savedText: 'initial value' }
}; };
var pluginData = {};
var vaultFiles = makeDefaultVaultFiles(); var vaultFiles = makeDefaultVaultFiles();
var externalOpens = []; var externalOpens = [];
var trashEntries = []; var trashEntries = [];
@ -1120,8 +1121,15 @@
}, },
ReadPluginSetting: function () { return Promise.resolve(null); }, ReadPluginSetting: function () { return Promise.resolve(null); },
WritePluginSetting: function () { return Promise.resolve(null); }, WritePluginSetting: function () { return Promise.resolve(null); },
ReadPluginDataJSON: function () { return Promise.resolve({}); }, ReadPluginDataJSON: function (pluginId, name) {
WritePluginDataJSON: function () { return Promise.resolve(null); }, var data = (pluginData[pluginId] && pluginData[pluginId][name]) || {};
return Promise.resolve([Object.assign({}, data), '']);
},
WritePluginDataJSON: function (pluginId, name, data) {
pluginData[pluginId] = pluginData[pluginId] || {};
pluginData[pluginId][name] = Object.assign({}, data || {});
return Promise.resolve('');
},
OpenWorkbenchResource: function (pluginId, request) { OpenWorkbenchResource: function (pluginId, request) {
return openWorkbenchResource(pluginId, request || {}, ''); return openWorkbenchResource(pluginId, request || {}, '');
}, },

View File

@ -2,6 +2,8 @@ import fs from 'node:fs';
import path from 'node:path'; import path from 'node:path';
import { pathToFileURL } from 'node:url'; import { pathToFileURL } from 'node:url';
const pluginData = {};
globalThis.window = { globalThis.window = {
__VERSTAK_PLUGIN_REGISTRY__: {}, __VERSTAK_PLUGIN_REGISTRY__: {},
__VERSTAK_EVENT_HANDLERS__: {}, __VERSTAK_EVENT_HANDLERS__: {},
@ -27,6 +29,15 @@ globalThis.window = {
commandId, commandId,
args, args,
}, '']), }, '']),
ReadPluginDataJSON: (pluginId, name) => Promise.resolve([
Object.assign({}, (pluginData[pluginId] && pluginData[pluginId][name]) || {}),
'',
]),
WritePluginDataJSON: (pluginId, name, data) => {
pluginData[pluginId] = pluginData[pluginId] || {};
pluginData[pluginId][name] = Object.assign({}, data || {});
return Promise.resolve('');
},
}, },
}, },
}, },
@ -67,4 +78,14 @@ if (result.status !== 'handled' || result.result.handledPath !== 'Project/Docs/r
throw new Error(`unexpected executeFor result: ${JSON.stringify(result)}`); throw new Error(`unexpected executeFor result: ${JSON.stringify(result)}`);
} }
if (!api.storage || !api.storage.data || typeof api.storage.data.read !== 'function' || typeof api.storage.data.write !== 'function') {
throw new Error('api.storage.data read/write is missing');
}
await api.storage.data.write('search-index', { version: 1, workspaceRootPath: 'Project' });
const stored = await api.storage.data.read('search-index');
if (stored.version !== 1 || stored.workspaceRootPath !== 'Project') {
throw new Error(`unexpected storage data: ${JSON.stringify(stored)}`);
}
console.log('plugin api contributions smoke passed'); console.log('plugin api contributions smoke passed');