-
-
Notifications
You must be signed in to change notification settings - Fork 60
/
builder.dart
77 lines (61 loc) · 2.4 KB
/
builder.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import 'dart:convert';
import 'dart:io';
import 'package:build/build.dart';
import 'package:build_modules/build_modules.dart';
import 'package:glob/glob.dart';
import 'package:path/path.dart' as p;
Builder buildStylesheet(BuilderOptions options) => TailwindBuilder(options);
class TailwindBuilder implements Builder {
final BuilderOptions options;
TailwindBuilder(this.options);
@override
Future<void> build(BuildStep buildStep) async {
var scratchSpace = await buildStep.fetchResource(scratchSpaceResource);
await scratchSpace.ensureAssets({buildStep.inputId}, buildStep);
var outputId = buildStep.inputId.changeExtension('').changeExtension('.css');
var packageFile = File('.dart_tool/package_config.json');
var packageJson = jsonDecode(await packageFile.readAsString());
var packageConfig = (packageJson['packages'] as List?)?.where((p) => p['name'] == 'jaspr_tailwind').firstOrNull;
if (packageConfig == null) {
print("Cannot find 'jaspr_tailwind' in package config.");
return;
}
// in order to rebuild when source files change
var assets = await buildStep.findAssets(Glob('{lib,web}/**.dart')).toList();
await Future.wait(assets.map((a) => buildStep.canRead(a)));
var root = p.normalize(p.join(Directory.current.path, '.dart_tool', Uri.parse(packageConfig['rootUri']!).path));
var configFile = File('tailwind.config.js');
var hasCustomConfig = await configFile.exists();
await Process.run(
'tailwindcss',
[
'--input',
scratchSpace.fileFor(buildStep.inputId).path,
'--output',
scratchSpace.fileFor(outputId).path.toPosix(),
'--content',
p.join(Directory.current.path, '{lib,web}', '**', '*.dart').toPosix(true),
if (options.config.containsKey('tailwindcss')) options.config['tailwindcss'],
if (hasCustomConfig) ...[
'--config',
p.join(Directory.current.path, 'tailwind.config.js').toPosix(),
],
],
workingDirectory: root,
);
await scratchSpace.copyOutput(outputId, buildStep);
}
@override
Map<String, List<String>> get buildExtensions => {
'web/{{file}}.tw.css': ['web/{{file}}.css']
};
}
extension POSIXPath on String {
String toPosix([bool quoted = false]) {
if (Platform.isWindows) {
final result = replaceAll('\\', '/');
return quoted ? "'$result'" : result;
}
return this;
}
}