1+ import { type } from 'arktype' ;
12import fs from 'fs-extra' ;
23import kleur from 'kleur' ;
34import path from 'path' ;
45import yargs from 'yargs' ;
5- import { type Options , type Target } from './types ' ;
6+ import { config , type Config , type Target , type TargetOptions } from './schema ' ;
67import { loadConfig } from './utils/loadConfig' ;
78import * as logger from './utils/logger' ;
89import { run } from './utils/workerize' ;
@@ -39,46 +40,21 @@ export async function build(argv: Argv) {
3940 ) ;
4041 }
4142
42- const options : Options = result ! . config ;
43+ const parsed = config ( result . config ) ;
4344
44- if ( ! options . targets ?. length ) {
45+ if ( parsed instanceof type . errors ) {
4546 throw new Error (
46- `No 'targets' found in the configuration in '${ path . relative (
47- root ,
48- result ! . filepath
49- ) } '.`
50- ) ;
51- }
52-
53- const source = options . source ;
54-
55- if ( ! source ) {
56- throw new Error (
57- `No 'source' option found in the configuration in '${ path . relative (
58- root ,
59- result ! . filepath
60- ) } '.`
47+ `Invalid configuration in ${ result . filepath } : ${ parsed . summary } `
6148 ) ;
6249 }
6350
64- const output = options . output ;
51+ const { source , output, targets , exclude } = parsed ;
6552
66- if ( ! output ) {
67- throw new Error (
68- `No 'output' option found in the configuration in '${ path . relative (
69- root ,
70- result ! . filepath
71- ) } '.`
72- ) ;
73- }
74-
75- const exclude = options . exclude ?? '**/{__tests__,__fixtures__,__mocks__}/**' ;
76-
77- const commonjs = options . targets ?. some ( ( t ) =>
53+ const commonjs = targets . some ( ( t ) =>
7854 Array . isArray ( t ) ? t [ 0 ] === 'commonjs' : t === 'commonjs'
7955 ) ;
8056
81- const module = options . targets ? .some ( ( t ) =>
57+ const module = targets . some ( ( t ) =>
8258 Array . isArray ( t ) ? t [ 0 ] === 'module' : t === 'module'
8359 ) ;
8460
@@ -94,68 +70,69 @@ export async function build(argv: Argv) {
9470 source,
9571 output,
9672 exclude,
97- options ,
73+ config : parsed ,
9874 variants,
9975 } ) ;
10076 } else {
10177 await Promise . all (
102- options . targets ? .map ( ( target ) =>
78+ targets . map ( ( target ) =>
10379 buildTarget ( {
10480 root,
105- target,
81+ target : Array . isArray ( target ) ? target [ 0 ] : target ,
10682 source,
10783 output,
10884 exclude,
109- options ,
85+ config : parsed ,
11086 variants,
11187 } )
11288 )
11389 ) ;
11490 }
11591}
11692
117- async function buildTarget ( {
93+ async function buildTarget < T extends Target > ( {
11894 root,
11995 target,
12096 source,
12197 output,
12298 exclude,
123- options ,
99+ config ,
124100 variants,
125101} : {
126102 root : string ;
127- target : Exclude < Options [ 'targets' ] , undefined > [ number ] ;
103+ target : T ;
128104 source : string ;
129105 output : string ;
130106 exclude : string ;
131- options : Options ;
107+ config : Config ;
132108 variants : {
133109 commonjs ?: boolean ;
134110 module ?: boolean ;
135111 } ;
136112} ) {
137- const targetName = Array . isArray ( target ) ? target [ 0 ] : target ;
138- const targetOptions = Array . isArray ( target ) ? target [ 1 ] : undefined ;
113+ const options = config . targets
114+ . map ( ( t ) => ( Array . isArray ( t ) ? t : ( [ t , undefined ] as const ) ) )
115+ . find ( ( t ) => t [ 0 ] === target ) ?. [ 1 ] ;
139116
140- const report = logger . grouped ( targetName ) ;
117+ const report = logger . grouped ( target ) ;
141118
142- switch ( targetName ) {
119+ switch ( target ) {
143120 case 'commonjs' :
144121 case 'module' :
145- await run ( targetName , {
122+ await run ( target , {
146123 root,
147124 source : path . resolve ( root , source ) ,
148- output : path . resolve ( root , output , targetName ) ,
125+ output : path . resolve ( root , output , target ) ,
149126 exclude,
150- options : targetOptions ,
127+ options : options as TargetOptions < 'commonjs' | 'module' > ,
151128 variants,
152129 report,
153130 } ) ;
154131 break ;
155132 case 'typescript' :
156133 {
157134 const esm =
158- options . targets ?. some ( ( t ) => {
135+ config . targets ?. some ( ( t ) => {
159136 if ( Array . isArray ( t ) ) {
160137 const [ name , options ] = t ;
161138
@@ -171,7 +148,7 @@ async function buildTarget({
171148 root,
172149 source : path . resolve ( root , source ) ,
173150 output : path . resolve ( root , output , 'typescript' ) ,
174- options : targetOptions ,
151+ options : options as TargetOptions < 'typescript' > ,
175152 esm,
176153 variants,
177154 report,
@@ -182,19 +159,18 @@ async function buildTarget({
182159 await run ( 'codegen' , {
183160 root,
184161 source : path . resolve ( root , source ) ,
185- output : path . resolve ( root , output , 'typescript' ) ,
186162 report,
187163 } ) ;
188164 break ;
189165 case 'custom' :
190166 await run ( 'custom' , {
191- options : targetOptions ,
167+ root ,
192168 source : path . resolve ( root , source ) ,
169+ options : options as TargetOptions < 'custom' > ,
193170 report,
194- root,
195171 } ) ;
196172 break ;
197173 default :
198- throw new Error ( `Invalid target ${ kleur . blue ( targetName ) } .` ) ;
174+ throw new Error ( `Invalid target ${ kleur . blue ( target ) } .` ) ;
199175 }
200176}
0 commit comments