UNPKG

@parcel/types-internal

Version:
2,109 lines (1,813 loc) 70.5 kB
import { $Shape } from "utility-types"; import type { Readable } from "stream"; import type SourceMap from "@parcel/source-map"; import type { Diagnostic, Diagnostifiable, DiagnosticWithoutOrigin } from "@parcel/diagnostic"; import type { FeatureFlags } from "@parcel/feature-flags"; import type { Event, BackendType } from "@parcel/watcher"; import type { Cache } from "./Cache"; import type { FileSystem, FileOptions, Stats as FileStats, ReaddirOptions, Encoding, Dirent } from "./FileSystem"; import type { AST as _AST, ConfigResult as _ConfigResult } from "./unsafe"; import type { FilePath } from "./FilePath"; import type { Glob } from "./Glob"; import type { PackageName } from "./PackageName"; import type { PackageManager, PackageManagerResolveResult, Invalidations, PackageInstaller, ModuleRequest, InstallOptions, InstallerOptions } from "./PackageManager"; import type { SemverRange } from "./SemverRange"; import type { DependencySpecifier } from "./DependencySpecifier"; import type { FileCreateInvalidation, GlobInvalidation, FileInvalidation, FileAboveInvalidation } from "./FileCreateInvalidation"; export interface TraceMeasurement { end(): void; } export type { FilePath, FileSystem, FileOptions, FileStats, ReaddirOptions, Encoding, Dirent, PackageName, Glob, DependencySpecifier, SemverRange, FileCreateInvalidation, GlobInvalidation, FileInvalidation, FileAboveInvalidation, PackageManager, PackageManagerResolveResult, Invalidations, PackageInstaller, ModuleRequest, InstallOptions, InstallerOptions, Cache }; /** Plugin-specific AST, <code>any</code> */ export type AST = _AST; export type ConfigResult = _ConfigResult; /** Plugin-specific config result, <code>any</code> */ export type ConfigResultWithFilePath<T> = { contents: T; filePath: FilePath; }; /** <code>process.env</code> */ export type EnvMap = typeof process.env; export type JSONValue = null | void // ? Is this okay? | boolean | number | string | Array<JSONValue> | JSONObject; /** A JSON object (as in "map") */ export type JSONObject = {[key: string]: JSONValue}; export type Semver = string; /** A pipeline as specified in the config mapping to <code>T</code> */ export type GlobMap<T> = Record<Glob, T>; export type RawParcelConfigPipeline = Array<PackageName>; export type HMROptions = { port?: number; host?: string; }; /** The format of .parcelrc */ export type RawParcelConfig = { extends?: PackageName | FilePath | Array<PackageName | FilePath>; resolvers?: RawParcelConfigPipeline; transformers?: Record<Glob, RawParcelConfigPipeline>; bundler?: PackageName; namers?: RawParcelConfigPipeline; runtimes?: RawParcelConfigPipeline; packagers?: Record<Glob, PackageName>; optimizers?: Record<Glob, RawParcelConfigPipeline>; compressors?: Record<Glob, RawParcelConfigPipeline>; reporters?: RawParcelConfigPipeline; validators?: Record<Glob, RawParcelConfigPipeline>; }; /** A .parcelrc where all package names are resolved */ export type ResolvedParcelConfigFile = RawParcelConfig & { readonly filePath: FilePath; readonly resolveFrom?: FilePath; }; /** Corresponds to <code>pkg#engines</code> */ export type Engines = { readonly browsers?: string | Array<string>; readonly electron?: SemverRange; readonly node?: SemverRange; readonly parcel?: SemverRange; }; /** Corresponds to <code>pkg#targets.*.sourceMap</code> */ export type TargetSourceMapOptions = { readonly sourceRoot?: string; readonly inline?: boolean; readonly inlineSources?: boolean; }; /** * A parsed version of PackageTargetDescriptor */ export interface Target { /** The output filename of the entry */ readonly distEntry: FilePath | null | undefined; /** The output folder */ readonly distDir: FilePath; readonly env: Environment; readonly name: string; readonly publicUrl: string; /** The location that created this Target, e.g. `package.json#main`*/ readonly loc: SourceLocation | null | undefined; } /** In which environment the output should run (influces e.g. bundle loaders) */ export type EnvironmentContext = "browser" | "web-worker" | "service-worker" | "worklet" | "node" | "electron-main" | "electron-renderer" | "react-client" | "react-server"; /** The JS module format for the bundle output */ export type OutputFormat = "esmodule" | "commonjs" | "global"; /** * The format of <code>pkg#targets.*</code> * * See Environment and Target. */ export type PackageTargetDescriptor = { readonly context?: EnvironmentContext; readonly engines?: Engines; readonly includeNodeModules?: boolean | Array<PackageName> | Record<PackageName, boolean>; readonly outputFormat?: OutputFormat; readonly publicUrl?: string; readonly distDir?: FilePath; readonly sourceMap?: boolean | TargetSourceMapOptions; readonly isLibrary?: boolean; readonly optimize?: boolean; readonly scopeHoist?: boolean; readonly source?: FilePath | Array<FilePath>; }; /** * The target format when using the JS API. * * (Same as PackageTargetDescriptor, but <code>distDir</code> is required.) */ export type TargetDescriptor = PackageTargetDescriptor & { readonly distDir: FilePath; readonly distEntry?: FilePath; }; export type SourceType = "script" | "module"; /** * This is used when creating an Environment (see that). */ export type EnvironmentOptions = { readonly context?: EnvironmentContext; readonly engines?: Engines; readonly includeNodeModules?: boolean | Array<PackageName> | Record<PackageName, boolean>; readonly outputFormat?: OutputFormat; readonly sourceType?: SourceType; readonly isLibrary?: boolean; readonly shouldOptimize?: boolean; readonly shouldScopeHoist?: boolean; readonly sourceMap?: TargetSourceMapOptions | null | undefined; readonly loc?: SourceLocation | null | undefined; }; /** * A resolved browserslist, e.g.: * <pre><code> * { * edge: '76', * firefox: '67', * chrome: '63', * safari: '11.1', * opera: '50', * } * </code></pre> */ export type VersionMap = Record<string, string>; export type EnvironmentFeature = "esmodules" | "dynamic-import" | "worker-module" | "service-worker-module" | "import-meta-url" | "import-meta-resolve" | "arrow-functions" | "global-this"; /** * Defines the environment in for the output bundle */ export interface Environment { readonly id: string; readonly context: EnvironmentContext; readonly engines: Engines; /** Whether to include all/none packages \ * (<code>true / false</code>), an array of package names to include, or an object \ * (of a package is not specified, it's included). */ readonly includeNodeModules: boolean | Array<PackageName> | Record<PackageName, boolean>; readonly outputFormat: OutputFormat; readonly sourceType: SourceType; /** Whether this is a library build (e.g. less loaders) */ readonly isLibrary: boolean; /** Whether the output should be minified. */ readonly shouldOptimize: boolean; /** Whether scope hoisting is enabled. */ readonly shouldScopeHoist: boolean; readonly sourceMap: TargetSourceMapOptions | null | undefined; readonly loc: SourceLocation | null | undefined; /** Whether <code>context</code> specifies a browser context. */ isBrowser(): boolean; /** Whether <code>context</code> specifies a node context. */ isNode(): boolean; /** Whether <code>context</code> specifies a server context. */ isServer(): boolean; /** Whether <code>context</code> specifies an electron context. */ isElectron(): boolean; /** Whether <code>context</code> specifies a worker context. */ isWorker(): boolean; /** Whether <code>context</code> specifies a worklet context. */ isWorklet(): boolean; /** Whether <code>context</code> specifies an isolated context (can't access other loaded ancestor bundles). */ isIsolated(): boolean; matchesEngines(minVersions: VersionMap, defaultValue?: boolean): boolean; supports(feature: EnvironmentFeature, defaultValue?: boolean): boolean; } /** * Format of <code>pkg#dependencies</code>, <code>pkg#devDependencies</code>, <code>pkg#peerDependencies</code> */ type PackageDependencies = Record<PackageName, Semver>; /** * Format of <code>package.json</code> */ export type PackageJSON = { name: PackageName; version: Semver; type?: "module"; main?: FilePath; module?: FilePath; types?: FilePath; browser?: FilePath | Record<FilePath, FilePath | boolean>; source?: FilePath | Array<FilePath>; alias?: { [key in PackageName | FilePath | Glob]?: PackageName | FilePath | { global: string; } }; browserslist?: Array<string> | Record<string, Array<string>>; engines?: Engines; targets?: Record<string, PackageTargetDescriptor>; dependencies?: PackageDependencies; devDependencies?: PackageDependencies; peerDependencies?: PackageDependencies; sideEffects?: boolean | FilePath | Array<FilePath>; bin?: string | Record<string, FilePath>; }; export type LogLevel = "none" | "error" | "warn" | "info" | "verbose"; export type BuildMode = "development" | "production" | string; export type DetailedReportOptions = { assetsPerBundle?: number; }; declare type GlobPattern = string; export type InitialParcelOptionsInternal<WorkerFarm> = { readonly entries?: FilePath | Array<FilePath>; readonly config?: DependencySpecifier; readonly defaultConfig?: DependencySpecifier; readonly env?: EnvMap; readonly targets?: (Array<string> | Readonly<Record<string, TargetDescriptor>>) | null | undefined; readonly shouldDisableCache?: boolean; readonly cacheDir?: FilePath; readonly watchDir?: FilePath; readonly watchBackend?: BackendType; readonly watchIgnore?: Array<FilePath | GlobPattern>; readonly mode?: BuildMode; readonly hmrOptions?: HMROptions | null | undefined; readonly shouldContentHash?: boolean; readonly serveOptions?: InitialServerOptions | false; readonly shouldAutoInstall?: boolean; readonly logLevel?: LogLevel; readonly shouldProfile?: boolean; readonly shouldTrace?: boolean; readonly shouldPatchConsole?: boolean; readonly shouldBuildLazily?: boolean; readonly lazyIncludes?: string[]; readonly lazyExcludes?: string[]; readonly shouldBundleIncrementally?: boolean; readonly unstableFileInvalidations?: Array<Event>; readonly inputFS?: FileSystem; readonly outputFS?: FileSystem; readonly cache?: Cache; readonly workerFarm?: WorkerFarm; readonly packageManager?: PackageManager; readonly detailedReport?: DetailedReportOptions | null | undefined; readonly defaultTargetOptions?: { readonly shouldOptimize?: boolean; readonly shouldScopeHoist?: boolean; readonly sourceMaps?: boolean; readonly publicUrl?: string; readonly distDir?: FilePath; readonly engines?: Engines; readonly outputFormat?: OutputFormat; readonly isLibrary?: boolean; }; readonly additionalReporters?: Array<{ packageName: DependencySpecifier; resolveFrom: FilePath; }>; readonly featureFlags?: Partial<FeatureFlags>; // throwErrors // global? }; export type InitialServerOptions = { readonly publicUrl?: string; readonly host?: string; readonly port: number; readonly https?: HTTPSOptions | boolean; }; export interface PluginOptions { readonly mode: BuildMode; readonly parcelVersion: string; readonly env: EnvMap; readonly hmrOptions: HMROptions | null | undefined; readonly serveOptions: ServerOptions | false; readonly shouldBuildLazily: boolean; readonly shouldAutoInstall: boolean; readonly logLevel: LogLevel; readonly projectRoot: FilePath; readonly cacheDir: FilePath; readonly inputFS: FileSystem; readonly outputFS: FileSystem; readonly packageManager: PackageManager; readonly instanceId: string; readonly detailedReport: DetailedReportOptions | null | undefined; readonly featureFlags: FeatureFlags; } export type ServerOptions = { readonly distDir: FilePath; readonly host?: string; readonly port: number; readonly https?: HTTPSOptions | boolean; readonly publicUrl?: string; }; export type HTTPSOptions = { readonly cert: FilePath; readonly key: FilePath; }; /** * Source locations are 1-based, meaning lines and columns start at 1 */ export type SourceLocation = { readonly filePath: string; /** inclusive */ readonly start: { readonly line: number; readonly column: number; }; /** exclusive */ readonly end: { readonly line: number; readonly column: number; }; }; /** * An object that plugins can write arbitrary data to. */ export type Meta = JSONObject; /** * An identifier in an asset (likely imported/exported). */ export type Symbol = string; /** * A map of export names to the corresponding asset's local variable names. */ export interface AssetSymbols // eslint-disable-next-line no-undef extends Iterable<[Symbol, { local: Symbol; loc: SourceLocation | null | undefined; meta?: Meta | null | undefined; }]> { /** * The exports of the asset are unknown, rather than just empty. * This is the default state. */ readonly isCleared: boolean; get(exportSymbol: Symbol): { local: Symbol; loc: SourceLocation | null | undefined; meta?: Meta | null | undefined; } | null | undefined; hasExportSymbol(exportSymbol: Symbol): boolean; hasLocalSymbol(local: Symbol): boolean; exportSymbols(): Iterable<Symbol>; } export interface MutableAssetSymbols extends AssetSymbols { /** * Initializes the map, sets isCleared to false. */ ensure(): void; set(exportSymbol: Symbol, local: Symbol, loc: SourceLocation | null | undefined, meta?: Meta | null | undefined): void; delete(exportSymbol: Symbol): void; } /** * isWeak means: the symbol is not used by the parent asset itself and is merely reexported */ export interface MutableDependencySymbols // eslint-disable-next-line no-undef extends Iterable<[Symbol, { local: Symbol; loc: SourceLocation | null | undefined; isWeak: boolean; meta?: Meta | null | undefined; }]> { /** * Initializes the map, sets isCleared to false. */ ensure(): void; /** * The symbols that are imports are unknown, rather than just empty. * This is the default state. */ readonly isCleared: boolean; get(exportSymbol: Symbol): { local: Symbol; loc: SourceLocation | null | undefined; isWeak: boolean; meta?: Meta | null | undefined; } | null | undefined; hasExportSymbol(exportSymbol: Symbol): boolean; hasLocalSymbol(local: Symbol): boolean; exportSymbols(): Iterable<Symbol>; set(exportSymbol: Symbol, local: Symbol, loc: SourceLocation | null | undefined, isWeak: boolean | null | undefined): void; delete(exportSymbol: Symbol): void; } export type DependencyPriority = "sync" | "parallel" | "lazy"; export type SpecifierType = "commonjs" | "esm" | "url" | "custom"; /** * Used when creating a Dependency, see that. * @section transformer */ export type DependencyOptions = { /** The specifier used to resolve the dependency. */ readonly specifier: DependencySpecifier; /** * How the specifier should be interpreted. * - esm: An ES module specifier. It is parsed as a URL, but bare specifiers are treated as node_modules. * - commonjs: A CommonJS specifier. It is not parsed as a URL. * - url: A URL that works as in a browser. Bare specifiers are treated as relative URLs. * - custom: A custom specifier. Must be handled by a custom resolver plugin. */ readonly specifierType: SpecifierType; /** * When the dependency should be loaded. * - sync: The dependency should be resolvable synchronously. The resolved asset will be placed * in the same bundle as the parent, or another bundle that's already on the page. * - parallel: The dependency should be placed in a separate bundle that's loaded in parallel * with the current bundle. * - lazy: The dependency should be placed in a separate bundle that's loaded later. * @default 'sync' */ readonly priority?: DependencyPriority; /** * Controls the behavior of the bundle the resolved asset is placed into. Use in combination with `priority` * to determine when the bundle is loaded. * - inline: The resolved asset will be placed into a new inline bundle. Inline bundles are not written * to a separate file, but embedded into the parent bundle. * - isolated: The resolved asset will be isolated from its parents in a separate bundle. * Shared assets will be duplicated. */ readonly bundleBehavior?: BundleBehavior; /** * When the dependency is a bundle entry (priority is "parallel" or "lazy"), this controls the naming * of that bundle. `needsStableName` indicates that the name should be stable over time, even when the * content of the bundle changes. This is useful for entries that a user would manually enter the URL * for, as well as for things like service workers or RSS feeds, where the URL must remain consistent * over time. */ readonly needsStableName?: boolean; /** Whether the dependency is optional. If the dependency cannot be resolved, this will not fail the build. */ readonly isOptional?: boolean; /** The location within the source file where the dependency was found. */ readonly loc?: SourceLocation; /** The environment of the dependency. */ readonly env?: EnvironmentOptions; /** * A list of custom conditions to use when resolving package.json "exports" and "imports". * This is combined with the conditions from the environment. However, it overrides the * default "import" and "require" conditions inferred from the specifierType. To include those * in addition to custom conditions, explicitly add them to this list. */ readonly packageConditions?: Array<string>; /** Plugin-specific metadata for the dependency. */ readonly meta?: Meta; /** The pipeline defined in .parcelrc that the dependency should be processed with. */ readonly pipeline?: string; /** * The file path where the dependency should be resolved from. * By default, this is the path of the source file where the dependency was specified. */ readonly resolveFrom?: FilePath; /** The semver version range expected for the dependency. */ readonly range?: SemverRange; /** The symbols within the resolved module that the source file depends on. */ readonly symbols?: ReadonlyMap<Symbol, { local: Symbol; loc: SourceLocation | null | undefined; isWeak: boolean; meta?: Meta; }>; }; /** * A Dependency denotes a connection between two assets \ * (likely some effect from the importee is expected - be it a side effect or a value is being imported). * * @section transformer */ export interface Dependency { /** The id of the dependency. */ readonly id: string; /** The specifier used to resolve the dependency. */ readonly specifier: DependencySpecifier; /** * How the specifier should be interpreted. * - esm: An ES module specifier. It is parsed as a URL, but bare specifiers are treated as node_modules. * - commonjs: A CommonJS specifier. It is not parsed as a URL. * - url: A URL that works as in a browser. Bare specifiers are treated as relative URLs. * - custom: A custom specifier. Must be handled by a custom resolver plugin. */ readonly specifierType: SpecifierType; /** * When the dependency should be loaded. * - sync: The dependency should be resolvable synchronously. The resolved asset will be placed * in the same bundle as the parent, or another bundle that's already on the page. * - parallel: The dependency should be placed in a separate bundle that's loaded in parallel * with the current bundle. * - lazy: The dependency should be placed in a separate bundle that's loaded later. * @default 'sync' */ readonly priority: DependencyPriority; /** * Controls the behavior of the bundle the resolved asset is placed into. Use in combination with `priority` * to determine when the bundle is loaded. * - inline: The resolved asset will be placed into a new inline bundle. Inline bundles are not written * to a separate file, but embedded into the parent bundle. * - isolated: The resolved asset will be isolated from its parents in a separate bundle. * Shared assets will be duplicated. */ readonly bundleBehavior: BundleBehavior | null | undefined; /** * When the dependency is a bundle entry (priority is "parallel" or "lazy"), this controls the naming * of that bundle. `needsStableName` indicates that the name should be stable over time, even when the * content of the bundle changes. This is useful for entries that a user would manually enter the URL * for, as well as for things like service workers or RSS feeds, where the URL must remain consistent * over time. */ readonly needsStableName: boolean; /** Whether the dependency is optional. If the dependency cannot be resolved, this will not fail the build. */ readonly isOptional: boolean; /** Whether the dependency is an entry. */ readonly isEntry: boolean; /** The location within the source file where the dependency was found. */ readonly loc: SourceLocation | null | undefined; /** The environment of the dependency. */ readonly env: Environment; /** * A list of custom conditions to use when resolving package.json "exports" and "imports". * This is combined with the conditions from the environment. However, it overrides the * default "import" and "require" conditions inferred from the specifierType. To include those * in addition to custom conditions, explicitly add them to this list. */ readonly packageConditions: Array<string> | null | undefined; /** Plugin-specific metadata for the dependency. */ readonly meta: Meta; /** If this is an entry, this is the target that is associated with that entry. */ readonly target: Target | null | undefined; /** The id of the asset with this dependency. */ readonly sourceAssetId: string | null | undefined; /** The file path of the asset with this dependency. */ readonly sourcePath: FilePath | null | undefined; /** The type of the asset that referenced this dependency. */ readonly sourceAssetType: string | null | undefined; /** * The file path where the dependency should be resolved from. * By default, this is the path of the source file where the dependency was specified. */ readonly resolveFrom: FilePath | null | undefined; /** The semver version range expected for the dependency. */ readonly range: SemverRange | null | undefined; /** The pipeline defined in .parcelrc that the dependency should be processed with. */ readonly pipeline: string | null | undefined; // TODO make immutable /** The symbols within the resolved module that the source file depends on. */ readonly symbols: MutableDependencySymbols; } export type File = { readonly filePath: FilePath; readonly hash?: string; }; /** * @section transformer */ export type ASTGenerator = { type: string; version: Semver; }; export type BundleBehavior = "inline" | "isolated"; export type ParcelTransformOptions = { filePath: FilePath; code?: string; env?: EnvironmentOptions; query?: string | null | undefined; }; export type ParcelResolveOptions = { specifier: DependencySpecifier; specifierType: SpecifierType; env?: EnvironmentOptions; resolveFrom?: FilePath; }; export type ParcelResolveResult = { filePath: FilePath; code?: string; query?: string | null | undefined; sideEffects?: boolean; }; /** * An asset represents a file or part of a file. It may represent any data type, including source code, * binary data, etc. Assets may exist in the file system or may be virtual. * * @section transformer */ export interface BaseAsset { /** The id of the asset. */ readonly id: string; /** The file system where the source is located. */ readonly fs: FileSystem; /** The file path of the asset. */ readonly filePath: FilePath; /** * The asset's type. This initially corresponds to the source file extension, * but it may be changed during transformation. */ readonly type: string; /** The transformer options for the asset from the dependency query string. */ readonly query: URLSearchParams; /** The environment of the asset. */ readonly env: Environment; /** * Whether this asset is part of the project, and not an external dependency (e.g. in node_modules). * This indicates that transformation using the project's configuration should be applied. */ readonly isSource: boolean; /** Plugin-specific metadata for the asset. */ readonly meta: Meta; /** * Controls which bundle the asset is placed into. * - inline: The asset will be placed into a new inline bundle. Inline bundles are not written * to a separate file, but embedded into the parent bundle. * - isolated: The asset will be isolated from its parents in a separate bundle. Shared assets * will be duplicated. */ readonly bundleBehavior: BundleBehavior | null | undefined; /** * If the asset is used as a bundle entry, this controls whether that bundle can be split * into multiple, or whether all of the dependencies must be placed in a single bundle. */ readonly isBundleSplittable: boolean; /** * Whether this asset can be omitted if none of its exports are being used. * This is initially set by the resolver, but can be overridden by transformers. */ readonly sideEffects: boolean; /** * When a transformer returns multiple assets, it can give them unique keys to identify them. * This can be used to find assets during packaging, or to create dependencies between multiple * assets returned by a transformer by using the unique key as the dependency specifier. */ readonly uniqueKey: string | null | undefined; /** The type of the AST. */ readonly astGenerator: ASTGenerator | null | undefined; /** The pipeline defined in .parcelrc that the asset should be processed with. */ readonly pipeline: string | null | undefined; /** The symbols that the asset exports. */ readonly symbols: AssetSymbols; /** Returns the current AST. */ getAST(): Promise<AST | null | undefined>; /** Returns the asset contents as a string. */ getCode(): Promise<string>; /** Returns the asset contents as a buffer. */ getBuffer(): Promise<Buffer>; /** Returns the asset contents as a stream. */ getStream(): Readable; /** Returns the source map for the asset, if available. */ getMap(): Promise<SourceMap | null | undefined>; /** Returns a buffer representation of the source map, if available. */ getMapBuffer(): Promise<Buffer | null | undefined>; /** Returns a list of dependencies for the asset. */ getDependencies(): ReadonlyArray<Dependency>; } /** * A mutable Asset, available during transformation. * @section transformer */ export interface MutableAsset extends BaseAsset { /** * The asset's type. This initially corresponds to the source file extension, * but it may be changed during transformation. */ type: string; /** * Controls which bundle the asset is placed into. * - inline: The asset will be placed into a new inline bundle. Inline bundles are not written * to a separate file, but embedded into the parent bundle. * - isolated: The asset will be isolated from its parents in a separate bundle. Shared assets * will be duplicated. */ bundleBehavior: BundleBehavior | null | undefined; /** * If the asset is used as a bundle entry, this controls whether that bundle can be split * into multiple, or whether all of the dependencies must be placed in a single bundle. * @default true */ isBundleSplittable: boolean; /** * Whether this asset can be omitted if none of its exports are being used. * This is initially set by the resolver, but can be overridden by transformers. */ sideEffects: boolean; /** * When a transformer returns multiple assets, it can give them unique keys to identify them. * This can be used to find assets during packaging, or to create dependencies between multiple * assets returned by a transformer by using the unique key as the dependency specifier. */ uniqueKey: string | null | undefined; /** The symbols that the asset exports. */ readonly symbols: MutableAssetSymbols; /** Adds a dependency to the asset. */ addDependency(arg0: DependencyOptions): string; /** * Adds a url dependency to the asset. * This is a shortcut for addDependency that sets the specifierType to 'url' and priority to 'lazy'. */ addURLDependency(url: string, opts: $Shape<DependencyOptions>): string; /** Invalidates the transformation when the given file is modified or deleted. */ invalidateOnFileChange(arg0: FilePath): void; /** Invalidates the transformation when matched files are created. */ invalidateOnFileCreate(arg0: FileCreateInvalidation): void; /** Invalidates the transformation when the given environment variable changes. */ invalidateOnEnvChange(arg0: string): void; /** Invalidates the transformation only when Parcel restarts. */ invalidateOnStartup(): void; /** Invalidates the transformation on every build. */ invalidateOnBuild(): void; /** Sets the asset contents as a string. */ setCode(arg0: string): void; /** Sets the asset contents as a buffer. */ setBuffer(arg0: Buffer): void; /** Sets the asset contents as a stream. */ setStream(arg0: Readable): void; /** Sets the asset's AST. */ setAST(arg0: AST): void; /** Returns whether the AST has been modified. */ isASTDirty(): boolean; /** Sets the asset's source map. */ setMap(arg0: SourceMap | null | undefined): void; setEnvironment(opts: EnvironmentOptions): void; } /** * An immutable Asset, available after transformation. * @section transformer */ export interface Asset extends BaseAsset { /** Statistics about the asset. */ readonly stats: Stats; } export type DevDepOptions = { specifier: DependencySpecifier; resolveFrom: FilePath; range?: SemverRange | null | undefined; /** * When this dev dependency is invalidated, also invalidate these dependencies. * This is useful if the parcel plugin or another parent dependency * has its own cache for this dev dependency other than Node's require cache. */ additionalInvalidations?: Array<{ specifier: DependencySpecifier; resolveFrom: FilePath; range?: SemverRange | null | undefined; }>; }; /** * @section transformer */ export interface Config { /** * Whether this config is part of the project, and not an external dependency (e.g. in node_modules). * This indicates that transformation using the project's configuration should be applied. */ readonly isSource: boolean; /** The path of the file to start searching for config from. */ readonly searchPath: FilePath; /** The environment */ readonly env: Environment; /** Invalidates the config when the given file is modified or deleted. */ invalidateOnFileChange(arg0: FilePath): void; /** Invalidates the config when matched files are created. */ invalidateOnFileCreate(arg0: FileCreateInvalidation): void; /** Invalidates the config when the given environment variable changes. */ invalidateOnEnvChange(arg0: string): void; /** Invalidates the config only when Parcel restarts. */ invalidateOnStartup(): void; /** Invalidates the config on every build. */ invalidateOnBuild(): void; /** * Adds a dev dependency to the config. If the dev dependency or any of its * dependencies change, the config will be invalidated. */ addDevDependency(arg0: DevDepOptions): void; /** * Sets the cache key for the config. By default, this is computed as a hash of the * files passed to invalidateOnFileChange or loaded by getConfig. If none, then a * hash of the result returned from loadConfig is used. This method can be used to * override this behavior and explicitly control the cache key. This can be useful * in cases where only part of a file is used to avoid unnecessary invalidations, * or when the result is not hashable (i.e. contains non-serializable properties like functions). */ setCacheKey(arg0: string): void; /** * Searches for config files with the given names in all parent directories * of the config's searchPath. */ getConfig<T>(filePaths: Array<FilePath>, options?: { packageKey?: string; parse?: boolean; exclude?: boolean; }): Promise<ConfigResultWithFilePath<T> | null | undefined>; /** * Searches for config files with the given names in all parent directories * of the passed searchPath. */ getConfigFrom<T>(searchPath: FilePath, filePaths: Array<FilePath>, options?: { packageKey?: string; parse?: boolean; exclude?: boolean; }): Promise<ConfigResultWithFilePath<T> | null | undefined>; /** Finds the nearest package.json from the config's searchPath. */ getPackage(): Promise<PackageJSON | null | undefined>; } export type Stats = { time: number; size: number; }; /** * @section transformer */ export type GenerateOutput = { readonly content: Blob; readonly map?: SourceMap | null | undefined; }; export type Blob = string | Buffer | Readable; /** * Transformers can return multiple result objects to create new assets. * For example, a file may contain multiple parts of different types, * which should be processed by their respective transformation pipelines. * * @section transformer */ export type TransformerResult = { /** The asset's type. */ readonly type: string; /** The content of the asset. Either content or an AST is required. */ readonly content?: Blob | null | undefined; /** The asset's AST. Either content or an AST is required. */ readonly ast?: AST | null | undefined; /** The source map for the asset. */ readonly map?: SourceMap | null | undefined; /** The dependencies of the asset. */ readonly dependencies?: ReadonlyArray<DependencyOptions>; /** The environment of the asset. The options are merged with the input asset's environment. */ readonly env?: EnvironmentOptions | Environment; /** * Controls which bundle the asset is placed into. * - inline: The asset will be placed into a new inline bundle. Inline bundles are not written * to a separate file, but embedded into the parent bundle. * - isolated: The asset will be isolated from its parents in a separate bundle. Shared assets * will be duplicated. */ readonly bundleBehavior?: BundleBehavior | null | undefined; /** * If the asset is used as a bundle entry, this controls whether that bundle can be split * into multiple, or whether all of the dependencies must be placed in a single bundle. */ readonly isBundleSplittable?: boolean; /** Plugin-specific metadata for the asset. */ readonly meta?: Meta; /** The pipeline defined in .parcelrc that the asset should be processed with. */ readonly pipeline?: string | null | undefined; /** * Whether this asset can be omitted if none of its exports are being used. * This is initially set by the resolver, but can be overridden by transformers. */ readonly sideEffects?: boolean; /** The symbols that the asset exports. */ readonly symbols?: ReadonlyMap<Symbol, { local: Symbol; loc: SourceLocation | null | undefined; }>; /** * When a transformer returns multiple assets, it can give them unique keys to identify them. * This can be used to find assets during packaging, or to create dependencies between multiple * assets returned by a transformer by using the unique key as the dependency specifier. */ readonly uniqueKey?: string | null | undefined; }; export type Async<T> = T | Promise<T>; export interface PluginLogger { /** Logs a diagnostic at the verbose log level. */ verbose(diagnostic: DiagnosticWithoutOrigin | Array<DiagnosticWithoutOrigin>): void; /** Logs a diagnostic at the info log level. */ info(diagnostic: DiagnosticWithoutOrigin | Array<DiagnosticWithoutOrigin>): void; /** Synonym for logger.info. */ log(diagnostic: DiagnosticWithoutOrigin | Array<DiagnosticWithoutOrigin>): void; /** Logs a diagnostic at the verbose warning log level. */ warn(diagnostic: DiagnosticWithoutOrigin | Array<DiagnosticWithoutOrigin>): void; /** Logs a diagnostic at the verbose error log level. */ error(input: Diagnostifiable | DiagnosticWithoutOrigin | Array<DiagnosticWithoutOrigin>): void; } /** * @section transformer */ export type ResolveOptions = { /** * How the specifier should be interpreted. * - esm: An ES module specifier. It is parsed as a URL, but bare specifiers are treated as node_modules. * - commonjs: A CommonJS specifier. It is not parsed as a URL. * - url: A URL that works as in a browser. Bare specifiers are treated as relative URLs. * - custom: A custom specifier. Must be handled by a custom resolver plugin. */ readonly specifierType?: SpecifierType; /** A list of custom conditions to use when resolving package.json "exports" and "imports". */ readonly packageConditions?: Array<string>; }; /** * @section transformer */ export type ResolveFn = (from: FilePath, to: string, options?: ResolveOptions) => Promise<FilePath>; /** * @section validator * @experimental */ type ResolveConfigFn = (configNames: Array<FilePath>) => Promise<FilePath | null | undefined>; /** * @section validator * @experimental */ type ResolveConfigWithPathFn = (configNames: Array<FilePath>, assetFilePath: string) => Promise<FilePath | null | undefined>; /** * @section validator * @experimental */ export type ValidateResult = { warnings: Array<Diagnostic>; errors: Array<Diagnostic>; }; /** * @section validator * @experimental */ export type DedicatedThreadValidator = { validateAll: (arg0: { assets: Asset[]; resolveConfigWithPath: ResolveConfigWithPathFn; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<Array<ValidateResult | null | undefined>>; }; /** * @section validator * @experimental */ export type MultiThreadValidator = { validate: (arg0: { asset: Asset; config: ConfigResult | void; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<ValidateResult | void>; getConfig?: (arg0: { asset: Asset; resolveConfig: ResolveConfigFn; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<ConfigResult | void>; }; /** * @section validator */ export type Validator = DedicatedThreadValidator | MultiThreadValidator; /** * The methods for a transformer plugin. * @section transformer */ export type Transformer<ConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Promise<ConfigType> | ConfigType; /** Whether an AST from a previous transformer can be reused (to prevent double-parsing) */ canReuseAST?: (arg0: { ast: AST; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => boolean; /** Parse the contents into an ast */ parse?: (arg0: { asset: Asset; config: ConfigType; resolve: ResolveFn; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<AST | null | undefined>; /** Transform the asset and/or add new assets */ transform(arg0: { asset: MutableAsset; config: ConfigType; resolve: ResolveFn; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }): Async<Array<TransformerResult | MutableAsset>>; /** * Do some processing after the transformation * @experimental */ postProcess?: (arg0: { assets: Array<MutableAsset>; config: ConfigType; resolve: ResolveFn; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<Array<TransformerResult>>; /** Stringify the AST */ generate?: (arg0: { asset: Asset; ast: AST; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<GenerateOutput>; }; /** * Used to control a traversal * @section bundler */ export type TraversalActions = { /** Skip the current node's children and continue the traversal if there are other nodes in the queue. */ skipChildren(): void; /** Stop the traversal */ stop(): void; }; /** * Essentially GraphTraversalCallback, but allows adding specific node enter and exit callbacks. * @section bundler */ export type GraphVisitor<TNode, TContext> = GraphTraversalCallback<TNode, TContext> | { enter?: GraphTraversalCallback<TNode, TContext>; exit?: GraphTraversalCallback<TNode, TContext>; }; /** * A generic callback for graph traversals * @param context The parent node's return value is passed as a parameter to the children's callback. \ * This can be used to forward information from the parent to children in a DFS (unlike a global variable). * @section bundler */ export type GraphTraversalCallback<TNode, TContext> = (node: TNode, context: TContext | null | undefined, actions: TraversalActions) => TContext | null | undefined; /** * @section bundler */ export type BundleTraversable = { readonly type: "asset"; value: Asset; } | { readonly type: "dependency"; value: Dependency; }; /** * @section bundler */ export type BundleGraphTraversable = { readonly type: "asset"; value: Asset; } | { readonly type: "dependency"; value: Dependency; }; /** * Options for MutableBundleGraph's <code>createBundle</code>. * * If an <code>entryAsset</code> is provided, <code>uniqueKey</code> (for the bundle id), * <code>type</code>, and <code>env</code> will be inferred from the <code>entryAsset</code>. * * If an <code>entryAsset</code> is not provided, <code>uniqueKey</code> (for the bundle id), * <code>type</code>, and <code>env</code> must be provided. * * isSplittable defaults to <code>entryAsset.isSplittable</code> or <code>false</code> * @section bundler */ export type CreateBundleOpts = // If an entryAsset is provided, a bundle id, type, and environment will be // inferred from the entryAsset. { /** The entry asset of the bundle. If provided, many bundle properties will be inferred from it. */ readonly entryAsset: Asset; /** The target of the bundle. Should come from the dependency that created the bundle. */ readonly target: Target; /** * Indicates that the bundle's file name should be stable over time, even when the content of the bundle * changes. This is useful for entries that a user would manually enter the URL for, as well as for things * like service workers or RSS feeds, where the URL must remain consistent over time. */ readonly needsStableName?: boolean | null | undefined; /** * Controls the behavior of the bundle. * to determine when the bundle is loaded. * - inline: Inline bundles are not written to a separate file, but embedded into the parent bundle. * - isolated: The bundle will be isolated from its parents. Shared assets will be duplicated. */ readonly bundleBehavior?: BundleBehavior | null | undefined; /** Name of the manual shared bundle config that caused this bundle to be created */ readonly manualSharedBundle?: string | null | undefined; } // If an entryAsset is not provided, a bundle id, type, and environment must // be provided. | { /** The type of the bundle. */ readonly type: string; /** The environment of the bundle. */ readonly env: Environment; /** A unique value for the bundle to be used in its id. */ readonly uniqueKey: string; /** The target of the bundle. Should come from the dependency that created the bundle. */ readonly target: Target; /** * Indicates that the bundle's file name should be stable over time, even when the content of the bundle * changes. This is useful for entries that a user would manually enter the URL for, as well as for things * like service workers or RSS feeds, where the URL must remain consistent over time. */ readonly needsStableName?: boolean | null | undefined; /** * Controls the behavior of the bundle. * to determine when the bundle is loaded. * - inline: Inline bundles are not written to a separate file, but embedded into the parent bundle. * - isolated: The bundle will be isolated from its parents. Shared assets will be duplicated. */ readonly bundleBehavior?: BundleBehavior | null | undefined; /** * Whether the bundle can be split. If false, then all dependencies of the bundle will be kept * internal to the bundle, rather than referring to other bundles. This may result in assets * being duplicated between multiple bundles, but can be useful for things like server side rendering. */ readonly isSplittable?: boolean | null | undefined; /** The bundle's pipeline, to be used for optimization. Usually based on the pipeline of the entry asset. */ readonly pipeline?: string | null | undefined; /** Name of the manual shared bundle config that caused this bundle to be created */ readonly manualSharedBundle?: string | null | undefined; }; /** * Specifies a symbol in an asset * @section packager */ export type SymbolResolution = { /** The Asset which exports the symbol. */ readonly asset: Asset; /** under which name the symbol is exported */ readonly exportSymbol: Symbol | string; /** The identifier under which the symbol can be referenced. */ readonly symbol: void | null | false | Symbol; /** The location of the specifier that lead to this result. */ readonly loc: SourceLocation | null | undefined; }; /** * @section packager */ export type ExportSymbolResolution = SymbolResolution & { readonly exportAs: Symbol | string; }; /** * A Bundle (a collection of assets) * * @section bundler */ export interface Bundle { /** The bundle id. */ readonly id: string; /** The type of the bundle. */ readonly type: string; /** The environment of the bundle. */ readonly env: Environment; /** The bundle's target. */ readonly target: Target; /** Assets that run when the bundle is loaded (e.g. runtimes could be added). VERIFY */ /** * Indicates that the bundle's file name should be stable over time, even when the content of the bundle * changes. This is useful for entries that a user would manually enter the URL for, as well as for things * like service workers or RSS feeds, where the URL must remain consistent over time. */ readonly needsStableName: boolean | null | undefined; /** * Controls the behavior of the bundle. * to determine when the bundle is loaded. * - inline: Inline bundles are not written to a separate file, but embedded into the parent bundle. * - isolated: The bundle will be isolated from its parents. Shared assets will be duplicated. */ readonly bundleBehavior: BundleBehavior | null | undefined; /** * Whether the bundle can be split. If false, then all dependencies of the bundle will be kept * internal to the bundle, rather than referring to other bundles. This may result in assets * being duplicated between multiple bundles, but can be useful for things like server side rendering. */ readonly isSplittable: boolean | null | undefined; /** * A placeholder for the bundle's content hash that can be used in the bundle's name or the contents of another * bundle. Hash references are replaced with a content hash of the bundle after packaging and optimizing. */ readonly hashReference: string; /** * Returns the assets that are executed immediately when the bundle is loaded. * Some bundles may not have any entry assets, for example, shared bundles. */ getEntryAssets(): Array<Asset>; /** * Returns the main entry of the bundle, which will provide the bundle's exports. * Some bundles do not have a main entry, for example, shared bundles. */ getMainEntry(): Asset | null | undefined; /** Returns whether the bundle includes the given asset. */ hasAsset(arg0: Asset): boolean; /** Returns whether the bundle includes the given dependency. */ hasDependency(arg0: Dependency): boolean; /** Traverses the assets in the bundle. */ traverseAssets<TContext>(visit: GraphVisitor<Asset, TContext>, startAsset?: Asset): TContext | null | undefined; /** Traverses assets and dependencies in the bundle. */ traverse<TContext>(visit: GraphVisitor<BundleTraversable, TContext>): TContext | null | undefined; } /** * A Bundle that got named by a Namer * @section bundler */ export interface NamedBundle extends Bundle { /** A shortened version of the bundle id that is used to refer to the bundle at runtime. */ readonly publicId: string; /** * The bundle's name. This is a file path relative to the bundle's target directory. * The bundle name may include a hash reference, but not the final content hash. */ readonly name: string; /** A version of the bundle's name with hash references removed for display. */ readonly displayName: string; } export interface PackagedBundle extends NamedBundle { /** The absolute file path of the written bundle, including the final content hash if any. */ readonly filePath: FilePath; /** Statistics about the bundle. */ readonly stats: Stats; /** A list of all of the files written for this bundle. */ readonly files: Array<PackagedBundleFile>; } export interface PackagedBundleFile { /** The absolute file path of the written file, including the final content hash if any. */ readonly filePath: FilePath; /** Statistics about the file. */ readonly stats: Stats; } /** * A collection of sibling bundles (which are stored in the BundleGraph) that should be loaded together (in order). * @section bundler */ export interface BundleGroup { /** The target of the bundle group. */ readonly target: Target; /** The id of the entry asset in the bundle group, which is executed immediately when the bundle group is loaded. */ readonly entryAssetId: string; } /** * A BundleGraph in the Bundler that can be modified * @section bundler * @experimental */ export interface MutableBundleGraph extends BundleGraph<Bundle> { /** Add asset and all child nodes to the bundle. */ addAssetGraphToBundle(arg0: Asset, arg1: Bundle, shouldSkipDependency?: (arg0: Dependency) => boolean): void; addAssetToBundle(arg0: Asset, arg1: Bundle): void; /** * Adds an asset as an entry to a bundle. Entry assets are executed immediately * when the bundle is loaded. */ addEntryToBundle(arg0: Asset, arg1: Bundle, shouldSkipDependency?: (arg0: Dependency) => boolean): void; /** Adds the Bundle to the BundleGroup, loading it along with others in the group */ addBundleToBundleGroup(arg0: Bundle, arg1: BundleGroup): void; createAssetReference(arg0: Dependency, arg1: Asset, arg2: Bundle): void; createBundleReference(arg0: Bundle, arg1: Bundle): void; createBundle(arg0: CreateBundleOpts): Bundle; /** Turns an edge (Dependency -> Asset-s) into (Dependency -> BundleGroup -> Asset-s) */ createBundleGroup(arg0: Dependency, arg1: Target): BundleGroup; /** @returns all Asset-s attached to the Dependency */ getDependencyAssets(arg0: Dependency): Array<Asset>; /** Get Bundles that load this bundle asynchronously. */ getParentBundlesOfBundleGroup(arg0: BundleGroup): Array<Bundle>; /** @returns the size in bytes of an asset and all assets in its subgraph */ getTotalSize(arg0: Asset): number; /** * Recursively removes an asset and its dependencies from a bundle. Stops at * bundle group boundaries. */ removeAssetGraphFromBundle(arg0: Asset, arg1: Bundle): void; /** * Removes a BundleGroup from the graph. If any of the group's Bundle-s no * longer exist in the graph, those are removed as well. */ removeBundleGroup(bundleGroup: BundleGroup): void; /** Turns a dependency to a different bundle into a dependency to an asset inside <code>bundle</code>. */ internalizeAsyncDependency(bundle: Bundle, dependency: Dependency): void; } /** * A Graph that contains Bundle-s, Asset-s, Dependency-s, BundleGroup-s * @section bundler */ export interface BundleGraph<TBundle extends Bundle> { /** Retrieves an asset by id. */ getAssetById(id: string): Asset; /** Returns the public (short) id for an asset. */ getAssetPublicId(asset: Asset): string; /** Returns a list of bundles in the bundle graph. By default, inline bundles are excluded. */ getBundles(opts?: { includeInline: boolean; }): Array<TBundle>; /** Traverses the assets and dependencies in the bundle graph, in depth first order. */ traverse<TContext>(visit: GraphVisitor<BundleGraphTraversable, TContext>, startAsset: Asset | null | undefined, options?: { skipUnusedDependencies?: boolean; }): TContext | null | undefined; /** Traverses all bundles in the bundle graph, including inline bundles, in depth first order. */ traverseBundles<TContext>(visit: GraphVisitor<TBundle, TContext>, startBundle: Bundle | null | undefined): TContext | null | undefined; /** Returns a list of bundle groups that load the given bundle. */ getBundleGroupsContainingBundle(bundle: Bundle): Array<BundleGroup>; /** Returns a list of bundles that load together in the given bundle group. */ getBundlesInBundleGroup(bundleGroup: BundleGroup, opts?: { recursive?: boolean; includeInline?: boolean; includeIsolated?: boolean; }): Array<TBundle>; /** Returns a list of bundles that this bundle loads asynchronously. */ getChildBundles(bundle: Bundle): Array<TBundle>; /** Returns a list of bundles that load this bundle asynchronously. */ getParentBundles(bundle: Bundle): Array<TBundle>; /** Returns whether the bundle was loaded by another bundle of the given type. */ hasParentBundleOfType(bundle: Bundle, type: string): boolean; /** Returns a list of bundles that are referenced by this bundle. By default, inline bundles are excluded. */ getReferencedBundles(bundle: Bundle, opts?: { recursive?: boolean; includeInline?: boolean; includeIsolated?: boolean; }): Array<TBundle>; /** Returns a list of bundles that reference this bundle. */ getReferencingBundles(bundle: Bundle): Array<TBundle>; /** Get the dependencies that the asset requires */ getDependencies(asset: Asset): Array<Dependency>; /** Get the dependencies that require the asset */ getIncomingDependencies(asset: Asset): Array<Dependency>; /** Get the asset that created the dependency. */ getAssetWithDependency(dep: Dependency): Asset | null | undefined; /** Returns whether the given bundle group is an entry. */ isEntryBundleGroup(bundleGroup: BundleGroup): boolean; /** * Returns undefined if the specified dependency was excluded or wasn't async \ * and otherwise the BundleGroup or Asset that the dependency resolves to. */ resolveAsyncDependency(dependency: Dependency, bundle: Bundle | null | undefined): ({ type: "bundle_group"; value: BundleGroup; } | { type: "asset"; value: Asset; }) | null | undefined; /** Returns whether a dependency was excluded because it had no used symbols. */ isDependencySkipped(dependency: Dependency): boolean; /** * Returns the asset that the dependency resolved to. * If a bundle is given, assets in that bundle are preferred. * Returns null if the dependency was excluded. */ getResolvedAsset(dependency: Dependency, bundle: Bundle | null | undefined): Asset | null | undefined; /** Returns the bundle that a dependency in a given bundle references, if any. */ getReferencedBundle(dependency: Dependency, bundle: Bundle): TBundle | null | undefined; /** Returns a list of bundles that contain the given asset. */ getBundlesWithAsset(arg0: Asset): Array<TBundle>; /** Returns a list of bundles that contain the given dependency. */ getBundlesWithDependency(arg0: Dependency): Array<TBundle>; /** * Returns whether the given asset is reachable in a sibling, or all possible * ancestries of the given bundle. This indicates that the asset may be excluded * from the given bundle. */ isAssetReachableFromBundle(asset: Asset, bundle: Bundle): boolean; /** Returns whether an asset is referenced outside the given bundle. */ isAssetReferenced(bundle: Bundle, asset: Asset): boolean; /** * Resolves the export `symbol` of `asset` to the source, * stopping at the first asset after leaving `bundle`. * `symbol === null`: bailout (== caller should do `asset.exports[exportsSymbol]`) * `symbol === undefined`: symbol not found * `symbol === false`: skipped * * <code>asset</code> exports <code>symbol</code>, try to find the asset where the \ * corresponding variable lives (resolves re-exports). Stop resolving transitively once \ * <code>boundary</code> was left (<code>bundle.hasAsset(asset) === false</code>), then <code>result.symbol</code> is undefined. */ getSymbolResolution(asset: Asset, symbol: Symbol, boundary: Bundle | null | undefined): SymbolResolution; /** Returns a list of symbols that are exported by the asset, including re-exports. */ getExportedSymbols(asset: Asset, boundary: Bundle | null | undefined): Array<ExportSymbolResolution>; /** * Returns a list of symbols from an asset or dependency that are referenced by a dependent asset. * * Returns null if symbol propagation didn't run (so the result is unknown). */ getUsedSymbols(arg0: Asset | Dependency): ReadonlySet<Symbol> | null | undefined; /** Returns the common root directory for the entry assets of a target. */ getEntryRoot(target: Target): FilePath; /** Returns a list of entry bundles. */ getEntryBundles(): Array<TBundle>; } /** * @section bundler */ export type BundleResult = { readonly contents: Blob; readonly ast?: AST; readonly map?: SourceMap | null | undefined; readonly type?: string; }; /** * @section resolver */ export type ResolveResult = { /** An absolute path to the resolved file. */ readonly filePath?: FilePath; /** An optional named pipeline to use to compile the resolved file. */ readonly pipeline?: string | null | undefined; /** Query parameters to be used by transformers when compiling the resolved file. */ readonly query?: URLSearchParams; /** Whether the resolved file should be excluded from the build. */ readonly isExcluded?: boolean; /** Overrides the priority set on the dependency. */ readonly priority?: DependencyPriority; /** Corresponds to BaseAsset's <code>sideEffects</code>. */ readonly sideEffects?: boolean; /** The code of the resolved asset. If provided, this is used rather than reading the file from disk. */ readonly code?: string; /** Whether this dependency can be deferred by Parcel itself (true by default). */ readonly canDefer?: boolean; /** A resolver might return diagnostics to also run subsequent resolvers while still providing a reason why it failed. */ readonly diagnostics?: Diagnostic | Array<Diagnostic>; /** Is spread (shallowly merged) onto the request's dependency.meta */ readonly meta?: JSONObject; /** A list of file paths or patterns that should invalidate the resolution if created. */ readonly invalidateOnFileCreate?: Array<FileCreateInvalidation>; /** A list of files that should invalidate the resolution if modified or deleted. */ readonly invalidateOnFileChange?: Array<FilePath>; /** Invalidates the resolution when the given environment variable changes.*/ readonly invalidateOnEnvChange?: Array<string>; }; /** * Turns an asset graph into a BundleGraph. * * bundle and optimize run in series and are functionally identitical. * @section bundler */ export type Bundler<ConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Promise<ConfigType> | ConfigType; bundle(arg0: { bundleGraph: MutableBundleGraph; config: ConfigType; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }): Async<void>; optimize(arg0: { bundleGraph: MutableBundleGraph; config: ConfigType; options: PluginOptions; logger: PluginLogger; }): Async<void>; }; /** * @section namer */ export type Namer<ConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Promise<ConfigType> | ConfigType; /** Return a filename/-path for <code>bundle</code> or nullish to leave it to the next namer plugin. */ name(arg0: { bundle: Bundle; bundleGraph: BundleGraph<Bundle>; config: ConfigType; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }): Async<FilePath | null | undefined>; }; /** * A "synthetic" asset that will be inserted into the bundle graph. * @section runtime */ export type RuntimeAsset = { readonly filePath: FilePath; readonly code: string; readonly dependency?: Dependency; readonly isEntry?: boolean; readonly env?: EnvironmentOptions; readonly shouldReplaceResolution?: boolean; }; /** * @section runtime */ export type Runtime<ConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Promise<ConfigType> | ConfigType; apply(arg0: { bundle: NamedBundle; bundleGraph: BundleGraph<NamedBundle>; config: ConfigType; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }): Async<void | RuntimeAsset | Array<RuntimeAsset>>; }; /** * @section packager */ export type Packager<ConfigType, BundleConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<ConfigType>; loadBundleConfig?: (arg0: { bundle: NamedBundle; bundleGraph: BundleGraph<NamedBundle>; config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<BundleConfigType>; package(arg0: { bundle: NamedBundle; bundleGraph: BundleGraph<NamedBundle>; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; config: ConfigType; bundleConfig: BundleConfigType; getInlineBundleContents: (arg0: Bundle, arg1: BundleGraph<NamedBundle>) => Async<{ contents: Blob; }>; getSourceMapReference: (map: SourceMap | null | undefined) => Async<string | null | undefined>; }): Async<BundleResult | BundleResult[]>; }; /** * @section optimizer */ export type Optimizer<ConfigType, BundleConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<ConfigType>; loadBundleConfig?: (arg0: { bundle: NamedBundle; bundleGraph: BundleGraph<NamedBundle>; config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Async<BundleConfigType>; optimize(arg0: { bundle: NamedBundle; bundleGraph: BundleGraph<NamedBundle>; contents: Blob; map: SourceMap | null | undefined; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; config: ConfigType; bundleConfig: BundleConfigType; getSourceMapReference: (map: SourceMap | null | undefined) => Async<string | null | undefined>; }): Async<BundleResult>; }; /** * @section compressor */ export type Compressor = { compress(arg0: { stream: Readable; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }): Async<{ stream: Readable; type?: string; } | null | undefined>; }; /** * @section resolver */ export type Resolver<ConfigType> = { loadConfig?: (arg0: { config: Config; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }) => Promise<ConfigType> | ConfigType; resolve(arg0: { dependency: Dependency; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; specifier: FilePath; pipeline: string | null | undefined; config: ConfigType; }): Async<ResolveResult | null | undefined>; }; /** * @section reporter */ export type ProgressLogEvent = { readonly type: "log"; readonly level: "progress"; readonly phase?: string; readonly message: string; }; /** * A log event with a rich diagnostic * @section reporter */ export type DiagnosticLogEvent = { readonly type: "log"; readonly level: "error" | "warn" | "info" | "verbose"; readonly diagnostics: Array<Diagnostic>; }; /** * @section reporter */ export type TextLogEvent = { readonly type: "log"; readonly level: "success"; readonly message: string; }; /** * @section reporter */ export type LogEvent = ProgressLogEvent | DiagnosticLogEvent | TextLogEvent; /** * The build just started. * @section reporter */ export type BuildStartEvent = { readonly type: "buildStart"; }; /** * The build just started in watch mode. * @section reporter */ export type WatchStartEvent = { readonly type: "watchStart"; }; /** * The build just ended in watch mode. * @section reporter */ export type WatchEndEvent = { readonly type: "watchEnd"; }; /** * A new Dependency is being resolved. * @section reporter */ export type ResolvingProgressEvent = { readonly type: "buildProgress"; readonly phase: "resolving"; readonly dependency: Dependency; }; /** * A new Asset is being transformed. * @section reporter */ export type TransformingProgressEvent = { readonly type: "buildProgress"; readonly phase: "transforming"; readonly filePath: FilePath; }; /** * The BundleGraph is generated. * @section reporter */ export type BundlingProgressEvent = { readonly type: "buildProgress"; readonly phase: "bundling"; }; export type BundledProgressEvent = { readonly type: "buildProgress"; readonly phase: "bundled"; readonly bundleGraph: BundleGraph<NamedBundle>; readonly changedAssets: Map<string, Asset>; }; /** * A new Bundle is being packaged. * @section reporter */ export type PackagingProgressEvent = { readonly type: "buildProgress"; readonly phase: "packaging"; readonly bundle: NamedBundle; }; /** * A new Bundle is being optimized. * @section reporter */ export type OptimizingProgressEvent = { readonly type: "buildProgress"; readonly phase: "optimizing"; readonly bundle: NamedBundle; }; /** * @section reporter */ export type BuildProgressEvent = ResolvingProgressEvent | TransformingProgressEvent | BundlingProgressEvent | BundledProgressEvent | PackagingProgressEvent | OptimizingProgressEvent; /** * The build was successful. * @section reporter */ export type BuildSuccessEvent = { readonly type: "buildSuccess"; readonly bundleGraph: BundleGraph<PackagedBundle>; readonly buildTime: number; readonly changedAssets: Map<string, Asset>; readonly requestBundle: (bundle: NamedBundle) => Promise<BuildSuccessEvent>; readonly unstable_requestStats: Record<string, number>; }; /** * The build failed. * @section reporter */ export type BuildFailureEvent = { readonly type: "buildFailure"; readonly diagnostics: Array<Diagnostic>; readonly unstable_requestStats: Record<string, number>; }; /** * @section reporter */ export type BuildEvent = BuildFailureEvent | BuildSuccessEvent; /** * A new file is being validated. * @section reporter */ export type ValidationEvent = { readonly type: "validation"; readonly filePath: FilePath; }; /** * A trace event has occured. * Loosely modeled on Chrome's Trace Event format: https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview * * @section reporter */ export type TraceEvent = { readonly type: "trace"; readonly ts: number; readonly duration: number; readonly name: string; readonly tid: number; readonly pid: number; readonly categories: string[]; readonly args?: Record<string, unknown>; }; export type CacheEvent = { type: "cache"; phase: string; total: number; size: number; }; /** * @section reporter */ export type ReporterEvent = LogEvent | BuildStartEvent | BuildProgressEvent | BuildSuccessEvent | BuildFailureEvent | WatchStartEvent | WatchEndEvent | ValidationEvent | TraceEvent | CacheEvent; /** * @section reporter */ export type Reporter = { report(arg0: { event: ReporterEvent; options: PluginOptions; logger: PluginLogger; tracer: PluginTracer; }): Async<void>; }; export interface ErrorWithCode extends Error { readonly code?: string; } export interface IDisposable { dispose(): unknown; } export type AsyncSubscription = { unsubscribe(): Promise<unknown>; }; export interface PluginTracer { /** Returns whether the tracer is enabled. Use this to avoid possibly expensive calculations * of arguments to `createMeasurement` - for example if you need to determine the entry of a bundle to pass it * in as the <code>argumentName</code>, you would only do this if the tracer is enabled. */ readonly enabled: boolean; /** * Creates a new trace measurement with the specified name. This name should reflect the current plugin or * function being executed (for example, the name of a Babel transform). The category will default to the name of your plugin, * however it should be set to reflect the type of operation (for example, for a hypothetical operation * to find CSS in an asset within a Compiled plugin you might set this to <code>find_css<code>). * * If this is an operation that executes multiple times on different things - whether that's assets, bundles, or * otherwise - specify the name of the context object in <code>argumentName</code>. * * <code>otherArgs</code> can be used for specifying any other key/value pairs * that should be written to the trace. * * For example: <code>tracer.createMeasurement('compiled', 'find_css', path.relative(options.projecRoot, asset.filePath), { meta: 'data' })</code> */ createMeasurement(name: string, category?: string, argumentName?: string, otherArgs?: Record<string, unknown>): TraceMeasurement | null; }