@@ -24,6 +24,9 @@ import * as ts from 'typescript';
24
24
import { TYPINGS } from './analysis' ;
25
25
import { request } from 'express' ;
26
26
27
+ import resolve from 'rollup-plugin-node-resolve' ;
28
+ import commonjs from 'rollup-plugin-commonjs' ;
29
+
27
30
/** Contains a list of members by type. */
28
31
export type MemberList = {
29
32
classes : string [ ] ;
@@ -46,12 +49,12 @@ export type ExportData = { dependencies: MemberList; sizeInBytes: number };
46
49
export async function extractDependencies (
47
50
exportName : string ,
48
51
jsBundle : string ,
49
- allModuleLocations : string [ ]
52
+ map : Map < string , string >
50
53
) : Promise < MemberList > {
51
54
const { dependencies } = await extractDependenciesAndSize (
52
55
exportName ,
53
56
jsBundle ,
54
- allModuleLocations
57
+ map
55
58
) ;
56
59
return dependencies ;
57
60
}
@@ -63,27 +66,34 @@ export async function extractDependencies(
63
66
export async function extractDependenciesAndSize (
64
67
exportName : string ,
65
68
jsBundle : string ,
66
- allModuleLocations : string [ ]
69
+ map : Map < string , string >
67
70
) : Promise < ExportData > {
68
71
const input = tmp . fileSync ( ) . name + '.js' ;
69
72
const output = tmp . fileSync ( ) . name + '.js' ;
70
73
71
74
const beforeContent = `export { ${ exportName } } from '${ path . resolve (
72
75
jsBundle
73
76
) } ';`;
77
+ //console.log(beforeContent);
74
78
fs . writeFileSync ( input , beforeContent ) ;
75
79
76
80
// Run Rollup on the JavaScript above to produce a tree-shaken build
77
81
const bundle = await rollup . rollup ( {
78
82
input,
79
- external : id => id . startsWith ( '@firebase-exp/' )
83
+ plugins : [
84
+ resolve ( {
85
+ mainFields : [ 'esm2017' , 'module' , 'main' ]
86
+ } ) ,
87
+ commonjs ( )
88
+ ]
80
89
} ) ;
81
90
await bundle . write ( { file : output , format : 'es' } ) ;
82
91
83
- const dependencies = extractDeclarations ( allModuleLocations , output ) ;
92
+ const dependencies = extractDeclarations ( output , map ) ;
84
93
85
94
// Extract size of minified build
86
95
const afterContent = fs . readFileSync ( output , 'utf-8' ) ;
96
+ //console.log(afterContent);
87
97
const { code } = terser . minify ( afterContent , {
88
98
output : {
89
99
comments : false
@@ -102,8 +112,8 @@ export async function extractDependenciesAndSize(
102
112
* compiler API.
103
113
*/
104
114
export function extractDeclarations (
105
- allModulesLocation : string [ ] ,
106
- jsFile : string
115
+ jsFile : string ,
116
+ map ?: Map < string , string >
107
117
) : MemberList {
108
118
const program = ts . createProgram ( [ jsFile ] , { allowJs : true } ) ;
109
119
const checker = program . getTypeChecker ( ) ;
@@ -113,7 +123,7 @@ export function extractDeclarations(
113
123
throw new Error ( 'Failed to parse file: ' + jsFile ) ;
114
124
}
115
125
116
- const declarations : MemberList = {
126
+ let declarations : MemberList = {
117
127
functions : [ ] ,
118
128
classes : [ ] ,
119
129
variables : [ ] ,
@@ -150,10 +160,7 @@ export function extractDeclarations(
150
160
const symbol = checker . getSymbolAtLocation ( node . moduleSpecifier ) ;
151
161
const reExportFullPath = symbol . valueDeclaration . getSourceFile ( )
152
162
. fileName ;
153
- const reExportsMember = extractDeclarations (
154
- allModulesLocation ,
155
- reExportFullPath
156
- ) ;
163
+ const reExportsMember = extractDeclarations ( reExportFullPath ) ;
157
164
158
165
// named exports
159
166
if ( node . exportClause && ts . isNamedExports ( node . exportClause ) ) {
@@ -184,6 +191,12 @@ export function extractDeclarations(
184
191
}
185
192
}
186
193
} ) ;
194
+
195
+ if ( map ) {
196
+ declarations = mapSymbolToType ( map , declarations ) ;
197
+ declarations = dedup ( declarations ) ;
198
+ }
199
+
187
200
// Sort to ensure stable output
188
201
declarations . functions . sort ( ) ;
189
202
declarations . classes . sort ( ) ;
@@ -193,6 +206,61 @@ export function extractDeclarations(
193
206
return declarations ;
194
207
}
195
208
209
+ function dedup ( memberList : MemberList ) : MemberList {
210
+ const classesSet : Set < string > = new Set ( memberList . classes ) ;
211
+ memberList . classes = Array . from ( classesSet ) ;
212
+
213
+ const functionsSet : Set < string > = new Set ( memberList . functions ) ;
214
+ memberList . functions = Array . from ( functionsSet ) ;
215
+
216
+ const enumsSet : Set < string > = new Set ( memberList . enums ) ;
217
+ memberList . enums = Array . from ( enumsSet ) ;
218
+
219
+ const variablesSet : Set < string > = new Set ( memberList . variables ) ;
220
+ memberList . variables = Array . from ( variablesSet ) ;
221
+
222
+ return memberList ;
223
+ }
224
+ function mapSymbolToType (
225
+ map : Map < string , string > ,
226
+ memberList : MemberList
227
+ ) : MemberList {
228
+ const newMemberList : MemberList = {
229
+ functions : [ ] ,
230
+ classes : [ ] ,
231
+ variables : [ ] ,
232
+ enums : [ ]
233
+ } ;
234
+ memberList . classes . forEach ( element => {
235
+ if ( map . has ( element ) ) {
236
+ newMemberList [ map . get ( element ) ] . push ( element ) ;
237
+ } else {
238
+ newMemberList . classes . push ( element ) ;
239
+ }
240
+ } ) ;
241
+ memberList . variables . forEach ( element => {
242
+ if ( map . has ( element ) ) {
243
+ newMemberList [ map . get ( element ) ] . push ( element ) ;
244
+ } else {
245
+ newMemberList . variables . push ( element ) ;
246
+ }
247
+ } ) ;
248
+ memberList . enums . forEach ( element => {
249
+ if ( map . has ( element ) ) {
250
+ newMemberList [ map . get ( element ) ] . push ( element ) ;
251
+ } else {
252
+ newMemberList . enums . push ( element ) ;
253
+ }
254
+ } ) ;
255
+ memberList . functions . forEach ( element => {
256
+ if ( map . has ( element ) ) {
257
+ newMemberList [ map . get ( element ) ] . push ( element ) ;
258
+ } else {
259
+ newMemberList . functions . push ( element ) ;
260
+ }
261
+ } ) ;
262
+ return newMemberList ;
263
+ }
196
264
function isReExported ( symbol : string , reExportedSymbols : string [ ] ) : boolean {
197
265
return reExportedSymbols . includes ( symbol ) ;
198
266
}
0 commit comments