Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/web_generator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ jobs:

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
- uses: actions/setup-node@v4
with:
node-version: 22
- uses: dart-lang/setup-dart@e51d8e571e22473a2ddebf0ef8a2123f0ab2c02c
with:
sdk: ${{ matrix.sdk }}
Expand Down
4 changes: 4 additions & 0 deletions web_generator/lib/src/_js_supertypes_src.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import 'dart:js_interop';

@JS()
external JSPromise get promise;
26 changes: 24 additions & 2 deletions web_generator/lib/src/config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,15 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:js_interop';

import 'package:dart_style/dart_style.dart';
import 'package:path/path.dart' as p;
import 'package:pub_semver/pub_semver.dart';
import 'package:yaml/yaml.dart';

import 'js/filesystem_api.dart';

class FunctionConfig {
/// The number of variable arguments
final int? varArgs;
Expand Down Expand Up @@ -154,10 +158,17 @@ class YamlConfig implements Config {
throw TypeError();
}

final allFiles = fs.globSync(
inputFiles.map((i) => i.toJS).toList().toJS,
FSGlobSyncOptions(
cwd: p.dirname(filename).toJS,
exclude:
excludeFileEntryFunc('.d.ts').toJS as FSGlobSyncExcludeFunc));

return YamlConfig._(
filename: Uri.file(filename),
input: inputFiles
.map((file) => p.join(p.dirname(filename), file))
input: allFiles.toDart
.map((file) => p.join(p.dirname(filename), file.toDart))
.toList(),
output:
p.join(p.dirname(filename), (yaml['output'] ?? output) as String),
Expand All @@ -174,3 +185,14 @@ class YamlConfig implements Config {
[]);
}
}

/// Creates the `exclude` function for [FSGlobSyncOptions]'s `exclude` option
/// to exclude all files not ending with the given [allowedExtension]
///
/// This helps support passing dir globs.
bool Function(String entry) excludeFileEntryFunc(String allowedExtension) {
return (String entry) {
if (p.extension(entry) != '') return !entry.endsWith(allowedExtension);
return true;
};
}
22 changes: 19 additions & 3 deletions web_generator/lib/src/dart_main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ void main(List<String> args) async {
await generateIDLBindings(
input: (argResult['input'] as List<String>).isEmpty
? null
: argResult['input'] as Iterable<String>,
: argResult['input'] as List<String>,
output: argResult['output'] as String,
generateAll: argResult['generate-all'] as bool,
languageVersion: Version.parse(languageVersionString),
Expand All @@ -54,8 +54,14 @@ void main(List<String> args) async {
filename: filename,
);
} else {
final allInputFiles = fs.globSync(
(argResult['input'] as List<String>).map((i) => i.toJS).toList().toJS,
FSGlobSyncOptions(
cwd: p.current.toJS,
exclude:
excludeFileEntryFunc('.d.ts').toJS as FSGlobSyncExcludeFunc));
config = Config(
input: argResult['input'] as List<String>,
input: allInputFiles.toDart.map((i) => i.toDart).toList(),
output: argResult['output'] as String,
languageVersion: Version.parse(languageVersionString),
);
Expand Down Expand Up @@ -135,11 +141,21 @@ Future<void> generateIDLBindings({
fs.writeFileSync('$output/$libraryPath'.toJS, contents);
}
} else {
final allInputFiles = fs
.globSync(
input.map((i) => i.toJS).toList().toJS,
FSGlobSyncOptions(
cwd: p.current.toJS,
exclude:
excludeFileEntryFunc('.idl').toJS as FSGlobSyncExcludeFunc))
.toDart
.map((i) => i.toDart)
.toList();
// parse individual files
ensureDirectoryExists(output);

final bindings = await generateBindingsForFiles({
for (final file in input)
for (final file in allInputFiles)
file: (fs.readFileSync(
file.toJS, JSReadFileOptions(encoding: 'utf-8'.toJS))
as JSString)
Expand Down
14 changes: 14 additions & 0 deletions web_generator/lib/src/js/filesystem_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,18 @@ extension type FileSystem._(JSObject _) implements JSObject {
external JSAny readFileSync(JSString path, [JSReadFileOptions options]);

external void writeFileSync(JSString path, JSString contents);

external JSArray<JSString> globSync(JSArray<JSString> patterns,
[FSGlobSyncOptions? options]);
}

extension type FSGlobSyncOptions._(JSObject _) implements JSObject {
external FSGlobSyncOptions({JSString cwd, FSGlobSyncExcludeFunc? exclude});

external JSString get cwd;
external JSArray<JSString>? get exclude;
}

extension type FSGlobSyncExcludeFunc(JSFunction _) implements JSFunction {
external bool call(String entry);
}
2 changes: 1 addition & 1 deletion web_generator/test/assets/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ preamble: |
// GENERATED FILE: DO NOT EDIT
//
// Created by `web_generator`
input: test.d.ts
input: 'test.d.ts'
output: '../../.dart_tool/test_config.dart'
include:
- APP_NAME
Expand Down
70 changes: 0 additions & 70 deletions web_generator/test/config_test.dart

This file was deleted.

Loading