@@ -72,6 +72,8 @@ struct BridgeJSLink {
72
72
var namespacedEnums : [ ExportedEnum ] = [ ]
73
73
var enumConstantLines : [ String ] = [ ]
74
74
var dtsEnumLines : [ String ] = [ ]
75
+ var topLevelEnumLines : [ String ] = [ ]
76
+ var topLevelDtsEnumLines : [ String ] = [ ]
75
77
76
78
if exportedSkeletons. contains ( where: { $0. classes. count > 0 } ) {
77
79
classLines. append (
@@ -102,14 +104,29 @@ struct BridgeJSLink {
102
104
if !skeleton. enums. isEmpty {
103
105
for enumDefinition in skeleton. enums {
104
106
let ( jsEnum, dtsEnum) = try renderExportedEnum ( enumDefinition)
105
- enumConstantLines. append ( contentsOf: jsEnum)
106
- if enumDefinition. enumType != . namespace {
107
+
108
+ switch enumDefinition. enumType {
109
+ case . namespace:
110
+ break
111
+ case . simple, . rawValue:
112
+ var exportedJsEnum = jsEnum
113
+ if !exportedJsEnum. isEmpty && exportedJsEnum [ 0 ] . hasPrefix ( " const " ) {
114
+ exportedJsEnum [ 0 ] = " export " + exportedJsEnum[ 0 ]
115
+ }
116
+ topLevelEnumLines. append ( contentsOf: exportedJsEnum)
117
+ topLevelDtsEnumLines. append ( contentsOf: dtsEnum)
118
+
119
+ if enumDefinition. namespace != nil {
120
+ namespacedEnums. append ( enumDefinition)
121
+ }
122
+ case . associatedValue:
123
+ enumConstantLines. append ( contentsOf: jsEnum)
107
124
exportsLines. append ( " \( enumDefinition. name) , " )
108
125
if enumDefinition. namespace != nil {
109
126
namespacedEnums. append ( enumDefinition)
110
127
}
128
+ dtsEnumLines. append ( contentsOf: dtsEnum)
111
129
}
112
- dtsEnumLines. append ( contentsOf: dtsEnum)
113
130
}
114
131
}
115
132
@@ -153,10 +170,11 @@ struct BridgeJSLink {
153
170
154
171
let exportsSection : String
155
172
if hasNamespacedItems {
173
+ let namespacedEnumsForExports = namespacedEnums. filter { $0. enumType == . associatedValue }
156
174
let namespaceSetupCode = namespaceBuilder. renderGlobalNamespace (
157
175
namespacedFunctions: namespacedFunctions,
158
176
namespacedClasses: namespacedClasses,
159
- namespacedEnums: namespacedEnums
177
+ namespacedEnums: namespacedEnumsForExports
160
178
)
161
179
. map { $0. indent ( count: 12 ) } . joined ( separator: " \n " )
162
180
@@ -189,14 +207,22 @@ struct BridgeJSLink {
189
207
"""
190
208
}
191
209
210
+ let topLevelEnumsSection = topLevelEnumLines. isEmpty ? " " : topLevelEnumLines. joined ( separator: " \n " ) + " \n \n "
211
+
212
+ let topLevelNamespaceCode = namespaceBuilder. renderTopLevelEnumNamespaceAssignments (
213
+ namespacedEnums: namespacedEnums
214
+ )
215
+ let namespaceAssignmentsSection =
216
+ topLevelNamespaceCode. isEmpty ? " " : topLevelNamespaceCode. joined ( separator: " \n " ) + " \n \n "
217
+
192
218
let outputJs = """
193
219
// NOTICE: This is auto-generated code by BridgeJS from JavaScriptKit,
194
220
// DO NOT EDIT.
195
221
//
196
222
// To update this file, just rebuild your project or run
197
223
// `swift package bridge-js`.
198
224
199
- export async function createInstantiator(options, swift) {
225
+ \( topLevelEnumsSection ) \( namespaceAssignmentsSection ) export async function createInstantiator(options, swift) {
200
226
let instance;
201
227
let memory;
202
228
let setException;
@@ -270,14 +296,17 @@ struct BridgeJSLink {
270
296
dtsLines. append ( " export type Imports = { " )
271
297
dtsLines. append ( contentsOf: importObjectBuilders. flatMap { $0. dtsImportLines } . map { $0. indent ( count: 4 ) } )
272
298
dtsLines. append ( " } " )
299
+ let topLevelDtsEnumsSection =
300
+ topLevelDtsEnumLines. isEmpty ? " " : topLevelDtsEnumLines. joined ( separator: " \n " ) + " \n "
301
+
273
302
let outputDts = """
274
303
// NOTICE: This is auto-generated code by BridgeJS from JavaScriptKit,
275
304
// DO NOT EDIT.
276
305
//
277
306
// To update this file, just rebuild your project or run
278
307
// `swift package bridge-js`.
279
308
280
- \( dtsLines. joined ( separator: " \n " ) )
309
+ \( topLevelDtsEnumsSection ) \( dtsLines. joined ( separator: " \n " ) )
281
310
export function createInstantiator(options: {
282
311
imports: Imports;
283
312
}, swift: any): Promise<{
@@ -535,7 +564,7 @@ struct BridgeJSLink {
535
564
jsLines. append ( " const \( enumDefinition. name) = { " )
536
565
for (index, enumCase) in enumDefinition. cases. enumerated ( ) {
537
566
let caseName = enumCase. name. capitalizedFirstLetter
538
- jsLines. append ( " \( caseName) : \( index) , " . indent ( count: 0 ) )
567
+ jsLines. append ( " \( caseName) : \( index) , " . indent ( count: 4 ) )
539
568
}
540
569
jsLines. append ( " }; " )
541
570
jsLines. append ( " " )
@@ -546,15 +575,15 @@ struct BridgeJSLink {
546
575
dtsLines. append ( " export enum \( enumDefinition. name) { " )
547
576
for (index, enumCase) in enumDefinition. cases. enumerated ( ) {
548
577
let caseName = enumCase. name. capitalizedFirstLetter
549
- dtsLines. append ( " \( caseName) = \( index) , " )
578
+ dtsLines. append ( " \( caseName) = \( index) , " . indent ( count : 4 ) )
550
579
}
551
580
dtsLines. append ( " } " )
552
581
dtsLines. append ( " " )
553
582
case . const:
554
583
dtsLines. append ( " export const \( enumDefinition. name) : { " )
555
584
for (index, enumCase) in enumDefinition. cases. enumerated ( ) {
556
585
let caseName = enumCase. name. capitalizedFirstLetter
557
- dtsLines. append ( " readonly \( caseName) : \( index) ; " )
586
+ dtsLines. append ( " readonly \( caseName) : \( index) ; " . indent ( count : 4 ) )
558
587
}
559
588
dtsLines. append ( " }; " )
560
589
dtsLines. append (
@@ -608,7 +637,7 @@ struct BridgeJSLink {
608
637
case " Float " , " Double " : formattedValue = rawValue
609
638
default : formattedValue = rawValue
610
639
}
611
- dtsLines. append ( " \( caseName) = \( formattedValue) , " )
640
+ dtsLines. append ( " \( caseName) = \( formattedValue) , " . indent ( count : 4 ) )
612
641
}
613
642
dtsLines. append ( " } " )
614
643
dtsLines. append ( " " )
@@ -630,7 +659,7 @@ struct BridgeJSLink {
630
659
formattedValue = rawValue
631
660
}
632
661
633
- dtsLines. append ( " readonly \( caseName) : \( formattedValue) ; " )
662
+ dtsLines. append ( " readonly \( caseName) : \( formattedValue) ; " . indent ( count : 4 ) )
634
663
}
635
664
dtsLines. append ( " }; " )
636
665
dtsLines. append (
@@ -780,7 +809,7 @@ struct BridgeJSLink {
780
809
781
810
uniqueNamespaces. sorted ( ) . forEach { namespace in
782
811
lines. append ( " if (typeof globalThis. \( namespace) === 'undefined') { " )
783
- lines. append ( " globalThis.\( namespace) = {}; " )
812
+ lines. append ( " globalThis. \( namespace) = {}; " . indent ( count : 4 ) )
784
813
lines. append ( " } " )
785
814
}
786
815
@@ -790,8 +819,10 @@ struct BridgeJSLink {
790
819
}
791
820
792
821
namespacedEnums. forEach { enumDefinition in
793
- let namespacePath : String = enumDefinition. namespace? . joined ( separator: " . " ) ?? " "
794
- lines. append ( " globalThis. \( namespacePath) . \( enumDefinition. name) = exports. \( enumDefinition. name) ; " )
822
+ if enumDefinition. enumType == . associatedValue {
823
+ let namespacePath : String = enumDefinition. namespace? . joined ( separator: " . " ) ?? " "
824
+ lines. append ( " globalThis. \( namespacePath) . \( enumDefinition. name) = exports. \( enumDefinition. name) ; " )
825
+ }
795
826
}
796
827
797
828
namespacedFunctions. forEach { function in
@@ -1015,7 +1046,7 @@ struct BridgeJSLink {
1015
1046
1016
1047
uniqueNamespaces. sorted ( ) . forEach { namespace in
1017
1048
lines. append ( " if (typeof globalThis. \( namespace) === 'undefined') { " )
1018
- lines. append ( " globalThis.\( namespace) = {}; " )
1049
+ lines. append ( " globalThis. \( namespace) = {}; " . indent ( count : 4 ) )
1019
1050
lines. append ( " } " )
1020
1051
}
1021
1052
@@ -1037,6 +1068,44 @@ struct BridgeJSLink {
1037
1068
return lines
1038
1069
}
1039
1070
1071
+ func renderTopLevelEnumNamespaceAssignments( namespacedEnums: [ ExportedEnum ] ) -> [ String ] {
1072
+ let topLevelNamespacedEnums = namespacedEnums. filter { $0. enumType == . simple || $0. enumType == . rawValue }
1073
+
1074
+ guard !topLevelNamespacedEnums. isEmpty else { return [ ] }
1075
+
1076
+ var lines : [ String ] = [ ]
1077
+ var uniqueNamespaces : [ String ] = [ ]
1078
+ var seen = Set < String > ( )
1079
+
1080
+ for enumDef in topLevelNamespacedEnums {
1081
+ guard let namespacePath = enumDef. namespace else { continue }
1082
+ namespacePath. enumerated ( ) . forEach { ( index, _) in
1083
+ let path = namespacePath [ 0 ... index] . joined ( separator: " . " )
1084
+ if !seen. contains ( path) {
1085
+ seen. insert ( path)
1086
+ uniqueNamespaces. append ( path)
1087
+ }
1088
+ }
1089
+ }
1090
+
1091
+ for namespace in uniqueNamespaces {
1092
+ lines. append ( " if (typeof globalThis. \( namespace) === 'undefined') { " )
1093
+ lines. append ( " globalThis. \( namespace) = {}; " . indent ( count: 4 ) )
1094
+ lines. append ( " } " )
1095
+ }
1096
+
1097
+ if !lines. isEmpty {
1098
+ lines. append ( " " )
1099
+ }
1100
+
1101
+ for enumDef in topLevelNamespacedEnums {
1102
+ let namespacePath = enumDef. namespace? . joined ( separator: " . " ) ?? " "
1103
+ lines. append ( " globalThis. \( namespacePath) . \( enumDef. name) = \( enumDef. name) ; " )
1104
+ }
1105
+
1106
+ return lines
1107
+ }
1108
+
1040
1109
private struct NamespaceContent {
1041
1110
var functions : [ ExportedFunction ] = [ ]
1042
1111
var classes : [ ExportedClass ] = [ ]
@@ -1410,7 +1479,9 @@ extension String {
1410
1479
func indent( count: Int ) -> String {
1411
1480
return String ( repeating: " " , count: count) + self
1412
1481
}
1482
+ }
1413
1483
1484
+ fileprivate extension String {
1414
1485
var capitalizedFirstLetter : String {
1415
1486
guard !isEmpty else { return self }
1416
1487
return prefix ( 1 ) . uppercased ( ) + dropFirst( )
0 commit comments