/
number.dart
89 lines (80 loc) · 3.82 KB
/
number.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright 2021 Google Inc. Use of this source code is governed by an
// MIT-style license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT.
import 'package:js/js.dart';
import '../../value.dart';
import '../../util/nullable.dart';
import '../immutable.dart';
import '../reflection.dart';
/// The JavaScript `SassNumber` class.
final JSClass numberClass = () {
var jsClass = createJSClass('sass.SassNumber', (Object self, num value,
[Object? unitOrOptions]) {
if (unitOrOptions is String) return SassNumber(value, unitOrOptions);
var options = unitOrOptions as _ConstructorOptions?;
return SassNumber.withUnits(value,
numeratorUnits:
options?.numeratorUnits.andThen(jsToDartList)?.cast<String>(),
denominatorUnits:
options?.denominatorUnits.andThen(jsToDartList)?.cast<String>());
});
jsClass.defineGetters({
'value': (SassNumber self) => self.value,
'isInt': (SassNumber self) => self.isInt,
'asInt': (SassNumber self) => self.asInt,
'numeratorUnits': (SassNumber self) => ImmutableList(self.numeratorUnits),
'denominatorUnits': (SassNumber self) =>
ImmutableList(self.denominatorUnits),
'hasUnits': (SassNumber self) => self.hasUnits,
});
jsClass.defineMethods({
'assertInt': (SassNumber self, [String? name]) => self.assertInt(name),
'assertInRange': (SassNumber self, num min, num max, [String? name]) =>
self.valueInRange(min, max, name),
'assertNoUnits': (SassNumber self, [String? name]) =>
self..assertNoUnits(name),
'assertUnit': (SassNumber self, String unit, [String? name]) =>
self..assertUnit(unit, name),
'hasUnit': (SassNumber self, String unit) => self.hasUnit(unit),
'compatibleWithUnit': (SassNumber self, String unit) =>
self.hasUnits && self.compatibleWithUnit(unit),
'convert': (SassNumber self, Object numeratorUnits, Object denominatorUnits,
[String? name]) =>
self.convert(jsToDartList(numeratorUnits).cast<String>(),
jsToDartList(denominatorUnits).cast<String>(), name),
'convertToMatch': (SassNumber self, SassNumber other,
[String? name, String? otherName]) =>
self.convertToMatch(other, name, otherName),
'convertValue': (SassNumber self, Object numeratorUnits,
Object denominatorUnits, [String? name]) =>
self.convertValue(jsToDartList(numeratorUnits).cast<String>(),
jsToDartList(denominatorUnits).cast<String>(), name),
'convertValueToMatch': (SassNumber self, SassNumber other,
[String? name, String? otherName]) =>
self.convertValueToMatch(other, name, otherName),
'coerce': (SassNumber self, Object numeratorUnits, Object denominatorUnits,
[String? name]) =>
self.coerce(jsToDartList(numeratorUnits).cast<String>(),
jsToDartList(denominatorUnits).cast<String>(), name),
'coerceToMatch': (SassNumber self, SassNumber other,
[String? name, String? otherName]) =>
self.coerceToMatch(other, name, otherName),
'coerceValue': (SassNumber self, Object numeratorUnits,
Object denominatorUnits, [String? name]) =>
self.coerceValue(jsToDartList(numeratorUnits).cast<String>(),
jsToDartList(denominatorUnits).cast<String>(), name),
'coerceValueToMatch': (SassNumber self, SassNumber other,
[String? name, String? otherName]) =>
self.coerceValueToMatch(other, name, otherName),
});
// Our concrete number types are actually subclasses of [SassNumber], so we
// have to go up one in the superclass chain to inject [jsClass].
getJSClass(SassNumber(0)).superclass.injectSuperclass(jsClass);
return jsClass;
}();
@JS()
@anonymous
class _ConstructorOptions {
external Object? get numeratorUnits;
external Object? get denominatorUnits;
}