diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 844c6423c..2a39b9c8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v2 - name: Setup Scala - uses: japgolly/setup-everything-scala@v2.0 + uses: japgolly/setup-everything-scala@v3.0 - name: Build and test run: sbt -DCI=1 "++${{ matrix.scalaversion }}" test package doc @@ -35,6 +35,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: japgolly/setup-everything-scala@v2.0 + - uses: japgolly/setup-everything-scala@v3.0 - name: Readme generation run: sbt readme/run diff --git a/.github/workflows/ghpages.yml b/.github/workflows/ghpages.yml index 5934dcb38..61944a1aa 100644 --- a/.github/workflows/ghpages.yml +++ b/.github/workflows/ghpages.yml @@ -4,7 +4,7 @@ name: Build and Deploy GhPages docs on: push: branches: - - master + - main jobs: build-and-deploy: @@ -13,13 +13,13 @@ jobs: - uses: actions/checkout@v2 - name: Setup Scala - uses: japgolly/setup-everything-scala@v2.0 + uses: japgolly/setup-everything-scala@v3.0 - name: Build run: sbt readme/run - name: Deploy - uses: JamesIves/github-pages-deploy-action@4.1.5 + uses: JamesIves/github-pages-deploy-action@4.1.8 with: token: ${{ secrets.GITHUB_TOKEN }} branch: gh-pages diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f9b67ff4e..d88788b4d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,7 @@ name: Release on: push: - branches: ["master"] + branches: ["main"] tags: ["v*"] jobs: publish: @@ -13,7 +13,7 @@ jobs: fetch-depth: 0 - name: Setup Scala - uses: japgolly/setup-everything-scala@v2.0 + uses: japgolly/setup-everything-scala@v3.0 - name: Release run: sbt ci-release diff --git a/.scala-steward.conf b/.scala-steward.conf index becf2ade3..f55658179 100644 --- a/.scala-steward.conf +++ b/.scala-steward.conf @@ -1,3 +1,4 @@ updates.ignore = [ - { groupId = "org.scala-lang" } + { groupId = "org.scala-lang" }, + { groupId = "org.scala-js" } ] diff --git a/.scalafmt.conf b/.scalafmt.conf index 59a582441..943690a56 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = 3.0.7 +version = 3.3.0 runner.dialect = scala213source3 project.git = true style = Scala.js diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..c71612dcb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,14 @@ +# Code of Conduct + +We are committed to providing a friendly, safe and welcoming environment for all, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, sexual identity and orientation, or other such characteristics. + +Everyone is expected to follow the [Scala Code of Conduct] when discussing the project on the available communication channels. +If you are being harassed, please contact us immediately so that we can support you. + +## Moderation + +Any questions, concerns, or moderation requests please contact a member of the project. + +- Arman Bilge: [twitter](https://twitter.com/armanbilge) | [email](mailto:arman@armanbilge.com) + +[Scala Code of Conduct]: https://www.scala-lang.org/conduct/ diff --git a/RELEASING.md b/RELEASING.md index 99d430d8d..84b142007 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -16,7 +16,7 @@ How to Perform a Release # For v2.x onwards ver=2.0.0 # change this to new version - git checkout master + git checkout main git tag -s v$ver git push --tags ``` diff --git a/api-reports/2_12.txt b/api-reports/2_12.txt index c2887d6c2..88725ae45 100644 --- a/api-reports/2_12.txt +++ b/api-reports/2_12.txt @@ -1099,10 +1099,10 @@ CompositionEventInit[JT] var bubbles: js.UndefOr[Boolean] CompositionEventInit[JT] var cancelable: js.UndefOr[Boolean] CompositionEventInit[JT] var composed: js.UndefOr[Boolean] CompositionEventInit[JT] var data: js.UndefOr[String] -CompositionEventInit[JT] val detail: js.UndefOr[Int] +CompositionEventInit[JT] var detail: js.UndefOr[Int] CompositionEventInit[JT] var locale: js.UndefOr[String] CompositionEventInit[JT] var scoped: js.UndefOr[Boolean] -CompositionEventInit[JT] val view: js.UndefOr[Window] +CompositionEventInit[JT] var view: js.UndefOr[Window] ConcatParams[JT] val algorithmId: BufferSource ConcatParams[JT] val hash: HashAlgorithmIdentifier ConcatParams[JT] val name: String @@ -1356,13 +1356,13 @@ DeviceMotionEvent[JC] def stopPropagation(): Unit DeviceMotionEvent[JC] def target: EventTarget DeviceMotionEvent[JC] def timeStamp: Double DeviceMotionEvent[JC] def `type`: String -DeviceMotionEventInit[JT] val acceleration: js.UndefOr[DeviceAcceleration] -DeviceMotionEventInit[JT] val accelerationIncludingGravity: js.UndefOr[DeviceAcceleration] +DeviceMotionEventInit[JT] var acceleration: js.UndefOr[DeviceAcceleration] +DeviceMotionEventInit[JT] var accelerationIncludingGravity: js.UndefOr[DeviceAcceleration] DeviceMotionEventInit[JT] var bubbles: js.UndefOr[Boolean] DeviceMotionEventInit[JT] var cancelable: js.UndefOr[Boolean] DeviceMotionEventInit[JT] var composed: js.UndefOr[Boolean] -DeviceMotionEventInit[JT] val interval: js.UndefOr[Double] -DeviceMotionEventInit[JT] val rotationRate: js.UndefOr[DeviceRotationRate] +DeviceMotionEventInit[JT] var interval: js.UndefOr[Double] +DeviceMotionEventInit[JT] var rotationRate: js.UndefOr[DeviceRotationRate] DeviceMotionEventInit[JT] var scoped: js.UndefOr[Boolean] DeviceOrientationEvent[JC] val absolute: Boolean DeviceOrientationEvent[JC] val alpha: Double @@ -1972,10 +1972,10 @@ FocusEvent[JC] def view: Window FocusEventInit[JT] var bubbles: js.UndefOr[Boolean] FocusEventInit[JT] var cancelable: js.UndefOr[Boolean] FocusEventInit[JT] var composed: js.UndefOr[Boolean] -FocusEventInit[JT] val detail: js.UndefOr[Int] -FocusEventInit[JT] val relatedTarget: js.UndefOr[EventTarget] +FocusEventInit[JT] var detail: js.UndefOr[Int] +FocusEventInit[JT] var relatedTarget: js.UndefOr[EventTarget] FocusEventInit[JT] var scoped: js.UndefOr[Boolean] -FocusEventInit[JT] val view: js.UndefOr[Window] +FocusEventInit[JT] var view: js.UndefOr[Window] FormData[JC] def append(name: js.Any, value: js.Any, blobName: String?): Unit FormData[JO] FrameType[JT] @@ -14682,7 +14682,7 @@ KeyboardEventInit[JT] var cancelable: js.UndefOr[Boolean] KeyboardEventInit[JT] var charCode: js.UndefOr[Int] KeyboardEventInit[JT] var composed: js.UndefOr[Boolean] KeyboardEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -KeyboardEventInit[JT] val detail: js.UndefOr[Int] +KeyboardEventInit[JT] var detail: js.UndefOr[Int] KeyboardEventInit[JT] var key: js.UndefOr[String] KeyboardEventInit[JT] var keyCode: js.UndefOr[Int] KeyboardEventInit[JT] var locale: js.UndefOr[String] @@ -14691,7 +14691,7 @@ KeyboardEventInit[JT] var metaKey: js.UndefOr[Boolean] KeyboardEventInit[JT] var repeat: js.UndefOr[Boolean] KeyboardEventInit[JT] var scoped: js.UndefOr[Boolean] KeyboardEventInit[JT] var shiftKey: js.UndefOr[Boolean] -KeyboardEventInit[JT] val view: js.UndefOr[Window] +KeyboardEventInit[JT] var view: js.UndefOr[Window] LinkStyle[JT] def sheet: StyleSheet Location[JT] def assign(url: String): Unit Location[JT] var hash: String @@ -15017,7 +15017,7 @@ MouseEventInit[JT] var clientX: js.UndefOr[Double] MouseEventInit[JT] var clientY: js.UndefOr[Double] MouseEventInit[JT] var composed: js.UndefOr[Boolean] MouseEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -MouseEventInit[JT] val detail: js.UndefOr[Int] +MouseEventInit[JT] var detail: js.UndefOr[Int] MouseEventInit[JT] var metaKey: js.UndefOr[Boolean] MouseEventInit[JT] var pageX: js.UndefOr[Double] MouseEventInit[JT] var pageY: js.UndefOr[Double] @@ -15026,7 +15026,7 @@ MouseEventInit[JT] var scoped: js.UndefOr[Boolean] MouseEventInit[JT] var screenX: js.UndefOr[Double] MouseEventInit[JT] var screenY: js.UndefOr[Double] MouseEventInit[JT] var shiftKey: js.UndefOr[Boolean] -MouseEventInit[JT] val view: js.UndefOr[Window] +MouseEventInit[JT] var view: js.UndefOr[Window] MutationObserver[JC] def disconnect(): Unit MutationObserver[JC] def observe(target: Node, options: MutationObserverInit): Unit MutationObserver[JC] def takeRecords(): js.Array[MutationRecord] @@ -15480,7 +15480,7 @@ PointerEventInit[JT] var clientX: js.UndefOr[Double] PointerEventInit[JT] var clientY: js.UndefOr[Double] PointerEventInit[JT] var composed: js.UndefOr[Boolean] PointerEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -PointerEventInit[JT] val detail: js.UndefOr[Int] +PointerEventInit[JT] var detail: js.UndefOr[Int] PointerEventInit[JT] var height: js.UndefOr[Double] PointerEventInit[JT] var isPrimary: js.UndefOr[Boolean] PointerEventInit[JT] var metaKey: js.UndefOr[Boolean] @@ -15498,7 +15498,7 @@ PointerEventInit[JT] var tangentialPressure: js.UndefOr[Double] PointerEventInit[JT] var tiltX: js.UndefOr[Double] PointerEventInit[JT] var tiltY: js.UndefOr[Double] PointerEventInit[JT] var twist: js.UndefOr[Double] -PointerEventInit[JT] val view: js.UndefOr[Window] +PointerEventInit[JT] var view: js.UndefOr[Window] PointerEventInit[JT] var width: js.UndefOr[Double] PopStateEvent[JT] def bubbles: Boolean PopStateEvent[JT] def cancelBubble: Boolean @@ -15625,6 +15625,8 @@ PushSubscriptionJSON[JT] val expirationTime: java.lang.Double PushSubscriptionJSON[JT] val keys: js.Dictionary[String] PushSubscriptionOptions[JT] var applicationServerKey: js.UndefOr[Uint8Array] PushSubscriptionOptions[JT] var userVisibleOnly: js.UndefOr[Boolean] +QueuingStrategy[JT] var highWaterMark: Int +QueuingStrategy[JT] var size: js.Function1[T, Int] RTCBundlePolicy[JT] RTCBundlePolicy[SO] val balanced: RTCBundlePolicy RTCBundlePolicy[SO] val `max-bundle` = "max-bundle".asInstanceOf[RTCBundlePolicy] @@ -15849,16 +15851,26 @@ ReadableStream[JT] def cancel(reason: js.UndefOr[Any]?): js.Promise[Unit] ReadableStream[JT] def getReader(): ReadableStreamReader[T] ReadableStream[JT] def locked: Boolean ReadableStream[JT] def pipeThrough[U](pair: Any, options: Any?): ReadableStream[U] -ReadableStream[JT] def pipeTo(dest: WriteableStream[T], options: Any?): Unit +ReadableStream[JT] def pipeTo(dest: WriteableStream[T], options: Any?): js.Promise[Unit] ReadableStream[JT] def tee(): js.Array[_ <: ReadableStream[T]] +ReadableStream[SO] def apply[T](underlyingSource: js.UndefOr[ReadableStreamUnderlyingSource[T]]?, queuingStrategy: js.UndefOr[QueuingStrategy[T]]?): ReadableStream[T] ReadableStreamController[JC] def close(): Unit ReadableStreamController[JC] def desiredSize: Int -ReadableStreamController[JC] def enqueue(chunk: Chunk[T]): js.UndefOr[Int] +ReadableStreamController[JC] def enqueue(): Unit +ReadableStreamController[JC] def enqueue(chunk: T): Unit ReadableStreamController[JC] def error(e: Any): Unit -ReadableStreamReader[JC] def cancel(reason: Any): js.Promise[Any] +ReadableStreamReader[JC] def cancel(): js.Promise[Unit] +ReadableStreamReader[JC] def cancel(reason: Any): js.Promise[Unit] ReadableStreamReader[JC] def closed: js.Promise[ReadableStreamReader[T]] ReadableStreamReader[JC] def read(): js.Promise[Chunk[T]] ReadableStreamReader[JC] def releaseLock(): Unit +ReadableStreamType[JT] +ReadableStreamType[SO] val bytes: ReadableStreamType +ReadableStreamUnderlyingSource[JT] var autoAllocateChunkSize: js.UndefOr[Int] +ReadableStreamUnderlyingSource[JT] var cancel: js.UndefOr[js.Function1[js.Any, js.UndefOr[js.Promise[Unit]]]] +ReadableStreamUnderlyingSource[JT] var pull: js.UndefOr[js.Function1[ReadableStreamController[T], js.UndefOr[js.Promise[Unit]]]] +ReadableStreamUnderlyingSource[JT] var start: js.UndefOr[js.Function1[ReadableStreamController[T], js.UndefOr[js.Promise[Unit]]]] +ReadableStreamUnderlyingSource[JT] var `type`: js.UndefOr[ReadableStreamType] ReferrerPolicy[JT] ReferrerPolicy[SO] val empty: ReferrerPolicy ReferrerPolicy[SO] val `no-referrer` = "no-referrer".asInstanceOf[ReferrerPolicy] @@ -15951,9 +15963,9 @@ Response[JC] def `type`: ResponseType Response[JC] def url: String Response[JO] def error(): Response Response[JO] def redirect(url: String, status: Int?): Response -ResponseInit[JT] var headers: HeadersInit -ResponseInit[JT] var status: Int -ResponseInit[JT] var statusText: ByteString +ResponseInit[JT] var headers: js.UndefOr[HeadersInit] +ResponseInit[JT] var status: js.UndefOr[Int] +ResponseInit[JT] var statusText: js.UndefOr[ByteString] ResponseType[JT] ResponseType[SO] val basic: ResponseType ResponseType[SO] val cors: ResponseType @@ -23914,13 +23926,13 @@ SVGZoomAndPan[JT] var zoomAndPan: Int SVGZoomEventInit[JT] var bubbles: js.UndefOr[Boolean] SVGZoomEventInit[JT] var cancelable: js.UndefOr[Boolean] SVGZoomEventInit[JT] var composed: js.UndefOr[Boolean] -SVGZoomEventInit[JT] val detail: js.UndefOr[Int] +SVGZoomEventInit[JT] var detail: js.UndefOr[Int] SVGZoomEventInit[JT] var newScale: js.UndefOr[Double] SVGZoomEventInit[JT] var newTranslate: js.UndefOr[SVGPoint] SVGZoomEventInit[JT] var previousScale: js.UndefOr[Double] SVGZoomEventInit[JT] var previousTranslate: js.UndefOr[SVGPoint] SVGZoomEventInit[JT] var scoped: js.UndefOr[Boolean] -SVGZoomEventInit[JT] val view: js.UndefOr[Window] +SVGZoomEventInit[JT] var view: js.UndefOr[Window] SVGZoomEventInit[JT] var zoomRectScreen: js.UndefOr[SVGRect] Screen[JC] def availHeight: Double Screen[JC] def availWidth: Double @@ -24271,11 +24283,11 @@ TextEventInit[JT] var bubbles: js.UndefOr[Boolean] TextEventInit[JT] var cancelable: js.UndefOr[Boolean] TextEventInit[JT] var composed: js.UndefOr[Boolean] TextEventInit[JT] var data: js.UndefOr[String] -TextEventInit[JT] val detail: js.UndefOr[Int] +TextEventInit[JT] var detail: js.UndefOr[Int] TextEventInit[JT] var inputMethod: js.UndefOr[Int] TextEventInit[JT] var locale: js.UndefOr[String] TextEventInit[JT] var scoped: js.UndefOr[Boolean] -TextEventInit[JT] val view: js.UndefOr[Window] +TextEventInit[JT] var view: js.UndefOr[Window] TextMetrics[JC] var width: Double TextTrack[JO] var DISABLED: Int TextTrack[JO] var ERROR: Int @@ -24381,13 +24393,13 @@ TouchEventInit[JT] var cancelable: js.UndefOr[Boolean] TouchEventInit[JT] var changedTouches: js.UndefOr[TouchList] TouchEventInit[JT] var composed: js.UndefOr[Boolean] TouchEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -TouchEventInit[JT] val detail: js.UndefOr[Int] +TouchEventInit[JT] var detail: js.UndefOr[Int] TouchEventInit[JT] var metaKey: js.UndefOr[Boolean] TouchEventInit[JT] var scoped: js.UndefOr[Boolean] TouchEventInit[JT] var shiftKey: js.UndefOr[Boolean] TouchEventInit[JT] var targetTouches: js.UndefOr[TouchList] TouchEventInit[JT] var touches: js.UndefOr[TouchList] -TouchEventInit[JT] val view: js.UndefOr[Window] +TouchEventInit[JT] var view: js.UndefOr[Window] TouchList[JT] @JSBracketAccess def apply(index: Int): T TouchList[JT] def item(index: Int): Touch TouchList[JT] def length: Int @@ -24452,9 +24464,9 @@ UIEvent[JC] def view: Window UIEventInit[JT] var bubbles: js.UndefOr[Boolean] UIEventInit[JT] var cancelable: js.UndefOr[Boolean] UIEventInit[JT] var composed: js.UndefOr[Boolean] -UIEventInit[JT] val detail: js.UndefOr[Int] +UIEventInit[JT] var detail: js.UndefOr[Int] UIEventInit[JT] var scoped: js.UndefOr[Boolean] -UIEventInit[JT] val view: js.UndefOr[Window] +UIEventInit[JT] var view: js.UndefOr[Window] URL[JC] var hash: String URL[JC] var host: String URL[JC] var hostname: String @@ -25083,7 +25095,7 @@ WheelEventInit[JT] var deltaMode: js.UndefOr[Int] WheelEventInit[JT] var deltaX: js.UndefOr[Double] WheelEventInit[JT] var deltaY: js.UndefOr[Double] WheelEventInit[JT] var deltaZ: js.UndefOr[Double] -WheelEventInit[JT] val detail: js.UndefOr[Int] +WheelEventInit[JT] var detail: js.UndefOr[Int] WheelEventInit[JT] var metaKey: js.UndefOr[Boolean] WheelEventInit[JT] var pageX: js.UndefOr[Double] WheelEventInit[JT] var pageY: js.UndefOr[Double] @@ -25092,7 +25104,7 @@ WheelEventInit[JT] var scoped: js.UndefOr[Boolean] WheelEventInit[JT] var screenX: js.UndefOr[Double] WheelEventInit[JT] var screenY: js.UndefOr[Double] WheelEventInit[JT] var shiftKey: js.UndefOr[Boolean] -WheelEventInit[JT] val view: js.UndefOr[Window] +WheelEventInit[JT] var view: js.UndefOr[Window] Window[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit Window[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit Window[JC] def alert(): Unit @@ -25636,14 +25648,8 @@ experimental/package[SO] lazy val ResponseType: dom.ResponseType.type (@depreca experimental/package[SO] lazy val WriteableState: dom.WriteableState.type (@deprecated in 2.0.0) experimental/package[SO] def apply(_status: Int = 200, _statusText: ByteString = "OK", _headers: HeadersInit = js.Dictionary[String]()): ResponseInit experimental/package[SO] @js.native @JSGlobal("fetch") def fetch(info: RequestInfo, init: RequestInit = null): js.Promise[Response] -experimental/package[SO] var headers = _headers -experimental/package[SO] var status = _status -experimental/package[SO] var statusText = _statusText experimental/package.Fetch[SO] @js.native @JSGlobal("fetch") def fetch(info: RequestInfo, init: RequestInit = null): js.Promise[Response] (@deprecated in 2.0.0) experimental/package.ResponseInit[SO] def apply(_status: Int = 200, _statusText: ByteString = "OK", _headers: HeadersInit = js.Dictionary[String]()): ResponseInit (@deprecated in 2.0.0) -experimental/package.ResponseInit[SO] var headers = _headers (@deprecated in 2.0.0) -experimental/package.ResponseInit[SO] var status = _status (@deprecated in 2.0.0) -experimental/package.ResponseInit[SO] var statusText = _statusText (@deprecated in 2.0.0) experimental/permissions/package[SO] type PermissionDescriptor = dom.PermissionDescriptor (@deprecated in 2.0.0) experimental/permissions/package[SO] type PermissionName = dom.PermissionName (@deprecated in 2.0.0) experimental/permissions/package[SO] type PermissionState = dom.PermissionState (@deprecated in 2.0.0) @@ -25958,7 +25964,7 @@ intl/NumberFormatOptions[JT] var useGrouping: js.UndefOr[Boolean] intl/NumberFormatOptions[SO] def apply(localeMatcher: js.UndefOr[String]?, style: js.UndefOr[String]?, currency: js.UndefOr[String]?, currencyDisplay: js.UndefOr[String]?, useGrouping: js.UndefOr[Boolean]?, minimumIntegerDigits: js.UndefOr[Double]?, minimumFractionDigits: js.UndefOr[Double]?, maximumFractionDigits: js.UndefOr[Double]?, minimumSignificantDigits: js.UndefOr[Double]?, maximumSignificantDigits: js.UndefOr[Double]?): NumberFormatOptions (@deprecated in 2.0.0) package[SO] type AlgorithmIdentifier = Algorithm | String package[SO] type BigInteger = js.typedarray.Uint8Array -package[SO] type BodyInit = Blob | BufferSource | FormData | String +package[SO] type BodyInit = Blob | BufferSource | FormData | String | ReadableStream[Uint8Array] package[SO] type BufferSource = ArrayBufferView | ArrayBuffer package[SO] type ByteString = String package[SO] type ClientRect = DOMRect (@deprecated in 2.0.0) diff --git a/api-reports/2_13.txt b/api-reports/2_13.txt index c2887d6c2..88725ae45 100644 --- a/api-reports/2_13.txt +++ b/api-reports/2_13.txt @@ -1099,10 +1099,10 @@ CompositionEventInit[JT] var bubbles: js.UndefOr[Boolean] CompositionEventInit[JT] var cancelable: js.UndefOr[Boolean] CompositionEventInit[JT] var composed: js.UndefOr[Boolean] CompositionEventInit[JT] var data: js.UndefOr[String] -CompositionEventInit[JT] val detail: js.UndefOr[Int] +CompositionEventInit[JT] var detail: js.UndefOr[Int] CompositionEventInit[JT] var locale: js.UndefOr[String] CompositionEventInit[JT] var scoped: js.UndefOr[Boolean] -CompositionEventInit[JT] val view: js.UndefOr[Window] +CompositionEventInit[JT] var view: js.UndefOr[Window] ConcatParams[JT] val algorithmId: BufferSource ConcatParams[JT] val hash: HashAlgorithmIdentifier ConcatParams[JT] val name: String @@ -1356,13 +1356,13 @@ DeviceMotionEvent[JC] def stopPropagation(): Unit DeviceMotionEvent[JC] def target: EventTarget DeviceMotionEvent[JC] def timeStamp: Double DeviceMotionEvent[JC] def `type`: String -DeviceMotionEventInit[JT] val acceleration: js.UndefOr[DeviceAcceleration] -DeviceMotionEventInit[JT] val accelerationIncludingGravity: js.UndefOr[DeviceAcceleration] +DeviceMotionEventInit[JT] var acceleration: js.UndefOr[DeviceAcceleration] +DeviceMotionEventInit[JT] var accelerationIncludingGravity: js.UndefOr[DeviceAcceleration] DeviceMotionEventInit[JT] var bubbles: js.UndefOr[Boolean] DeviceMotionEventInit[JT] var cancelable: js.UndefOr[Boolean] DeviceMotionEventInit[JT] var composed: js.UndefOr[Boolean] -DeviceMotionEventInit[JT] val interval: js.UndefOr[Double] -DeviceMotionEventInit[JT] val rotationRate: js.UndefOr[DeviceRotationRate] +DeviceMotionEventInit[JT] var interval: js.UndefOr[Double] +DeviceMotionEventInit[JT] var rotationRate: js.UndefOr[DeviceRotationRate] DeviceMotionEventInit[JT] var scoped: js.UndefOr[Boolean] DeviceOrientationEvent[JC] val absolute: Boolean DeviceOrientationEvent[JC] val alpha: Double @@ -1972,10 +1972,10 @@ FocusEvent[JC] def view: Window FocusEventInit[JT] var bubbles: js.UndefOr[Boolean] FocusEventInit[JT] var cancelable: js.UndefOr[Boolean] FocusEventInit[JT] var composed: js.UndefOr[Boolean] -FocusEventInit[JT] val detail: js.UndefOr[Int] -FocusEventInit[JT] val relatedTarget: js.UndefOr[EventTarget] +FocusEventInit[JT] var detail: js.UndefOr[Int] +FocusEventInit[JT] var relatedTarget: js.UndefOr[EventTarget] FocusEventInit[JT] var scoped: js.UndefOr[Boolean] -FocusEventInit[JT] val view: js.UndefOr[Window] +FocusEventInit[JT] var view: js.UndefOr[Window] FormData[JC] def append(name: js.Any, value: js.Any, blobName: String?): Unit FormData[JO] FrameType[JT] @@ -14682,7 +14682,7 @@ KeyboardEventInit[JT] var cancelable: js.UndefOr[Boolean] KeyboardEventInit[JT] var charCode: js.UndefOr[Int] KeyboardEventInit[JT] var composed: js.UndefOr[Boolean] KeyboardEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -KeyboardEventInit[JT] val detail: js.UndefOr[Int] +KeyboardEventInit[JT] var detail: js.UndefOr[Int] KeyboardEventInit[JT] var key: js.UndefOr[String] KeyboardEventInit[JT] var keyCode: js.UndefOr[Int] KeyboardEventInit[JT] var locale: js.UndefOr[String] @@ -14691,7 +14691,7 @@ KeyboardEventInit[JT] var metaKey: js.UndefOr[Boolean] KeyboardEventInit[JT] var repeat: js.UndefOr[Boolean] KeyboardEventInit[JT] var scoped: js.UndefOr[Boolean] KeyboardEventInit[JT] var shiftKey: js.UndefOr[Boolean] -KeyboardEventInit[JT] val view: js.UndefOr[Window] +KeyboardEventInit[JT] var view: js.UndefOr[Window] LinkStyle[JT] def sheet: StyleSheet Location[JT] def assign(url: String): Unit Location[JT] var hash: String @@ -15017,7 +15017,7 @@ MouseEventInit[JT] var clientX: js.UndefOr[Double] MouseEventInit[JT] var clientY: js.UndefOr[Double] MouseEventInit[JT] var composed: js.UndefOr[Boolean] MouseEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -MouseEventInit[JT] val detail: js.UndefOr[Int] +MouseEventInit[JT] var detail: js.UndefOr[Int] MouseEventInit[JT] var metaKey: js.UndefOr[Boolean] MouseEventInit[JT] var pageX: js.UndefOr[Double] MouseEventInit[JT] var pageY: js.UndefOr[Double] @@ -15026,7 +15026,7 @@ MouseEventInit[JT] var scoped: js.UndefOr[Boolean] MouseEventInit[JT] var screenX: js.UndefOr[Double] MouseEventInit[JT] var screenY: js.UndefOr[Double] MouseEventInit[JT] var shiftKey: js.UndefOr[Boolean] -MouseEventInit[JT] val view: js.UndefOr[Window] +MouseEventInit[JT] var view: js.UndefOr[Window] MutationObserver[JC] def disconnect(): Unit MutationObserver[JC] def observe(target: Node, options: MutationObserverInit): Unit MutationObserver[JC] def takeRecords(): js.Array[MutationRecord] @@ -15480,7 +15480,7 @@ PointerEventInit[JT] var clientX: js.UndefOr[Double] PointerEventInit[JT] var clientY: js.UndefOr[Double] PointerEventInit[JT] var composed: js.UndefOr[Boolean] PointerEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -PointerEventInit[JT] val detail: js.UndefOr[Int] +PointerEventInit[JT] var detail: js.UndefOr[Int] PointerEventInit[JT] var height: js.UndefOr[Double] PointerEventInit[JT] var isPrimary: js.UndefOr[Boolean] PointerEventInit[JT] var metaKey: js.UndefOr[Boolean] @@ -15498,7 +15498,7 @@ PointerEventInit[JT] var tangentialPressure: js.UndefOr[Double] PointerEventInit[JT] var tiltX: js.UndefOr[Double] PointerEventInit[JT] var tiltY: js.UndefOr[Double] PointerEventInit[JT] var twist: js.UndefOr[Double] -PointerEventInit[JT] val view: js.UndefOr[Window] +PointerEventInit[JT] var view: js.UndefOr[Window] PointerEventInit[JT] var width: js.UndefOr[Double] PopStateEvent[JT] def bubbles: Boolean PopStateEvent[JT] def cancelBubble: Boolean @@ -15625,6 +15625,8 @@ PushSubscriptionJSON[JT] val expirationTime: java.lang.Double PushSubscriptionJSON[JT] val keys: js.Dictionary[String] PushSubscriptionOptions[JT] var applicationServerKey: js.UndefOr[Uint8Array] PushSubscriptionOptions[JT] var userVisibleOnly: js.UndefOr[Boolean] +QueuingStrategy[JT] var highWaterMark: Int +QueuingStrategy[JT] var size: js.Function1[T, Int] RTCBundlePolicy[JT] RTCBundlePolicy[SO] val balanced: RTCBundlePolicy RTCBundlePolicy[SO] val `max-bundle` = "max-bundle".asInstanceOf[RTCBundlePolicy] @@ -15849,16 +15851,26 @@ ReadableStream[JT] def cancel(reason: js.UndefOr[Any]?): js.Promise[Unit] ReadableStream[JT] def getReader(): ReadableStreamReader[T] ReadableStream[JT] def locked: Boolean ReadableStream[JT] def pipeThrough[U](pair: Any, options: Any?): ReadableStream[U] -ReadableStream[JT] def pipeTo(dest: WriteableStream[T], options: Any?): Unit +ReadableStream[JT] def pipeTo(dest: WriteableStream[T], options: Any?): js.Promise[Unit] ReadableStream[JT] def tee(): js.Array[_ <: ReadableStream[T]] +ReadableStream[SO] def apply[T](underlyingSource: js.UndefOr[ReadableStreamUnderlyingSource[T]]?, queuingStrategy: js.UndefOr[QueuingStrategy[T]]?): ReadableStream[T] ReadableStreamController[JC] def close(): Unit ReadableStreamController[JC] def desiredSize: Int -ReadableStreamController[JC] def enqueue(chunk: Chunk[T]): js.UndefOr[Int] +ReadableStreamController[JC] def enqueue(): Unit +ReadableStreamController[JC] def enqueue(chunk: T): Unit ReadableStreamController[JC] def error(e: Any): Unit -ReadableStreamReader[JC] def cancel(reason: Any): js.Promise[Any] +ReadableStreamReader[JC] def cancel(): js.Promise[Unit] +ReadableStreamReader[JC] def cancel(reason: Any): js.Promise[Unit] ReadableStreamReader[JC] def closed: js.Promise[ReadableStreamReader[T]] ReadableStreamReader[JC] def read(): js.Promise[Chunk[T]] ReadableStreamReader[JC] def releaseLock(): Unit +ReadableStreamType[JT] +ReadableStreamType[SO] val bytes: ReadableStreamType +ReadableStreamUnderlyingSource[JT] var autoAllocateChunkSize: js.UndefOr[Int] +ReadableStreamUnderlyingSource[JT] var cancel: js.UndefOr[js.Function1[js.Any, js.UndefOr[js.Promise[Unit]]]] +ReadableStreamUnderlyingSource[JT] var pull: js.UndefOr[js.Function1[ReadableStreamController[T], js.UndefOr[js.Promise[Unit]]]] +ReadableStreamUnderlyingSource[JT] var start: js.UndefOr[js.Function1[ReadableStreamController[T], js.UndefOr[js.Promise[Unit]]]] +ReadableStreamUnderlyingSource[JT] var `type`: js.UndefOr[ReadableStreamType] ReferrerPolicy[JT] ReferrerPolicy[SO] val empty: ReferrerPolicy ReferrerPolicy[SO] val `no-referrer` = "no-referrer".asInstanceOf[ReferrerPolicy] @@ -15951,9 +15963,9 @@ Response[JC] def `type`: ResponseType Response[JC] def url: String Response[JO] def error(): Response Response[JO] def redirect(url: String, status: Int?): Response -ResponseInit[JT] var headers: HeadersInit -ResponseInit[JT] var status: Int -ResponseInit[JT] var statusText: ByteString +ResponseInit[JT] var headers: js.UndefOr[HeadersInit] +ResponseInit[JT] var status: js.UndefOr[Int] +ResponseInit[JT] var statusText: js.UndefOr[ByteString] ResponseType[JT] ResponseType[SO] val basic: ResponseType ResponseType[SO] val cors: ResponseType @@ -23914,13 +23926,13 @@ SVGZoomAndPan[JT] var zoomAndPan: Int SVGZoomEventInit[JT] var bubbles: js.UndefOr[Boolean] SVGZoomEventInit[JT] var cancelable: js.UndefOr[Boolean] SVGZoomEventInit[JT] var composed: js.UndefOr[Boolean] -SVGZoomEventInit[JT] val detail: js.UndefOr[Int] +SVGZoomEventInit[JT] var detail: js.UndefOr[Int] SVGZoomEventInit[JT] var newScale: js.UndefOr[Double] SVGZoomEventInit[JT] var newTranslate: js.UndefOr[SVGPoint] SVGZoomEventInit[JT] var previousScale: js.UndefOr[Double] SVGZoomEventInit[JT] var previousTranslate: js.UndefOr[SVGPoint] SVGZoomEventInit[JT] var scoped: js.UndefOr[Boolean] -SVGZoomEventInit[JT] val view: js.UndefOr[Window] +SVGZoomEventInit[JT] var view: js.UndefOr[Window] SVGZoomEventInit[JT] var zoomRectScreen: js.UndefOr[SVGRect] Screen[JC] def availHeight: Double Screen[JC] def availWidth: Double @@ -24271,11 +24283,11 @@ TextEventInit[JT] var bubbles: js.UndefOr[Boolean] TextEventInit[JT] var cancelable: js.UndefOr[Boolean] TextEventInit[JT] var composed: js.UndefOr[Boolean] TextEventInit[JT] var data: js.UndefOr[String] -TextEventInit[JT] val detail: js.UndefOr[Int] +TextEventInit[JT] var detail: js.UndefOr[Int] TextEventInit[JT] var inputMethod: js.UndefOr[Int] TextEventInit[JT] var locale: js.UndefOr[String] TextEventInit[JT] var scoped: js.UndefOr[Boolean] -TextEventInit[JT] val view: js.UndefOr[Window] +TextEventInit[JT] var view: js.UndefOr[Window] TextMetrics[JC] var width: Double TextTrack[JO] var DISABLED: Int TextTrack[JO] var ERROR: Int @@ -24381,13 +24393,13 @@ TouchEventInit[JT] var cancelable: js.UndefOr[Boolean] TouchEventInit[JT] var changedTouches: js.UndefOr[TouchList] TouchEventInit[JT] var composed: js.UndefOr[Boolean] TouchEventInit[JT] var ctrlKey: js.UndefOr[Boolean] -TouchEventInit[JT] val detail: js.UndefOr[Int] +TouchEventInit[JT] var detail: js.UndefOr[Int] TouchEventInit[JT] var metaKey: js.UndefOr[Boolean] TouchEventInit[JT] var scoped: js.UndefOr[Boolean] TouchEventInit[JT] var shiftKey: js.UndefOr[Boolean] TouchEventInit[JT] var targetTouches: js.UndefOr[TouchList] TouchEventInit[JT] var touches: js.UndefOr[TouchList] -TouchEventInit[JT] val view: js.UndefOr[Window] +TouchEventInit[JT] var view: js.UndefOr[Window] TouchList[JT] @JSBracketAccess def apply(index: Int): T TouchList[JT] def item(index: Int): Touch TouchList[JT] def length: Int @@ -24452,9 +24464,9 @@ UIEvent[JC] def view: Window UIEventInit[JT] var bubbles: js.UndefOr[Boolean] UIEventInit[JT] var cancelable: js.UndefOr[Boolean] UIEventInit[JT] var composed: js.UndefOr[Boolean] -UIEventInit[JT] val detail: js.UndefOr[Int] +UIEventInit[JT] var detail: js.UndefOr[Int] UIEventInit[JT] var scoped: js.UndefOr[Boolean] -UIEventInit[JT] val view: js.UndefOr[Window] +UIEventInit[JT] var view: js.UndefOr[Window] URL[JC] var hash: String URL[JC] var host: String URL[JC] var hostname: String @@ -25083,7 +25095,7 @@ WheelEventInit[JT] var deltaMode: js.UndefOr[Int] WheelEventInit[JT] var deltaX: js.UndefOr[Double] WheelEventInit[JT] var deltaY: js.UndefOr[Double] WheelEventInit[JT] var deltaZ: js.UndefOr[Double] -WheelEventInit[JT] val detail: js.UndefOr[Int] +WheelEventInit[JT] var detail: js.UndefOr[Int] WheelEventInit[JT] var metaKey: js.UndefOr[Boolean] WheelEventInit[JT] var pageX: js.UndefOr[Double] WheelEventInit[JT] var pageY: js.UndefOr[Double] @@ -25092,7 +25104,7 @@ WheelEventInit[JT] var scoped: js.UndefOr[Boolean] WheelEventInit[JT] var screenX: js.UndefOr[Double] WheelEventInit[JT] var screenY: js.UndefOr[Double] WheelEventInit[JT] var shiftKey: js.UndefOr[Boolean] -WheelEventInit[JT] val view: js.UndefOr[Window] +WheelEventInit[JT] var view: js.UndefOr[Window] Window[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], options: EventListenerOptions): Unit Window[JC] def addEventListener[T <: Event](`type`: String, listener: js.Function1[T, _], useCapture: Boolean?): Unit Window[JC] def alert(): Unit @@ -25636,14 +25648,8 @@ experimental/package[SO] lazy val ResponseType: dom.ResponseType.type (@depreca experimental/package[SO] lazy val WriteableState: dom.WriteableState.type (@deprecated in 2.0.0) experimental/package[SO] def apply(_status: Int = 200, _statusText: ByteString = "OK", _headers: HeadersInit = js.Dictionary[String]()): ResponseInit experimental/package[SO] @js.native @JSGlobal("fetch") def fetch(info: RequestInfo, init: RequestInit = null): js.Promise[Response] -experimental/package[SO] var headers = _headers -experimental/package[SO] var status = _status -experimental/package[SO] var statusText = _statusText experimental/package.Fetch[SO] @js.native @JSGlobal("fetch") def fetch(info: RequestInfo, init: RequestInit = null): js.Promise[Response] (@deprecated in 2.0.0) experimental/package.ResponseInit[SO] def apply(_status: Int = 200, _statusText: ByteString = "OK", _headers: HeadersInit = js.Dictionary[String]()): ResponseInit (@deprecated in 2.0.0) -experimental/package.ResponseInit[SO] var headers = _headers (@deprecated in 2.0.0) -experimental/package.ResponseInit[SO] var status = _status (@deprecated in 2.0.0) -experimental/package.ResponseInit[SO] var statusText = _statusText (@deprecated in 2.0.0) experimental/permissions/package[SO] type PermissionDescriptor = dom.PermissionDescriptor (@deprecated in 2.0.0) experimental/permissions/package[SO] type PermissionName = dom.PermissionName (@deprecated in 2.0.0) experimental/permissions/package[SO] type PermissionState = dom.PermissionState (@deprecated in 2.0.0) @@ -25958,7 +25964,7 @@ intl/NumberFormatOptions[JT] var useGrouping: js.UndefOr[Boolean] intl/NumberFormatOptions[SO] def apply(localeMatcher: js.UndefOr[String]?, style: js.UndefOr[String]?, currency: js.UndefOr[String]?, currencyDisplay: js.UndefOr[String]?, useGrouping: js.UndefOr[Boolean]?, minimumIntegerDigits: js.UndefOr[Double]?, minimumFractionDigits: js.UndefOr[Double]?, maximumFractionDigits: js.UndefOr[Double]?, minimumSignificantDigits: js.UndefOr[Double]?, maximumSignificantDigits: js.UndefOr[Double]?): NumberFormatOptions (@deprecated in 2.0.0) package[SO] type AlgorithmIdentifier = Algorithm | String package[SO] type BigInteger = js.typedarray.Uint8Array -package[SO] type BodyInit = Blob | BufferSource | FormData | String +package[SO] type BodyInit = Blob | BufferSource | FormData | String | ReadableStream[Uint8Array] package[SO] type BufferSource = ArrayBufferView | ArrayBuffer package[SO] type ByteString = String package[SO] type ClientRect = DOMRect (@deprecated in 2.0.0) diff --git a/dom/src/main/scala-2/org/scalajs/dom/ReadableStreamType.scala b/dom/src/main/scala-2/org/scalajs/dom/ReadableStreamType.scala new file mode 100644 index 000000000..0f622a271 --- /dev/null +++ b/dom/src/main/scala-2/org/scalajs/dom/ReadableStreamType.scala @@ -0,0 +1,11 @@ +package org.scalajs.dom + +import scala.scalajs.js + +/** [[https://streams.spec.whatwg.org/#enumdef-readablestreamtype ReadableStreamType enum]] */ +@js.native +sealed trait ReadableStreamType extends js.Any + +object ReadableStreamType { + val bytes: ReadableStreamType = "bytes".asInstanceOf[ReadableStreamType] +} \ No newline at end of file diff --git a/dom/src/main/scala-3/org/scalajs/dom/ReadableStreamType.scala b/dom/src/main/scala-3/org/scalajs/dom/ReadableStreamType.scala new file mode 100644 index 000000000..c19fb3d14 --- /dev/null +++ b/dom/src/main/scala-3/org/scalajs/dom/ReadableStreamType.scala @@ -0,0 +1,7 @@ +package org.scalajs.dom + +opaque type ReadableStreamType <: String = String + +object ReadableStreamType { + val bytes: ReadableStreamType = "bytes" +} diff --git a/dom/src/main/scala/org/scalajs/dom/CacheQueryOptions.scala b/dom/src/main/scala/org/scalajs/dom/CacheQueryOptions.scala index 68f76b1e9..753e0c4b0 100644 --- a/dom/src/main/scala/org/scalajs/dom/CacheQueryOptions.scala +++ b/dom/src/main/scala/org/scalajs/dom/CacheQueryOptions.scala @@ -11,7 +11,7 @@ trait CacheQueryOptions extends js.Object { var ignoreMethod: Boolean = js.native // false - var ignoreVary: Boolean = js.native //false + var ignoreVary: Boolean = js.native // false var cacheName: String = js.native } diff --git a/dom/src/main/scala/org/scalajs/dom/DeviceMotionEventInit.scala b/dom/src/main/scala/org/scalajs/dom/DeviceMotionEventInit.scala index a3e845f2e..17787b221 100644 --- a/dom/src/main/scala/org/scalajs/dom/DeviceMotionEventInit.scala +++ b/dom/src/main/scala/org/scalajs/dom/DeviceMotionEventInit.scala @@ -5,15 +5,15 @@ import scala.scalajs.js trait DeviceMotionEventInit extends EventInit { /** Device acceleration with gravity removed. */ - val acceleration: js.UndefOr[DeviceAcceleration] = js.undefined + var acceleration: js.UndefOr[DeviceAcceleration] = js.undefined /** Device acceleration including the force of gravity. */ - val accelerationIncludingGravity: js.UndefOr[DeviceAcceleration] = + var accelerationIncludingGravity: js.UndefOr[DeviceAcceleration] = js.undefined /** The rate of rotation. */ - val rotationRate: js.UndefOr[DeviceRotationRate] = js.undefined + var rotationRate: js.UndefOr[DeviceRotationRate] = js.undefined /** The sampling rate in seconds that data is received from the hardware. */ - val interval: js.UndefOr[Double] = js.undefined + var interval: js.UndefOr[Double] = js.undefined } diff --git a/dom/src/main/scala/org/scalajs/dom/FileReader.scala b/dom/src/main/scala/org/scalajs/dom/FileReader.scala index 28f725d29..d7d28a192 100644 --- a/dom/src/main/scala/org/scalajs/dom/FileReader.scala +++ b/dom/src/main/scala/org/scalajs/dom/FileReader.scala @@ -76,7 +76,7 @@ class FileReader() extends EventTarget { @js.native @JSGlobal object FileReader extends js.Object { - //states + // states val EMPTY: Short = js.native val LOADING: Short = js.native val DONE: Short = js.native diff --git a/dom/src/main/scala/org/scalajs/dom/FocusEventInit.scala b/dom/src/main/scala/org/scalajs/dom/FocusEventInit.scala index 4298f760d..68ff51902 100644 --- a/dom/src/main/scala/org/scalajs/dom/FocusEventInit.scala +++ b/dom/src/main/scala/org/scalajs/dom/FocusEventInit.scala @@ -9,5 +9,5 @@ package org.scalajs.dom import scala.scalajs.js trait FocusEventInit extends UIEventInit { - val relatedTarget: js.UndefOr[EventTarget] = js.undefined + var relatedTarget: js.UndefOr[EventTarget] = js.undefined } diff --git a/dom/src/main/scala/org/scalajs/dom/GamepadEventInit.scala b/dom/src/main/scala/org/scalajs/dom/GamepadEventInit.scala index 02ceda4b5..7df74886a 100644 --- a/dom/src/main/scala/org/scalajs/dom/GamepadEventInit.scala +++ b/dom/src/main/scala/org/scalajs/dom/GamepadEventInit.scala @@ -9,5 +9,5 @@ package org.scalajs.dom import scala.scalajs.js trait GamepadEventInit extends EventInit { - var gamepad: js.UndefOr[Gamepad] + var gamepad: js.UndefOr[Gamepad] = js.undefined } diff --git a/dom/src/main/scala/org/scalajs/dom/QueuingStrategy.scala b/dom/src/main/scala/org/scalajs/dom/QueuingStrategy.scala new file mode 100644 index 000000000..bf5e8845a --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/QueuingStrategy.scala @@ -0,0 +1,23 @@ +package org.scalajs.dom + +import scala.scalajs.js + +/** See [[https://streams.spec.whatwg.org/#qs-api ¶7.1. The queuing strategy API]] + * + * @tparam T + * Type of the Chunks returned by the Stream + */ +trait QueuingStrategy[T] extends js.Object { + + /** A non-negative number indicating the high water mark of the stream using this queuing strategy. */ + var highWaterMark: Int + + /** (non-byte streams only) + * + * The result is used to determine backpressure, manifesting via the appropriate desiredSize property. For readable + * streams, it also governs when the underlying source's [[ReadableStreamUnderlyingSource.pull]] method is called. + * + * A function that computes and returns the finite non-negative size of the given chunk value. + */ + var size: js.Function1[T, Int] +} diff --git a/dom/src/main/scala/org/scalajs/dom/ReadableStream.scala b/dom/src/main/scala/org/scalajs/dom/ReadableStream.scala index 0a857b149..8d553d83b 100644 --- a/dom/src/main/scala/org/scalajs/dom/ReadableStream.scala +++ b/dom/src/main/scala/org/scalajs/dom/ReadableStream.scala @@ -75,7 +75,7 @@ trait ReadableStream[+T] extends js.Object { * * //todo: determine the type of options */ - def pipeTo(dest: WriteableStream[T], options: Any = js.native): Unit = js.native + def pipeTo(dest: WriteableStream[T], options: Any = js.native): js.Promise[Unit] = js.native /** See [[https://streams.spec.whatwg.org/#rs-tee ¶3.2.4.6. tee()]] of whatwg streams spec. * @@ -90,5 +90,20 @@ trait ReadableStream[+T] extends js.Object { * allow interference between the two branches. (Let us know if you think we should add an option to tee that creates * structured clones of the chunks for each branch.) */ - def tee(): js.Array[_ <: ReadableStream[T]] = js.native //TODO js.Tuple2[ReadableStream[T], ReadableStream[T]] + def tee(): js.Array[_ <: ReadableStream[T]] = js.native // TODO js.Tuple2[ReadableStream[T], ReadableStream[T]] +} + +object ReadableStream { + + def apply[T]( + underlyingSource: js.UndefOr[ReadableStreamUnderlyingSource[T]] = js.undefined, + queuingStrategy: js.UndefOr[QueuingStrategy[T]] = js.undefined + ): ReadableStream[T] = { + js.Dynamic + .newInstance(js.Dynamic.global.ReadableStream)( + underlyingSource.asInstanceOf[js.Any], + queuingStrategy.asInstanceOf[js.Any] + ) + .asInstanceOf[ReadableStream[T]] + } } diff --git a/dom/src/main/scala/org/scalajs/dom/ReadableStreamController.scala b/dom/src/main/scala/org/scalajs/dom/ReadableStreamController.scala index 55e7106d5..ee40db34b 100644 --- a/dom/src/main/scala/org/scalajs/dom/ReadableStreamController.scala +++ b/dom/src/main/scala/org/scalajs/dom/ReadableStreamController.scala @@ -1,7 +1,7 @@ package org.scalajs.dom import scala.scalajs.js -import scala.scalajs.js.annotation._ +import scala.scalajs.js.annotation.JSGlobal /** [[https://streams.spec.whatwg.org/#rs-controller-class ¶3.3 Class ReadableStreamController]] of whatwg spec * @@ -15,7 +15,7 @@ import scala.scalajs.js.annotation._ */ @js.native @JSGlobal -class ReadableStreamController[-T](stream: ReadableStream[T] = null) extends js.Object { +class ReadableStreamController[-T] private[this] () extends js.Object { /** The desiredSize getter returns the desired size to fill the controlled stream’s internal queue. It can be * negative, if the queue is over-full. An underlying source should use this information to determine when and how to @@ -39,7 +39,8 @@ class ReadableStreamController[-T](stream: ReadableStream[T] = null) extends js. * @return * seems like its an undefOr[Int] of the size */ - def enqueue(chunk: Chunk[T]): js.UndefOr[Int] = js.native + def enqueue(chunk: T): Unit = js.native + def enqueue(): Unit = js.native /** The error method will error the readable stream, making all future interactions with it fail with the given error * e. diff --git a/dom/src/main/scala/org/scalajs/dom/ReadableStreamReader.scala b/dom/src/main/scala/org/scalajs/dom/ReadableStreamReader.scala index adf996e55..1953b2688 100644 --- a/dom/src/main/scala/org/scalajs/dom/ReadableStreamReader.scala +++ b/dom/src/main/scala/org/scalajs/dom/ReadableStreamReader.scala @@ -30,11 +30,9 @@ class ReadableStreamReader[+T](stream: ReadableStream[T]) extends js.Object { * * If the reader is active, the cancel method behaves the same as that for the associated stream. When done, it * automatically releases the lock. - * - * //todo determine type of reason */ - // not actually sure what the return type is here - def cancel(reason: Any): js.Promise[Any] = js.native + def cancel(reason: Any): js.Promise[Unit] = js.native + def cancel(): js.Promise[Unit] = js.native /** See [[https://streams.spec.whatwg.org/#reader-read 3.4.4.3. read()]] of whatwg Stream spec. * diff --git a/dom/src/main/scala/org/scalajs/dom/ReadableStreamUnderlyingSource.scala b/dom/src/main/scala/org/scalajs/dom/ReadableStreamUnderlyingSource.scala new file mode 100644 index 000000000..0d7712bc4 --- /dev/null +++ b/dom/src/main/scala/org/scalajs/dom/ReadableStreamUnderlyingSource.scala @@ -0,0 +1,57 @@ +package org.scalajs.dom + +import scala.scalajs.js + +/** See [[https://streams.spec.whatwg.org/#underlying-source-api ¶4.2.3. The underlying source API]] of whatwg streams + * spec. + * + * @tparam T + * Type of the Chunks returned by the Stream + */ +trait ReadableStreamUnderlyingSource[T] extends js.Object { + + /** A function that is called immediately during creation of the ReadableStream. + * + * If this setup process is asynchronous, it can return a promise to signal success or failure; a rejected promise + * will error the stream. Any thrown exceptions will be re-thrown by the [[ReadableStream]] constructor. + */ + var start: js.UndefOr[js.Function1[ReadableStreamController[T], js.UndefOr[js.Promise[Unit]]]] = js.undefined + + /** A function that is called whenever the stream’s internal queue of chunks becomes not full, i.e. whenever the + * queue’s desired size becomes positive. Generally, it will be called repeatedly until the queue reaches its high + * water mark (i.e. until the desired size becomes non-positive). + * + * This function will not be called until [[start]] successfully completes. Additionally, it will only be called + * repeatedly if it enqueues at least one chunk or fulfills a BYOB request; a no-op [[pull]] implementation will not + * be continually called. + * + * If the function returns a promise, then it will not be called again until that promise fulfills. (If the promise + * rejects, the stream will become errored.) This is mainly used in the case of pull sources, where the promise + * returned represents the process of acquiring a new chunk. Throwing an exception is treated the same as returning a + * rejected promise. + */ + var pull: js.UndefOr[js.Function1[ReadableStreamController[T], js.UndefOr[js.Promise[Unit]]]] = js.undefined + + /** A function that is called whenever the consumer cancels the stream, via [[ReadableStream.cancel]] or + * [[ReadableStreamReader.cancel():scala\.scalajs\.js\.Promise[Unit]*]]. It takes as its argument the same value as + * was passed to those methods by the consumer. If the shutdown process is asynchronous, it can return a promise to + * signal success or failure; the result will be communicated via the return value of the [[cancel]] method that was + * called. Additionally, a rejected promise will error the stream, instead of letting it close. Throwing an exception + * is treated the same as returning a rejected promise. + */ + var cancel: js.UndefOr[js.Function1[js.Any, js.UndefOr[js.Promise[Unit]]]] = js.undefined + + /** Can be set to "bytes" to signal that the constructed [[ReadableStream]] is a readable byte stream. + * + * Setting any value other than "bytes" or undefined will cause the ReadableStream() constructor to throw an + * exception. + */ + var `type`: js.UndefOr[ReadableStreamType] = js.undefined + + /** (byte streams only) + * + * Can be set to a positive integer to cause the implementation to automatically allocate buffers for the underlying + * source code to write into. + */ + var autoAllocateChunkSize: js.UndefOr[Int] = js.undefined +} diff --git a/dom/src/main/scala/org/scalajs/dom/Request.scala b/dom/src/main/scala/org/scalajs/dom/Request.scala index 1bc4b1b59..124849a8f 100644 --- a/dom/src/main/scala/org/scalajs/dom/Request.scala +++ b/dom/src/main/scala/org/scalajs/dom/Request.scala @@ -23,7 +23,7 @@ class Request(input: RequestInfo, init: RequestInit = null) extends Body { def `mediaType`: RequestType = js.native /** Contains the URL of the request. */ - def url: String = js.native //should be USVString + def url: String = js.native // should be USVString /** Contains the associated Headers object of the request. */ def headers: Headers = js.native @@ -42,7 +42,7 @@ class Request(input: RequestInfo, init: RequestInit = null) extends Body { def redirect: RequestRedirect = js.native - def integrity: String = js.native //should be DOMString + def integrity: String = js.native // should be DOMString def keepalive: Boolean = js.native diff --git a/dom/src/main/scala/org/scalajs/dom/Response.scala b/dom/src/main/scala/org/scalajs/dom/Response.scala index 54c147cbc..45505a8b3 100644 --- a/dom/src/main/scala/org/scalajs/dom/Response.scala +++ b/dom/src/main/scala/org/scalajs/dom/Response.scala @@ -25,10 +25,10 @@ class Response(content: BodyInit = null, init: ResponseInit = null) extends Body def ok: Boolean = js.native /** Contains the status code of the response (e.g., 200 for a success). */ - val status: Int = js.native //actually returns unsigned short + val status: Int = js.native // actually returns unsigned short /** Contains the status message corresponding to the status code (e.g., OK for 200). */ - def statusText: ByteString = js.native //actually returns ByteString + def statusText: ByteString = js.native // actually returns ByteString /** Contains the Headers object associated with the response. */ val headers: Headers = js.native diff --git a/dom/src/main/scala/org/scalajs/dom/ResponseInit.scala b/dom/src/main/scala/org/scalajs/dom/ResponseInit.scala index 7b6646978..da611ca41 100644 --- a/dom/src/main/scala/org/scalajs/dom/ResponseInit.scala +++ b/dom/src/main/scala/org/scalajs/dom/ResponseInit.scala @@ -4,7 +4,7 @@ import scala.scalajs.js /** See [[https://fetch.spec.whatwg.org/#response-class ¶6.4 Response class]] definition in whatwg Fetch spec. */ trait ResponseInit extends js.Object { - var status: Int - var statusText: ByteString - var headers: HeadersInit + var status: js.UndefOr[Int] = js.undefined + var statusText: js.UndefOr[ByteString] = js.undefined + var headers: js.UndefOr[HeadersInit] = js.undefined } diff --git a/dom/src/main/scala/org/scalajs/dom/UIEventInit.scala b/dom/src/main/scala/org/scalajs/dom/UIEventInit.scala index 78026b997..49bd6de3e 100644 --- a/dom/src/main/scala/org/scalajs/dom/UIEventInit.scala +++ b/dom/src/main/scala/org/scalajs/dom/UIEventInit.scala @@ -9,6 +9,6 @@ package org.scalajs.dom import scala.scalajs.js trait UIEventInit extends EventInit { - val detail: js.UndefOr[Int] = js.undefined - val view: js.UndefOr[Window] = js.undefined + var detail: js.UndefOr[Int] = js.undefined + var view: js.UndefOr[Window] = js.undefined } diff --git a/dom/src/main/scala/org/scalajs/dom/WindowClient.scala b/dom/src/main/scala/org/scalajs/dom/WindowClient.scala index e6f0f57ef..e7248bae9 100644 --- a/dom/src/main/scala/org/scalajs/dom/WindowClient.scala +++ b/dom/src/main/scala/org/scalajs/dom/WindowClient.scala @@ -12,7 +12,7 @@ trait WindowClient extends Client { /** The visibilityState read-only property of the WindowClient interface indicates the visibility of the current * client. This value can be one of hidden, visible, prerender, or unloaded. */ - //todo: stubs for https://www.w3.org/TR/page-visibility/#dom-document-visibilitystate + // todo: stubs for https://www.w3.org/TR/page-visibility/#dom-document-visibilitystate def visibilityState: String = js.native /** The focused read-only property of the WindowClient interface is a Boolean that indicates whether the current diff --git a/dom/src/main/scala/org/scalajs/dom/WindowOrWorkerGlobalScope.scala b/dom/src/main/scala/org/scalajs/dom/WindowOrWorkerGlobalScope.scala index b90929721..10e9111f7 100644 --- a/dom/src/main/scala/org/scalajs/dom/WindowOrWorkerGlobalScope.scala +++ b/dom/src/main/scala/org/scalajs/dom/WindowOrWorkerGlobalScope.scala @@ -28,7 +28,7 @@ trait WindowOrWorkerGlobalScope extends WindowBase64 with WindowTimers { def isSecureContext: Boolean = js.native /** Returns the origin of the global scope, serialized as a string. */ - def origin: String = js.native //should be USVString + def origin: String = js.native // should be USVString /** Starts the process of fetching a resource from the network. */ def fetch(info: RequestInfo, init: RequestInit = js.native): js.Promise[Response] = js.native diff --git a/dom/src/main/scala/org/scalajs/dom/experimental/package.scala b/dom/src/main/scala/org/scalajs/dom/experimental/package.scala index 0c1a4adfa..87547506c 100644 --- a/dom/src/main/scala/org/scalajs/dom/experimental/package.scala +++ b/dom/src/main/scala/org/scalajs/dom/experimental/package.scala @@ -65,9 +65,9 @@ package object experimental { def apply(_status: Int = 200, _statusText: ByteString = "OK", _headers: HeadersInit = js.Dictionary[String]()): ResponseInit = { new ResponseInit { - var status = _status - var statusText = _statusText - var headers = _headers + status = _status + statusText = _statusText + headers = _headers } } } diff --git a/dom/src/main/scala/org/scalajs/dom/package.scala b/dom/src/main/scala/org/scalajs/dom/package.scala index 071246649..caeea520b 100644 --- a/dom/src/main/scala/org/scalajs/dom/package.scala +++ b/dom/src/main/scala/org/scalajs/dom/package.scala @@ -2,7 +2,7 @@ package org.scalajs import scala.scalajs.js import scala.scalajs.js.annotation._ -import scala.scalajs.js.typedarray.{ArrayBuffer, ArrayBufferView} +import scala.scalajs.js.typedarray.{ArrayBuffer, ArrayBufferView, Uint8Array} import scala.scalajs.js.| package object dom { @@ -32,7 +32,7 @@ package object dom { /** defined at [[https://fetch.spec.whatwg.org/#body-mixin ¶6.2 Body mixin]] in whatwg Fetch spec */ type BodyInit = - Blob | BufferSource | FormData | String //todo: add URLSearchParams + Blob | BufferSource | FormData | String | ReadableStream[Uint8Array] // todo: add URLSearchParams /** WebIDL sequence is js.Array[T] | JSIterable[T]. However @mseddon knows at least Blink's IDL compiler treats * these as simply js.Array[T] for now. We keep this type as a reminder to check in more detail diff --git a/project/Build.scala b/project/Build.scala index eef9c3d79..bab9374c2 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -145,7 +145,7 @@ object Build { ScalatexReadme( projectId = "readme", wd = file(""), - url = "https://github.com/scala-js/scala-js-dom/tree/master", + url = "https://github.com/scala-js/scala-js-dom/tree/main", source = "Index", autoResources = Seq("example-opt.js"), ) diff --git a/project/build.properties b/project/build.properties index 10fd9eee0..3161d2146 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.1 diff --git a/project/plugins.sbt b/project/plugins.sbt index 8a93dde83..5ec36db84 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,9 +1,9 @@ libraryDependencies += "org.scala-js" %% "scalajs-env-jsdom-nodejs" % "1.1.0" libraryDependencies += "org.scala-js" %% "scalajs-env-selenium" % "1.1.1" -addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.31") +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.33") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0") addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.10") addSbtPlugin("com.lihaoyi" % "scalatex-sbt-plugin" % "0.3.11") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.5.1") -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") diff --git a/tests-chrome/src/test/scala/org/scalajs/dom/tests/chrome/ChromeTests.scala b/tests-chrome/src/test/scala/org/scalajs/dom/tests/chrome/ChromeTests.scala index 9a4e5e267..b91a6cff8 100644 --- a/tests-chrome/src/test/scala/org/scalajs/dom/tests/chrome/ChromeTests.scala +++ b/tests-chrome/src/test/scala/org/scalajs/dom/tests/chrome/ChromeTests.scala @@ -3,4 +3,4 @@ package org.scalajs.dom.tests.chrome import org.scalajs.dom.tests.shared._ import org.scalajs.dom.tests.webworker._ -class ChromeTests extends SharedTests with WebWorkerTests \ No newline at end of file +class ChromeTests extends SharedTests with WebWorkerTests with BrowserTests \ No newline at end of file diff --git a/tests-firefox/src/test/scala/org/scalajs/dom/tests/firefox/FirefoxTests.scala b/tests-firefox/src/test/scala/org/scalajs/dom/tests/firefox/FirefoxTests.scala index 1a8735389..d877f8b79 100644 --- a/tests-firefox/src/test/scala/org/scalajs/dom/tests/firefox/FirefoxTests.scala +++ b/tests-firefox/src/test/scala/org/scalajs/dom/tests/firefox/FirefoxTests.scala @@ -3,4 +3,4 @@ package org.scalajs.dom.tests.firefox import org.scalajs.dom.tests.shared._ import org.scalajs.dom.tests.webworker._ -class FirefoxTests extends SharedTests with WebWorkerTests \ No newline at end of file +class FirefoxTests extends SharedTests with WebWorkerTests with BrowserTests \ No newline at end of file diff --git a/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala b/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala new file mode 100644 index 000000000..10d8c26a8 --- /dev/null +++ b/tests-shared/src/main/scala/org/scalajs/dom/tests/shared/BrowserTests.scala @@ -0,0 +1,131 @@ +package org.scalajs.dom.tests.shared + +import org.junit.Assert.assertEquals +import org.junit.Test +import org.scalajs.dom.QueuingStrategy +import org.scalajs.dom.ReadableStream +import org.scalajs.dom.ReadableStreamController +import org.scalajs.dom.ReadableStreamReader +import org.scalajs.dom.ReadableStreamUnderlyingSource +import org.scalajs.dom.tests.shared.AsyncTesting.AsyncResult +import org.scalajs.dom.tests.shared.AsyncTesting._ +import org.scalajs.dom.tests.shared.AsyncTesting.async + +import scala.concurrent.Future +import scala.concurrent.Promise +import scala.scalajs.js +import scala.scalajs.js.Thenable.Implicits._ +import scala.util.Try + +trait BrowserTests { + + def read[T](reader: ReadableStreamReader[T])(values: Seq[T]): Future[Seq[T]] = { + reader + .read() + .flatMap { chunk => + if (chunk.done) { + Future.successful(values) + } else { + read(reader)(values :+ chunk.value) + } + } + } + + @Test + final def ReadableStreamConstructionAndConsumptionTest: AsyncResult = async { + case class Tuna(color: String) + + val expectedTunas = Seq( + Tuna("blue"), + Tuna("red") + ) + + val stream = ReadableStream[Tuna]( + new ReadableStreamUnderlyingSource[Tuna] { + start = js.defined({ (controller: ReadableStreamController[Tuna]) => + controller.enqueue(Tuna("blue")) + controller.enqueue(Tuna("red")) + controller.close(): js.UndefOr[js.Promise[Unit]] + }): js.UndefOr[js.Function1[ReadableStreamController[Tuna], js.UndefOr[js.Promise[Unit]]]] + } + ) + + read(stream.getReader())(Seq.empty) + .map { receivedTunas => + assertEquals(receivedTunas, expectedTunas) + } + } + + @Test + final def ReadableStreamQueueingStrategyTest: AsyncResult = async { + val expectedStrings = Seq( + "short one", + "definitely a longer one" + ) + + val stream = ReadableStream[String]( + new ReadableStreamUnderlyingSource[String] { + start = js.defined({ (controller: ReadableStreamController[String]) => + controller.enqueue("short one") + controller.enqueue("definitely a longer one") + controller.close(): js.UndefOr[js.Promise[Unit]] + }): js.UndefOr[js.Function1[ReadableStreamController[String], js.UndefOr[js.Promise[Unit]]]] + }, + new QueuingStrategy[String] { + var highWaterMark = 1 + var size: js.Function1[String, Int] = { (chunk: String) => + chunk.length + } + } + ) + + read(stream.getReader())(Seq.empty) + .map { receivedStrings => + assertEquals(receivedStrings, expectedStrings) + } + } + + @Test + final def ReadableStreamReaderCancelUnitTest: AsyncResult = async { + val reasonPromise = Promise[Unit]() + val stream = ReadableStream[Unit]( + new ReadableStreamUnderlyingSource[Unit] { + cancel = js.defined({ (reason: Any) => + reasonPromise.tryComplete(Try(reason.asInstanceOf[Unit])) + (): js.UndefOr[js.Promise[Unit]] + }): js.UndefOr[js.Function1[Any, js.UndefOr[js.Promise[Unit]]]] + } + ) + + for { + _ <- stream + .getReader() + .cancel() + .map(assertEquals((), _)) + _ <- reasonPromise.future.map(assertEquals((), _)) + } yield () + } + + @Test + final def ReadableStreamReaderCancelPromiseTest: AsyncResult = async { + val expectedReason = "probably a good one" + + val reasonPromise = Promise[String]() + val stream = ReadableStream[Unit]( + new ReadableStreamUnderlyingSource[Unit] { + cancel = js.defined({ (reason: Any) => + reasonPromise.tryComplete(Try(reason.asInstanceOf[String])) + (): js.UndefOr[js.Promise[Unit]] + }): js.UndefOr[js.Function1[Any, js.UndefOr[js.Promise[Unit]]]] + } + ) + + for { + _ <- stream + .getReader() + .cancel(expectedReason) + .map(assertEquals((), _)) + _ <- reasonPromise.future.map(assertEquals(expectedReason, _)) + } yield () + } +}