@@ -20,6 +20,7 @@ module GlobalVars =
20
20
21
21
let makeTextWriter fileName = File.CreateText( Path.Combine( outputFolder, fileName)) :> TextWriter
22
22
let tsWebOutput = makeTextWriter " dom.generated.d.ts"
23
+ let tsWebES6Output = makeTextWriter " dom.es6.generated.d.ts"
23
24
let tsWorkerOutput = makeTextWriter " webworker.generated.d.ts"
24
25
let defaultEventType = " Event"
25
26
@@ -698,6 +699,9 @@ module Emit =
698
699
let extendedTypes =
699
700
[ " ArrayBuffer" ; " ArrayBufferView" ; " Int8Array" ; " Uint8Array" ; " Int16Array" ; " Uint16Array" ; " Int32Array" ; " Uint32Array" ; " Float32Array" ; " Float64Array" ]
700
701
702
+ let integerTypes =
703
+ [ " byte" ; " octet" ; " short" ; " unsigned short" ; " long" ; " unsigned long" ; " long long" ; " unsigned long long" ]
704
+
701
705
/// Get typescript type using object dom type, object name, and it's associated interface name
702
706
let rec DomTypeToTsType ( objDomType : string ) =
703
707
match objDomType.Trim( '?' ) with
@@ -713,15 +717,13 @@ module Emit =
713
717
| " EventListener" -> " EventListenerOrEventListenerObject"
714
718
| " double" | " float" -> " number"
715
719
| " Function" -> " Function"
716
- | " long" | " long long" | " signed long" | " signed long long" | " unsigned long" | " unsigned long long" -> " number"
717
- | " octet" | " byte" -> " number"
718
720
| " object" -> " any"
719
721
| " Promise" -> " Promise"
720
722
| " ReadyState" -> " string"
721
723
| " sequence" -> " Array"
722
- | " short" | " signed short" | " unsigned short" -> " number"
723
724
| " UnrestrictedDouble" -> " number"
724
725
| " void" -> " void"
726
+ | integerType when List.contains integerType integerTypes -> " number"
725
727
| extendedType when List.contains extendedType extendedTypes -> extendedType
726
728
| _ ->
727
729
if ignoreDOMTypes && Seq.contains objDomType [ " Element" ; " Window" ; " Document" ] then " any"
@@ -824,21 +826,19 @@ module Emit =
824
826
Pt.Printl " "
825
827
826
828
let EmitElementTagNameMap () =
827
- Pt.Printl " interface ElementTagNameMap {"
829
+ Pt.Printl " interface ElementTagNameMap extends HTMLElementTagNameMap {"
828
830
Pt.IncreaseIndent()
829
831
for e in tagNameToEleName do
830
- Pt.Printl " \" %s \" : %s ;" ( e.Key.ToLower()) e.Value
832
+ if iNameToIDependList.ContainsKey e.Value && not ( Seq.contains " HTMLElement" iNameToIDependList.[ e.Value]) then
833
+ Pt.Printl " \" %s \" : %s ;" ( e.Key.ToLower()) e.Value
831
834
Pt.DecreaseIndent()
832
835
Pt.Printl " }"
833
836
Pt.Printl " "
834
837
835
838
let EmitElementListTagNameMap () =
836
- Pt.Printl " interface ElementListTagNameMap {"
837
- Pt.IncreaseIndent()
838
- for e in tagNameToEleName do
839
- Pt.Printl " \" %s \" : NodeListOf<%s >;" ( e.Key.ToLower()) e.Value
840
- Pt.DecreaseIndent()
841
- Pt.Printl " }"
839
+ Pt.Printl " type ElementListTagNameMap = {"
840
+ Pt.PrintWithAddedIndent " [key in keyof ElementTagNameMap]: NodeListOf<ElementTagNameMap[key]>"
841
+ Pt.Printl " };"
842
842
Pt.Printl " "
843
843
844
844
/// Emit overloads for the createEvent method
@@ -847,9 +847,9 @@ module Emit =
847
847
// Emit plurals. For example, "Events", "MutationEvents"
848
848
let hasPlurals = [ " Event" ; " MutationEvent" ; " MouseEvent" ; " SVGZoomEvent" ; " UIEvent" ]
849
849
for x in distinctETypeList do
850
- Pt.Printl " createEvent(eventInterface:\" %s \" ): %s ;" x x
850
+ Pt.Printl " createEvent(eventInterface: \" %s \" ): %s ;" x x
851
851
if List.contains x hasPlurals then
852
- Pt.Printl " createEvent(eventInterface:\" %s s\" ): %s ;" x x
852
+ Pt.Printl " createEvent(eventInterface: \" %s s\" ): %s ;" x x
853
853
Pt.Printl " createEvent(eventInterface: string): Event;"
854
854
855
855
/// Generate the parameters string for function signatures
@@ -1012,7 +1012,7 @@ module Emit =
1012
1012
if m.Name.IsSome then
1013
1013
// If there are added overloads from the json files, print them first
1014
1014
match getAddedItemByName m.Name.Value ItemKind.SignatureOverload i.Name with
1015
- | Some ol -> ol.Signatures |> Array.iter ( printLine " %s " )
1015
+ | Some ol -> ol.Signatures |> Array.iter ( printLine " %s ; " )
1016
1016
| _ -> ()
1017
1017
1018
1018
let overloads = GetOverloads ( Function.Method m) false
@@ -1119,7 +1119,7 @@ module Emit =
1119
1119
EmitMembers flavor prefix EmitScope.StaticOnly i
1120
1120
1121
1121
Pt.DecreaseIndent()
1122
- Pt.Printl " }"
1122
+ Pt.Printl " }; "
1123
1123
Pt.Printl " "
1124
1124
1125
1125
/// Emit all the named constructors at root level
@@ -1132,7 +1132,7 @@ module Emit =
1132
1132
let ncParams =
1133
1133
[ for p in nc.Params do
1134
1134
yield { Type = p.Type; Name = p.Name; Optional = p.Optional.IsSome; Variadic = p.Variadic.IsSome; Nullable = p.Nullable.IsSome}]
1135
- Pt.Printl " declare var %s : {new(%s ): %s ; };" nc.Name ( ParamsToString ncParams) i.Name)
1135
+ Pt.Printl " declare var %s : { new(%s ): %s ; };" nc.Name ( ParamsToString ncParams) i.Name)
1136
1136
1137
1137
let EmitInterfaceDeclaration ( i : Browser.Interface ) =
1138
1138
let processIName iName =
@@ -1336,7 +1336,7 @@ module Emit =
1336
1336
EmitMembers flavor prefix EmitScope.StaticOnly i
1337
1337
emitAddedConstructor ()
1338
1338
Pt.DecreaseIndent()
1339
- Pt.Printl " }"
1339
+ Pt.Printl " }; "
1340
1340
Pt.Printl " "
1341
1341
1342
1342
let emitPureStaticInterface () =
@@ -1440,7 +1440,7 @@ module Emit =
1440
1440
| Some comment -> Pt.PrintWithAddedIndent " %s " comment
1441
1441
| _ -> ()
1442
1442
ai.ConstructorSignatures |> Array.iter ( Pt.PrintWithAddedIndent " %s ;" )
1443
- Pt.Printl " }"
1443
+ Pt.Printl " }; "
1444
1444
Pt.Printl " "
1445
1445
1446
1446
let EmitTypeDefs flavor =
@@ -1466,8 +1466,8 @@ module Emit =
1466
1466
Pt.Reset()
1467
1467
Pt.Printl " /////////////////////////////"
1468
1468
match flavor with
1469
- | Worker -> Pt.Printl " /// IE Worker APIs"
1470
- | _ -> Pt.Printl " /// IE DOM APIs"
1469
+ | Worker -> Pt.Printl " /// Worker APIs"
1470
+ | _ -> Pt.Printl " /// DOM APIs"
1471
1471
Pt.Printl " /////////////////////////////"
1472
1472
Pt.Printl " "
1473
1473
@@ -1502,8 +1502,53 @@ module Emit =
1502
1502
target.Flush()
1503
1503
target.Close()
1504
1504
1505
+ let EmitIterator ( i : Browser.Interface ) =
1506
+ let isIntegerKeyParam ( p : Browser.Param ) =
1507
+ List.contains p.Type integerTypes
1508
+
1509
+ // check anonymous unsigned long getter and length property
1510
+ let isIterableGetter ( m : Browser.Method ) =
1511
+ m.Getter = Some 1 && m.Params.Length = 1 && isIntegerKeyParam m.Params.[ 0 ]
1512
+
1513
+ let findIterableGetter () =
1514
+ let anonymousGetter =
1515
+ if ( i.AnonymousMethods.IsSome) then Array.tryFind isIterableGetter i.AnonymousMethods.Value.Methods
1516
+ else None
1517
+
1518
+ if ( anonymousGetter.IsSome) then anonymousGetter
1519
+ else if ( i.Methods.IsSome) then Array.tryFind isIterableGetter i.Methods.Value.Methods
1520
+ else None
1521
+
1522
+ let findLengthProperty ( p : Browser.Property ) =
1523
+ p.Name = " length" && List.contains p.Type integerTypes
1524
+
1525
+ if i.Name <> " Window" && i.Properties.IsSome then
1526
+ let iterableGetter = findIterableGetter()
1527
+ let lengthProperty = Array.tryFind findLengthProperty i.Properties.Value.Properties
1528
+ if iterableGetter.IsSome && lengthProperty.IsSome then
1529
+ Pt.Printl " interface %s {" i.Name
1530
+ Pt.IncreaseIndent()
1531
+ Pt.Printl " [Symbol.iterator](): IterableIterator<%s >" ( DomTypeToTsType iterableGetter.Value.Type)
1532
+ Pt.DecreaseIndent()
1533
+ Pt.Printl " }"
1534
+ Pt.Printl " "
1535
+
1536
+ let EmitES6Thing ( target : TextWriter ) =
1537
+ Pt.Reset()
1538
+ Pt.Printl " /////////////////////////////"
1539
+ Pt.Printl " /// DOM ES6 APIs"
1540
+ Pt.Printl " /////////////////////////////"
1541
+ Pt.Printl " "
1542
+
1543
+ browser.Interfaces |> Array.iter EmitIterator
1544
+
1545
+ fprintf target " %s " ( Pt.GetResult())
1546
+ target.Flush()
1547
+ target.Close()
1548
+
1505
1549
let EmitDomWeb () =
1506
1550
EmitTheWholeThing Flavor.All GlobalVars.tsWebOutput
1551
+ EmitES6Thing GlobalVars.tsWebES6Output
1507
1552
1508
1553
let EmitDomWorker () =
1509
1554
ignoreDOMTypes <- true
0 commit comments