567 lines
16 KiB
Go
567 lines
16 KiB
Go
|
// This API exposes esbuild's two main operations: building and transforming.
|
||
|
// It's intended for integrating esbuild into other tools as a library.
|
||
|
//
|
||
|
// If you are just trying to run esbuild from Go without the overhead of
|
||
|
// creating a child process, there is also an API for the command-line
|
||
|
// interface itself: https://godoc.org/github.com/evanw/esbuild/pkg/cli.
|
||
|
//
|
||
|
// Build API
|
||
|
//
|
||
|
// This function runs an end-to-end build operation. It takes an array of file
|
||
|
// paths as entry points, parses them and all of their dependencies, and
|
||
|
// returns the output files to write to the file system. The available options
|
||
|
// roughly correspond to esbuild's command-line flags.
|
||
|
//
|
||
|
// Example usage:
|
||
|
//
|
||
|
// package main
|
||
|
//
|
||
|
// import (
|
||
|
// "os"
|
||
|
//
|
||
|
// "github.com/evanw/esbuild/pkg/api"
|
||
|
// )
|
||
|
//
|
||
|
// func main() {
|
||
|
// result := api.Build(api.BuildOptions{
|
||
|
// EntryPoints: []string{"input.js"},
|
||
|
// Outfile: "output.js",
|
||
|
// Bundle: true,
|
||
|
// Write: true,
|
||
|
// LogLevel: api.LogLevelInfo,
|
||
|
// })
|
||
|
//
|
||
|
// if len(result.Errors) > 0 {
|
||
|
// os.Exit(1)
|
||
|
// }
|
||
|
// }
|
||
|
//
|
||
|
// Transform API
|
||
|
//
|
||
|
// This function transforms a string of source code into JavaScript. It can be
|
||
|
// used to minify JavaScript, convert TypeScript/JSX to JavaScript, or convert
|
||
|
// newer JavaScript to older JavaScript. The available options roughly
|
||
|
// correspond to esbuild's command-line flags.
|
||
|
//
|
||
|
// Example usage:
|
||
|
//
|
||
|
// package main
|
||
|
//
|
||
|
// import (
|
||
|
// "fmt"
|
||
|
// "os"
|
||
|
//
|
||
|
// "github.com/evanw/esbuild/pkg/api"
|
||
|
// )
|
||
|
//
|
||
|
// func main() {
|
||
|
// jsx := `
|
||
|
// import * as React from 'react'
|
||
|
// import * as ReactDOM from 'react-dom'
|
||
|
//
|
||
|
// ReactDOM.render(
|
||
|
// <h1>Hello, world!</h1>,
|
||
|
// document.getElementById('root')
|
||
|
// );
|
||
|
// `
|
||
|
//
|
||
|
// result := api.Transform(jsx, api.TransformOptions{
|
||
|
// Loader: api.LoaderJSX,
|
||
|
// })
|
||
|
//
|
||
|
// fmt.Printf("%d errors and %d warnings\n",
|
||
|
// len(result.Errors), len(result.Warnings))
|
||
|
//
|
||
|
// os.Stdout.Write(result.Code)
|
||
|
// }
|
||
|
//
|
||
|
package api
|
||
|
|
||
|
type SourceMap uint8
|
||
|
|
||
|
const (
|
||
|
SourceMapNone SourceMap = iota
|
||
|
SourceMapInline
|
||
|
SourceMapLinked
|
||
|
SourceMapExternal
|
||
|
SourceMapInlineAndExternal
|
||
|
)
|
||
|
|
||
|
type SourcesContent uint8
|
||
|
|
||
|
const (
|
||
|
SourcesContentInclude SourcesContent = iota
|
||
|
SourcesContentExclude
|
||
|
)
|
||
|
|
||
|
type LegalComments uint8
|
||
|
|
||
|
const (
|
||
|
LegalCommentsDefault LegalComments = iota
|
||
|
LegalCommentsNone
|
||
|
LegalCommentsInline
|
||
|
LegalCommentsEndOfFile
|
||
|
LegalCommentsLinked
|
||
|
LegalCommentsExternal
|
||
|
)
|
||
|
|
||
|
type JSXMode uint8
|
||
|
|
||
|
const (
|
||
|
JSXModeTransform JSXMode = iota
|
||
|
JSXModePreserve
|
||
|
)
|
||
|
|
||
|
type Target uint8
|
||
|
|
||
|
const (
|
||
|
DefaultTarget Target = iota
|
||
|
ESNext
|
||
|
ES5
|
||
|
ES2015
|
||
|
ES2016
|
||
|
ES2017
|
||
|
ES2018
|
||
|
ES2019
|
||
|
ES2020
|
||
|
ES2021
|
||
|
)
|
||
|
|
||
|
type Loader uint8
|
||
|
|
||
|
const (
|
||
|
LoaderNone Loader = iota
|
||
|
LoaderJS
|
||
|
LoaderJSX
|
||
|
LoaderTS
|
||
|
LoaderTSX
|
||
|
LoaderJSON
|
||
|
LoaderText
|
||
|
LoaderBase64
|
||
|
LoaderDataURL
|
||
|
LoaderFile
|
||
|
LoaderBinary
|
||
|
LoaderCSS
|
||
|
LoaderDefault
|
||
|
)
|
||
|
|
||
|
type Platform uint8
|
||
|
|
||
|
const (
|
||
|
PlatformBrowser Platform = iota
|
||
|
PlatformNode
|
||
|
PlatformNeutral
|
||
|
)
|
||
|
|
||
|
type Format uint8
|
||
|
|
||
|
const (
|
||
|
FormatDefault Format = iota
|
||
|
FormatIIFE
|
||
|
FormatCommonJS
|
||
|
FormatESModule
|
||
|
)
|
||
|
|
||
|
type EngineName uint8
|
||
|
|
||
|
const (
|
||
|
EngineChrome EngineName = iota
|
||
|
EngineEdge
|
||
|
EngineFirefox
|
||
|
EngineIOS
|
||
|
EngineNode
|
||
|
EngineSafari
|
||
|
)
|
||
|
|
||
|
type Engine struct {
|
||
|
Name EngineName
|
||
|
Version string
|
||
|
}
|
||
|
|
||
|
type Location struct {
|
||
|
File string
|
||
|
Namespace string
|
||
|
Line int // 1-based
|
||
|
Column int // 0-based, in bytes
|
||
|
Length int // in bytes
|
||
|
LineText string
|
||
|
Suggestion string
|
||
|
}
|
||
|
|
||
|
type Message struct {
|
||
|
PluginName string
|
||
|
Text string
|
||
|
Location *Location
|
||
|
Notes []Note
|
||
|
|
||
|
// Optional user-specified data that is passed through unmodified. You can
|
||
|
// use this to stash the original error, for example.
|
||
|
Detail interface{}
|
||
|
}
|
||
|
|
||
|
type Note struct {
|
||
|
Text string
|
||
|
Location *Location
|
||
|
}
|
||
|
|
||
|
type StderrColor uint8
|
||
|
|
||
|
const (
|
||
|
ColorIfTerminal StderrColor = iota
|
||
|
ColorNever
|
||
|
ColorAlways
|
||
|
)
|
||
|
|
||
|
type LogLevel uint8
|
||
|
|
||
|
const (
|
||
|
LogLevelSilent LogLevel = iota
|
||
|
LogLevelVerbose
|
||
|
LogLevelDebug
|
||
|
LogLevelInfo
|
||
|
LogLevelWarning
|
||
|
LogLevelError
|
||
|
)
|
||
|
|
||
|
type Charset uint8
|
||
|
|
||
|
const (
|
||
|
CharsetDefault Charset = iota
|
||
|
CharsetASCII
|
||
|
CharsetUTF8
|
||
|
)
|
||
|
|
||
|
type TreeShaking uint8
|
||
|
|
||
|
const (
|
||
|
TreeShakingDefault TreeShaking = iota
|
||
|
TreeShakingFalse
|
||
|
TreeShakingTrue
|
||
|
)
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// Build API
|
||
|
|
||
|
type BuildOptions struct {
|
||
|
Color StderrColor // Documentation: https://esbuild.github.io/api/#color
|
||
|
LogLimit int // Documentation: https://esbuild.github.io/api/#log-limit
|
||
|
LogLevel LogLevel // Documentation: https://esbuild.github.io/api/#log-level
|
||
|
|
||
|
Sourcemap SourceMap // Documentation: https://esbuild.github.io/api/#sourcemap
|
||
|
SourceRoot string // Documentation: https://esbuild.github.io/api/#source-root
|
||
|
SourcesContent SourcesContent // Documentation: https://esbuild.github.io/api/#sources-content
|
||
|
|
||
|
Target Target // Documentation: https://esbuild.github.io/api/#target
|
||
|
Engines []Engine // Documentation: https://esbuild.github.io/api/#target
|
||
|
|
||
|
MinifyWhitespace bool // Documentation: https://esbuild.github.io/api/#minify
|
||
|
MinifyIdentifiers bool // Documentation: https://esbuild.github.io/api/#minify
|
||
|
MinifySyntax bool // Documentation: https://esbuild.github.io/api/#minify
|
||
|
Charset Charset // Documentation: https://esbuild.github.io/api/#charset
|
||
|
TreeShaking TreeShaking // Documentation: https://esbuild.github.io/api/#tree-shaking
|
||
|
IgnoreAnnotations bool // Documentation: https://esbuild.github.io/api/#ignore-annotations
|
||
|
LegalComments LegalComments // Documentation: https://esbuild.github.io/api/#legal-comments
|
||
|
|
||
|
JSXMode JSXMode // Documentation: https://esbuild.github.io/api/#jsx-mode
|
||
|
JSXFactory string // Documentation: https://esbuild.github.io/api/#jsx-factory
|
||
|
JSXFragment string // Documentation: https://esbuild.github.io/api/#jsx-fragment
|
||
|
|
||
|
Define map[string]string // Documentation: https://esbuild.github.io/api/#define
|
||
|
Pure []string // Documentation: https://esbuild.github.io/api/#pure
|
||
|
KeepNames bool // Documentation: https://esbuild.github.io/api/#keep-names
|
||
|
|
||
|
GlobalName string // Documentation: https://esbuild.github.io/api/#global-name
|
||
|
Bundle bool // Documentation: https://esbuild.github.io/api/#bundle
|
||
|
PreserveSymlinks bool // Documentation: https://esbuild.github.io/api/#preserve-symlinks
|
||
|
Splitting bool // Documentation: https://esbuild.github.io/api/#splitting
|
||
|
Outfile string // Documentation: https://esbuild.github.io/api/#outfile
|
||
|
Metafile bool // Documentation: https://esbuild.github.io/api/#metafile
|
||
|
Outdir string // Documentation: https://esbuild.github.io/api/#outdir
|
||
|
Outbase string // Documentation: https://esbuild.github.io/api/#outbase
|
||
|
AbsWorkingDir string // Documentation: https://esbuild.github.io/api/#working-directory
|
||
|
Platform Platform // Documentation: https://esbuild.github.io/api/#platform
|
||
|
Format Format // Documentation: https://esbuild.github.io/api/#format
|
||
|
External []string // Documentation: https://esbuild.github.io/api/#external
|
||
|
MainFields []string // Documentation: https://esbuild.github.io/api/#main-fields
|
||
|
Conditions []string // Documentation: https://esbuild.github.io/api/#conditions
|
||
|
Loader map[string]Loader // Documentation: https://esbuild.github.io/api/#loader
|
||
|
ResolveExtensions []string // Documentation: https://esbuild.github.io/api/#resolve-extensions
|
||
|
Tsconfig string // Documentation: https://esbuild.github.io/api/#tsconfig
|
||
|
OutExtensions map[string]string // Documentation: https://esbuild.github.io/api/#out-extension
|
||
|
PublicPath string // Documentation: https://esbuild.github.io/api/#public-path
|
||
|
Inject []string // Documentation: https://esbuild.github.io/api/#inject
|
||
|
Banner map[string]string // Documentation: https://esbuild.github.io/api/#banner
|
||
|
Footer map[string]string // Documentation: https://esbuild.github.io/api/#footer
|
||
|
NodePaths []string // Documentation: https://esbuild.github.io/api/#node-paths
|
||
|
|
||
|
EntryNames string // Documentation: https://esbuild.github.io/api/#entry-names
|
||
|
ChunkNames string // Documentation: https://esbuild.github.io/api/#chunk-names
|
||
|
AssetNames string // Documentation: https://esbuild.github.io/api/#asset-names
|
||
|
|
||
|
EntryPoints []string // Documentation: https://esbuild.github.io/api/#entry-points
|
||
|
EntryPointsAdvanced []EntryPoint // Documentation: https://esbuild.github.io/api/#entry-points
|
||
|
|
||
|
Stdin *StdinOptions // Documentation: https://esbuild.github.io/api/#stdin
|
||
|
Write bool // Documentation: https://esbuild.github.io/api/#write
|
||
|
AllowOverwrite bool // Documentation: https://esbuild.github.io/api/#allow-overwrite
|
||
|
Incremental bool // Documentation: https://esbuild.github.io/api/#incremental
|
||
|
Plugins []Plugin // Documentation: https://esbuild.github.io/plugins/
|
||
|
|
||
|
Watch *WatchMode // Documentation: https://esbuild.github.io/api/#watch
|
||
|
}
|
||
|
|
||
|
type EntryPoint struct {
|
||
|
InputPath string
|
||
|
OutputPath string
|
||
|
}
|
||
|
|
||
|
type WatchMode struct {
|
||
|
OnRebuild func(BuildResult)
|
||
|
}
|
||
|
|
||
|
type StdinOptions struct {
|
||
|
Contents string
|
||
|
ResolveDir string
|
||
|
Sourcefile string
|
||
|
Loader Loader
|
||
|
}
|
||
|
|
||
|
type BuildResult struct {
|
||
|
Errors []Message
|
||
|
Warnings []Message
|
||
|
|
||
|
OutputFiles []OutputFile
|
||
|
Metafile string
|
||
|
|
||
|
Rebuild func() BuildResult // Only when "Incremental: true"
|
||
|
Stop func() // Only when "Watch: true"
|
||
|
}
|
||
|
|
||
|
type OutputFile struct {
|
||
|
Path string
|
||
|
Contents []byte
|
||
|
}
|
||
|
|
||
|
// Documentation: https://esbuild.github.io/api/#build-api
|
||
|
func Build(options BuildOptions) BuildResult {
|
||
|
return buildImpl(options).result
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// Transform API
|
||
|
|
||
|
type TransformOptions struct {
|
||
|
Color StderrColor // Documentation: https://esbuild.github.io/api/#color
|
||
|
LogLimit int // Documentation: https://esbuild.github.io/api/#log-limit
|
||
|
LogLevel LogLevel // Documentation: https://esbuild.github.io/api/#log-level
|
||
|
|
||
|
Sourcemap SourceMap // Documentation: https://esbuild.github.io/api/#sourcemap
|
||
|
SourceRoot string // Documentation: https://esbuild.github.io/api/#source-root
|
||
|
SourcesContent SourcesContent // Documentation: https://esbuild.github.io/api/#sources-content
|
||
|
|
||
|
Target Target // Documentation: https://esbuild.github.io/api/#target
|
||
|
Engines []Engine // Documentation: https://esbuild.github.io/api/#target
|
||
|
|
||
|
Format Format // Documentation: https://esbuild.github.io/api/#format
|
||
|
GlobalName string // Documentation: https://esbuild.github.io/api/#global-name
|
||
|
|
||
|
MinifyWhitespace bool // Documentation: https://esbuild.github.io/api/#minify
|
||
|
MinifyIdentifiers bool // Documentation: https://esbuild.github.io/api/#minify
|
||
|
MinifySyntax bool // Documentation: https://esbuild.github.io/api/#minify
|
||
|
Charset Charset // Documentation: https://esbuild.github.io/api/#charset
|
||
|
TreeShaking TreeShaking // Documentation: https://esbuild.github.io/api/#tree-shaking
|
||
|
IgnoreAnnotations bool // Documentation: https://esbuild.github.io/api/#ignore-annotations
|
||
|
LegalComments LegalComments // Documentation: https://esbuild.github.io/api/#legal-comments
|
||
|
|
||
|
JSXMode JSXMode // Documentation: https://esbuild.github.io/api/#jsx
|
||
|
JSXFactory string // Documentation: https://esbuild.github.io/api/#jsx-factory
|
||
|
JSXFragment string // Documentation: https://esbuild.github.io/api/#jsx-fragment
|
||
|
|
||
|
TsconfigRaw string // Documentation: https://esbuild.github.io/api/#tsconfig-raw
|
||
|
Banner string // Documentation: https://esbuild.github.io/api/#banner
|
||
|
Footer string // Documentation: https://esbuild.github.io/api/#footer
|
||
|
|
||
|
Define map[string]string // Documentation: https://esbuild.github.io/api/#define
|
||
|
Pure []string // Documentation: https://esbuild.github.io/api/#pure
|
||
|
KeepNames bool // Documentation: https://esbuild.github.io/api/#keep-names
|
||
|
|
||
|
Sourcefile string // Documentation: https://esbuild.github.io/api/#sourcefile
|
||
|
Loader Loader // Documentation: https://esbuild.github.io/api/#loader
|
||
|
}
|
||
|
|
||
|
type TransformResult struct {
|
||
|
Errors []Message
|
||
|
Warnings []Message
|
||
|
|
||
|
Code []byte
|
||
|
Map []byte
|
||
|
}
|
||
|
|
||
|
// Documentation: https://esbuild.github.io/api/#transform-api
|
||
|
func Transform(input string, options TransformOptions) TransformResult {
|
||
|
return transformImpl(input, options)
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// Serve API
|
||
|
|
||
|
// Documentation: https://esbuild.github.io/api/#serve-arguments
|
||
|
type ServeOptions struct {
|
||
|
Port uint16
|
||
|
Host string
|
||
|
Servedir string
|
||
|
OnRequest func(ServeOnRequestArgs)
|
||
|
}
|
||
|
|
||
|
type ServeOnRequestArgs struct {
|
||
|
RemoteAddress string
|
||
|
Method string
|
||
|
Path string
|
||
|
Status int
|
||
|
TimeInMS int // The time to generate the response, not to send it
|
||
|
}
|
||
|
|
||
|
// Documentation: https://esbuild.github.io/api/#serve-return-values
|
||
|
type ServeResult struct {
|
||
|
Port uint16
|
||
|
Host string
|
||
|
Wait func() error
|
||
|
Stop func()
|
||
|
}
|
||
|
|
||
|
// Documentation: https://esbuild.github.io/api/#serve
|
||
|
func Serve(serveOptions ServeOptions, buildOptions BuildOptions) (ServeResult, error) {
|
||
|
return serveImpl(serveOptions, buildOptions)
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// Plugin API
|
||
|
|
||
|
type SideEffects uint8
|
||
|
|
||
|
const (
|
||
|
SideEffectsTrue SideEffects = iota
|
||
|
SideEffectsFalse
|
||
|
)
|
||
|
|
||
|
type Plugin struct {
|
||
|
Name string
|
||
|
Setup func(PluginBuild)
|
||
|
}
|
||
|
|
||
|
type PluginBuild struct {
|
||
|
InitialOptions *BuildOptions
|
||
|
OnStart func(callback func() (OnStartResult, error))
|
||
|
OnEnd func(callback func(result *BuildResult))
|
||
|
OnResolve func(options OnResolveOptions, callback func(OnResolveArgs) (OnResolveResult, error))
|
||
|
OnLoad func(options OnLoadOptions, callback func(OnLoadArgs) (OnLoadResult, error))
|
||
|
}
|
||
|
|
||
|
type OnStartResult struct {
|
||
|
Errors []Message
|
||
|
Warnings []Message
|
||
|
}
|
||
|
|
||
|
type OnResolveOptions struct {
|
||
|
Filter string
|
||
|
Namespace string
|
||
|
}
|
||
|
|
||
|
type OnResolveArgs struct {
|
||
|
Path string
|
||
|
Importer string
|
||
|
Namespace string
|
||
|
ResolveDir string
|
||
|
Kind ResolveKind
|
||
|
PluginData interface{}
|
||
|
}
|
||
|
|
||
|
type OnResolveResult struct {
|
||
|
PluginName string
|
||
|
|
||
|
Errors []Message
|
||
|
Warnings []Message
|
||
|
|
||
|
Path string
|
||
|
External bool
|
||
|
SideEffects SideEffects
|
||
|
Namespace string
|
||
|
Suffix string
|
||
|
PluginData interface{}
|
||
|
|
||
|
WatchFiles []string
|
||
|
WatchDirs []string
|
||
|
}
|
||
|
|
||
|
type OnLoadOptions struct {
|
||
|
Filter string
|
||
|
Namespace string
|
||
|
}
|
||
|
|
||
|
type OnLoadArgs struct {
|
||
|
Path string
|
||
|
Namespace string
|
||
|
Suffix string
|
||
|
PluginData interface{}
|
||
|
}
|
||
|
|
||
|
type OnLoadResult struct {
|
||
|
PluginName string
|
||
|
|
||
|
Errors []Message
|
||
|
Warnings []Message
|
||
|
|
||
|
Contents *string
|
||
|
ResolveDir string
|
||
|
Loader Loader
|
||
|
PluginData interface{}
|
||
|
|
||
|
WatchFiles []string
|
||
|
WatchDirs []string
|
||
|
}
|
||
|
|
||
|
type ResolveKind uint8
|
||
|
|
||
|
const (
|
||
|
ResolveEntryPoint ResolveKind = iota
|
||
|
ResolveJSImportStatement
|
||
|
ResolveJSRequireCall
|
||
|
ResolveJSDynamicImport
|
||
|
ResolveJSRequireResolve
|
||
|
ResolveCSSImportRule
|
||
|
ResolveCSSURLToken
|
||
|
)
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// FormatMessages API
|
||
|
|
||
|
type MessageKind uint8
|
||
|
|
||
|
const (
|
||
|
ErrorMessage MessageKind = iota
|
||
|
WarningMessage
|
||
|
)
|
||
|
|
||
|
type FormatMessagesOptions struct {
|
||
|
TerminalWidth int
|
||
|
Kind MessageKind
|
||
|
Color bool
|
||
|
}
|
||
|
|
||
|
func FormatMessages(msgs []Message, opts FormatMessagesOptions) []string {
|
||
|
return formatMsgsImpl(msgs, opts)
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
// AnalyzeMetafile API
|
||
|
|
||
|
type AnalyzeMetafileOptions struct {
|
||
|
Color bool
|
||
|
Verbose bool
|
||
|
}
|
||
|
|
||
|
// Documentation: https://esbuild.github.io/api/#analyze
|
||
|
func AnalyzeMetafile(metafile string, opts AnalyzeMetafileOptions) string {
|
||
|
return analyzeMetafileImpl(metafile, opts)
|
||
|
}
|