aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bundler.zig3
-rw-r--r--src/cli.zig57
-rw-r--r--src/css_scanner.zig80
3 files changed, 78 insertions, 62 deletions
diff --git a/src/bundler.zig b/src/bundler.zig
index c4b296d34..484a25201 100644
--- a/src/bundler.zig
+++ b/src/bundler.zig
@@ -1832,7 +1832,8 @@ pub fn NewBundler(cache_files: bool) type {
&bundler.linker,
bundler.log,
);
- try css_writer.run(bundler.log, bundler.allocator);
+ var did_warn = false;
+ try css_writer.run(bundler.log, bundler.allocator, &did_warn);
output_file.size = css_writer.written;
var file_op = options.OutputFile.FileOperation.fromFile(file.handle, file_path.pretty);
diff --git a/src/cli.zig b/src/cli.zig
index edc209014..a6310022a 100644
--- a/src/cli.zig
+++ b/src/cli.zig
@@ -150,7 +150,7 @@ pub const Arguments = struct {
pub const ParamType = clap.Param(clap.Help);
- const params: [25]ParamType = brk: {
+ const params: [23]ParamType = brk: {
@setEvalBranchQuota(9999);
break :brk [_]ParamType{
clap.parseParam("--use <STR> Choose a framework, e.g. \"--use next\". It checks first for a package named \"bun-framework-packagename\" and then \"packagename\".") catch unreachable,
@@ -171,13 +171,13 @@ pub const Arguments = struct {
// clap.parseParam("--production   [not implemented] generate production code") catch unreachable,
clap.parseParam("--public-dir <STR> Top-level directory for .html files, fonts or anything external. Defaults to \"<cwd>/public\", to match create-react-app and Next.js") catch unreachable,
clap.parseParam("--tsconfig-override <STR> Load tsconfig from path instead of cwd/tsconfig.json") catch unreachable,
- clap.parseParam("-d, --define <STR>... Substitute K:V while parsing, e.g. --define process.env.NODE_ENV:development") catch unreachable,
+ clap.parseParam("-d, --define <STR>... Substitute K:V while parsing, e.g. --define process.env.NODE_ENV:\"development\". Values are parsed as JSON.") catch unreachable,
clap.parseParam("-e, --external <STR>... Exclude module from transpilation (can use * wildcards). ex: -e react") catch unreachable,
clap.parseParam("-h, --help Display this help and exit. ") catch unreachable,
clap.parseParam("-i, --inject <STR>... Inject module at the top of every file") catch unreachable,
- clap.parseParam("-l, --loader <STR>... Parse files with .ext:loader, e.g. --loader .js:jsx. Valid loaders: jsx, js, json, tsx (not implemented yet), ts (not implemented yet), css (not implemented yet)") catch unreachable,
- clap.parseParam("-o, --outdir <STR> Save output to directory (default: \"out\" if none provided and multiple entry points passed)") catch unreachable,
- clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable,
+ clap.parseParam("-l, --loader <STR>... Parse files with .ext:loader, e.g. --loader .js:jsx. Valid loaders: jsx, js, json, tsx, ts, css") catch unreachable,
+ // clap.parseParam("-o, --outdir <STR> Save output to directory (default: \"out\" if none provided and multiple entry points passed)") catch unreachable,
+ // clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable,
// clap.parseParam("-r, --resolve <STR> Determine import/require behavior. \"disable\" ignores. \"dev\" bundles node_modules and builds everything else as independent entry points") catch unreachable,
clap.parseParam("<POS>... ") catch unreachable,
@@ -235,7 +235,8 @@ pub const Arguments = struct {
std.os.exit(0);
}
- var output_dir = args.option("--outdir");
+ // var output_dir = args.option("--outdir");
+ var output_dir: ?string = null;
var define_keys = defines_tuple.keys;
var define_values = defines_tuple.values;
@@ -337,28 +338,28 @@ pub const Arguments = struct {
switch (comptime cmd) {
.BuildCommand => {
- if (args.option("--resolve")) |_resolve| {
- switch (ResolveMatcher.match(_resolve)) {
- ResolveMatcher.case("disable") => {
- opts.resolve = Api.ResolveMode.disable;
- },
- ResolveMatcher.case("bundle") => {
- opts.resolve = Api.ResolveMode.bundle;
- },
- ResolveMatcher.case("dev") => {
- opts.resolve = Api.ResolveMode.dev;
- },
- ResolveMatcher.case("lazy") => {
- opts.resolve = Api.ResolveMode.lazy;
- },
- else => {
- diag.name.long = "--resolve";
- diag.arg = _resolve;
- try diag.report(Output.errorWriter(), error.InvalidResolveOption);
- std.process.exit(1);
- },
- }
- }
+ // if (args.option("--resolve")) |_resolve| {
+ // switch (ResolveMatcher.match(_resolve)) {
+ // ResolveMatcher.case("disable") => {
+ // opts.resolve = Api.ResolveMode.disable;
+ // },
+ // ResolveMatcher.case("bundle") => {
+ // opts.resolve = Api.ResolveMode.bundle;
+ // },
+ // ResolveMatcher.case("dev") => {
+ // opts.resolve = Api.ResolveMode.dev;
+ // },
+ // ResolveMatcher.case("lazy") => {
+ // opts.resolve = Api.ResolveMode.lazy;
+ // },
+ // else => {
+ // diag.name.long = "--resolve";
+ // diag.arg = _resolve;
+ // try diag.report(Output.errorWriter(), error.InvalidResolveOption);
+ // std.process.exit(1);
+ // },
+ // }
+ // }
},
else => {},
}
diff --git a/src/css_scanner.zig b/src/css_scanner.zig
index 1415ac3e6..4dc6fa106 100644
--- a/src/css_scanner.zig
+++ b/src/css_scanner.zig
@@ -114,6 +114,8 @@ pub const Scanner = struct {
codepoint: CodePoint = -1,
approximate_newline_count: usize = 0,
+ did_warn_tailwind: bool = false,
+
pub fn init(log: *logger.Log, allocator: *std.mem.Allocator, source: *const logger.Source) Scanner {
return Scanner{ .log = log, .source = source, .allocator = allocator };
}
@@ -316,6 +318,18 @@ pub const Scanner = struct {
return text;
}
+ pub fn warnTailwind(scanner: *Scanner, start: usize) void {
+ if (scanner.did_warn_tailwind) return;
+ scanner.did_warn_tailwind = true;
+ scanner.log.addWarningFmt(
+ scanner.source,
+ logger.usize2Loc(start),
+ scanner.allocator,
+ "To use Tailwind with Bun, use the Tailwind CLI and import the processed .css file.\nLearn more: https://tailwindcss.com/docs/installation#watching-for-changes",
+ .{},
+ ) catch {};
+ }
+
pub fn next(
scanner: *Scanner,
comptime import_behavior: ImportBehavior,
@@ -495,46 +509,22 @@ pub const Scanner = struct {
switch (word[0]) {
'b' => {
if (strings.eqlComptime(word, "base")) {
- scanner.log.addWarningFmt(
- scanner.source,
- logger.Loc{ .start = @intCast(i32, start) },
- scanner.allocator,
- "Tailwind not supported yet, try @import \"tailwindcss/dist/base.css\";",
- .{},
- ) catch {};
+ scanner.warnTailwind(start);
}
},
'c' => {
if (strings.eqlComptime(word, "components")) {
- scanner.log.addWarningFmt(
- scanner.source,
- logger.Loc{ .start = @intCast(i32, start) },
- scanner.allocator,
- "Tailwind not supported yet, try @import \"tailwindcss/dist/components.css\";",
- .{},
- ) catch {};
+ scanner.warnTailwind(start);
}
},
'u' => {
if (strings.eqlComptime(word, "utilities")) {
- scanner.log.addWarningFmt(
- scanner.source,
- logger.Loc{ .start = @intCast(i32, start) },
- scanner.allocator,
- "Tailwind not supported yet, try @import \"tailwindcss/dist/utilities.css\";",
- .{},
- ) catch {};
+ scanner.warnTailwind(start);
}
},
's' => {
if (strings.eqlComptime(word, "screens")) {
- scanner.log.addWarningFmt(
- scanner.source,
- logger.Loc{ .start = @intCast(i32, start) },
- scanner.allocator,
- "Tailwind not supported yet, try @import \"tailwindcss/dist/screens.css\";",
- .{},
- ) catch {};
+ scanner.warnTailwind(start);
}
},
else => continue :toplevel,
@@ -897,7 +887,12 @@ pub fn NewWriter(
};
}
- pub fn scan(writer: *Writer, log: *logger.Log, allocator: *std.mem.Allocator) !void {
+ pub fn scan(
+ writer: *Writer,
+ log: *logger.Log,
+ allocator: *std.mem.Allocator,
+ did_warn_tailwind: *bool,
+ ) !void {
var scanner = Scanner.init(
log,
@@ -905,10 +900,17 @@ pub fn NewWriter(
writer.source,
);
+ scanner.did_warn_tailwind = did_warn_tailwind.*;
try scanner.next(.scan, @TypeOf(writer), writer, scanChunk);
+ did_warn_tailwind.* = scanner.did_warn_tailwind;
}
- pub fn append(writer: *Writer, log: *logger.Log, allocator: *std.mem.Allocator) !usize {
+ pub fn append(
+ writer: *Writer,
+ log: *logger.Log,
+ allocator: *std.mem.Allocator,
+ did_warn_tailwind: *bool,
+ ) !usize {
var scanner = Scanner.init(
log,
@@ -916,19 +918,30 @@ pub fn NewWriter(
writer.source,
);
+ scanner.did_warn_tailwind = did_warn_tailwind.*;
+
try scanner.next(.omit, @TypeOf(writer), writer, writeBundledChunk);
+ did_warn_tailwind.* = scanner.did_warn_tailwind;
+
return scanner.approximate_newline_count;
}
- pub fn run(writer: *Writer, log: *logger.Log, allocator: *std.mem.Allocator) !void {
+ pub fn run(
+ writer: *Writer,
+ log: *logger.Log,
+ allocator: *std.mem.Allocator,
+ did_warn_tailwind: *bool,
+ ) !void {
var scanner = Scanner.init(
log,
allocator,
writer.source,
);
+ scanner.did_warn_tailwind = did_warn_tailwind.*;
try scanner.next(.keep, @TypeOf(writer), writer, commitChunk);
+ did_warn_tailwind.* = scanner.did_warn_tailwind;
}
fn writeString(writer: *Writer, str: string, quote: Chunk.TextContent.Quote) !void {
@@ -1180,13 +1193,14 @@ pub fn NewBundler(
css.buildCtx = &this;
try this.addCSSImport(absolute_path);
+ var did_warn_tailwind: bool = false;
while (this.import_queue.readItem()) |item| {
const watcher_id = this.watcher.indexOf(item) orelse unreachable;
const watch_item = this.watcher.watchlist.get(watcher_id);
const source = try this.getSource(watch_item.file_path, watch_item.fd);
css.source = &source;
- try css.scan(log, allocator);
+ try css.scan(log, allocator, &did_warn_tailwind);
}
// This exists to identify the entry point
@@ -1222,7 +1236,7 @@ pub fn NewBundler(
try this.writeAll("/* ");
try this.writeAll(file_path);
try this.writeAll("*/\n");
- lines_of_code += try css.append(log, allocator);
+ lines_of_code += try css.append(log, allocator, &did_warn_tailwind);
}
try this.writer.done();