feat: expose file byte read API
This commit is contained in:
parent
64168054ac
commit
ef959d6018
|
|
@ -13,14 +13,15 @@ for that host-provided object:
|
||||||
- `commands.register/execute/executeFor`
|
- `commands.register/execute/executeFor`
|
||||||
- `contributions.list`
|
- `contributions.list`
|
||||||
- `events.publish/subscribe`
|
- `events.publish/subscribe`
|
||||||
- `files.list/metadata/readText/writeText/createFolder/move/trash/listTrash/restoreTrash`
|
- `files.list/metadata/readText/readBytes/writeText/createFolder/move/trash/listTrash/restoreTrash`
|
||||||
- `workbench.openResource/editResource`
|
- `workbench.openResource/editResource`
|
||||||
- optional `dispose`
|
- optional `dispose`
|
||||||
|
|
||||||
Files paths are canonical vault-relative slash paths. Backslashes, Windows/UNC
|
Files paths are canonical vault-relative slash paths. Backslashes, Windows/UNC
|
||||||
absolute paths, traversal, null bytes, `.verstak` variants, and symlink
|
absolute paths, traversal, null bytes, `.verstak` variants, and symlink
|
||||||
read/write/move/trash operations are rejected by the host. Files read/write is
|
read/write/move/trash operations are rejected by the host. Text read/write is
|
||||||
UTF-8 text-only in the current runtime.
|
UTF-8 only; `readText` is limited to 2 MB and `readBytes` returns a bounded
|
||||||
|
base64 payload for regular files up to 8 MB.
|
||||||
|
|
||||||
Open/edit routing uses `OpenResourceRequest` with `kind: "vault-file"` and
|
Open/edit routing uses `OpenResourceRequest` with `kind: "vault-file"` and
|
||||||
contexts `generic-text`, `generic-markdown`, and `notes-markdown`. Plugins that
|
contexts `generic-text`, `generic-markdown`, and `notes-markdown`. Plugins that
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import type { CapabilityEntry, FileEntry, FileMetadata, MovePathOptions, OpenResourceRequest, OpenResourceResult, PluginSettings, RegisteredContributionPoints, RestoreTrashOptions, TrashEntry, TrashResult, WriteTextOptions } from './types';
|
import type { CapabilityEntry, FileBytes, FileEntry, FileMetadata, MovePathOptions, OpenResourceRequest, OpenResourceResult, PluginSettings, RegisteredContributionPoints, RestoreTrashOptions, TrashEntry, TrashResult, WriteTextOptions } from './types';
|
||||||
export type PluginCommandArgs = Record<string, unknown>;
|
export type PluginCommandArgs = Record<string, unknown>;
|
||||||
export type PluginCommandHandler = (args: PluginCommandArgs, declaration: PluginCommandDeclaration) => unknown | Promise<unknown>;
|
export type PluginCommandHandler = (args: PluginCommandArgs, declaration: PluginCommandDeclaration) => unknown | Promise<unknown>;
|
||||||
export type Unsubscribe = () => void;
|
export type Unsubscribe = () => void;
|
||||||
|
|
@ -82,6 +82,7 @@ export interface VerstakPluginAPI {
|
||||||
list(relativeDir?: string): Promise<FileEntry[]>;
|
list(relativeDir?: string): Promise<FileEntry[]>;
|
||||||
metadata(relativePath: string): Promise<FileMetadata>;
|
metadata(relativePath: string): Promise<FileMetadata>;
|
||||||
readText(relativePath: string): Promise<string>;
|
readText(relativePath: string): Promise<string>;
|
||||||
|
readBytes(relativePath: string): Promise<FileBytes>;
|
||||||
writeText(relativePath: string, content: string, options?: WriteTextOptions): Promise<void>;
|
writeText(relativePath: string, content: string, options?: WriteTextOptions): Promise<void>;
|
||||||
createFolder(relativePath: string): Promise<void>;
|
createFolder(relativePath: string): Promise<void>;
|
||||||
move(fromRelativePath: string, toRelativePath: string, options?: MovePathOptions): Promise<void>;
|
move(fromRelativePath: string, toRelativePath: string, options?: MovePathOptions): Promise<void>;
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"plugin-api.d.ts","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"plugin-api.d.ts","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"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"}
|
||||||
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"plugin-api.js","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,gDAAgD;AA+IhD,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACtF,CAAC"}
|
{"version":3,"file":"plugin-api.js","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAC9E,gDAAgD;AAiJhD,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACtF,CAAC"}
|
||||||
|
|
@ -1 +1 @@
|
||||||
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,KAAK,EAAwB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAQ3E,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAetF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CASnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,SAAgB,EAAE,OAAO,GAAE,oBAAyB,GAAG,gBAAgB,CA4QlH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCxF;AAGD,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,CAAC"}
|
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../src/test-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,KAAK,EAAwB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAQ3E,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,4BAA4B,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAetF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CASnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,SAAgB,EAAE,OAAO,GAAE,oBAAyB,GAAG,gBAAgB,CAySlH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAgCxF;AAGD,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,CAAC"}
|
||||||
|
|
@ -72,6 +72,21 @@ export function createMockPluginAPI(pluginId = 'test.plugin', options = {}) {
|
||||||
const idx = path.lastIndexOf('/');
|
const idx = path.lastIndexOf('/');
|
||||||
return idx === -1 ? path : path.slice(idx + 1);
|
return idx === -1 ? path : path.slice(idx + 1);
|
||||||
}
|
}
|
||||||
|
function base64FromString(value) {
|
||||||
|
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||||
|
let result = '';
|
||||||
|
let i = 0;
|
||||||
|
while (i < value.length) {
|
||||||
|
const a = value.charCodeAt(i++) & 0xff;
|
||||||
|
const b = i < value.length ? value.charCodeAt(i++) & 0xff : NaN;
|
||||||
|
const c = i < value.length ? value.charCodeAt(i++) & 0xff : NaN;
|
||||||
|
result += alphabet[a >> 2];
|
||||||
|
result += alphabet[((a & 3) << 4) | (Number.isNaN(b) ? 0 : b >> 4)];
|
||||||
|
result += Number.isNaN(b) ? '=' : alphabet[((b & 15) << 2) | (Number.isNaN(c) ? 0 : c >> 6)];
|
||||||
|
result += Number.isNaN(c) ? '=' : alphabet[c & 63];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
function entry(path, node) {
|
function entry(path, node) {
|
||||||
const name = baseName(path);
|
const name = baseName(path);
|
||||||
const dot = name.lastIndexOf('.');
|
const dot = name.lastIndexOf('.');
|
||||||
|
|
@ -184,6 +199,21 @@ export function createMockPluginAPI(pluginId = 'test.plugin', options = {}) {
|
||||||
throw new Error(`not-regular-file: ${path}`);
|
throw new Error(`not-regular-file: ${path}`);
|
||||||
return node.content || '';
|
return node.content || '';
|
||||||
}),
|
}),
|
||||||
|
readBytes: vi.fn(async (relativePath) => {
|
||||||
|
const path = normalizePath(relativePath);
|
||||||
|
const node = files.get(path);
|
||||||
|
if (!node)
|
||||||
|
throw new Error(`not-found: ${path}`);
|
||||||
|
if (node.type !== 'file')
|
||||||
|
throw new Error(`not-regular-file: ${path}`);
|
||||||
|
const content = node.content || '';
|
||||||
|
return {
|
||||||
|
relativePath: path,
|
||||||
|
size: content.length,
|
||||||
|
mimeHint: path.toLowerCase().endsWith('.txt') ? 'text/plain; charset=utf-8' : '',
|
||||||
|
dataBase64: base64FromString(content),
|
||||||
|
};
|
||||||
|
}),
|
||||||
writeText: vi.fn(async (relativePath, content, options = {}) => {
|
writeText: vi.fn(async (relativePath, content, options = {}) => {
|
||||||
const path = normalizePath(relativePath);
|
const path = normalizePath(relativePath);
|
||||||
const node = files.get(path);
|
const node = files.get(path);
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -78,6 +78,12 @@ export interface FileMetadata {
|
||||||
canRead: boolean;
|
canRead: boolean;
|
||||||
canWrite: boolean;
|
canWrite: boolean;
|
||||||
}
|
}
|
||||||
|
export interface FileBytes {
|
||||||
|
relativePath: string;
|
||||||
|
size: number;
|
||||||
|
mimeHint: string;
|
||||||
|
dataBase64: string;
|
||||||
|
}
|
||||||
export interface WriteTextOptions {
|
export interface WriteTextOptions {
|
||||||
/** Create the file when it is missing. Parent folder must already exist. */
|
/** Create the file when it is missing. Parent folder must already exist. */
|
||||||
createIfMissing?: boolean;
|
createIfMissing?: boolean;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -22,6 +22,7 @@ describe('VerstakPluginAPI contract', () => {
|
||||||
expect(typeof api.files.list).toBe('function');
|
expect(typeof api.files.list).toBe('function');
|
||||||
expect(typeof api.files.metadata).toBe('function');
|
expect(typeof api.files.metadata).toBe('function');
|
||||||
expect(typeof api.files.readText).toBe('function');
|
expect(typeof api.files.readText).toBe('function');
|
||||||
|
expect(typeof api.files.readBytes).toBe('function');
|
||||||
expect(typeof api.files.writeText).toBe('function');
|
expect(typeof api.files.writeText).toBe('function');
|
||||||
expect(typeof api.files.createFolder).toBe('function');
|
expect(typeof api.files.createFolder).toBe('function');
|
||||||
expect(typeof api.files.move).toBe('function');
|
expect(typeof api.files.move).toBe('function');
|
||||||
|
|
@ -250,6 +251,12 @@ describe('VerstakPluginAPI contract', () => {
|
||||||
await api.files.createFolder('PlatformTest');
|
await api.files.createFolder('PlatformTest');
|
||||||
await api.files.writeText('PlatformTest/one.txt', 'hello', { createIfMissing: true });
|
await api.files.writeText('PlatformTest/one.txt', 'hello', { createIfMissing: true });
|
||||||
await expect(api.files.readText('PlatformTest/one.txt')).resolves.toBe('hello');
|
await expect(api.files.readText('PlatformTest/one.txt')).resolves.toBe('hello');
|
||||||
|
await expect(api.files.readBytes('PlatformTest/one.txt')).resolves.toEqual({
|
||||||
|
relativePath: 'PlatformTest/one.txt',
|
||||||
|
size: 5,
|
||||||
|
mimeHint: 'text/plain; charset=utf-8',
|
||||||
|
dataBase64: 'aGVsbG8=',
|
||||||
|
});
|
||||||
await expect(api.files.list('PlatformTest')).resolves.toEqual([
|
await expect(api.files.list('PlatformTest')).resolves.toEqual([
|
||||||
expect.objectContaining({ relativePath: 'PlatformTest/one.txt', type: 'file' }),
|
expect.objectContaining({ relativePath: 'PlatformTest/one.txt', type: 'file' }),
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
CapabilityEntry,
|
CapabilityEntry,
|
||||||
|
FileBytes,
|
||||||
FileEntry,
|
FileEntry,
|
||||||
FileMetadata,
|
FileMetadata,
|
||||||
MovePathOptions,
|
MovePathOptions,
|
||||||
|
|
@ -118,6 +119,7 @@ export interface VerstakPluginAPI {
|
||||||
list(relativeDir?: string): Promise<FileEntry[]>;
|
list(relativeDir?: string): Promise<FileEntry[]>;
|
||||||
metadata(relativePath: string): Promise<FileMetadata>;
|
metadata(relativePath: string): Promise<FileMetadata>;
|
||||||
readText(relativePath: string): Promise<string>;
|
readText(relativePath: string): Promise<string>;
|
||||||
|
readBytes(relativePath: string): Promise<FileBytes>;
|
||||||
writeText(relativePath: string, content: string, options?: WriteTextOptions): Promise<void>;
|
writeText(relativePath: string, content: string, options?: WriteTextOptions): Promise<void>;
|
||||||
createFolder(relativePath: string): Promise<void>;
|
createFolder(relativePath: string): Promise<void>;
|
||||||
move(fromRelativePath: string, toRelativePath: string, options?: MovePathOptions): Promise<void>;
|
move(fromRelativePath: string, toRelativePath: string, options?: MovePathOptions): Promise<void>;
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,22 @@ export function createMockPluginAPI(pluginId = 'test.plugin', options: MockPlugi
|
||||||
return idx === -1 ? path : path.slice(idx + 1);
|
return idx === -1 ? path : path.slice(idx + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function base64FromString(value: string): string {
|
||||||
|
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||||
|
let result = '';
|
||||||
|
let i = 0;
|
||||||
|
while (i < value.length) {
|
||||||
|
const a = value.charCodeAt(i++) & 0xff;
|
||||||
|
const b = i < value.length ? value.charCodeAt(i++) & 0xff : NaN;
|
||||||
|
const c = i < value.length ? value.charCodeAt(i++) & 0xff : NaN;
|
||||||
|
result += alphabet[a >> 2];
|
||||||
|
result += alphabet[((a & 3) << 4) | (Number.isNaN(b) ? 0 : b >> 4)];
|
||||||
|
result += Number.isNaN(b) ? '=' : alphabet[((b & 15) << 2) | (Number.isNaN(c) ? 0 : c >> 6)];
|
||||||
|
result += Number.isNaN(c) ? '=' : alphabet[c & 63];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
function entry(path: string, node: { type: 'file' | 'folder'; content?: string; modifiedAt: string }) {
|
function entry(path: string, node: { type: 'file' | 'folder'; content?: string; modifiedAt: string }) {
|
||||||
const name = baseName(path);
|
const name = baseName(path);
|
||||||
const dot = name.lastIndexOf('.');
|
const dot = name.lastIndexOf('.');
|
||||||
|
|
@ -190,6 +206,19 @@ export function createMockPluginAPI(pluginId = 'test.plugin', options: MockPlugi
|
||||||
if (node.type !== 'file') throw new Error(`not-regular-file: ${path}`);
|
if (node.type !== 'file') throw new Error(`not-regular-file: ${path}`);
|
||||||
return node.content || '';
|
return node.content || '';
|
||||||
}),
|
}),
|
||||||
|
readBytes: vi.fn(async (relativePath: string) => {
|
||||||
|
const path = normalizePath(relativePath);
|
||||||
|
const node = files.get(path);
|
||||||
|
if (!node) throw new Error(`not-found: ${path}`);
|
||||||
|
if (node.type !== 'file') throw new Error(`not-regular-file: ${path}`);
|
||||||
|
const content = node.content || '';
|
||||||
|
return {
|
||||||
|
relativePath: path,
|
||||||
|
size: content.length,
|
||||||
|
mimeHint: path.toLowerCase().endsWith('.txt') ? 'text/plain; charset=utf-8' : '',
|
||||||
|
dataBase64: base64FromString(content),
|
||||||
|
};
|
||||||
|
}),
|
||||||
writeText: vi.fn(async (relativePath: string, content: string, options = {}) => {
|
writeText: vi.fn(async (relativePath: string, content: string, options = {}) => {
|
||||||
const path = normalizePath(relativePath);
|
const path = normalizePath(relativePath);
|
||||||
const node = files.get(path);
|
const node = files.get(path);
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,13 @@ export interface FileMetadata {
|
||||||
canWrite: boolean;
|
canWrite: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface FileBytes {
|
||||||
|
relativePath: string;
|
||||||
|
size: number;
|
||||||
|
mimeHint: string;
|
||||||
|
dataBase64: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface WriteTextOptions {
|
export interface WriteTextOptions {
|
||||||
/** Create the file when it is missing. Parent folder must already exist. */
|
/** Create the file when it is missing. Parent folder must already exist. */
|
||||||
createIfMissing?: boolean;
|
createIfMissing?: boolean;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue