From d030d9fedb86d8acaaeb15820625496ee74b775a Mon Sep 17 00:00:00 2001 From: susiwen8 Date: Tue, 9 Feb 2021 13:52:32 +0800 Subject: [PATCH] Feat: add `footer` and `banner` for css file --- cmd/esbuild/main.go | 6 ++++-- internal/bundler/linker.go | 14 +++++++++++++- internal/config/config.go | 2 ++ lib/common.ts | 4 ++++ lib/types.ts | 2 ++ pkg/api/api.go | 4 ++++ pkg/api/api_impl.go | 2 ++ pkg/cli/cli_impl.go | 16 ++++++++++++++++ 8 files changed, 47 insertions(+), 3 deletions(-) diff --git a/cmd/esbuild/main.go b/cmd/esbuild/main.go index da7373992b9..a70991907cd 100644 --- a/cmd/esbuild/main.go +++ b/cmd/esbuild/main.go @@ -54,16 +54,18 @@ var helpText = func(colors logger.Colors) string { --watch Watch mode: rebuild on file system changes ` + colors.Bold + `Advanced options:` + colors.Default + ` - --banner=... Text to be prepended to each output file + --banner=... Text to be prepended to each output JS file --charset=utf8 Do not escape UTF-8 code points --color=... Force use of color terminal escapes (true | false) --error-limit=... Maximum error count or 0 to disable (default 10) - --footer=... Text to be appended to each output file + --footer=... Text to be appended to each output JS file --inject:F Import the file F into all input files and automatically replace matching globals with imports --keep-names Preserve "name" on functions and classes --log-level=... Disable logging (info | warning | error | silent, default info) + --css-banner=... Text to be prepended to each output CSS file + --css-footer=... Text to be appended to each output CSS file --main-fields=... Override the main file order in package.json (default "browser,module,main" when platform is browser and "main,module" when platform is node) diff --git a/internal/bundler/linker.go b/internal/bundler/linker.go index 3dceae6840c..96f76182e4f 100644 --- a/internal/bundler/linker.go +++ b/internal/bundler/linker.go @@ -4100,6 +4100,7 @@ func (repr *chunkReprCSS) generate(c *linkerContext, chunk *chunkInfo) func(gene return func(continueData generateContinue) []OutputFile { waitGroup.Wait() j := js_printer.Joiner{} + prevOffset := lineColumnOffset{} newlineBeforeComment := false // Generate any prefix rules now @@ -4134,8 +4135,15 @@ func (repr *chunkReprCSS) generate(c *linkerContext, chunk *chunkInfo) func(gene } } - // Start the metadata jMeta := js_printer.Joiner{} + if len(c.options.CSSBanner) > 0 { + prevOffset.advanceString(c.options.CSSBanner) + prevOffset.advanceString("\n") + j.AddString(c.options.CSSBanner) + j.AddString("\n") + } + + // Start the metadata if c.options.AbsMetadataFile != "" { isFirstMeta := true jMeta.AddString("{\n \"imports\": [") @@ -4182,6 +4190,10 @@ func (repr *chunkReprCSS) generate(c *linkerContext, chunk *chunkInfo) func(gene } } + if len(c.options.CSSFooter) > 0 { + j.AddString(c.options.CSSFooter) + } + // Make sure the file ends with a newline if j.Length() > 0 && j.LastByte() != '\n' { j.AddString("\n") diff --git a/internal/config/config.go b/internal/config/config.go index c4a7362d5c6..e00b2213f21 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -216,6 +216,8 @@ type Options struct { InjectedFiles []InjectedFile Banner string Footer string + CSSBanner string + CSSFooter string Plugins []Plugin diff --git a/lib/common.ts b/lib/common.ts index 433736bea29..8e3e4b75800 100644 --- a/lib/common.ts +++ b/lib/common.ts @@ -112,6 +112,8 @@ function pushCommonFlags(flags: string[], options: CommonOptions, keys: OptionKe let keepNames = getFlag(options, keys, 'keepNames', mustBeBoolean); let banner = getFlag(options, keys, 'banner', mustBeString); let footer = getFlag(options, keys, 'footer', mustBeString); + let cssBanner = getFlag(options, keys, 'cssBanner', mustBeString); + let cssFooter = getFlag(options, keys, 'cssFooter', mustBeString); if (sourcesContent !== void 0) flags.push(`--sources-content=${sourcesContent}`); if (target) { @@ -142,6 +144,8 @@ function pushCommonFlags(flags: string[], options: CommonOptions, keys: OptionKe if (banner) flags.push(`--banner=${banner}`); if (footer) flags.push(`--footer=${footer}`); + if (cssBanner) flags.push(`--css-banner=${cssBanner}`); + if (cssFooter) flags.push(`--css-footer=${cssFooter}`); } function flagsForBuildOptions( diff --git a/lib/types.ts b/lib/types.ts index 6982c7ea516..e5c4bb3340f 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -28,6 +28,8 @@ interface CommonOptions { keepNames?: boolean; banner?: string; footer?: string; + cssBanner?: string; + cssFooter?: string; color?: boolean; logLevel?: LogLevel; diff --git a/pkg/api/api.go b/pkg/api/api.go index c1b1cf01865..a57357bce58 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -256,6 +256,8 @@ type BuildOptions struct { Inject []string Banner string Footer string + CSSBanner string + CSSFooter string NodePaths []string // The "NODE_PATH" variable from Node.js EntryPoints []string @@ -326,6 +328,8 @@ type TransformOptions struct { TsconfigRaw string Footer string Banner string + CSSFooter string + CSSBanner string Define map[string]string Pure []string diff --git a/pkg/api/api_impl.go b/pkg/api/api_impl.go index 85703120095..4b2358a1f46 100644 --- a/pkg/api/api_impl.go +++ b/pkg/api/api_impl.go @@ -600,6 +600,8 @@ func rebuildImpl( AbsNodePaths: make([]string, len(buildOpts.NodePaths)), Banner: buildOpts.Banner, Footer: buildOpts.Footer, + CSSBanner: buildOpts.CSSBanner, + CSSFooter: buildOpts.CSSFooter, WatchMode: buildOpts.Watch != nil, Plugins: plugins, } diff --git a/pkg/cli/cli_impl.go b/pkg/cli/cli_impl.go index 8ef25174305..8029a88131e 100644 --- a/pkg/cli/cli_impl.go +++ b/pkg/cli/cli_impl.go @@ -362,6 +362,22 @@ func parseOptionsImpl(osArgs []string, buildOpts *api.BuildOptions, transformOpt transformOpts.Footer = value } + case strings.HasPrefix(arg, "--css-banner="): + value := arg[len("--css-banner="):] + if buildOpts != nil { + buildOpts.CSSBanner = value + } else { + transformOpts.CSSBanner = value + } + + case strings.HasPrefix(arg, "--css-footer="): + value := arg[len("--css-footer="):] + if buildOpts != nil { + buildOpts.CSSFooter = value + } else { + transformOpts.CSSFooter = value + } + case strings.HasPrefix(arg, "--error-limit="): value := arg[len("--error-limit="):] limit, err := strconv.Atoi(value)