Implementation
final FigSpec esbuildSpec = FigSpec(
name: 'esbuild',
description: 'An extremely fast JavaScript bundler',
icon: esbuildIcon,
parserDirectives: ParserDirectives(optionArgSeparators: ['=', ':']),
args: [
FigArg(
name: 'entry points',
isVariadic: true,
template: 'filepaths',
),
],
options: [
// Simple options:
FigOption(
name: ['--bundle'],
description: 'Bundle all dependencies into the output files',
priority: 51,
),
FigOption(
name: ['--define'],
description:
'Replace variable names with a literal value, eg. --define:DEBUG=true',
requiresSeparator: ':',
args: [FigArg(name: 'name=value')],
priority: 51,
),
FigOption(
name: ['--external'],
description: 'Exclude modules from the build',
requiresSeparator: ':',
args: [FigArg(name: 'module specifier')],
priority: 51,
),
FigOption(
name: ['--format'],
description: 'The output format',
requiresSeparator: '=',
args: [
FigArg(
name: 'format',
suggestions: [
FigSuggestion(name: 'iife'),
FigSuggestion(name: 'cjs'),
FigSuggestion(name: 'esm')
],
)
],
priority: 51,
),
FigOption(
name: ['--loader'],
description: 'For a given file extension, specify a loader',
requiresSeparator: ':',
args: [
FigArg(
name: 'loaders',
generators: [
extensionsKeyValueGenerator(values: [
'js',
'jsx',
'ts',
'tsx',
'css',
'json',
'text',
'base64',
'file',
'dataurl',
'binary',
'copy'
])
],
)
],
priority: 51,
),
FigOption(
name: ['--minify'],
description: 'Minify the output (sets all the --minify-* options)',
priority: 51,
),
FigOption(
name: ['--outdir'],
description: 'The output directory for multiple entrypoints',
requiresSeparator: '=',
args: [FigArg(name: 'path', template: 'folders')],
priority: 51,
),
FigOption(
name: ['--outfile'],
description: 'The output file for one entrypoint',
requiresSeparator: '=',
args: [FigArg(name: 'path', template: 'filepaths')],
priority: 51,
),
FigOption(
name: ['--platform'],
description: 'The platform target',
requiresSeparator: '=',
args: [
FigArg(
name: 'name',
suggestions: [
FigSuggestion(name: 'browser'),
FigSuggestion(name: 'node'),
FigSuggestion(name: 'neutral')
],
)
],
priority: 51,
),
FigOption(
name: ['--serve'],
description: 'Start a local HTTP server on this host:port',
requiresSeparator: '=',
args: [FigArg(name: '[address:]port', isOptional: true)],
priority: 51,
),
FigOption(
name: ['--splitting'],
description: 'Enable code splitting',
priority: 51,
),
FigOption(
name: ['--target'],
description:
'Set the environment target. Can be a particular ES version or browser version, eg. chrome101',
requiresSeparator: '=',
args: [
FigArg(
name: 'target',
suggestions: [
FigSuggestion(name: 'esnext'),
FigSuggestion(name: 'es2016'),
FigSuggestion(name: 'es2022'),
FigSuggestion(name: 'chrome'),
FigSuggestion(name: 'firefox'),
FigSuggestion(name: 'ie'),
FigSuggestion(name: 'node'),
FigSuggestion(name: 'safari'),
FigSuggestion(name: 'opera'),
],
)
],
priority: 51,
),
FigOption(
name: ['--watch'],
description: 'Rebuild on file system changes',
priority: 51,
requiresSeparator: '=',
args: [
FigArg(
name: 'forever',
suggestions: [FigSuggestion(name: 'forever')],
isOptional: true,
)
],
),
// Advanced options:
FigOption(
name: ['--allow-overwrite'],
description: 'Allow output files to overwrite input files',
),
FigOption(
name: ['--analyze'],
description: 'Print a report about the contents of the bundle',
requiresSeparator: '=',
args: [
FigArg(
name: 'verbose',
isOptional: true,
suggestions: [FigSuggestion(name: 'verbose')],
)
],
),
FigOption(
name: ['--asset-names'],
description: "Path template for 'file' loader files",
requiresSeparator: '=',
args: [FigArg(name: 'template', defaultValue: '[name]-[hash]')],
),
FigOption(
name: ['--banner'],
description: 'Text to be prepended to each output file type',
requiresSeparator: ':',
args: [
FigArg(
name: 'ext=text[,ext=text...]',
generators: [extensionsKeyValueGenerator()],
)
],
),
FigOption(
name: ['--charset'],
description: 'Use UTF-8 instead of escaped codepoints in ASCII',
insertValue: '--charset=utf8',
displayName: '--charset=utf8',
requiresSeparator: '=',
args: [],
),
FigOption(
name: ['--chunk-names'],
description: 'Path template to use for code splitting chunks',
requiresSeparator: '=',
args: [FigArg(name: 'template', defaultValue: '[name]-[hash]')],
),
FigOption(
name: ['--color'],
description: 'Force use of terminal colors',
requiresSeparator: '=',
args: [
FigArg(
name: 'enabled',
suggestions: [
FigSuggestion(name: 'true'),
FigSuggestion(name: 'false')
],
)
],
),
FigOption(
name: ['--drop'],
description: 'Remove certain constructs',
requiresSeparator: ':',
args: [
FigArg(suggestions: [
FigSuggestion(name: 'console'),
FigSuggestion(name: 'debugger')
])
],
),
FigOption(
name: ['--entry-names'],
description: 'Path template to use for entry point output paths',
requiresSeparator: '=',
args: [FigArg(name: 'template', defaultValue: '[dir]/[name]')],
),
FigOption(
name: ['--footer'],
description: 'Text to be appended to each file type',
requiresSeparator: ':',
args: [
FigArg(
name: 'ext=text',
suggestions: [
FigSuggestion(name: 'css=', icon: esbuildIcon),
FigSuggestion(name: 'js=', icon: esbuildIcon),
],
)
],
),
FigOption(
name: ['--global-name'],
description: 'The name of the global if using --format=iife',
requiresSeparator: '=',
args: [FigArg(name: 'name')],
),
FigOption(
name: ['--ignore-annotations'],
description:
'Enable this to work with packages that have incorrect tree-shaking annotations',
),
FigOption(
name: ['--inject'],
description:
'Import the file into all input files, automatically replace matching globals',
requiresSeparator: ':',
args: [FigArg(name: 'import', template: 'filepaths')],
),
FigOption(
name: ['--jsx-factory'],
description: 'What to use for the JSX factory',
requiresSeparator: '=',
args: [
FigArg(
name: 'factory',
suggestions: [
FigSuggestion(name: 'React.createElement'),
FigSuggestion(name: 'h'),
FigSuggestion(name: 'preact.h')
],
)
],
),
FigOption(
name: ['--jsx-fragment'],
description: 'What to use for the JS Fragment factory',
requiresSeparator: '=',
args: [
FigArg(
name: 'fragment',
suggestions: [
FigSuggestion(name: 'React.Fragment'),
FigSuggestion(name: 'Fragment')
],
)
],
),
FigOption(
name: ['--jsx'],
description: 'Preserve JSX instead of transforming',
requiresSeparator: '=',
args: [
FigArg(
suggestions: [
FigSuggestion(
name: 'preserve',
description: 'Preserve JSX instead of transforming'),
FigSuggestion(
name: 'automatic',
description: "Use React's new automatic JSX transform"),
],
)
],
),
FigOption(
name: ['--jsx-dev'],
description: 'Toggles development mode for the automatic runtime',
),
FigOption(
name: ['--jsx-import-source'],
description:
'Overrides the root import for runtime functions (default: react)',
requiresSeparator: '=',
args: [FigArg(name: 'source', defaultValue: 'react')],
),
FigOption(
name: ['--keep-names'],
description: "Preserve 'name' on functions and classes",
),
FigOption(
name: ['--legal-comments'],
description: 'Where to place legal comments',
requiresSeparator: '=',
args: [
FigArg(
name: 'location',
suggestions: [
FigSuggestion(name: 'none'),
FigSuggestion(name: 'inline'),
FigSuggestion(name: 'eof'),
FigSuggestion(name: 'linked'),
FigSuggestion(name: 'external'),
],
)
],
),
FigOption(
name: ['--log-level'],
description: 'Set the log level',
requiresSeparator: '=',
args: [
FigArg(
name: 'level',
suggestions: [
FigSuggestion(name: 'verbose'),
FigSuggestion(name: 'debug'),
FigSuggestion(name: 'info'),
FigSuggestion(name: 'warning'),
FigSuggestion(name: 'error'),
FigSuggestion(name: 'silent'),
],
defaultValue: 'info',
)
],
),
FigOption(
name: ['--log-limit'],
description: 'Maximum message count, 0 to disable',
requiresSeparator: '=',
args: [FigArg(name: 'count', defaultValue: '6')],
),
FigOption(
name: ['--log-override'],
description: 'For a particular identifier, set the log level',
requiresSeparator: ':',
args: [
FigArg(
name: 'identifier:level',
suggestions: staticKeyValueSuggestions(
[
// JS
"assign-to-constant",
"assign-to-import",
"call-import-namespace",
"commonjs-variable-in-esm",
"delete-super-property",
"direct-eval",
"duplicate-case",
"duplicate-object-key",
"empty-import-meta",
"equals-nan",
"equals-negative-zero",
"equals-new-object",
"html-comment-in-js",
"impossible-typeof",
"indirect-require",
"private-name-will-throw",
"semicolon-after-return",
"suspicious-boolean-not",
"this-is-undefined-in-esm",
"unsupported-dynamic-import",
"unsupported-jsx-comment",
"unsupported-regexp",
"unsupported-require-call",
// CSS
"css-syntax-error",
"invalid-@charset",
"invalid-@import",
"invalid-@nest",
"invalid-@layer",
"invalid-calc",
"js-comment-in-css",
"unsupported-@charset",
"unsupported-@namespace",
"unsupported-css-property",
// Bundler
"ambiguous-reexport",
"different-path-case",
"ignored-bare-import",
"ignored-dynamic-import",
"import-is-undefined",
"require-resolve-not-external",
// Source maps
"invalid-source-mappings",
"sections-in-source-map",
"missing-source-map",
"unsupported-source-map-comment",
],
["verbose", "debug", "info", "warning", "error", "silent"],
),
)
],
),
FigOption(
name: ['--main-fields'],
description: 'Override the main file order in package.json',
requiresSeparator: '=',
args: [FigArg(name: 'field order', defaultValue: 'browser,module,main')],
),
FigOption(
name: ['--mangle-cache'],
description: "Save 'mangle props' decisions to a JSON file",
requiresSeparator: '=',
args: [
FigArg(
name: 'path',
template: 'filepaths',
suggestCurrentToken: true,
)
],
),
FigOption(
name: ['--mangle-props'],
description: 'Rename all properties matching a regular expression',
requiresSeparator: '=',
args: [FigArg(name: 'regex')],
),
FigOption(
name: ['--mangle-quoted'],
description: 'Enable mangling (renaming) quoted properties',
requiresSeparator: '=',
args: [
FigArg(
name: 'status',
suggestions: [
FigSuggestion(name: 'true'),
FigSuggestion(name: 'false')
],
)
],
),
FigOption(
name: ['--metafile'],
description: 'Write metadata about the build to a JSON file',
requiresSeparator: '=',
args: [
FigArg(
name: 'path',
template: 'filepaths',
suggestCurrentToken: true,
)
],
),
FigOption(
name: ['--minify-whitespace'],
description: 'Remove unnecessary whitespace in output files',
),
FigOption(
name: ['--minify-identifiers'],
description: 'Shorten identifiers in output files',
),
FigOption(
name: ['--minify-syntax'],
description: 'Use equivalent but shorter syntax in output files',
),
FigOption(
name: ['--out-extension'],
description: 'Use a custom output extension for each extension',
requiresSeparator: ':',
args: [
FigArg(
name: 'ext=new',
generators: [extensionsKeyValueGenerator()],
)
],
),
FigOption(
name: ['--outbase'],
description:
'Base path used to determine entrypoint output paths, for multiple entrypoints',
requiresSeparator: '=',
args: [FigArg(name: 'path', template: 'folders')],
),
FigOption(
name: ['--preserve-symlinks'],
description: 'Disable symlink resolution',
),
FigOption(
name: ['--public-path'],
description: "Set the base URL for the 'file' loader",
requiresSeparator: '=',
args: [FigArg(name: 'path', template: 'folders')],
),
FigOption(
name: ['--pure'],
description: 'Mark the name as a pure function for tree shaking',
requiresSeparator: ':',
args: [FigArg(name: 'name')],
),
FigOption(
name: ['--reserve-props'],
description: 'Do not mangle these properties',
requiresSeparator: '=',
args: [FigArg(name: 'properties')],
),
FigOption(
name: ['--resolve-extensions'],
description: 'Comma-separated list of implicit extensions',
requiresSeparator: '=',
args: [
FigArg(
name: 'extensions',
generators: [extensionsKeyValueGenerator()],
)
],
),
FigOption(
name: ['--servedir'],
description: 'What to serve in addition to the generated output files',
requiresSeparator: '=',
args: [FigArg(name: 'path', template: 'folders')],
),
FigOption(
name: ['--source-root'],
description: 'Set the sourceRoot field in generated source maps',
requiresSeparator: '=',
args: [FigArg(name: 'URL')],
),
FigOption(
name: ['--sourcefile'],
description:
"Set the source file for the source map if there's no file name to use",
requiresSeparator: '=',
args: [FigArg(name: 'name')],
),
FigOption(
name: ['--sourcemap'],
description: 'Generate source maps?',
requiresSeparator: '=',
args: [
FigArg(
name: 'options',
isOptional: true,
suggestions: [
FigSuggestion(
name: 'external',
description:
'Generate a separate .map.js file with no comment'),
FigSuggestion(
name: 'inline', description: 'Append source maps to JS files'),
],
)
],
priority: 51,
),
FigOption(
name: ['--sources-content'],
description: 'Omit the sourcesContent field in generated source maps',
insertValue: '--sources-content=false',
displayName: '--sources-content=false',
requiresSeparator: '=',
args: [
FigArg(suggestions: [FigSuggestion(name: 'false')])
],
),
FigOption(
name: ['--supported'],
description: 'Consider a given syntax to be supported',
requiresSeparator: ':',
args: [
FigArg(
name: 'syntax=status',
suggestions: staticKeyValueSuggestions(
[
"arbitrary-module-namespace-names",
"array-spread",
"arrow",
"async-await",
"async-generator",
"bigint",
"class",
"class-field",
"class-private-accessor",
"class-private-brand-check",
"class-private-field",
"class-private-method",
"class-private-static-accessor",
"class-private-static-field",
"class-private-static-method",
"class-static-blocks",
"class-static-field",
"const-and-let",
"default-argument",
"destructuring",
"dynamic-import",
"exponent-operator",
"export-star-as",
"for-await",
"for-of",
"generator",
"hashbang",
"import-assertions",
"import-meta",
"logical-assignment",
"nested-rest-binding",
"new-target",
"node-colon-prefix-import",
"node-colon-prefix-require",
"nullish-coalescing",
"object-accessors",
"object-extensions",
"object-rest-spread",
"optional-catch-binding",
"optional-chain",
"regexp-dot-all-flag",
"regexp-lookbehind-assertions",
"regexp-match-indices",
"regexp-named-capture-groups",
"regexp-sticky-and-unicode-flags",
"regexp-unicode-property-escapes",
"rest-argument",
"template-literal",
"top-level-await",
"typeof-exotic-object-is-object",
"unicode-escapes",
"hex-rgba",
"rebecca-purple",
"modern-rgb-hsl",
"inset-property",
"nesting",
],
["true", "false"],
),
)
],
),
FigOption(
name: ['--tree-shaking'],
description: 'Force tree shaking on or off',
requiresSeparator: '=',
args: [
FigArg(
name: 'status',
suggestions: [
FigSuggestion(name: 'true'),
FigSuggestion(name: 'false')
],
)
],
),
FigOption(
name: ['--tsconfig'],
description: 'Use this TypeScript config instead of the default',
requiresSeparator: '=',
args: [FigArg(name: 'path', template: 'filepaths')],
),
FigOption(
name: ['--version'],
description: 'Print the current version and exit',
),
],
);