// Copyright (c) 2024, 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.

import 'package:js/js.dart';

const dart2js = const bool.fromEnvironment('dart.library._dart2js_only');

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
dynamic confuse(dynamic x) => x;

@JS()
external dynamic eval(String script);

void injectJS() {
  eval(
    '''
    self.jsFunction = function(s) {
        if (this == null) {
          throw "`this` is null or undefined";
        }
        if (typeof s != 'string') {
          throw "`s` is not a string";
        }
        return s.at(0);
      };
    self.jsObject = { call: function(s) {
        if (this == null) {
          throw "`this` is null or undefined";
        }
        if (typeof s != 'string') {
          throw "`s` is not a string";
        }
        return s.at(0);
      } };
    self.NamedClass = class NamedClass {
      call(s) {
        if (this == null) {
          throw "`this` is null or undefined";
        }
        if (typeof s != 'string') {
          throw "`s` is not a string";
        }
        return s.at(0);
      }
    }
    self.jsClass = new NamedClass();
    ''',
  );
}

bool jsThisIsNullCheck(e) =>
    e.toString().contains('`this` is null or undefined');

bool jsArgIsNotStringCheck(e) => e.toString().contains('`s` is not a string');
