@@ -9,15 +9,7 @@ import * as t from '@babel/types';
99import { ZodError , z } from 'zod' ;
1010import { fromZodError } from 'zod-validation-error' ;
1111import { CompilerError } from '../CompilerError' ;
12- import {
13- CompilationMode ,
14- defaultOptions ,
15- Logger ,
16- PanicThresholdOptions ,
17- parsePluginOptions ,
18- PluginOptions ,
19- ProgramContext ,
20- } from '../Entrypoint' ;
12+ import { Logger , ProgramContext } from '../Entrypoint' ;
2113import { Err , Ok , Result } from '../Utils/Result' ;
2214import {
2315 DEFAULT_GLOBALS ,
@@ -158,7 +150,7 @@ export type Hook = z.infer<typeof HookSchema>;
158150 * missing some recursive Object / Function shapeIds
159151 */
160152
161- const EnvironmentConfigSchema = z . object ( {
153+ export const EnvironmentConfigSchema = z . object ( {
162154 customHooks : z . map ( z . string ( ) , HookSchema ) . default ( new Map ( ) ) ,
163155
164156 /**
@@ -640,191 +632,6 @@ const EnvironmentConfigSchema = z.object({
640632
641633export type EnvironmentConfig = z . infer < typeof EnvironmentConfigSchema > ;
642634
643- /**
644- * For test fixtures and playground only.
645- *
646- * Pragmas are straightforward to parse for boolean options (`:true` and
647- * `:false`). These are 'enabled' config values for non-boolean configs (i.e.
648- * what is used when parsing `:true`).
649- */
650- const testComplexConfigDefaults : PartialEnvironmentConfig = {
651- validateNoCapitalizedCalls : [ ] ,
652- enableChangeDetectionForDebugging : {
653- source : 'react-compiler-runtime' ,
654- importSpecifierName : '$structuralCheck' ,
655- } ,
656- enableEmitFreeze : {
657- source : 'react-compiler-runtime' ,
658- importSpecifierName : 'makeReadOnly' ,
659- } ,
660- enableEmitInstrumentForget : {
661- fn : {
662- source : 'react-compiler-runtime' ,
663- importSpecifierName : 'useRenderCounter' ,
664- } ,
665- gating : {
666- source : 'react-compiler-runtime' ,
667- importSpecifierName : 'shouldInstrument' ,
668- } ,
669- globalGating : 'DEV' ,
670- } ,
671- enableEmitHookGuards : {
672- source : 'react-compiler-runtime' ,
673- importSpecifierName : '$dispatcherGuard' ,
674- } ,
675- inlineJsxTransform : {
676- elementSymbol : 'react.transitional.element' ,
677- globalDevVar : 'DEV' ,
678- } ,
679- lowerContextAccess : {
680- source : 'react-compiler-runtime' ,
681- importSpecifierName : 'useContext_withSelector' ,
682- } ,
683- inferEffectDependencies : [
684- {
685- function : {
686- source : 'react' ,
687- importSpecifierName : 'useEffect' ,
688- } ,
689- numRequiredArgs : 1 ,
690- } ,
691- {
692- function : {
693- source : 'shared-runtime' ,
694- importSpecifierName : 'useSpecialEffect' ,
695- } ,
696- numRequiredArgs : 2 ,
697- } ,
698- {
699- function : {
700- source : 'useEffectWrapper' ,
701- importSpecifierName : 'default' ,
702- } ,
703- numRequiredArgs : 1 ,
704- } ,
705- ] ,
706- } ;
707-
708- /**
709- * For snap test fixtures and playground only.
710- */
711- function parseConfigPragmaEnvironmentForTest (
712- pragma : string ,
713- ) : EnvironmentConfig {
714- const maybeConfig : any = { } ;
715- // Get the defaults to programmatically check for boolean properties
716- const defaultConfig = EnvironmentConfigSchema . parse ( { } ) ;
717-
718- for ( const token of pragma . split ( ' ' ) ) {
719- if ( ! token . startsWith ( '@' ) ) {
720- continue ;
721- }
722- const keyVal = token . slice ( 1 ) ;
723- let [ key , val = undefined ] = keyVal . split ( ':' ) ;
724- const isSet = val === undefined || val === 'true' ;
725-
726- if ( isSet && key in testComplexConfigDefaults ) {
727- maybeConfig [ key ] =
728- testComplexConfigDefaults [ key as keyof PartialEnvironmentConfig ] ;
729- continue ;
730- }
731-
732- if ( key === 'customMacros' && val ) {
733- const valSplit = val . split ( '.' ) ;
734- if ( valSplit . length > 0 ) {
735- const props = [ ] ;
736- for ( const elt of valSplit . slice ( 1 ) ) {
737- if ( elt === '*' ) {
738- props . push ( { type : 'wildcard' } ) ;
739- } else if ( elt . length > 0 ) {
740- props . push ( { type : 'name' , name : elt } ) ;
741- }
742- }
743- maybeConfig [ key ] = [ [ valSplit [ 0 ] , props ] ] ;
744- }
745- continue ;
746- }
747-
748- if (
749- key !== 'enableResetCacheOnSourceFileChanges' &&
750- typeof defaultConfig [ key as keyof EnvironmentConfig ] !== 'boolean'
751- ) {
752- // skip parsing non-boolean properties
753- continue ;
754- }
755- if ( val === undefined || val === 'true' ) {
756- maybeConfig [ key ] = true ;
757- } else {
758- maybeConfig [ key ] = false ;
759- }
760- }
761- const config = EnvironmentConfigSchema . safeParse ( maybeConfig ) ;
762- if ( config . success ) {
763- /**
764- * Unless explicitly enabled, do not insert HMR handling code
765- * in test fixtures or playground to reduce visual noise.
766- */
767- if ( config . data . enableResetCacheOnSourceFileChanges == null ) {
768- config . data . enableResetCacheOnSourceFileChanges = false ;
769- }
770- return config . data ;
771- }
772- CompilerError . invariant ( false , {
773- reason : 'Internal error, could not parse config from pragma string' ,
774- description : `${ fromZodError ( config . error ) } ` ,
775- loc : null ,
776- suggestions : null ,
777- } ) ;
778- }
779- export function parseConfigPragmaForTests (
780- pragma : string ,
781- defaults : {
782- compilationMode : CompilationMode ;
783- } ,
784- ) : PluginOptions {
785- const environment = parseConfigPragmaEnvironmentForTest ( pragma ) ;
786- let compilationMode : CompilationMode = defaults . compilationMode ;
787- let panicThreshold : PanicThresholdOptions = 'all_errors' ;
788- let noEmit : boolean = defaultOptions . noEmit ;
789- for ( const token of pragma . split ( ' ' ) ) {
790- if ( ! token . startsWith ( '@' ) ) {
791- continue ;
792- }
793- switch ( token ) {
794- case '@compilationMode(annotation)' : {
795- compilationMode = 'annotation' ;
796- break ;
797- }
798- case '@compilationMode(infer)' : {
799- compilationMode = 'infer' ;
800- break ;
801- }
802- case '@compilationMode(all)' : {
803- compilationMode = 'all' ;
804- break ;
805- }
806- case '@compilationMode(syntax)' : {
807- compilationMode = 'syntax' ;
808- break ;
809- }
810- case '@panicThreshold(none)' : {
811- panicThreshold = 'none' ;
812- break ;
813- }
814- case '@noEmit' : {
815- noEmit = true ;
816- break ;
817- }
818- }
819- }
820- return parsePluginOptions ( {
821- environment,
822- compilationMode,
823- panicThreshold,
824- noEmit,
825- } ) ;
826- }
827-
828635export type PartialEnvironmentConfig = Partial < EnvironmentConfig > ;
829636
830637export type ReactFunctionType = 'Component' | 'Hook' | 'Other' ;
0 commit comments