UNPKG

@builder.io/dev-tools

Version:

Builder.io Visual CMS Devtools

525 lines (524 loc) 16.3 kB
import type { spawnSync } from "node:child_process"; export interface DevToolsPath { basename: (path: string, suffix?: string) => string; extname: (path: string) => string; dirname: (path: string) => string; isAbsolute: (path: string) => boolean; join: (...paths: string[]) => string; normalize: (path: string) => string; relative: (from: string, to: string) => string; resolve: (...pathSegments: string[]) => string; } export interface RepoInfo { hasGit: boolean; remoteUrl: string; defaultBranch: string; currentBranch: string; commit: string; } export interface DevToolsSys extends DevToolsPath { cwd: () => string; getCwdDir: () => string; getAppRootDir: () => string; getRepoRootDir: () => string; exists: (path: string) => Promise<boolean>; existsSync: (path: string) => boolean; readdir: (path: string, absolutePaths?: boolean) => Promise<string[]>; readdirRecursive: (path: string, skipFolders?: string[]) => Promise<string[]>; readdirSync: (path: string) => string[]; readFile: (filePath: string) => Promise<string | null>; readFileSync: (filePath: string) => string | null; readFileSyncBuffer: (filePath: string) => Uint8Array | null; spawnSync: typeof spawnSync | undefined; stat: (path: string) => Promise<{ isDirectory: () => boolean; isFile: () => boolean; size: number; }>; statSync: (path: string) => { isDirectory: () => boolean; isFile: () => boolean; size: number; }; writeFile: (filePath: string, content: string | Uint8Array) => Promise<void>; unlink: (filePath: string) => Promise<void>; unlinkSync: (filePath: string) => void; formatCode: (filePath: string, code: string) => Promise<string>; hash: (str: string) => Promise<string>; on: (eventName: "change", callback: FileChangeCallback) => void; off: (eventName: "change", callback: FileChangeCallback) => void; debug: (...args: any[]) => void; launchEditor: (file: LaunchEditorFile) => Promise<void>; platform: () => DevtoolsPlatform; getDeviceId: () => Promise<string>; getFrameworks: () => Framework[]; getRepoInfo: (githubWorkingDirectory?: string) => Promise<RepoInfo>; Sentry: typeof import("@sentry/node") | undefined; ts: typeof import("typescript"); version: string; sdkVersion: SDK_VERSION_VALUES | null; ignoreMissingConfig?: boolean; kind: SPACE_KIND_VALUES; magicast: typeof import("magicast") | undefined; } export interface DevtoolsPlatform { runtime: string; os: string; } export type FileChangeCallback = (file: FileChangeInfo) => Promise<void> | void; export interface FileChangeInfo { path: string; basename: string; extname: string; dirname: string; } export interface EnsureConfigResult { content: string; filePath: string; fileName: string; outcome: "already-exists" | "added" | "no-update"; } export interface FrameworkDependency { name: string; version?: string; devDependency?: boolean; } export interface BuildToolConfig { id: string; content: string; filePath: string; } export interface CreateDevToolsOptions extends DevToolsSys { frameworks?: Framework[]; } export interface FrameworkBuilderPageOptions { templateContentId: string; title: string; pathname: string; localePathname?: string; } export interface DevToolsAdapter { getPublicApiKey: () => Promise<EnvInfo>; setPublicApiKey: (opts: SetPublicApiKeyOptions) => Promise<EnvInfo>; builderPageOptions: () => Promise<FrameworkBuilderPageOptions>; ensureBuilderSetup: () => Promise<ModifiedFile[]>; ensureFigmaImportPage: () => Promise<ModifiedFile[]>; getRegistry: (opts?: GetRegistryOptions) => Promise<ComponentRegistry>; getRegistryPath: () => string; loadComponent: (opts: LoadComponentOptions) => Promise<LoadComponent>; addExternalPackage: (pkgName: string) => void; registerComponent: (opts: RegisterComponentOptions) => Promise<ComponentRegistry>; unregisterComponent: (opts: UnregisterComponentOptions) => Promise<ComponentRegistry>; setRegisteredComponentInfo: (opts: SetComponentInfoOptions) => Promise<ComponentRegistry>; setRegisteredComponentInput: (opts: SetComponentInputOptions) => Promise<ComponentRegistry>; getDependencies: (opts: DependenciesOptions) => FrameworkDependency[]; getDevRunCommand: () => string; getCache: () => Promise<Record<string, any>>; setCache: (cache: Record<string, any>) => Promise<void>; } export interface DevTools extends DevToolsAdapter { exportRegistry: () => Promise<string>; importRegistry: (exportedRegistry: string) => Promise<ComponentRegistry>; framework: string; findAllDependencies: () => Promise<DependencyTree>; } export interface DevToolsServerOptions extends DevToolsSys, DevTools { getClientId: () => string; getPastSyncInfo?: (data: { sessionKey: string; since: number; }) => any; resyncSnippet?: (data: { syncInfo: SyncInfo; snippet: Snippet; }) => any; enableAppWatch: (enabled: boolean) => Promise<boolean>; closeAppServer: () => Promise<void>; restartAppServer: () => Promise<void>; port?: number; getAllProjectFiles?: () => Promise<string[]>; } export interface DevToolsHttpServer { url: string; port: number; setContext(ctx: DevToolsServerContext): void; close(): Promise<void>; } export interface BuilderAppCredentials { publicApiKey: string | null; } export interface DevToolsServerContext extends Omit<DevToolsServerOptions, "getAllProjectFiles"> { devToolsServerUrl: string; isValid: boolean; serverShouldRestart: boolean; publicApiKey: string; port: number; ignoreMissingConfig: boolean; getAllProjectFiles: () => Promise<string[]>; } export interface SetPublicApiKeyOptions { publicApiKey: string; } export interface EnvInfo { envKey: string; envValue: string | null; file: string; modifiedType?: "create" | "update" | "permission-error" | null; } export interface DevToolsServer { getUrl: () => string; } export type ApiRequest = ApiConnectBuilderRequest | ApiDevToolsEnabledRequest | ApiGetRegistryRequest | ApiLaunchEditorRequest | ApiRegisterComponentRequest | ApiRegisteredComponentInfoRequest | ApiRegisteredComponentInputRequest | ApiLoadComponentRequest | ApiUnregisterComponentRequest | ApiValidateBuilderRequest | ApiFrameworksRequest | ApiReadFileRequest | ApiWriteFileRequest | ApiReaddirRequest | ApiGetBuilderCacheRequest | ApiEnsureFigmaImportPageRequest | ApiSetBuilderCacheRequest | ApiTranspileModuleRequest | ApiTranspileFileRequest | ApiPastSyncInfoRequest | ApiResyncSnippetRequest | ApiLocalConfigRequest | ApiGetAllProjectFilesRequest; export interface ApiTranspileModuleRequest extends TranspileModuleOptions { type: "transileModule"; } export interface ApiTranspileFileRequest extends TranspileFileOptions { type: "transileFile"; } export interface ApiGetBuilderCacheRequest { type: "getCache"; } export interface ApiSetBuilderCacheRequest { type: "setCache"; data: Record<string, any>; } export interface ApiPastSyncInfoRequest { type: "getPastSyncInfo"; data: { sessionKey: string; since: number; }; } export interface ApiResyncSnippetRequest { type: "resyncSnippet"; data: { syncInfo: SyncInfo; snippet: Snippet; }; } export interface ApiEnsureFigmaImportPageRequest { type: "ensureFigmaImportPage"; } export interface ApiConnectBuilderRequest { type: "connectBuilder"; data: { publicApiKey: string; privateAuthKey: string; kind: string | null; }; } export interface ApiDevToolsEnabledRequest { type: "enableDevTools"; data: { enabled: boolean; }; } export interface ApiGetRegistryRequest { type: "getRegistry"; data?: GetRegistryOptions; } export interface GetRegistryOptions { readAllInputTypes?: boolean; } export interface ApiLocalConfigRequest { type: "localConfig"; } export interface ApiLaunchEditorRequest { type: "launchEditor"; data: LaunchEditorFile; } export interface ApiRegisterComponentRequest { type: "registerComponent"; data: RegisterComponentOptions; } export interface ApiUnregisterComponentRequest { type: "unregisterComponent"; data: UnregisterComponentOptions; } export interface ApiRegisteredComponentInfoRequest { type: "setComponentInfo"; data: SetComponentInfoOptions; } export interface ApiRegisteredComponentInputRequest { type: "setComponentInput"; data: SetComponentInputOptions; } export interface ApiLoadComponentRequest { type: "loadComponent"; data: LoadComponentOptions; } export interface ApiValidateBuilderRequest { type: "validateBuilder"; } export interface ApiFrameworksRequest { type: "getFrameworks"; } export interface ApiReadFileRequest { type: "readFile"; path: string; } export interface ApiWriteFileRequest { type: "writeFile"; path: string; content: string; } export interface ApiReaddirRequest { type: "readdir"; path: string; } export interface ApiResponse<T = any> { type?: string; data?: T; errors?: string[]; } export interface ValidatedBuilder { isValid: boolean; pathname: string; platform: DevtoolsPlatform; } export interface ConnectedBuilder { success: boolean; pathname: string; modifiedFiles: ModifiedFile[]; platform: DevtoolsPlatform; kind: SPACE_KIND_VALUES; } export interface LocalConfig { userId?: string; deviceId?: string; } export interface ModifiedFile { filePath: string; displayFilePath?: string; modifiedType: "create" | "update"; } export interface Framework { name: string; version?: SemanticVersion; } export interface SemanticVersion { major?: number; minor?: number; patch?: number; } export interface ComponentRegistry { components: ComponentInfo[]; registryPath: string; registryDisplayPath: string; frameworks: Framework[]; dependencies: AppDependency[]; publicApiKey: string | undefined; devToolsVersion: string; } export interface AppDependency { name: string; } export interface ExportedRegistry { components: MinimalComponentInfo[]; version: number; } export interface LoadComponent extends ComponentRegistry { component: ComponentInfo; } export interface LoadComponentOptions { cmpId: string; } export interface RegisterComponentOptions { cmpId: string | string[]; } export interface UnregisterComponentOptions { cmpId: string; } export interface SetComponentInfoOptions { cmpId: string; name?: string; image?: string | null; description?: string | null; } export interface SetComponentInputOptions extends Partial<Omit<ComponentInput, "isRegistered">> { cmpId: string; name: string; registerInput?: boolean; } export interface DependenciesOptions { sdkVersion: SDK_VERSION_VALUES | null; } export interface ComponentInfo { id: string; filePath: string; relFilePath: string; importPath: string; name: string; image?: string; description?: string; inputs: ComponentInput[]; displayFilePath?: string; exportName: string; exportType?: ExportType; importName: string; nodeIndex?: number; isRegistered?: boolean; acceptsChildren?: boolean; meta?: Record<string, any>; dependencies?: AppDependency[]; externalImportPath?: string; framework: "react" | "angular" | "qwik" | "vue"; vueApiType?: "composition-setup" | "composition" | "options"; } export interface MinimalComponentInfo { filePath: string; name: string; image?: string; description?: string; inputs: ComponentInput[]; exportName: string; } /** * Extends the @builder.io/sdk Input type to include additional properties. * If a property is set to null, it will be removed from the input. */ export interface ComponentInput { /** This is the name of the component prop this input represents */ name: string; /** A friendlier name to show in the UI if the component prop name is not ideal for end users. Setting to null will remove the value. */ friendlyName?: string | null; /** A default value to use. Setting to null will remove the value. */ defaultValue?: string | number | boolean | null; /** * The type of input to use, such as 'text' * * See all available inputs [here](https://www.builder.io/c/docs/custom-react-components#input-types) * and you can create your own custom input types and associated editor UIs with [plugins](https://www.builder.io/c/docs/extending/plugins) */ type: string; /** Is this input mandatory or not. Setting to null will remove the setting. */ required?: boolean | null; /** * Additional text to render in the UI to give guidance on how to use this * * @example * ```js * helperText: 'Be sure to use a proper URL, starting with "https://"' * 111 */ helperText?: string | null; /** * For "text" input type, specifying an enum will show a dropdown of options instead */ enum?: string[] | { label: string; value: string | number | boolean; helperText?: string; }[]; meta?: Record<string, any>; /** Add-on data that should not go in the registry */ isRegistered?: boolean; hideFromUI?: boolean; } export type ExportType = "default" | "named"; export interface PackageJSON { dependencies?: { [pkgName: string]: string; }; devDependencies?: { [pkgName: string]: string; }; scripts?: { [scriptName: string]: string; }; [key: string]: any; } export type ModuleFormat = "esm" | "cjs"; export interface LaunchEditorFile { filePath: string; line?: number; column?: number; } export interface TranspileFileOptions { filePath: string; compilerOptions: import("typescript").CompilerOptions; } export interface TranspileModuleOptions { code: string; filePath?: string; compilerOptions: import("typescript").CompilerOptions; } export interface TranspileResult { code: string | null; output: string | null; diagnostics: TranspileDiagnostic[]; } export interface TranspileDiagnostic { messageText: string; } export declare const SDK_VERSIONS: { readonly gen1: "Gen 1"; readonly gen2: "Gen 2"; }; type SDK_VERSION_KEYS = keyof typeof SDK_VERSIONS; export type SDK_VERSION_VALUES = (typeof SDK_VERSIONS)[SDK_VERSION_KEYS]; export interface SDKVersionInfo { version: SDK_VERSION_VALUES; recommended: boolean; } export interface SDKFrameworks { [key: string]: SDKVersionInfo[]; } export interface UpdateRegistry { addCmpToRegistry: ComponentInfo | null; removeCmpFromRegistry: ComponentInfo | null; updateRegisteredCmp: ComponentInfo | null; nodeIndex: number; components: ComponentInfo[]; } export interface AddCliOptions { cwd: string; command?: string; snippetId?: string; snippet?: Snippet; path?: string; } export interface FileNode { name: string; code: string; path: string; timestamp?: number; snippetId?: string; } export interface FolderNode { name: string; path: string; files: (FileNode | FolderNode)[]; } export interface Snippet { createdDate: number; contentId: string; code: string; framework: string; suggestedName: string; id: string; files: Array<FileNode | FolderNode>; sessionKey: string; } export interface SyncInfo { snippet: Snippet; pathInput: string; writtenFiles: Array<FileNode>; timeStamp: number; } export interface Package { name: string; subPackages: string[]; } export type DependencyTree = Package[]; export declare const SPACE_KIND: { readonly CMS: "cms"; readonly VCP: "vcp"; readonly HYBRID: "hybrid"; }; type SPACE_KIND_KEYS = keyof typeof SPACE_KIND; export type SPACE_KIND_VALUES = (typeof SPACE_KIND)[SPACE_KIND_KEYS] | null; export interface ApiGetAllProjectFilesRequest { type: "getAllProjectFiles"; } export {};