1010
1111require ( '../shared/babelRegister' ) . registerForScript ( ) ;
1212
13+ /*::
14+ import type {BuildOptions} from './config';
15+ */
16+
1317const { PACKAGES_DIR , REPO_ROOT } = require ( '../shared/consts' ) ;
1418const {
1519 buildConfig,
@@ -30,8 +34,9 @@ const {parseArgs, styleText} = require('util');
3034
3135const SRC_DIR = 'src' ;
3236const BUILD_DIR = 'dist' ;
37+ const NOFLOW_BUILD_DIR = 'dist_noflow' ;
3338const JS_FILES_PATTERN = '**/*.js' ;
34- const IGNORE_PATTERN = '**/__{tests,mocks,fixtures}__/**' ;
39+ const IGNORE_PATTERN = '**/__{tests,mocks,fixtures,flowtests }__/**' ;
3540
3641const config = {
3742 allowPositionals : true ,
@@ -77,6 +82,13 @@ async function build() {
7782
7883 let ok = true ;
7984 for ( const packageName of packagesToBuild ) {
85+ const { target} = getBuildOptions ( packageName ) ;
86+
87+ if ( target === 'noflow' ) {
88+ await buildNoFlowTarget ( packageName ) ;
89+ continue ;
90+ }
91+
8092 await buildPackage ( packageName , prepack ) ;
8193 }
8294
@@ -163,8 +175,9 @@ async function buildFile(
163175) {
164176 const { silent = false } = options ;
165177 const packageName = getPackageName ( file ) ;
166- const buildPath = getBuildPath ( file ) ;
167- const { emitFlowDefs, emitTypeScriptDefs} = getBuildOptions ( packageName ) ;
178+ const buildOptions = getBuildOptions ( packageName ) ;
179+ const { emitFlowDefs, emitTypeScriptDefs} = buildOptions ;
180+ const buildPath = getBuildPath ( file , buildOptions ) ;
168181
169182 const logResult = ( { copied, desc} /*: {copied: boolean, desc?: string} */ ) =>
170183 silent ||
@@ -226,6 +239,87 @@ async function buildFile(
226239 logResult ( { copied : true } ) ;
227240}
228241
242+ async function buildNoFlowTarget ( packageName /*: string */ ) {
243+ try {
244+ const buildOptions = getBuildOptions ( packageName ) ;
245+ const { srcOverride} = buildOptions ;
246+
247+ process . stdout . write (
248+ `${ packageName } ${ styleText ( 'yellow' , '(noflow)' ) } ${ styleText ( 'dim' , '.' ) . repeat ( 63 - packageName . length ) } ` ,
249+ ) ;
250+
251+ const files = glob . sync (
252+ path . resolve (
253+ PACKAGES_DIR ,
254+ packageName ,
255+ ...( srcOverride != null
256+ ? [ '{' , srcOverride , '}' ]
257+ : [ SRC_DIR , '**/*.js' ] ) ,
258+ ) ,
259+ {
260+ nodir : true ,
261+ ignore : [ IGNORE_PATTERN ] ,
262+ } ,
263+ ) ;
264+
265+ for ( const file of files ) {
266+ const filePath = path . normalize ( file ) ;
267+ const buildPath = getBuildPath ( filePath , buildOptions ) ;
268+ const prettierConfig = { parser : 'babel' } ;
269+ const source = await fs . readFile ( file , 'utf-8' ) ;
270+
271+ await fs . mkdir ( path . dirname ( buildPath ) , { recursive : true } ) ;
272+
273+ // If file contains `@noflow`, copy only
274+ if ( / @ n o f l o w / . test ( source ) ) {
275+ await fs . copyFile ( file , buildPath ) ;
276+ continue ;
277+ }
278+
279+ // Apply Flow transforms
280+ const babelResult = await babel . transformFileAsync (
281+ filePath ,
282+ getBabelConfig ( packageName ) ,
283+ ) ;
284+ const transformed = await prettier . format (
285+ babelResult . code ,
286+ /* $FlowFixMe[incompatible-type] Natural Inference rollout. See
287+ * https://fburl.com/workplace/6291gfvu */
288+ prettierConfig ,
289+ ) ;
290+
291+ // Write transformed file with source map comment
292+ const relativeSourcePath = path . relative (
293+ path . dirname ( buildPath ) ,
294+ filePath ,
295+ ) ;
296+ const sourceMapComment = `\n//# sourceMappingURL=${ path . basename ( buildPath ) } .map` ;
297+ await fs . writeFile ( buildPath , transformed + sourceMapComment ) ;
298+
299+ // Write source map file
300+ if ( babelResult . map ) {
301+ const sourceMapPath = buildPath + '.map' ;
302+ const sourceMap = {
303+ ...babelResult . map ,
304+ sources : [ relativeSourcePath ] ,
305+ } ;
306+ await fs . writeFile ( sourceMapPath , JSON . stringify ( sourceMap , null , 2 ) ) ;
307+ }
308+ }
309+
310+ process . stdout . write (
311+ styleText ( [ 'reset' , 'inverse' , 'bold' , 'green' ] , ' DONE ' ) ,
312+ ) ;
313+ } catch ( e ) {
314+ process . stdout . write (
315+ styleText ( [ 'reset' , 'inverse' , 'bold' , 'red' ] , ' FAIL ' ) + '\n' ,
316+ ) ;
317+ throw e ;
318+ } finally {
319+ process . stdout . write ( '\n' ) ;
320+ }
321+ }
322+
229323/*::
230324type PackageJson = {
231325 name: string,
@@ -356,13 +450,19 @@ function getPackageName(file /*: string */) /*: string */ {
356450 return path . relative ( PACKAGES_DIR , file ) . split ( path . sep ) [ 0 ] ;
357451}
358452
359- function getBuildPath ( file /*: string */ ) /*: string */ {
453+ function getBuildPath (
454+ file /*: string */ ,
455+ { srcOverride, target} /*: BuildOptions */ ,
456+ ) /*: string */ {
360457 const packageDir = path . join ( PACKAGES_DIR , getPackageName ( file ) ) ;
361458
362459 return path . join (
363460 packageDir ,
364461 file
365- . replace ( path . join ( packageDir , SRC_DIR ) , BUILD_DIR )
462+ . replace (
463+ path . join ( packageDir , srcOverride ? '' : SRC_DIR ) ,
464+ target === 'noflow' ? NOFLOW_BUILD_DIR : BUILD_DIR ,
465+ )
366466 . replace ( '.flow.js' , '.js' ) ,
367467 ) ;
368468}
0 commit comments