UNPKG

@codesandbox/sandpack-client

Version:

<img style="width:100%" src="https://user-images.githubusercontent.com/4838076/143581035-ebee5ba2-9cb1-4fe8-a05b-2f44bd69bb4b.gif" alt="Component toolkit for live running code editing experiences" />

296 lines (295 loc) 8.28 kB
import type { SandpackNodeMessage } from "./clients/node/types"; import type { SandpackRuntimeMessage } from "./clients/runtime/types"; export interface ClientOptions { /** * Paths to external resources */ externalResources?: string[]; /** * Location of the bundler. */ bundlerURL?: string; /** * Level of logging to do in the bundler */ logLevel?: SandpackLogLevel; /** * Relative path that the iframe loads (eg: /about) */ startRoute?: string; /** * Width of iframe. */ width?: string; /** * Height of iframe. */ height?: string; /** * If we should skip the third step: evaluation. */ skipEval?: boolean; /** * Boolean flags to trigger certain UI elements in the bundler */ showOpenInCodeSandbox?: boolean; showErrorScreen?: boolean; showLoadingScreen?: boolean; /** * The bundler will clear the console if you set this to true, everytime the iframe refreshes / starts the first compile */ clearConsoleOnFirstCompile?: boolean; /** * You can pass a custom file resolver that is responsible for resolving files. * We will use this to get all files from the file system. */ fileResolver?: { isFile: (path: string) => Promise<boolean>; readFile: (path: string) => Promise<string>; }; reactDevTools?: ReactDevToolsMode; /** * The custom private npm registry setting makes it possible * to retrieve npm packages from your own npm registry. */ customNpmRegistries?: NpmRegistry[]; /** * CodeSandbox sandbox id: used internally by codesandbox */ sandboxId?: string; /** * CodeSandbox team id: with this information, bundler can connect to CodeSandbox * and unlock a few capabilities */ teamId?: string; /** * Enable the service worker feature for sandpack-bundler */ experimental_enableServiceWorker?: boolean; experimental_stableServiceWorkerId?: string; } export interface SandboxSetup { files: SandpackBundlerFiles; dependencies?: Dependencies; devDependencies?: Dependencies; entry?: string; /** * What template we use, if not defined we infer the template from the dependencies or files. * */ template?: SandpackTemplate; /** * Only use unpkg for fetching the dependencies, no preprocessing. It's slower, but doesn't talk * to AWS. */ disableDependencyPreprocessing?: boolean; } export interface SandpackBundlerFile { code: string; hidden?: boolean; active?: boolean; readOnly?: boolean; } export type SandpackBundlerFiles = Record<string, SandpackBundlerFile>; export interface Module { code: string; path: string; } export type Modules = Record<string, { code: string; path: string; }>; export type Dependencies = Record<string, string>; export type ReactDevToolsMode = "latest" | "legacy"; export interface ModuleSource { fileName: string; compiledCode: string; sourceMap: unknown | undefined; } export declare enum SandpackLogLevel { None = 0, Error = 10, Warning = 20, Info = 30, Debug = 40 } export interface ErrorStackFrame { columnNumber: number; fileName: string; functionName: string; lineNumber: number; _originalColumnNumber: number; _originalFileName: string; _originalFunctionName: string; _originalLineNumber: number; _originalScriptCode: Array<{ lineNumber: number; content: string; highlight: boolean; }>; } export interface TranspiledModule { module: Module; query: string; source: ModuleSource | undefined; assets: Record<string, ModuleSource>; isEntry: boolean; isTestFile: boolean; childModules: string[]; /** * All extra modules emitted by the loader */ emittedAssets: ModuleSource[]; initiators: string[]; dependencies: string[]; asyncDependencies: string[]; transpilationDependencies: string[]; transpilationInitiators: string[]; } export interface BundlerState { entry: string; transpiledModules: Record<string, TranspiledModule>; } export type SandpackMessage = SandpackRuntimeMessage | SandpackNodeMessage; export type ListenerFunction = (msg: SandpackMessage) => void; export type UnsubscribeFunction = () => void; export type Listen = (listener: ListenerFunction, clientId?: string) => UnsubscribeFunction; export type Dispatch = (msg: SandpackMessage, clientId?: string) => void; export interface SandpackError { message: string; line?: number; column?: number; path?: string; title?: string; } export interface SandpackErrorMessage { title: string; path: string; message: string; line: number; column: number; payload: { frames?: ErrorStackFrame[]; }; } export type ClientStatus = "initializing" | "installing-dependencies" | "transpiling" | "evaluating" | "running-tests" | "idle" | "done"; export type SandpackMessageConsoleMethods = "log" | "debug" | "info" | "warn" | "error" | "table" | "clear" | "time" | "timeEnd" | "count" | "assert"; export interface BaseSandpackMessage { type: string; $id?: number; codesandbox?: boolean; } export interface BaseProtocolMessage { type: string; msgId: string; } export interface ProtocolErrorMessage extends BaseProtocolMessage { error: { message: string; }; } export interface ProtocolResultMessage extends BaseProtocolMessage { result: any; } export interface ProtocolRequestMessage extends BaseProtocolMessage { method: string; params: any[]; } export interface NpmRegistry { enabledScopes: string[]; limitToScopes: boolean; registryUrl: string; /** * It must be `false` if you're providing a sef-host solution, * otherwise, it'll try to proxy from CodeSandbox Proxy */ proxyEnabled: boolean; registryAuthToken?: string; } type TestStatus = "running" | "pass" | "fail"; export type TestError = Error & { matcherResult?: boolean; mappedErrors?: Array<{ fileName: string; _originalFunctionName: string; _originalColumnNumber: number; _originalLineNumber: number; _originalScriptCode: Array<{ lineNumber: number; content: string; highlight: boolean; }> | null; }>; }; export interface Test { name: string; blocks: string[]; status: TestStatus; path: string; errors: TestError[]; duration?: number | undefined; } export type SandboxTestMessage = RunAllTests | RunTests | ClearJestErrors | ({ type: "test"; } & (InitializedTestsMessage | TestCountMessage | TotalTestStartMessage | TotalTestEndMessage | AddFileMessage | RemoveFileMessage | FileErrorMessage | DescribeStartMessage | DescribeEndMessage | AddTestMessage | TestStartMessage | TestEndMessage)); interface InitializedTestsMessage { event: "initialize_tests"; } interface ClearJestErrors { type: "action"; action: "clear-errors"; source: "jest"; path: string; } interface TestCountMessage { event: "test_count"; count: number; } interface TotalTestStartMessage { event: "total_test_start"; } interface TotalTestEndMessage { event: "total_test_end"; } interface AddFileMessage { event: "add_file"; path: string; } interface RemoveFileMessage { event: "remove_file"; path: string; } interface FileErrorMessage { event: "file_error"; path: string; error: TestError; } interface DescribeStartMessage { event: "describe_start"; blockName: string; } interface DescribeEndMessage { event: "describe_end"; } interface AddTestMessage { event: "add_test"; testName: string; path: string; } interface TestStartMessage { event: "test_start"; test: Test; } interface TestEndMessage { event: "test_end"; test: Test; } interface RunAllTests { type: "run-all-tests"; } interface RunTests { type: "run-tests"; path: string; } export type SandpackTemplate = "angular-cli" | "create-react-app" | "create-react-app-typescript" | "svelte" | "parcel" | "vue-cli" | "static" | "solid" | "nextjs" | "node"; export {};