Skip to content

Commit 27cd123

Browse files
committed
Improve ES6 support in TypeScript definitions generation
Users building with --emit-tsd and the EXPORT_ES6 setting should get TypeScript definitions accounting for the fact that ES6 modules include a default export that is a functor to instantiate and access the wasm module in question When generating TS definitions, query the EXPORT_ES6 setting and, if present, add the appropriate exports to the output
1 parent 4de9bbb commit 27cd123

File tree

3 files changed

+118
-1
lines changed

3 files changed

+118
-1
lines changed

test/other/embind_tsgen_es6.d.ts

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// TypeScript bindings for emscripten-generated code. Automatically generated at compile time.
2+
interface WasmModule {
3+
_main(_0: number, _1: number): number;
4+
}
5+
6+
export interface Test {
7+
x: number;
8+
readonly y: number;
9+
functionOne(_0: number, _1: number): number;
10+
functionTwo(_0: number, _1: number): number;
11+
functionFour(_0: boolean): number;
12+
functionFive(x: number, y: number): number;
13+
constFn(): number;
14+
longFn(_0: number): number;
15+
functionThree(_0: ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string): number;
16+
functionSix(str: ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string): number;
17+
delete(): void;
18+
}
19+
20+
export interface BarValue<T extends number> {
21+
value: T;
22+
}
23+
export type Bar = BarValue<0>|BarValue<1>|BarValue<2>;
24+
25+
export interface EmptyEnumValue<T extends number> {
26+
value: T;
27+
}
28+
export type EmptyEnum = never/* Empty Enumerator */;
29+
30+
export type ValArrIx = [ Bar, Bar, Bar, Bar ];
31+
32+
export interface IntVec {
33+
push_back(_0: number): void;
34+
resize(_0: number, _1: number): void;
35+
size(): number;
36+
get(_0: number): number | undefined;
37+
set(_0: number, _1: number): boolean;
38+
delete(): void;
39+
}
40+
41+
export interface MapIntInt {
42+
keys(): IntVec;
43+
get(_0: number): number | undefined;
44+
set(_0: number, _1: number): void;
45+
size(): number;
46+
delete(): void;
47+
}
48+
49+
export interface Foo {
50+
process(_0: Test): void;
51+
delete(): void;
52+
}
53+
54+
export type ValObj = {
55+
foo: Foo,
56+
bar: Bar
57+
};
58+
59+
export interface ClassWithConstructor {
60+
fn(_0: number): number;
61+
delete(): void;
62+
}
63+
64+
export interface ClassWithTwoConstructors {
65+
delete(): void;
66+
}
67+
68+
export interface ClassWithSmartPtrConstructor {
69+
fn(_0: number): number;
70+
delete(): void;
71+
}
72+
73+
export interface BaseClass {
74+
fn(_0: number): number;
75+
delete(): void;
76+
}
77+
78+
export interface DerivedClass extends BaseClass {
79+
fn2(_0: number): number;
80+
delete(): void;
81+
}
82+
83+
export type ValArr = [ number, number, number ];
84+
85+
interface EmbindModule {
86+
Test: {staticFunction(_0: number): number; staticFunctionWithParam(x: number): number; staticProperty: number};
87+
class_returning_fn(): Test;
88+
class_unique_ptr_returning_fn(): Test;
89+
a_class_instance: Test;
90+
an_enum: Bar;
91+
Bar: {valueOne: BarValue<0>, valueTwo: BarValue<1>, valueThree: BarValue<2>};
92+
EmptyEnum: {};
93+
enum_returning_fn(): Bar;
94+
IntVec: {new(): IntVec};
95+
MapIntInt: {new(): MapIntInt};
96+
Foo: {};
97+
ClassWithConstructor: {new(_0: number, _1: ValArr): ClassWithConstructor};
98+
ClassWithTwoConstructors: {new(): ClassWithTwoConstructors; new(_0: number): ClassWithTwoConstructors};
99+
ClassWithSmartPtrConstructor: {new(_0: number, _1: ValArr): ClassWithSmartPtrConstructor};
100+
BaseClass: {};
101+
DerivedClass: {};
102+
a_bool: boolean;
103+
an_int: number;
104+
optional_test(_0: Foo | undefined): number | undefined;
105+
global_fn(_0: number, _1: number): number;
106+
smart_ptr_function(_0: ClassWithSmartPtrConstructor): number;
107+
smart_ptr_function_with_params(foo: ClassWithSmartPtrConstructor): number;
108+
function_with_callback_param(_0: (message: string) => void): number;
109+
string_test(_0: ArrayBuffer|Uint8Array|Uint8ClampedArray|Int8Array|string): string;
110+
wstring_test(_0: string): string;
111+
}
112+
export type MainModule = WasmModule & EmbindModule;
113+
export type MainModuleFunctor = () => Promise<MainModule>;
114+
export default MainModuleFunctor;

test/test_other.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3189,7 +3189,7 @@ def test_embind_tsgen_ignore(self):
31893189
'-sMINIMAL_RUNTIME=2',
31903190
'-sEXPORT_ES6=1']
31913191
self.emcc(test_file('other/embind_tsgen.cpp'), extra_args)
3192-
self.assertFileContents(test_file('other/embind_tsgen_ignore_2.d.ts'), read_file('embind_tsgen.d.ts'))
3192+
self.assertFileContents(test_file('other/embind_tsgen_ignore_2.d.ts'), read_file('embind_tsgen_es6.d.ts'))
31933193
# Also test this separately since it conflicts with other settings.
31943194
extra_args = ['-sWASM=0']
31953195
self.emcc(test_file('other/embind_tsgen.cpp'), extra_args)

tools/emscripten.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,9 @@ def create_tsd(metadata, embind_tsd):
631631
if embind_tsd:
632632
export_interfaces += ' & EmbindModule'
633633
out += f'export type MainModule = {export_interfaces};\n'
634+
if settings.EXPORT_ES6 and settings.MODULARIZE:
635+
out += 'export type MainModuleFunctor = () => Promise<MainModule>;\n'
636+
out += 'export default MainModuleFunctor;\n'
634637
return out
635638

636639

0 commit comments

Comments
 (0)