Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
6 changes: 1 addition & 5 deletions js_interop_gen/lib/src/bcd.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.

import 'dart:convert' hide json;
import 'dart:js_interop';

import 'js/filesystem_api.dart';

Expand All @@ -22,10 +21,7 @@ class BrowserCompatData {
required bool generateAll,
required String path,
}) {
final content =
(fs.readFileSync(path.toJS, JSReadFileOptions(encoding: 'utf8'.toJS))
as JSString)
.toDart;
final content = fs.readFileSync(path, readFileOptions(encoding: 'utf8'));

final contentMap = jsonDecode(content) as Map;
final api = (contentMap['api'] as Map).cast<String, dynamic>();
Expand Down
41 changes: 16 additions & 25 deletions js_interop_gen/lib/src/dart_main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.

import 'dart:convert';
import 'dart:js_interop';

import 'package:args/args.dart';
import 'package:code_builder/code_builder.dart' as code;
Expand Down Expand Up @@ -54,13 +53,11 @@ void main(List<String> args) async {

if (argResult.wasParsed('config')) {
final filename = argResult['config'] as String;
final configContent =
fs.readFileSync(
filename.toJS,
JSReadFileOptions(encoding: 'utf8'.toJS),
)
as JSString;
final yaml = loadYamlDocument(configContent.toDart);
final configContent = fs.readFileSync(
filename,
readFileOptions(encoding: 'utf8'),
);
final yaml = loadYamlDocument(configContent);
config = YamlConfig.fromYaml(
yaml.contents as YamlMap,
filename: filename,
Expand Down Expand Up @@ -109,17 +106,17 @@ Future<void> generateJSInteropBindings(Config config) async {
if (dartDeclarations.multiFileOutput) {
for (final entry in generatedCodeMap.entries) {
fs.writeFileSync(
p.join(configOutput, p.basename(entry.key)).toJS,
entry.value.toJS,
p.join(configOutput, p.basename(entry.key)),
entry.value,
);
}
} else {
final entry = generatedCodeMap.entries.first;
fs.writeFileSync(configOutput.toJS, entry.value.toJS);
fs.writeFileSync(configOutput, entry.value);
for (final entry in generatedCodeMap.entries.skip(1)) {
fs.writeFileSync(
p.join(p.dirname(configOutput), p.basename(entry.key)).toJS,
entry.value.toJS,
p.join(p.dirname(configOutput), p.basename(entry.key)),
entry.value,
);
}
}
Expand Down Expand Up @@ -152,15 +149,15 @@ Future<void> generateIDLBindings({

if (renameMap.isNotEmpty) {
final jsonStr = jsonEncode(renameMap);
fs.writeFileSync(renameMapPath.toJS, jsonStr.toJS);
fs.writeFileSync(renameMapPath, jsonStr);
}

for (var entry in bindings.entries) {
final libraryPath = entry.key;
final library = entry.value;

final contents = _emitLibrary(library, languageVersion).toJS;
fs.writeFileSync('$output/$libraryPath'.toJS, contents);
final contents = _emitLibrary(library, languageVersion);
fs.writeFileSync('$output/$libraryPath', contents);
}
} else {
final allInputFiles = expandGlobs(input.toList(), extension: '.idl');
Expand All @@ -170,13 +167,7 @@ Future<void> generateIDLBindings({
final bindings = await generateBindingsForFiles(
{
for (final file in allInputFiles)
file:
(fs.readFileSync(
file.toJS,
JSReadFileOptions(encoding: 'utf-8'.toJS),
)
as JSString)
.toDart,
file: fs.readFileSync(file, readFileOptions(encoding: 'utf-8')),
},
output,
bcdJsonPath: bcdJsonPath,
Expand All @@ -186,8 +177,8 @@ Future<void> generateIDLBindings({
final libraryPath = entry.key;
final library = entry.value;

final contents = _emitLibrary(library, languageVersion).toJS;
fs.writeFileSync('$output/$libraryPath'.toJS, contents);
final contents = _emitLibrary(library, languageVersion);
fs.writeFileSync('$output/$libraryPath', contents);
}
}
}
Expand Down
15 changes: 6 additions & 9 deletions js_interop_gen/lib/src/doc_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.

import 'dart:convert';
import 'dart:js_interop';

import 'package:path/path.dart' as p;

Expand All @@ -12,14 +11,12 @@ import 'js/filesystem_api.dart';

class DocProvider {
static DocProvider create() {
final content =
fs.readFileSync(
p.join('..', '..', '..', 'third_party', 'mdn', 'mdn.json').toJS,
JSReadFileOptions(encoding: 'utf8'.toJS),
)
as JSString;

return DocProvider(jsonDecode(content.toDart) as Map<String, dynamic>);
final content = fs.readFileSync(
p.join('..', '..', '..', 'third_party', 'mdn', 'mdn.json'),
readFileOptions(encoding: 'utf8'),
);

return DocProvider(jsonDecode(content) as Map<String, dynamic>);
}

final List<MdnInterface> interfaces = [];
Expand Down
24 changes: 9 additions & 15 deletions js_interop_gen/lib/src/generate_bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,11 @@ Future<(TranslationResult, Map<String, String>)> generateBindings(
}) async {
var renameMap = <String, String>{};
if (renameMapPath != null) {
if (fs.existsSync(renameMapPath.toJS).toDart) {
final jsonStr =
(fs.readFileSync(
renameMapPath.toJS,
JSReadFileOptions(encoding: 'utf8'.toJS),
)
as JSString)
.toDart;
if (fs.existsSync(renameMapPath)) {
final jsonStr = fs.readFileSync(
renameMapPath,
readFileOptions(encoding: 'utf8'),
);
final json = jsonDecode(jsonStr) as Map<String, dynamic>;
renameMap = json.map((k, v) => MapEntry(k, v as String));
}
Expand All @@ -101,13 +98,10 @@ Future<(TranslationResult, Map<String, String>)> generateBindings(
JSObject? elementsData;

if (idlJsonPath != null) {
final jsonStr =
(fs.readFileSync(
idlJsonPath.toJS,
JSReadFileOptions(encoding: 'utf8'.toJS),
)
as JSString)
.toDart;
final jsonStr = fs.readFileSync(
idlJsonPath,
readFileOptions(encoding: 'utf8'),
);
final json = jsonDecode(jsonStr) as Map<String, dynamic>;

idlData = (json['idl'] as Map?)?.jsify() as JSObject?;
Expand Down
16 changes: 5 additions & 11 deletions js_interop_gen/lib/src/interop_gen/transform/type_resolver.dart
Original file line number Diff line number Diff line change
Expand Up @@ -568,17 +568,11 @@ class TypeResolver {
// if import there and not this file, imported from specified file
final importUrl =
!nameImport.endsWith('.d.ts') &&
fs
.existsSync(
(p.isAbsolute('$nameImport.d.ts')
? '$nameImport.d.ts'
: p.join(
p.dirname(transformer.file),
'$nameImport.d.ts',
))
.toJS,
)
.toDart
fs.existsSync(
p.isAbsolute('$nameImport.d.ts')
? '$nameImport.d.ts'
: p.join(p.dirname(transformer.file), '$nameImport.d.ts'),
)
? '$nameImport.d.ts'
: nameImport;
final relativePath =
Expand Down
64 changes: 17 additions & 47 deletions js_interop_gen/lib/src/js/filesystem_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,28 @@
// 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.

// TODO(srujzs): Remove this workaround once we use an SDK version that contains
// https://github.com/dart-lang/sdk/issues/54801.
@JS()
library;

import 'dart:js_interop';
import 'generated/node_api.dart' as gen;

@JS()
external FileSystem get fs;

extension type JSMkdirOptions._(JSObject _) implements JSObject {
external factory JSMkdirOptions({JSBoolean? recursive});
}

extension type JSReadFileOptions._(JSObject _) implements JSObject {
external factory JSReadFileOptions({JSString? encoding});
}

extension type FileSystem._(JSObject _) implements JSObject {
external JSBoolean existsSync(JSString path);
export 'generated/node_api.dart'
show GlobSyncOptions, MkdirOptions, ReadFileOptions, fs;

@JS('mkdirSync')
external void mkdirSyncOneArg(JSString path);

@JS('mkdirSync')
external void mkdirSyncTwoArg(JSString path, JSMkdirOptions options);

void mkdirSync(JSString path, [JSMkdirOptions? options]) {
if (options == null) {
return mkdirSyncOneArg(path);
} else {
return mkdirSyncTwoArg(path, options);
}
}

external JSAny readFileSync(JSString path, [JSReadFileOptions options]);

external void writeFileSync(JSString path, JSString contents);

external JSArray<JSString> globSync(
JSArray<JSString> patterns, [
FSGlobSyncOptions? options,
]);
// Safe creator helpers for options bags to avoid calling non-existent JS
// constructors.
gen.MkdirOptions mkdirOptions({bool? recursive}) {
final obj = JSObject() as gen.MkdirOptions;
if (recursive != null) obj.recursive = recursive;
return obj;
}

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

external JSString get cwd;
external JSArray<JSString>? get exclude;
gen.ReadFileOptions readFileOptions({String? encoding}) {
final obj = JSObject() as gen.ReadFileOptions;
if (encoding != null) obj.encoding = encoding;
return obj;
}

extension type FSGlobSyncExcludeFunc(JSFunction _) implements JSFunction {
external bool call(String entry);
gen.GlobSyncOptions globSyncOptions({String? cwd}) {
final obj = JSObject() as gen.GlobSyncOptions;
if (cwd != null) obj.cwd = cwd;
return obj;
}
48 changes: 48 additions & 0 deletions js_interop_gen/lib/src/js/generated/node_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// ignore_for_file: camel_case_types, constant_identifier_names
// ignore_for_file: library_private_types_in_public_api
// ignore_for_file: lines_longer_than_80_chars, non_constant_identifier_names
// ignore_for_file: unnecessary_ignore, unnecessary_parenthesis

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:js_interop' as _i1;

extension type MkdirOptions._(_i1.JSObject _) implements _i1.JSObject {
external bool? recursive;
}
extension type ReadFileOptions._(_i1.JSObject _) implements _i1.JSObject {
external String? encoding;
}
extension type GlobSyncOptions._(_i1.JSObject _) implements _i1.JSObject {
external String? cwd;

external _AnonymousFunction_1801294? exclude;
}
extension type fs._(_i1.JSObject _) implements _i1.JSObject {
@_i1.JS()
external static bool existsSync(String path);
@_i1.JS()
external static void mkdirSync(String path, [MkdirOptions? options]);
@_i1.JS()
external static String readFileSync(String path, [ReadFileOptions? options]);
@_i1.JS()
external static void writeFileSync(String path, String contents);
@_i1.JS()
external static _i1.JSArray<_i1.JSString> globSync(
_i1.JSArray<_i1.JSString> patterns, [
GlobSyncOptions? options,
]);
}
extension type process._(_i1.JSObject _) implements _i1.JSObject {
@_i1.JS()
external static void exit(num code);
}
extension type console._(_i1.JSObject _) implements _i1.JSObject {
@_i1.JS()
external static void error(String message);
}
@_i1.JS()
external String get url;
extension type _AnonymousFunction_1801294._(_i1.JSFunction _)
implements _i1.JSFunction {
external bool call(String entry);
}
11 changes: 4 additions & 7 deletions js_interop_gen/lib/src/js/node.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@
// 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 'generated/node_api.dart' as gen;

@JS()
external String get url;
export 'generated/node_api.dart' show url;

@JS('process.exit')
external void exit(int code);
void exit(int code) => gen.process.exit(code);

@JS('console.error')
external void printErr(String message);
void printErr(String message) => gen.console.error(message);
16 changes: 16 additions & 0 deletions js_interop_gen/lib/src/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions js_interop_gen/lib/src/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"author": "Dart project authors",
"license": "BSD 3",
"dependencies": {
"@types/node": "^22.0.0",
"@types/webidl2": "^24.4.4",
"typescript": "^5.9.3",
"webidl2": "^24.4.1"
Expand Down
Loading
Loading