From f1257ea3d123ed09de38f8e2721b6fc0e1ad9e92 Mon Sep 17 00:00:00 2001 From: Till Gerken Date: Tue, 28 Oct 2025 16:52:42 +0100 Subject: [PATCH 1/3] Switch to universal IO to remove dependency on dart:io --- lib/src/platforms/vm.dart | 2 +- lib/src/platforms/web.dart | 37 +++++++++++++------ lib/src/timezones/idatetimezone_writer.dart | 2 +- pubspec.yaml | 3 +- test/testing/test_fx.dart | 2 +- tool/culture_compiler/decode_to_json.dart | 2 +- tool/culture_compiler/encode_dart.dart | 2 +- tool/culture_compiler/encode_json_to_bin.dart | 2 +- tool/tzdb_compiler/main.dart | 2 +- .../tzdb/cldr_windows_zone_parser.dart | 2 +- tool/tzdb_compiler/tzdb/file_source.dart | 2 +- .../tzdb/tzdb_zone_info_compiler.dart | 2 +- 12 files changed, 38 insertions(+), 22 deletions(-) diff --git a/lib/src/platforms/vm.dart b/lib/src/platforms/vm.dart index 57684014..75a4c444 100644 --- a/lib/src/platforms/vm.dart +++ b/lib/src/platforms/vm.dart @@ -4,7 +4,7 @@ import 'dart:async'; import 'dart:collection'; -import 'dart:io' as io; +import 'package:universal_io/io.dart' as io; import 'package:time_machine2/src/time_machine_internal.dart'; import 'package:time_machine2/src/timezones/datetimezone_providers.dart'; diff --git a/lib/src/platforms/web.dart b/lib/src/platforms/web.dart index 7c3448ed..16529b34 100644 --- a/lib/src/platforms/web.dart +++ b/lib/src/platforms/web.dart @@ -3,7 +3,7 @@ // Use of this source code is governed by the Apache License 2.0, as found in the LICENSE.txt file. import 'dart:async'; -import 'dart:js'; +import 'dart:js_interop'; import 'package:time_machine2/src/time_machine_internal.dart'; import 'package:time_machine2/src/timezones/datetimezone_providers.dart'; @@ -53,19 +53,34 @@ class TimeMachine { // {locale: en-US, numberingSystem: latn, calendar: gregory, timeZone: America/New_York, year: numeric, month: numeric, day: numeric} static void _readIntlObject() { try { - JsObject options = context['Intl'] - .callMethod('DateTimeFormat') - .callMethod('resolvedOptions'); + final dateTimeFormat = _DateTimeFormat(); + final options = dateTimeFormat.resolvedOptions(); - _locale = options['locale']; - _timeZoneId = options['timeZone']; - _numberingSystem = options['numberingSystem']; - _calendar = options['calendar']; - _yearFormat = options['year']; - _monthFormat = options['month']; - _dayFormat = options['day']; + _locale = options.locale.toDart; + _timeZoneId = options.timeZone.toDart; + _numberingSystem = options.numberingSystem.toDart; + _calendar = options.calendar.toDart; + _yearFormat = options.year.toDart; + _monthFormat = options.month.toDart; + _dayFormat = options.day.toDart; } catch (e, s) { print('Failed to get platform local information.\n$e\n$s'); } } } + +@JS('Intl.DateTimeFormat') +extension type _DateTimeFormat._(JSObject _) implements JSObject { + external _DateTimeFormat(); + external _ResolvedOptions resolvedOptions(); +} + +extension type _ResolvedOptions._(JSObject _) implements JSObject { + external JSString get locale; + external JSString get timeZone; + external JSString get numberingSystem; + external JSString get calendar; + external JSString get year; + external JSString get month; + external JSString get day; +} diff --git a/lib/src/timezones/idatetimezone_writer.dart b/lib/src/timezones/idatetimezone_writer.dart index 41e29709..dca06510 100644 --- a/lib/src/timezones/idatetimezone_writer.dart +++ b/lib/src/timezones/idatetimezone_writer.dart @@ -2,7 +2,7 @@ /// Use of this source code is governed by the Apache License 2.0, /// as found in the LICENSE.txt file. -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'package:time_machine2/time_machine2.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index a748edb3..2f98a6b2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,7 +14,7 @@ platforms: # SDK's lower bound must be compatible with the current version pushed with Flutter # ./flutter --version environment: - sdk: ">=2.19.0 <4.0.0" + sdk: ">=3.3.0 <4.0.0" # Verify flutter_test dependency compatibility first before updating any constraints # https://github.com/flutter/flutter/blob/master/packages/flutter_test/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: collection: ^1.18.0 http: ^1.2.2 meta: ^1.15.0 + universal_io: ^2.2.0 dev_dependencies: args: ^2.0.0 diff --git a/test/testing/test_fx.dart b/test/testing/test_fx.dart index d8746c70..c6ada719 100644 --- a/test/testing/test_fx.dart +++ b/test/testing/test_fx.dart @@ -3,7 +3,7 @@ // Use of this source code is governed by the Apache License 2.0, as found in the LICENSE.txt file. import 'dart:async'; import 'dart:mirrors'; -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'package:test/test.dart'; import 'package:time_machine2/src/time_machine_internal.dart'; diff --git a/tool/culture_compiler/decode_to_json.dart b/tool/culture_compiler/decode_to_json.dart index e0d06076..9cab642a 100644 --- a/tool/culture_compiler/decode_to_json.dart +++ b/tool/culture_compiler/decode_to_json.dart @@ -1,5 +1,5 @@ import 'dart:convert'; -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'dart:typed_data'; import 'package:time_machine2/src/time_machine_internal.dart'; diff --git a/tool/culture_compiler/encode_dart.dart b/tool/culture_compiler/encode_dart.dart index 30d045a4..4f075baf 100644 --- a/tool/culture_compiler/encode_dart.dart +++ b/tool/culture_compiler/encode_dart.dart @@ -1,4 +1,4 @@ -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'dart:typed_data'; import 'package:path/path.dart' as p; diff --git a/tool/culture_compiler/encode_json_to_bin.dart b/tool/culture_compiler/encode_json_to_bin.dart index 793d8a92..7a82f750 100644 --- a/tool/culture_compiler/encode_json_to_bin.dart +++ b/tool/culture_compiler/encode_json_to_bin.dart @@ -1,5 +1,5 @@ import 'dart:convert'; -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'package:time_machine2/src/time_machine_internal.dart'; diff --git a/tool/tzdb_compiler/main.dart b/tool/tzdb_compiler/main.dart index 77efb8fd..7a31c6c8 100644 --- a/tool/tzdb_compiler/main.dart +++ b/tool/tzdb_compiler/main.dart @@ -2,7 +2,7 @@ // Portions of this work are Copyright 2018 The Noda Time Authors. All rights reserved. // Use of this source code is governed by the Apache License 2.0, as found in the LICENSE.txt file. -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'dart:typed_data'; import 'package:path/path.dart' as path; diff --git a/tool/tzdb_compiler/tzdb/cldr_windows_zone_parser.dart b/tool/tzdb_compiler/tzdb/cldr_windows_zone_parser.dart index dc522fd8..64cb4744 100644 --- a/tool/tzdb_compiler/tzdb/cldr_windows_zone_parser.dart +++ b/tool/tzdb_compiler/tzdb/cldr_windows_zone_parser.dart @@ -1,4 +1,4 @@ -import 'dart:io' as io; +import 'package:universal_io/io.dart' as io; import 'package:xml/xml.dart' as xml; diff --git a/tool/tzdb_compiler/tzdb/file_source.dart b/tool/tzdb_compiler/tzdb/file_source.dart index dc21d5fb..67692d71 100644 --- a/tool/tzdb_compiler/tzdb/file_source.dart +++ b/tool/tzdb_compiler/tzdb/file_source.dart @@ -1,4 +1,4 @@ -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'dart:convert'; import 'package:archive/archive.dart'; diff --git a/tool/tzdb_compiler/tzdb/tzdb_zone_info_compiler.dart b/tool/tzdb_compiler/tzdb/tzdb_zone_info_compiler.dart index 6d5c204f..779d9cc5 100644 --- a/tool/tzdb_compiler/tzdb/tzdb_zone_info_compiler.dart +++ b/tool/tzdb_compiler/tzdb/tzdb_zone_info_compiler.dart @@ -2,7 +2,7 @@ // Portions of this work are Copyright 2018 The Noda Time Authors. All rights reserved. // Use of this source code is governed by the Apache License 2.0, as found in the LICENSE.txt file. -import 'dart:io'; +import 'package:universal_io/io.dart'; import 'package:http/http.dart' as http; import 'package:time_machine2/src/time_machine_internal.dart'; From 28221d9d5d7d53fb51004d38566e0296ca8148fb Mon Sep 17 00:00:00 2001 From: Till Gerken Date: Tue, 28 Oct 2025 17:05:05 +0100 Subject: [PATCH 2/3] Default to web platform when using WASM --- lib/time_machine2.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/time_machine2.dart b/lib/time_machine2.dart index 7c98f6bd..c1c045d2 100644 --- a/lib/time_machine2.dart +++ b/lib/time_machine2.dart @@ -9,6 +9,7 @@ import 'src/platforms/platform_io.dart' // `dart.library.js` is compatible with node and browser via dart2js -- `dart.library.html` will only work for the browser // or at lest it seemed it should be, when I tried `dart.library.js` in chrome, it failed to evaluate to true if (dart.library.html) 'src/platforms/web.dart' + if (dart.library.js_interop) 'src/platforms/web.dart' if (dart.library.io) 'src/platforms/vm.dart' as time_machine; export 'src/calendar_system.dart' show CalendarSystem; From a29521fe1257690abbdfca8101a061026457af08 Mon Sep 17 00:00:00 2001 From: Till Gerken Date: Tue, 28 Oct 2025 17:06:34 +0100 Subject: [PATCH 3/3] Fix lints --- lib/src/calendars/islamic_yearmonthday_calculator.dart | 6 +----- lib/src/calendars/week_year_rules.dart | 2 -- lib/src/text/parse_result.dart | 4 ++-- lib/src/text/zoneddatetime_pattern_parser.dart | 2 +- lib/src/timezones/tzdb_stream_reader.dart | 2 -- 5 files changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/src/calendars/islamic_yearmonthday_calculator.dart b/lib/src/calendars/islamic_yearmonthday_calculator.dart index a75433b1..ac9007fe 100644 --- a/lib/src/calendars/islamic_yearmonthday_calculator.dart +++ b/lib/src/calendars/islamic_yearmonthday_calculator.dart @@ -168,9 +168,7 @@ class IslamicYearMonthDayCalculator extends RegularYearMonthDayCalculator { case IslamicLeapYearPattern.indian: return 690562340; // 0b101001001010010010010100100100 case IslamicLeapYearPattern.habashAlHasib: - return 153692453; // 0b001001001010010010100100100101 - default: - throw ArgumentError.value(leapYearPattern.index, 'leapYearPattern'); + return 153692453; } } @@ -182,8 +180,6 @@ class IslamicYearMonthDayCalculator extends RegularYearMonthDayCalculator { return _daysAtAstronomicalEpoch; case IslamicEpoch.civil: return _daysAtCivilEpoch; - default: - throw ArgumentError.value(epoch.index, 'epoch'); } } } diff --git a/lib/src/calendars/week_year_rules.dart b/lib/src/calendars/week_year_rules.dart index 69ea78f4..861b2131 100644 --- a/lib/src/calendars/week_year_rules.dart +++ b/lib/src/calendars/week_year_rules.dart @@ -79,8 +79,6 @@ abstract class WeekYearRules { case CalendarWeekRule.firstFullWeek: minDaysInFirstWeek = 7; break; - default: - throw ArgumentError('Unsupported CalendarWeekRule: $calendarWeekRule'); } return SimpleWeekYearRule(minDaysInFirstWeek, firstDayOfWeek, true); } diff --git a/lib/src/text/parse_result.dart b/lib/src/text/parse_result.dart index c90ecff8..149ebf0d 100644 --- a/lib/src/text/parse_result.dart +++ b/lib/src/text/parse_result.dart @@ -42,7 +42,7 @@ class ParseResult { throw StateError( 'Parse operation succeeded, so no exception is available'); } - return _errorProvider!(); + return _errorProvider(); } /// Gets the value from the parse operation if it was successful, or throws an exception indicating the parse failure @@ -56,7 +56,7 @@ class ParseResult { if (_errorProvider == null) { return _value; } - throw _errorProvider!(); + throw _errorProvider(); } /// Returns the success value, and sets the out parameter to either diff --git a/lib/src/text/zoneddatetime_pattern_parser.dart b/lib/src/text/zoneddatetime_pattern_parser.dart index 59fd3c9b..a389d19c 100644 --- a/lib/src/text/zoneddatetime_pattern_parser.dart +++ b/lib/src/text/zoneddatetime_pattern_parser.dart @@ -279,7 +279,7 @@ class _ZonedDateTimeParseBucket extends ParseBucket { } } value.move(value.index + longestSoFar.length); - return _zoneProvider! + return _zoneProvider .getDateTimeZoneSync(longestSoFar); // [longestSoFar]; } } diff --git a/lib/src/timezones/tzdb_stream_reader.dart b/lib/src/timezones/tzdb_stream_reader.dart index 60c64023..45b56f5a 100644 --- a/lib/src/timezones/tzdb_stream_reader.dart +++ b/lib/src/timezones/tzdb_stream_reader.dart @@ -192,8 +192,6 @@ class TzdbStreamReader { return FixedDateTimeZone.read(reader, id); case DateTimeZoneType.precalculated: return PrecalculatedDateTimeZone.read(reader, id); - default: - throw Exception('Unknown zone type: $type'); } } }