Skip to content

Commit f3c960f

Browse files
[web_generator] Add support for passing files as globs (#427)
* added support for glob entries * added support for properly working with dir globs * changed ext to .idl * minor fmt * minor fixes * Squashed commit of the following: commit da1dd5d Author: Devon Carew <[email protected]> Date: Thu Jul 24 10:24:40 2025 -0700 switch CI to using workflow files (#428) * switch CI to using workflow files * update the sdk matrix * review feedback * remove format sdk version check commit 8ffaf5e Author: Nikechukwu <[email protected]> Date: Wed Jul 23 12:17:55 2025 -0400 [interop] Implement Diagnostics and Handling Errors (#426) * implemented diagnostics * added extra invalid semantic * added node version for web generator * minor config fix * updated node version to fix GHA bug * changed `globSync` API to use string path rather than `fs.Dirent` * formatting * removed config test * resolved commits * fixed bug preventing files from being returned * formatting and analyzing fixes
1 parent f51cc85 commit f3c960f

File tree

8 files changed

+52
-79
lines changed

8 files changed

+52
-79
lines changed

.github/workflows/web_generator.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ jobs:
3030

3131
steps:
3232
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
33+
- uses: actions/setup-node@v4
34+
with:
35+
node-version: 22
3336
- uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c
3437
with:
3538
sdk: ${{ matrix.sdk }}

web_generator/lib/src/config.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import 'package:path/path.dart' as p;
77
import 'package:pub_semver/pub_semver.dart';
88
import 'package:yaml/yaml.dart';
99

10+
import 'util.dart';
11+
1012
class FunctionConfig {
1113
/// The number of variable arguments
1214
final int? varArgs;
@@ -154,11 +156,13 @@ class YamlConfig implements Config {
154156
throw TypeError();
155157
}
156158

159+
final allFiles =
160+
expandGlobs(inputFiles, extension: '.d.ts', cwd: p.dirname(filename));
161+
157162
return YamlConfig._(
158163
filename: Uri.file(filename),
159-
input: inputFiles
160-
.map((file) => p.join(p.dirname(filename), file))
161-
.toList(),
164+
input:
165+
allFiles.map((file) => p.join(p.dirname(filename), file)).toList(),
162166
output:
163167
p.join(p.dirname(filename), (yaml['output'] ?? output) as String),
164168
name: yaml['name'] as String?,

web_generator/lib/src/dart_main.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void main(List<String> args) async {
3636
await generateIDLBindings(
3737
input: (argResult['input'] as List<String>).isEmpty
3838
? null
39-
: argResult['input'] as Iterable<String>,
39+
: argResult['input'] as List<String>,
4040
output: argResult['output'] as String,
4141
generateAll: argResult['generate-all'] as bool,
4242
languageVersion: Version.parse(languageVersionString),
@@ -55,7 +55,8 @@ void main(List<String> args) async {
5555
);
5656
} else {
5757
config = Config(
58-
input: argResult['input'] as List<String>,
58+
input:
59+
expandGlobs(argResult['input'] as List<String>, extension: '.d.ts'),
5960
output: argResult['output'] as String,
6061
languageVersion: Version.parse(languageVersionString),
6162
);
@@ -138,11 +139,12 @@ Future<void> generateIDLBindings({
138139
fs.writeFileSync('$output/$libraryPath'.toJS, contents);
139140
}
140141
} else {
142+
final allInputFiles = expandGlobs(input.toList(), extension: '.idl');
141143
// parse individual files
142144
ensureDirectoryExists(output);
143145

144146
final bindings = await generateBindingsForFiles({
145-
for (final file in input)
147+
for (final file in allInputFiles)
146148
file: (fs.readFileSync(
147149
file.toJS, JSReadFileOptions(encoding: 'utf-8'.toJS))
148150
as JSString)

web_generator/lib/src/js/filesystem_api.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,18 @@ extension type FileSystem._(JSObject _) implements JSObject {
4040
external JSAny readFileSync(JSString path, [JSReadFileOptions options]);
4141

4242
external void writeFileSync(JSString path, JSString contents);
43+
44+
external JSArray<JSString> globSync(JSArray<JSString> patterns,
45+
[FSGlobSyncOptions? options]);
46+
}
47+
48+
extension type FSGlobSyncOptions._(JSObject _) implements JSObject {
49+
external FSGlobSyncOptions({JSString cwd, FSGlobSyncExcludeFunc? exclude});
50+
51+
external JSString get cwd;
52+
external JSArray<JSString>? get exclude;
53+
}
54+
55+
extension type FSGlobSyncExcludeFunc(JSFunction _) implements JSFunction {
56+
external bool call(String entry);
4357
}

web_generator/lib/src/util.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
import 'dart:js_interop';
66

7+
import 'package:path/path.dart' as p;
8+
79
import 'js/filesystem_api.dart';
810

911
// TODO(joshualitt): Let's find a better place for these.
@@ -47,3 +49,17 @@ const packageRoot = 'package:web';
4749

4850
String capitalize(String s) =>
4951
s.isEmpty ? '' : '${s[0].toUpperCase()}${s.substring(1)}';
52+
53+
List<String> expandGlobs(List<String> input,
54+
{String? cwd, required String extension}) {
55+
cwd ??= p.current;
56+
final globSync = fs.globSync(
57+
input.map((i) => i.toJS).toList().toJS,
58+
FSGlobSyncOptions(
59+
cwd: cwd.toJS,
60+
));
61+
return globSync.toDart
62+
.map((i) => i.toDart)
63+
.where((f) => f.endsWith(extension))
64+
.toList();
65+
}

web_generator/test/assets/config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ preamble: |
44
// GENERATED FILE: DO NOT EDIT
55
//
66
// Created by `web_generator`
7-
input: test.d.ts
7+
input: 'test.d.ts'
88
output: '../../.dart_tool/test_config.dart'
99
include:
1010
- APP_NAME

web_generator/test/config_test.dart

Lines changed: 0 additions & 70 deletions
This file was deleted.

web_generator/test/integration/idl_test.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,18 @@ void main() {
1313
group('IDL Integration Test', () {
1414
final testGenFolder = p.join('test', 'integration', 'idl');
1515
final inputDir = Directory(testGenFolder);
16+
final outputDir = p.join('.dart_tool', 'idl');
1617

1718
setUpAll(() async {
1819
// set up npm
1920
await runProc('npm', ['install'], workingDirectory: bindingsGenPath);
2021

2122
// compile file
2223
await compileDartMain(dir: bindingsGenPath);
24+
25+
if (!(await Directory(outputDir).exists())) {
26+
await Directory(outputDir).create(recursive: true);
27+
}
2328
});
2429

2530
for (final inputFile in inputDir
@@ -29,8 +34,7 @@ void main() {
2934
final inputFileName = p.basenameWithoutExtension(inputFile.path);
3035
final inputName = inputFileName.replaceFirst('_input', '');
3136

32-
final outputActualPath =
33-
p.join('.dart_tool', 'idl', '${inputName}_actual.dart');
37+
final outputActualPath = p.join(outputDir, '${inputName}_actual.dart');
3438
final outputExpectedPath =
3539
p.join(testGenFolder, '${inputName}_expected.dart');
3640

0 commit comments

Comments
 (0)