@@ -20,6 +20,7 @@ module GlobalVars =
2020
2121 let makeTextWriter fileName = File.CreateText( Path.Combine( outputFolder, fileName)) :> TextWriter
2222 let tsWebOutput = makeTextWriter " dom.generated.d.ts"
23+ let tsWebES6Output = makeTextWriter " dom.es6.generated.d.ts"
2324 let tsWorkerOutput = makeTextWriter " webworker.generated.d.ts"
2425 let defaultEventType = " Event"
2526
@@ -698,6 +699,9 @@ module Emit =
698699 let extendedTypes =
699700 [ " ArrayBuffer" ; " ArrayBufferView" ; " Int8Array" ; " Uint8Array" ; " Int16Array" ; " Uint16Array" ; " Int32Array" ; " Uint32Array" ; " Float32Array" ; " Float64Array" ]
700701
702+ let integerTypes =
703+ [ " byte" ; " octet" ; " short" ; " unsigned short" ; " long" ; " unsigned long" ; " long long" ; " unsigned long long" ]
704+
701705 /// Get typescript type using object dom type, object name, and it's associated interface name
702706 let rec DomTypeToTsType ( objDomType : string ) =
703707 match objDomType.Trim( '?' ) with
@@ -713,15 +717,13 @@ module Emit =
713717 | " EventListener" -> " EventListenerOrEventListenerObject"
714718 | " double" | " float" -> " number"
715719 | " Function" -> " Function"
716- | " long" | " long long" | " signed long" | " signed long long" | " unsigned long" | " unsigned long long" -> " number"
717- | " octet" | " byte" -> " number"
718720 | " object" -> " any"
719721 | " Promise" -> " Promise"
720722 | " ReadyState" -> " string"
721723 | " sequence" -> " Array"
722- | " short" | " signed short" | " unsigned short" -> " number"
723724 | " UnrestrictedDouble" -> " number"
724725 | " void" -> " void"
726+ | integerType when List.contains integerType integerTypes -> " number"
725727 | extendedType when List.contains extendedType extendedTypes -> extendedType
726728 | _ ->
727729 if ignoreDOMTypes && Seq.contains objDomType [ " Element" ; " Window" ; " Document" ] then " any"
@@ -1466,8 +1468,8 @@ module Emit =
14661468 Pt.Reset()
14671469 Pt.Printl " /////////////////////////////"
14681470 match flavor with
1469- | Worker -> Pt.Printl " /// IE Worker APIs"
1470- | _ -> Pt.Printl " /// IE DOM APIs"
1471+ | Worker -> Pt.Printl " /// Worker APIs"
1472+ | _ -> Pt.Printl " /// DOM APIs"
14711473 Pt.Printl " /////////////////////////////"
14721474 Pt.Printl " "
14731475
@@ -1502,8 +1504,53 @@ module Emit =
15021504 target.Flush()
15031505 target.Close()
15041506
1507+ let EmitIterator ( i : Browser.Interface ) =
1508+ let isIntegerKeyParam ( p : Browser.Param ) =
1509+ List.contains p.Type integerTypes
1510+
1511+ // check anonymous unsigned long getter and length property
1512+ let isIterableGetter ( m : Browser.Method ) =
1513+ m.Getter = Some 1 && m.Params.Length = 1 && isIntegerKeyParam m.Params.[ 0 ]
1514+
1515+ let findIterableGetter () =
1516+ let anonymousGetter =
1517+ if ( i.AnonymousMethods.IsSome) then Array.tryFind isIterableGetter i.AnonymousMethods.Value.Methods
1518+ else None
1519+
1520+ if ( anonymousGetter.IsSome) then anonymousGetter
1521+ else if ( i.Methods.IsSome) then Array.tryFind isIterableGetter i.Methods.Value.Methods
1522+ else None
1523+
1524+ let findLengthProperty ( p : Browser.Property ) =
1525+ p.Name = " length" && List.contains p.Type integerTypes
1526+
1527+ if i.Name <> " Window" && i.Properties.IsSome then
1528+ let iterableGetter = findIterableGetter()
1529+ let lengthProperty = Array.tryFind findLengthProperty i.Properties.Value.Properties
1530+ if iterableGetter.IsSome && lengthProperty.IsSome then
1531+ Pt.Printl " interface %s {" i.Name
1532+ Pt.IncreaseIndent()
1533+ Pt.Printl " [Symbol.iterator](): IterableIterator<%s >" ( DomTypeToTsType iterableGetter.Value.Type)
1534+ Pt.DecreaseIndent()
1535+ Pt.Printl " }"
1536+ Pt.Printl " "
1537+
1538+ let EmitES6Thing ( target : TextWriter ) =
1539+ Pt.Reset()
1540+ Pt.Printl " /////////////////////////////"
1541+ Pt.Printl " /// DOM ES6 APIs"
1542+ Pt.Printl " /////////////////////////////"
1543+ Pt.Printl " "
1544+
1545+ browser.Interfaces |> Array.iter EmitIterator
1546+
1547+ fprintf target " %s " ( Pt.GetResult())
1548+ target.Flush()
1549+ target.Close()
1550+
15051551 let EmitDomWeb () =
15061552 EmitTheWholeThing Flavor.All GlobalVars.tsWebOutput
1553+ EmitES6Thing GlobalVars.tsWebES6Output
15071554
15081555 let EmitDomWorker () =
15091556 ignoreDOMTypes <- true
0 commit comments