1
- import path from 'node:path'
2
1
import { fileURLToPath } from 'node:url'
3
2
import type { Check , SizeLimitConfig } from 'size-limit'
3
+ import type { Configuration } from 'webpack'
4
4
5
5
const __dirname = fileURLToPath ( new URL ( '.' , import . meta. url ) )
6
6
7
+ const packageJsonEntryPoints = new Set < string > ( )
8
+
9
+ const getPackageJsonExports = async (
10
+ packageJsonExports :
11
+ | string
12
+ | Record < string , any >
13
+ | null
14
+ | typeof import ( './package.json' ) . exports ,
15
+ ) => {
16
+ if ( typeof packageJsonExports === 'string' ) {
17
+ packageJsonEntryPoints . add (
18
+ packageJsonExports . startsWith ( './' )
19
+ ? packageJsonExports
20
+ : `./${ packageJsonExports } ` ,
21
+ )
22
+
23
+ return packageJsonEntryPoints
24
+ }
25
+
26
+ if ( typeof packageJsonExports === 'object' && packageJsonExports !== null ) {
27
+ await Promise . all (
28
+ Object . entries ( packageJsonExports )
29
+ . filter (
30
+ ( [ condition ] ) =>
31
+ condition !== './package.json' && condition !== 'types' ,
32
+ )
33
+ . map ( ( [ _condition , entryPoint ] ) => entryPoint )
34
+ . map ( getPackageJsonExports ) ,
35
+ )
36
+ }
37
+
38
+ return packageJsonEntryPoints
39
+ }
40
+
7
41
const getAllPackageEntryPoints = async ( ) => {
8
42
const packageJson = await import ( './package.json' , { with : { type : 'json' } } )
9
43
10
- const packageExports = Object . entries ( packageJson . exports [ '.' ] )
11
- . filter ( ( [ condition ] ) => condition !== 'types' )
12
- . map ( ( [ _condition , entryPoint ] ) =>
13
- path . isAbsolute ( entryPoint ) ? `./${ entryPoint } ` : entryPoint ,
14
- )
44
+ const packageExports = await getPackageJsonExports ( packageJson . exports )
15
45
16
46
return [ ...new Set ( packageExports ) ]
17
47
}
@@ -20,63 +50,69 @@ const getAllImports = async (
20
50
entryPoint : string ,
21
51
index : number ,
22
52
) : Promise < SizeLimitConfig > => {
23
- const allNamedImports = await import ( entryPoint )
53
+ const allNamedImports : typeof import ( './src/index' ) = await import ( entryPoint )
24
54
25
55
return Object . keys ( allNamedImports )
26
56
. map < Check > ( ( namedImport ) => ( {
27
57
path : entryPoint ,
28
- name : `import { ${ namedImport } } from "${ entryPoint } "` ,
58
+ name : `${ index + 1 } . import { ${ namedImport } } from "${ entryPoint } "` ,
29
59
import : `{ ${ namedImport } }` ,
30
- modifyWebpackConfig : ( config ) => {
31
- config . optimization . nodeEnv = 'development'
32
- return config
33
- } ,
34
60
} ) )
35
61
. concat ( [
36
62
{
37
63
path : entryPoint ,
38
- name : `import * from "${ entryPoint } "` ,
64
+ name : `${ index + 1 } . import * from "${ entryPoint } "` ,
39
65
import : '*' ,
40
66
} ,
41
67
{
42
68
path : entryPoint ,
43
- name : `import "${ entryPoint } "` ,
69
+ name : `${ index + 1 } . import "${ entryPoint } "` ,
44
70
} ,
45
71
] )
46
72
}
47
73
48
- const setNodeEnv = (
49
- nodeEnv : 'development' | 'production' ,
50
- ) : Check [ 'modifyWebpackConfig' ] => {
51
- return ( config ) => {
52
- config . optimization . nodeEnv = nodeEnv
74
+ const allNodeEnvs = [ 'development' , 'production' ] as const
75
+
76
+ type NodeEnv = ( typeof allNodeEnvs ) [ number ]
77
+
78
+ const setNodeEnv = ( nodeEnv : NodeEnv ) => {
79
+ const modifyWebpackConfig = ( ( config : Configuration ) => {
80
+ ; ( config . optimization ??= { } ) . nodeEnv = nodeEnv
53
81
return config
54
- }
82
+ } ) satisfies Check [ 'modifyWebpackConfig' ]
83
+
84
+ return modifyWebpackConfig
55
85
}
56
86
57
- const getAllImportsWithNodeEnv = async (
58
- nodeEnv : 'development' | 'production' ,
59
- ) => {
87
+ const getAllImportsWithNodeEnv = async ( nodeEnv : NodeEnv ) => {
60
88
const allPackageEntryPoints = await getAllPackageEntryPoints ( )
61
89
62
90
const allImportsFromAllEntryPoints = (
63
91
await Promise . all ( allPackageEntryPoints . map ( getAllImports ) )
64
92
) . flat ( )
65
93
66
- const allImportsWithNodeEnv = allImportsFromAllEntryPoints . map (
94
+ const modifyWebpackConfig = setNodeEnv ( nodeEnv )
95
+
96
+ const allImportsWithNodeEnv = allImportsFromAllEntryPoints . map < Check > (
67
97
( importsFromEntryPoint ) => ( {
68
98
...importsFromEntryPoint ,
69
99
name : `${ importsFromEntryPoint . name } ('${ nodeEnv } ' mode)` ,
70
- modifyWebpackConfig : setNodeEnv ( nodeEnv ) ,
100
+ modifyWebpackConfig,
71
101
} ) ,
72
102
)
73
103
74
104
return allImportsWithNodeEnv
75
105
}
76
106
77
- const allNodeEnvs = [ 'development' , 'production' ] as const
107
+ const getSizeLimitConfig = async ( ) : Promise < SizeLimitConfig > => {
108
+ const sizeLimitConfig = (
109
+ await Promise . all ( allNodeEnvs . map ( getAllImportsWithNodeEnv ) )
110
+ ) . flat ( )
111
+
112
+ return sizeLimitConfig
113
+ }
78
114
79
115
const sizeLimitConfig : Promise < SizeLimitConfig > = ( async ( ) =>
80
- ( await Promise . all ( allNodeEnvs . map ( getAllImportsWithNodeEnv ) ) ) . flat ( ) ) ( )
116
+ await getSizeLimitConfig ( ) ) ( )
81
117
82
118
export default sizeLimitConfig
0 commit comments