This commit is contained in:
ekibun
2021-02-22 13:07:53 +08:00
parent 7fe4f5e431
commit 8fb26b20af
12 changed files with 385 additions and 362 deletions

View File

@@ -20,7 +20,6 @@ jobs:
- name: Flutter action
uses: subosito/flutter-action@v1
with:
channel: "stable"
flutter-version: "1.22.4"
channel: beta
- run: flutter pub get
- run: flutter test test/flutter_qjs_test.dart

View File

@@ -6,6 +6,10 @@
* @LastEditTime: 2020-12-02 11:36:40
-->
## 0.3.4
* upgrade ffi to 1.0.0.
## 0.3.3
* remove `JSInvokable.call`.

View File

@@ -58,7 +58,7 @@ class CodeInputController extends TextEditingController {
String oldText = oldSpan.toPlainText();
String newText = value.text;
if (oldText == newText) return oldSpan;
(spanCall?.timeout(Duration.zero) ?? Future.delayed(Duration.zero))
(spanCall?.timeout(Duration.zero) ?? Future.value())
.then((_) => spanCall = compute(_convert, value.text).then((lsSpan) {
TextSpan newSpan = TextSpan(style: style, children: lsSpan);
if (newSpan.toPlainText() == value.text) oldSpan = newSpan;

View File

@@ -53,7 +53,6 @@ class _TestPageState extends State<TestPage> {
if (engine != null) return;
engine = IsolateQjs(
moduleHandler: (String module) async {
if (module == "test") return "export default '${new DateTime.now()}'";
return await rootBundle.loadString(
"js/" + module.replaceFirst(new RegExp(r".js$"), "") + ".js");
},

View File

@@ -7,56 +7,56 @@ packages:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.0-nullsafety.3"
version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.3"
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0-nullsafety.5"
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0-nullsafety.3"
version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0-nullsafety.3"
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.15.0-nullsafety.5"
version: "1.15.0"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0-nullsafety.3"
version: "1.2.0"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.3"
version: "1.0.0"
flutter:
dependency: "direct main"
description: flutter
@@ -75,7 +75,7 @@ packages:
path: ".."
relative: true
source: path
version: "0.3.3"
version: "0.3.4"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -94,21 +94,21 @@ packages:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.10-nullsafety.3"
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0-nullsafety.6"
version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0-nullsafety.3"
version: "1.8.0"
sky_engine:
dependency: transitive
description: flutter
@@ -120,56 +120,56 @@ packages:
name: source_span
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0-nullsafety.4"
version: "1.8.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.0-nullsafety.6"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.3"
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0-nullsafety.3"
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0-nullsafety.3"
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.19-nullsafety.6"
version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0-nullsafety.5"
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.5"
version: "2.1.0"
sdks:
dart: ">=2.12.0-0.0 <3.0.0"
flutter: ">=1.20.0 <2.0.0"
dart: ">=2.12.0-259.9.beta <3.0.0"
flutter: ">=1.20.0"

View File

@@ -15,8 +15,8 @@ typedef _JsHostPromiseRejectionHandler = void Function(dynamic reason);
/// Quickjs engine for flutter.
class FlutterQjs {
Pointer _rt;
Pointer _ctx;
Pointer<JSRuntime> _rt;
Pointer<JSContext> _ctx;
/// Max stack size for quickjs.
final int stackSize;
@@ -42,10 +42,10 @@ class FlutterQjs {
try {
switch (type) {
case JSChannelType.METHON:
final pdata = ptr.cast<Pointer>();
final pdata = ptr.cast<Pointer<JSValue>>();
final argc = pdata.elementAt(1).value.cast<Int32>().value;
List pargs = [];
for (int i = 0; i < argc; ++i) {
final pargs = [];
for (var i = 0; i < argc; ++i) {
pargs.add(_jsToDart(
ctx,
Pointer.fromAddress(
@@ -53,7 +53,10 @@ class FlutterQjs {
),
));
}
JSInvokable func = _jsToDart(ctx, pdata.elementAt(3).value);
final JSInvokable func = _jsToDart(
ctx,
pdata.elementAt(3).value,
);
return _dartToJs(
ctx,
func.invoke(
@@ -68,7 +71,7 @@ class FlutterQjs {
Future.microtask(() {
malloc.free(ret);
});
return ret;
return ret.cast();
case JSChannelType.PROMISE_TRACK:
final err = _parseJSException(ctx, ptr);
if (hostPromiseRejectionHandler != null) {
@@ -76,29 +79,29 @@ class FlutterQjs {
} else {
print('unhandled promise rejection: $err');
}
return Pointer.fromAddress(0);
return nullptr;
case JSChannelType.FREE_OBJECT:
Pointer rt = ctx;
final rt = ctx.cast<JSRuntime>();
_DartObject obj = _DartObject.fromAddress(rt, ptr.address);
obj?.free();
return Pointer.fromAddress(0);
return nullptr;
}
throw JSError('call channel with wrong type');
} catch (e) {
if (type == JSChannelType.FREE_OBJECT) {
print('DartObject release error: $e');
return Pointer.fromAddress(0);
return nullptr;
}
if (type == JSChannelType.MODULE) {
print('host Promise Rejection Handler error: $e');
return Pointer.fromAddress(0);
return nullptr;
}
final throwObj = _dartToJs(ctx, e);
final err = jsThrow(ctx, throwObj);
jsFreeValue(ctx, throwObj);
if (type == JSChannelType.MODULE) {
jsFreeValue(ctx, err);
return Pointer.fromAddress(0);
return nullptr;
}
return err;
}

File diff suppressed because it is too large Load Diff

View File

@@ -115,21 +115,19 @@ void _runJsIsolate(Map spawnMessage) async {
},
moduleHandler: (name) {
final ptr = calloc<Pointer<Utf8>>();
ptr.value = Pointer.fromAddress(0);
ptr.value = Pointer.fromAddress(ptr.address);
sendPort.send({
#type: #module,
#name: name,
#ptr: ptr.address,
});
while (ptr.value.address == 0) sleep(Duration.zero);
if (ptr.value.address == -1) throw JSError('Module Not found');
final ret = ptr.value.toDartString();
sendPort.send({
#type: #release,
#ptr: ptr.value.address,
});
while (ptr.value.address == ptr.address) sleep(Duration(microseconds: 1));
final ret = ptr.value;
malloc.free(ptr);
return ret;
if (ret.address == -1) throw JSError('Module Not found');
final retString = ret.toDartString();
malloc.free(ret);
return retString;
},
);
port.listen((msg) async {
@@ -225,9 +223,6 @@ class IsolateQjs {
ptr.value = Pointer.fromAddress(-1);
}
break;
case #release:
malloc.free(Pointer.fromAddress(msg[#ptr]));
break;
}
}, onDone: () {
close();

View File

@@ -49,7 +49,7 @@ class _DartFunction extends JSInvokable {
class _DartObject extends JSRef implements JSRefLeakable {
Object _obj;
Pointer _ctx;
Pointer<JSContext> _ctx;
_DartObject(this._ctx, this._obj) {
if (_obj is JSRef) {
(_obj as JSRef).dup();
@@ -57,7 +57,7 @@ class _DartObject extends JSRef implements JSRefLeakable {
runtimeOpaques[jsGetRuntime(_ctx)]?.addRef(this);
}
static _DartObject fromAddress(Pointer rt, int val) {
static _DartObject fromAddress(Pointer<JSRuntime> rt, int val) {
return runtimeOpaques[rt]?.getRef((e) => identityHashCode(e) == val);
}
@@ -116,12 +116,12 @@ class JSError extends _IsolateEncodable {
/// JS Object reference
/// call [release] to release js object.
class _JSObject extends JSRef {
Pointer _val;
Pointer _ctx;
Pointer<JSValue> _val;
Pointer<JSContext> _ctx;
/// Create
_JSObject(this._ctx, Pointer _val) {
Pointer rt = jsGetRuntime(_ctx);
_JSObject(this._ctx, Pointer<JSValue> _val) {
final rt = jsGetRuntime(_ctx);
this._val = jsDupValue(_ctx, _val);
runtimeOpaques[rt]?.addRef(this);
}
@@ -129,7 +129,7 @@ class _JSObject extends JSRef {
@override
void destroy() {
if (_val == null) return;
Pointer rt = jsGetRuntime(_ctx);
final rt = jsGetRuntime(_ctx);
runtimeOpaques[rt]?.removeRef(this);
jsFreeValue(_ctx, _val);
_val = null;
@@ -145,11 +145,11 @@ class _JSObject extends JSRef {
/// JS function wrapper
class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable {
_JSFunction(Pointer ctx, Pointer val) : super(ctx, val);
_JSFunction(Pointer<JSContext> ctx, Pointer<JSValue> val) : super(ctx, val);
@override
invoke(List<dynamic> arguments, [dynamic thisVal]) {
Pointer jsRet = _invoke(arguments, thisVal);
final jsRet = _invoke(arguments, thisVal);
if (jsRet == null) return;
bool isException = jsIsException(jsRet) != 0;
if (isException) {
@@ -161,17 +161,17 @@ class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable {
return ret;
}
Pointer _invoke(List<dynamic> arguments, [dynamic thisVal]) {
Pointer<JSValue> _invoke(List<dynamic> arguments, [dynamic thisVal]) {
if (_val == null) throw JSError("InternalError: JSValue released");
List<Pointer> args = arguments
final args = arguments
.map(
(e) => _dartToJs(_ctx, e),
)
.toList();
Pointer jsThis = _dartToJs(_ctx, thisVal);
Pointer jsRet = jsCall(_ctx, _val, jsThis, args);
final jsThis = _dartToJs(_ctx, thisVal);
final jsRet = jsCall(_ctx, _val, jsThis, args);
jsFreeValue(_ctx, jsThis);
for (Pointer jsArg in args) {
for (final jsArg in args) {
jsFreeValue(_ctx, jsArg);
}
return jsRet;
@@ -255,15 +255,15 @@ class IsolateFunction extends JSInvokable implements _IsolateEncodable {
_destroy();
return null;
}
List args = _decodeData(msg[#args]);
Map thisVal = _decodeData(msg[#thisVal]);
final List args = _decodeData(msg[#args]);
final thisVal = _decodeData(msg[#thisVal]);
return _invokable.invoke(args, thisVal);
}
@override
Future invoke(List positionalArguments, [thisVal]) async {
List dArgs = _encodeData(positionalArguments);
Map dThisVal = _encodeData(thisVal);
final List dArgs = _encodeData(positionalArguments);
final dThisVal = _encodeData(thisVal);
return _send({
#args: dArgs,
#thisVal: dThisVal,

View File

@@ -7,7 +7,7 @@
*/
part of '../flutter_qjs.dart';
dynamic _parseJSException(Pointer ctx, [Pointer perr]) {
dynamic _parseJSException(Pointer<JSContext> ctx, [Pointer<JSValue> perr]) {
final e = perr ?? jsGetException(ctx);
var err;
try {
@@ -20,11 +20,11 @@ dynamic _parseJSException(Pointer ctx, [Pointer perr]) {
}
void _definePropertyValue(
Pointer ctx,
Pointer obj,
Pointer<JSContext> ctx,
Pointer<JSValue> obj,
dynamic key,
dynamic val, {
Map<dynamic, dynamic> cache,
Map<dynamic, Pointer<JSValue>> cache,
}) {
final jsAtomVal = _dartToJs(ctx, key, cache: cache);
final jsAtom = jsValueToAtom(ctx, jsAtomVal);
@@ -39,9 +39,9 @@ void _definePropertyValue(
jsFreeValue(ctx, jsAtomVal);
}
Pointer _jsGetPropertyValue(
Pointer ctx,
Pointer obj,
Pointer<JSValue> _jsGetPropertyValue(
Pointer<JSContext> ctx,
Pointer<JSValue> obj,
dynamic key, {
Map<dynamic, dynamic> cache,
}) {
@@ -53,7 +53,8 @@ Pointer _jsGetPropertyValue(
return jsProp;
}
Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
Pointer<JSValue> _dartToJs(Pointer<JSContext> ctx, dynamic val,
{Map<dynamic, Pointer<JSValue>> cache}) {
if (val == null) return jsUNDEFINED();
if (val is Error) return _dartToJs(ctx, JSError(val, val.stackTrace));
if (val is Exception) return _dartToJs(ctx, JSError(val));
@@ -66,17 +67,17 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
}
if (val is _JSObject) return jsDupValue(ctx, val._val);
if (val is Future) {
final resolvingFunc = malloc<Uint8>(sizeOfJSValue * 2);
final resolvingFunc = malloc<Uint8>(sizeOfJSValue * 2).cast<JSValue>();
final resolvingFunc2 =
Pointer.fromAddress(resolvingFunc.address + sizeOfJSValue);
Pointer<JSValue>.fromAddress(resolvingFunc.address + sizeOfJSValue);
final ret = jsNewPromiseCapability(ctx, resolvingFunc);
_JSFunction res = _jsToDart(ctx, resolvingFunc);
_JSFunction rej = _jsToDart(ctx, resolvingFunc2);
final _JSFunction res = _jsToDart(ctx, resolvingFunc);
final _JSFunction rej = _jsToDart(ctx, resolvingFunc2);
jsFreeValue(ctx, resolvingFunc, free: false);
jsFreeValue(ctx, resolvingFunc2, free: false);
malloc.free(resolvingFunc);
_DartObject refRes = _DartObject(ctx, res);
_DartObject refRej = _DartObject(ctx, rej);
final refRes = _DartObject(ctx, res);
final refRej = _DartObject(ctx, rej);
res.free();
rej.free();
val.then((value) {
@@ -106,7 +107,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
return jsDupValue(ctx, cache[val]);
}
if (val is List) {
Pointer ret = jsNewArray(ctx);
final ret = jsNewArray(ctx);
cache[val] = ret;
for (int i = 0; i < val.length; ++i) {
_definePropertyValue(ctx, ret, i, val[i], cache: cache);
@@ -114,7 +115,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
return ret;
}
if (val is Map) {
Pointer ret = jsNewObject(ctx);
final ret = jsNewObject(ctx);
cache[val] = ret;
for (MapEntry<dynamic, dynamic> entry in val.entries) {
_definePropertyValue(ctx, ret, entry.key, entry.value, cache: cache);
@@ -123,7 +124,7 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
}
// wrap Function to JSInvokable
final valWrap = JSInvokable._wrap(val);
int dartObjectClassId =
final dartObjectClassId =
runtimeOpaques[jsGetRuntime(ctx)]?.dartObjectClassId ?? 0;
if (dartObjectClassId == 0) return jsUNDEFINED();
final dartObject = jsNewObjectClass(
@@ -139,9 +140,10 @@ Pointer _dartToJs(Pointer ctx, dynamic val, {Map<dynamic, dynamic> cache}) {
return dartObject;
}
dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
dynamic _jsToDart(Pointer<JSContext> ctx, Pointer<JSValue> val,
{Map<int, dynamic> cache}) {
if (cache == null) cache = Map();
int tag = jsValueGetTag(val);
final tag = jsValueGetTag(val);
if (jsTagIsFloat64(tag) != 0) {
return jsToFloat64(ctx, val);
}
@@ -160,14 +162,14 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
rt, jsGetObjectOpaque(val, dartObjectClassId));
if (dartObject != null) return dartObject._obj;
}
Pointer<IntPtr> psize = malloc<IntPtr>();
Pointer<Uint8> buf = jsGetArrayBuffer(ctx, psize, val);
int size = psize.value;
final psize = malloc<IntPtr>();
final buf = jsGetArrayBuffer(ctx, psize, val);
final size = psize.value;
malloc.free(psize);
if (buf.address != 0) {
return Uint8List.fromList(buf.asTypedList(size));
}
int valptr = jsValueGetPtr(val).address;
final valptr = jsValueGetPtr(val);
if (cache.containsKey(valptr)) {
return cache[valptr];
}
@@ -181,8 +183,9 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
jsFreeValue(ctx, pstack);
return JSError(err, stack);
} else if (jsIsPromise(ctx, val) != 0) {
Pointer jsPromiseThen = _jsGetPropertyValue(ctx, val, 'then');
_JSFunction promiseThen = _jsToDart(ctx, jsPromiseThen, cache: cache);
final jsPromiseThen = _jsGetPropertyValue(ctx, val, 'then');
final _JSFunction promiseThen =
_jsToDart(ctx, jsPromiseThen, cache: cache);
jsFreeValue(ctx, jsPromiseThen);
final completer = Completer();
completer.future.catchError((e) {});
@@ -199,30 +202,34 @@ dynamic _jsToDart(Pointer ctx, Pointer val, {Map<int, dynamic> cache}) {
], jsPromise);
jsPromise.free();
promiseThen.free();
bool isException = jsIsException(jsRet) != 0;
final isException = jsIsException(jsRet) != 0;
jsFreeValue(ctx, jsRet);
if (isException) throw _parseJSException(ctx);
return completer.future;
} else if (jsIsArray(ctx, val) != 0) {
Pointer jslength = _jsGetPropertyValue(ctx, val, 'length');
int length = jsToInt64(ctx, jslength);
List<dynamic> ret = [];
final jslength = _jsGetPropertyValue(ctx, val, 'length');
final length = jsToInt64(ctx, jslength);
final ret = [];
cache[valptr] = ret;
for (int i = 0; i < length; ++i) {
for (var i = 0; i < length; ++i) {
final jsProp = _jsGetPropertyValue(ctx, val, i);
ret.add(_jsToDart(ctx, jsProp, cache: cache));
jsFreeValue(ctx, jsProp);
}
return ret;
} else {
Pointer<Pointer> ptab = malloc<Pointer>();
Pointer<Uint32> plen = malloc<Uint32>();
if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) return null;
int len = plen.value;
final ptab = malloc<Pointer<JSPropertyEnum>>();
final plen = malloc<Uint32>();
if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) {
malloc.free(plen);
malloc.free(ptab);
return null;
}
final len = plen.value;
malloc.free(plen);
Map<dynamic, dynamic> ret = Map();
final ret = Map();
cache[valptr] = ret;
for (int i = 0; i < len; ++i) {
for (var i = 0; i < len; ++i) {
final jsAtom = jsPropertyEnumGetAtom(ptab.value, i);
final jsAtomValue = jsAtomToValue(ctx, jsAtom);
final jsProp = jsGetProperty(ctx, val, jsAtom);

View File

@@ -7,56 +7,56 @@ packages:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.5.0-nullsafety.3"
version: "2.5.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.3"
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0-nullsafety.5"
version: "1.1.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0-nullsafety.3"
version: "1.2.0"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0-nullsafety.3"
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.15.0-nullsafety.5"
version: "1.15.0"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0-nullsafety.3"
version: "1.2.0"
ffi:
dependency: "direct main"
description:
name: ffi
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.3"
version: "1.0.0"
flutter:
dependency: "direct main"
description: flutter
@@ -73,21 +73,21 @@ packages:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.10-nullsafety.3"
version: "0.12.10"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0-nullsafety.6"
version: "1.3.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0-nullsafety.3"
version: "1.8.0"
sky_engine:
dependency: transitive
description: flutter
@@ -99,56 +99,56 @@ packages:
name: source_span
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0-nullsafety.4"
version: "1.8.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.0-nullsafety.6"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.3"
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0-nullsafety.3"
version: "1.1.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.0-nullsafety.3"
version: "1.2.0"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.19-nullsafety.6"
version: "0.2.19"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0-nullsafety.5"
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.5"
version: "2.1.0"
sdks:
dart: ">=2.12.0-0.0 <3.0.0"
dart: ">=2.12.0-259.9.beta <3.0.0"
flutter: ">=1.20.0"

View File

@@ -1,6 +1,6 @@
name: flutter_qjs
description: This plugin is a simple js engine for flutter using the `quickjs` project. Plugin currently supports all the platforms except web!
version: 0.3.3
version: 0.3.4
homepage: https://github.com/ekibun/flutter_qjs
environment:
@@ -26,6 +26,7 @@ flutter:
# be modified. They are used by the tooling to maintain consistency when
# adding or updating assets for this project.
plugin:
implements: flutter_qjs
platforms:
# This plugin project was generated without specifying any
# platforms with the `--platform` argument. If you see the `fake_platform` map below, remove it and