Index: packages/js_util/src/js_util_base.dart |
diff --git a/packages/js_util/src/js_util_base.dart b/packages/js_util/src/js_util_base.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7f35991c98c4c8d500bf9c9aedb2fdb764b9b082 |
--- /dev/null |
+++ b/packages/js_util/src/js_util_base.dart |
@@ -0,0 +1,59 @@ |
+@JS() |
+library js_util.base; |
+ |
+import 'package:js/js.dart'; |
+import 'package:quiver_iterables/iterables.dart'; |
+ |
+// js_util library uses the technique described in |
+// https://github.com/dart-lang/sdk/issues/25053 |
+// because dart2js compiler does not support [] operator. |
+ |
+@JS() |
+@anonymous |
+class PropertyDescription { |
+ external factory PropertyDescription( |
+ {bool configurable, bool enumerable, value, bool writable}); |
+} |
+ |
+/// A wrapper for https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty |
+@JS('Object.defineProperty') |
+external void defineProperty(o, String prop, PropertyDescription description); |
+ |
+/// Returns `o[prop]`. |
+@JS('JsUtil.getValue') |
+external getValue(o, String prop); |
+ |
+/// Creates a new JavaScript object. |
+@JS('JsUtil.newObject') |
+external newObject(); |
+ |
+/// Performs `o[key] = value`. |
+void setValue(o, String key, value) { |
+ defineProperty(o, key, new PropertyDescription(value: value)); |
+} |
+ |
+/// Converts a Dart object to a JavaScript object. |
+/// |
+/// For example, you can convert a Dart [Map] to a JavaScript object. |
+/// |
+/// final jsObj = toJS({ |
+/// 'people': [ |
+/// {'firstName': 'Kwang Yul', 'lastName': 'Seo'}, |
+/// {'firstName': 'DoHyung', 'lastName': 'Kim'}, |
+/// {'firstName': 'Kyusun', 'lastName': 'Kim'} |
+/// ] |
+/// }); |
+/// |
+toJS(o) { |
+ if (o is Map) { |
+ final newObj = newObject(); |
+ for (final keyValuePair in zip([o.keys, o.values])) { |
+ setValue(newObj, keyValuePair[0], toJS(keyValuePair[1])); |
+ } |
+ return newObj; |
+ } else if (o is List) { |
+ return o.map((e) => toJS(e)).toList(); |
+ } else { |
+ return o; |
+ } |
+} |