///| Core JavaScript types and utilities

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
pub using @core {
  type Any,
  type Nullable,
  type Nullish,
  type Promise,
  type PromiseResolvers,
  type ThrowError,
  identity,
  any,
  new,
  typeof_,
  from_async,
  from_entries,
  from_fn0,
  from_fn1,
  from_fn2,
  from_fn3,
  promisify0,
  promisify1,
  promisify2,
  promisify3,
  new_object,
  new_array,
  run_async,
  suspend,
  log,
  throwable,
}

///| JavaScript Global Functions

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
pub using @global {
  type Timer,
  globalThis,
  undefined,
  isNaN,
  isFinite,
  parseInt,
  parseFloat,
  atob,
  btoa,
  encodeURI,
  decodeURI,
  encodeURIComponent,
  decodeURIComponent,
  structuredClone,
  setTimeout,
  clearTimeout,
  setInterval,
  clearInterval,
  queueMicrotask,
  dynamic_import,
}

///| JavaScript Error types

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
pub using @error {
  type JsError,
  type TypeError,
  type RangeError,
  type ReferenceError,
  type SyntaxError,
  type URIError,
  type EvalError,
  type AggregateError,
}

///| JavaScript Object

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
pub using @object {type Object}

///| JavaScript Symbol

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol
pub using @symbol {type Symbol, symbol}

///| JavaScript ArrayBuffer and TypedArrays

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
pub using @arraybuffer {
  type ArrayBuffer,
  type TypedArray,
  type DataView,
  type SharedArrayBuffer,
  type Uint8Array,
  type Uint16Array,
  type Uint32Array,
  type Int8Array,
  type Int16Array,
  type Int32Array,
  type Float32Array,
  type Float64Array,
  type BigInt64Array,
  type BigUint64Array,
}

///| JavaScript Array (JsArray to avoid conflict with MoonBit's Array)

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
pub using @array {type JsArray}

///| JavaScript String (JsString for consistency)

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String
pub using @string {type JsString}

///| JavaScript JSON

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON
pub using @json {type JSON}

///| JavaScript Iterators

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
pub using @iterator {type JsIterator, type AsyncIterator}

///| JavaScript AbortController and AbortSignal

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController
pub using @js_async {type AbortController, type AbortSignal}

///| JavaScript Math

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math
pub using @math {type Math}

///| JavaScript Date

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
pub using @date {type Date}

///| JavaScript RegExp

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
pub using @regexp {type RegExp, type RegExpMatchArray, type RegExpResult}

///| JavaScript Collections (Map and Set)

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
pub using @collection {type JsMap, type JsSet}

///| JavaScript BigInt

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
pub using @bigint {type JsBigInt}

///| JavaScript Weak References

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry
pub using @weak {
  type WeakMap,
  type WeakSet,
  type WeakRef,
  type FinalizationRegistry,
}

///| JavaScript Proxy

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
pub using @proxy {type Proxy}

///| JavaScript Reflect

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
pub using @reflect {type Reflect}

///| JavaScript Atomics

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics
pub using @atomics {type Atomics, type AtomicsWaitResult}

///| JavaScript Function

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
pub using @function {type Function}

///| JavaScript Disposable Resources

///|
/// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DisposableStack
pub using @disposable {type DisposableStack, type AsyncDisposableStack}