Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
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 extension
///
/// This helps support passing dir globs.
bool Function(FSDirent entry) excludeFileEntryFunc(String extension) {
return (FSDirent entry) {
if (entry.isFile()) return !entry.name.endsWith(extension);
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
21 changes: 21 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,25 @@ 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._(JSObject _) implements JSObject {
external bool call(FSDirent entry);
}

extension type FSDirent._(JSObject _) implements JSObject {
external String name;
external String parentPath;
external bool isFile();
external bool isDirectory();
}
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: '*.d.ts'
output: '../../.dart_tool/test_config.dart'
include:
- APP_NAME
Expand Down
Loading