Add remote fs API
Summary: Changelog: Expose Flipper Server FS access to Flipper plugins Reviewed By: lblasa Differential Revision: D32883144 fbshipit-source-id: 47637b61849ef60a2d8fe91a0a28d2a358e0b8c4
This commit is contained in:
committed by
Facebook GitHub Bot
parent
a87b99cd3d
commit
0e785fb18d
@@ -132,6 +132,18 @@ export type IOSDeviceParams = {
|
||||
};
|
||||
|
||||
export type FlipperServerCommands = {
|
||||
'node-api-fs-access': (path: string, mode?: number) => Promise<void>;
|
||||
'node-api-fs-pathExists': (path: string, mode?: number) => Promise<boolean>;
|
||||
'node-api-fs-unlink': (path: string) => Promise<void>;
|
||||
'node-api-fs-mkdir': (
|
||||
path: string,
|
||||
options?: {recursive?: boolean} & MkdirOptions,
|
||||
) => Promise<string | void>;
|
||||
'node-api-fs-copyFile': (
|
||||
src: string,
|
||||
dest: string,
|
||||
flags?: number,
|
||||
) => Promise<void>;
|
||||
/**
|
||||
* @throws ExecError
|
||||
*/
|
||||
@@ -310,6 +322,10 @@ export type BufferEncoding =
|
||||
| 'binary'
|
||||
| 'hex';
|
||||
|
||||
export interface MkdirOptions {
|
||||
mode?: string | number;
|
||||
}
|
||||
|
||||
export type FlipperServerConfig = {
|
||||
gatekeepers: Record<string, boolean>;
|
||||
env: Partial<Record<ENVIRONMENT_VARIABLES, string>>;
|
||||
|
||||
@@ -13,7 +13,12 @@ import {NormalizedMenuEntry} from './MenuEntry';
|
||||
import {RealFlipperClient} from './Plugin';
|
||||
import {Notification} from './Notification';
|
||||
import {DetailSidebarProps} from '../ui/DetailSidebar';
|
||||
import {ExecOptions, ExecOut, BufferEncoding} from 'flipper-common';
|
||||
import {
|
||||
ExecOptions,
|
||||
ExecOut,
|
||||
BufferEncoding,
|
||||
MkdirOptions,
|
||||
} from 'flipper-common';
|
||||
|
||||
export type FileEncoding = 'utf-8' | 'base64';
|
||||
|
||||
@@ -31,7 +36,18 @@ export type RemoteNodeAPI = {
|
||||
): Promise<ExecOut<string>>;
|
||||
};
|
||||
fs: {
|
||||
// TODO: Fill me
|
||||
access(path: string, mode?: number): Promise<void>;
|
||||
pathExists(path: string, mode?: number): Promise<boolean>;
|
||||
unlink(path: string): Promise<void>;
|
||||
mkdir(
|
||||
path: string,
|
||||
options: {recursive: true} & MkdirOptions,
|
||||
): Promise<string | undefined>;
|
||||
mkdir(
|
||||
path: string,
|
||||
options?: {recursive?: false} & MkdirOptions,
|
||||
): Promise<void>;
|
||||
copyFile(src: string, dest: string, flags?: number): Promise<void>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -393,7 +393,13 @@ export function createMockFlipperLib(options?: StartPluginOptions): FlipperLib {
|
||||
childProcess: {
|
||||
exec: jest.fn(),
|
||||
},
|
||||
fs: {},
|
||||
fs: {
|
||||
access: jest.fn(),
|
||||
pathExists: jest.fn(),
|
||||
unlink: jest.fn(),
|
||||
mkdir: jest.fn(),
|
||||
copyFile: jest.fn(),
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ import {
|
||||
internGraphPOSTAPIRequest,
|
||||
} from './fb-stubs/internRequests';
|
||||
import {commandNodeApiExec} from './commands/NodeApiExec';
|
||||
import {access, copyFile, mkdir, unlink} from 'fs/promises';
|
||||
|
||||
export const SERVICE_FLIPPER = 'flipper.oAuthToken';
|
||||
|
||||
@@ -215,6 +216,18 @@ export class FlipperServerImpl implements FlipperServer {
|
||||
|
||||
private commandHandler: FlipperServerCommands = {
|
||||
'node-api-exec': commandNodeApiExec,
|
||||
'node-api-fs-access': access,
|
||||
'node-api-fs-pathExists': async (path, mode) => {
|
||||
try {
|
||||
await access(path, mode);
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
'node-api-fs-unlink': unlink,
|
||||
'node-api-fs-mkdir': mkdir,
|
||||
'node-api-fs-copyFile': copyFile,
|
||||
'get-config': async () => this.config,
|
||||
'get-changelog': getChangelog,
|
||||
'device-list': async () => {
|
||||
|
||||
@@ -8,7 +8,12 @@
|
||||
*/
|
||||
|
||||
import {_setFlipperLibImplementation, RemoteNodeAPI} from 'flipper-plugin';
|
||||
import type {BufferEncoding, ExecOptions, Logger} from 'flipper-common';
|
||||
import type {
|
||||
BufferEncoding,
|
||||
ExecOptions,
|
||||
Logger,
|
||||
MkdirOptions,
|
||||
} from 'flipper-common';
|
||||
import type {Store} from '../reducers';
|
||||
import createPaste from '../fb-stubs/createPaste';
|
||||
import type BaseDevice from '../devices/BaseDevice';
|
||||
@@ -75,7 +80,30 @@ export function initializeFlipperLibImplementation(
|
||||
options,
|
||||
)) as RemoteNodeAPI['childProcess']['exec'],
|
||||
},
|
||||
fs: {},
|
||||
fs: {
|
||||
access: async (path: string, mode?: number) =>
|
||||
renderHost.flipperServer.exec('node-api-fs-access', path, mode),
|
||||
pathExists: async (path: string, mode?: number) =>
|
||||
renderHost.flipperServer.exec('node-api-fs-pathExists', path, mode),
|
||||
unlink: async (path: string) =>
|
||||
renderHost.flipperServer.exec('node-api-fs-unlink', path),
|
||||
mkdir: (async (
|
||||
path: string,
|
||||
options?: {recursive?: boolean} & MkdirOptions,
|
||||
) =>
|
||||
renderHost.flipperServer.exec(
|
||||
'node-api-fs-mkdir',
|
||||
path,
|
||||
options,
|
||||
)) as RemoteNodeAPI['fs']['mkdir'],
|
||||
copyFile: async (src: string, dest: string, flags?: number) =>
|
||||
renderHost.flipperServer.exec(
|
||||
'node-api-fs-copyFile',
|
||||
src,
|
||||
dest,
|
||||
flags,
|
||||
),
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user