// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Annotations to mark interfaces to JavaScript. All of these annotations are /// exported via `package:js`. library _js_annotations; export 'dart:js_util' show allowInterop, allowInteropCaptureThis; /// An annotation that indicates a library, class, or member is implemented /// directly in JavaScript. /// /// All external members of a class or library with this annotation implicitly /// have it as well. /// /// Specifying [name] customizes the JavaScript name to use. By default the /// dart name is used. It is not valid to specify a custom [name] for class /// instance members. class JS { final String? name; const JS([this.name]); } class _Anonymous { const _Anonymous(); } class _StaticInterop { const _StaticInterop(); } /// An annotation that indicates a [JS] annotated class is structural and does /// not have a known JavaScript prototype. /// /// A class marked with [anonymous] must have an unnamed factory constructor /// with no positional arguments, only named arguments. Invoking the constructor /// desugars to creating a JavaScript object literal with name-value pairs /// corresponding to the parameter names and values. const _Anonymous anonymous = _Anonymous(); /// [staticInterop] enables the [JS] annotated class to be treated as a "static" /// interop class. /// /// These classes allow interop with native types, like the ones in `dart:html`. /// These classes should not contain any instance members, inherited or /// otherwise, and should instead use static extension members. const _StaticInterop staticInterop = _StaticInterop(); /// NOTE: [trustTypes] is an experimental annotation that may disappear at any /// point in time. It exists solely to help users who wish to migrate classes /// from the older style of JS interop to the new static interop model but wish /// to preserve the older semantics for type checks. This annotation must be /// used alongside [staticInterop] and it affects any external methods in any /// extension to the static interop class. class _TrustTypes { const _TrustTypes(); } const _TrustTypes trustTypes = _TrustTypes(); /// Annotation to allow Dart classes to be wrapped with a JS object using /// `dart:js_interop`'s `createJSInteropWrapper`. /// /// When an instance of a class annotated with this annotation is passed to /// `createJSInteropWrapper`, the method returns a JS object that contains /// a property for each of the class' instance members. When called, these /// properties forward to the instance's corresponding members. /// /// You can either annotate specific instance members to only wrap those members /// or you can annotate the entire class, which will include all of its instance /// members. /// /// By default, the property will have the same name as the corresponding /// instance member. You can change the property name of a member in the JS /// object by providing a [name] in the @[JSExport] annotation on the member, /// like so: /// ``` /// class Export { /// @JSExport('printHelloWorld') /// void printMessage() => print('Hello World!'); /// } /// ``` /// which will then set the property 'printHelloWorld' in the JS object to /// forward to `printMessage`. /// /// Classes and mixins in the hierarchy of the annotated class are included only /// if they are annotated as well or specific members in them are annotated. If /// a superclass does not have an annotation anywhere, its members are not /// included. If members are overridden, only the overriding member will /// be wrapped as long as it or its class has this annotation. /// /// Only concrete instance members can and will be wrapped, and it's an error to /// annotate other members with this annotation. class JSExport { final String name; const JSExport([this.name = '']); }