methods method
Implementation
@override
Map<String, Function> methods() {
return {
'init': () => {},
'keys': (dynamic value) => (value is Map)
? InvokableController.ownEnumerableKeys(value)
: (value == null ? [] : null),
'values': (dynamic value) => (value is Map)
? InvokableController.ownEnumerableKeys(value)
.map((key) => InvokableController.getProperty(value, key))
.toList()
: (value == null ? [] : null),
'entries': (dynamic value) => (value is Map)
? InvokableController.ownEnumerableKeys(value)
.map((key) => [key, InvokableController.getProperty(value, key)])
.toList()
: (value == null ? [] : null),
'fromEntries': (dynamic entries) {
final result = <dynamic, dynamic>{};
List<dynamic> entryList = [];
if (entries is List) {
entryList = entries;
} else if (entries is Invokable) {
final method = entries.methods()['entries'];
final value =
method == null ? null : Function.apply(method, const []);
if (value is List) entryList = value;
}
for (final entry in entryList) {
if (entry is List && entry.length >= 2) {
result[entry[0]] = entry[1];
} else if (entry is Map) {
final key = entry.containsKey('key') ? entry['key'] : entry[0];
final value =
entry.containsKey('value') ? entry['value'] : entry[1];
result[key] = value;
}
}
return result;
},
'create': (dynamic proto) {
final Map<String, dynamic> obj = {};
if (proto != null) {
InvokableController.setPrototype(obj, proto);
}
return obj;
},
'getPrototypeOf': (dynamic value) =>
InvokableController.getPrototype(value),
'hasOwn': (dynamic value, dynamic key) =>
InvokableController.hasOwnProperty(value, key),
'hasOwnProperty': (dynamic value, String key) =>
InvokableController.hasOwnProperty(value, key),
'getOwnPropertyNames': (dynamic value) => (value is Map)
? InvokableController.ownPropertyKeys(value)
: (value == null ? [] : null),
'getPropertyNames': (dynamic value) => (value is Map)
? InvokableController.ownPropertyKeys(value)
: (value == null ? [] : null),
'toString': (dynamic value) => value.toString(),
'toJSON': (dynamic value) => JSON().methods()['stringify']!(value),
'defineProperty': (dynamic value, String key, dynamic property) {
if (value is Map) {
InvokableController.defineProperty(
value, key, _descriptorFromMap(property));
}
return value;
},
'getOwnPropertyDescriptor': (dynamic value, String key) =>
InvokableController.getOwnPropertyDescriptor(value, key)?.toMap(),
'deleteProperty': (dynamic value, String key) =>
InvokableController.deleteProperty(value, key),
'has': (dynamic value, String key) =>
InvokableController.hasProperty(value, key),
'isPrototypeOf': (dynamic proto, dynamic value) =>
InvokableController.isPrototypeInChain(value, proto),
'propertyIsEnumerable': (dynamic value, String key) =>
InvokableController.propertyIsEnumerable(value, key),
'assign': (dynamic target, [dynamic source, dynamic source2]) {
if (target is! Map) return target;
for (final sourceValue in [source, source2]) {
if (sourceValue is Map) {
for (final key
in InvokableController.ownEnumerableKeys(sourceValue)) {
InvokableController.setProperty(target, key,
InvokableController.getProperty(sourceValue, key));
}
}
}
return target;
},
};
}