@@ -133,11 +133,9 @@ class Inspector {
133133
134134 log ( 'Error during inspection:' , error ) ;
135135
136- throw new InternalInspectionError (
137- error instanceof Error ? error . message : `${ error } ` ,
138- this . frames ,
139- error . stack
140- ) ;
136+ if ( ! ( error instanceof Error ) ) throw error ;
137+
138+ throw new InternalInspectionError ( error . message , this . frames , error . stack ) ;
141139 }
142140 }
143141
@@ -275,6 +273,17 @@ class Inspector {
275273 value : object ,
276274 capturedProperties ?: CapturedPropertyChain [ ]
277275 ) : Promise < Entry > {
276+ const factoryInfo = tryExtractMagicFactory ( value ) ;
277+ if ( factoryInfo ) {
278+ return {
279+ type : 'factory' ,
280+ value : {
281+ isAsync : factoryInfo . isAsync ,
282+ factory : ( await this . inspect ( factoryInfo . factory ) ) as Entry < 'function' > ,
283+ } ,
284+ } ;
285+ }
286+
278287 if ( this . doNotCapture ( value ) ) {
279288 log ( 'Value should skip capture' ) ;
280289 return Entry . json ( ) ;
@@ -995,6 +1004,89 @@ function isDerivedNoCaptureConstructor(func: Function): boolean {
9951004 return false ;
9961005}
9971006
1007+ const factorySymbol = Symbol ( 'inox-tool/inline-factory' ) ;
1008+
1009+ type MagicPlaceholder = {
1010+ [ factorySymbol ] : {
1011+ initialized : boolean ;
1012+ isAsync : boolean ;
1013+ factory : ( ) => Record < any , any > ;
1014+ } ;
1015+ } ;
1016+
1017+ function ensureFactoryInitialized ( magicValue : MagicPlaceholder ) : void {
1018+ if ( ! magicValue [ factorySymbol ] . initialized ) {
1019+ Object . assign ( magicValue , magicValue [ factorySymbol ] . factory ( ) ) ;
1020+ magicValue [ factorySymbol ] . initialized = true ;
1021+ }
1022+ }
1023+
1024+ const magicFactoryProxyHandler : ProxyHandler < MagicPlaceholder > = {
1025+ has : ( target , key ) => {
1026+ if ( key === factorySymbol ) return true ;
1027+ ensureFactoryInitialized ( target ) ;
1028+
1029+ return Reflect . has ( target , key ) ;
1030+ } ,
1031+ get : ( target , key ) => {
1032+ if ( key === factorySymbol ) {
1033+ return {
1034+ isAsync : target [ factorySymbol ] . isAsync ,
1035+ factory : target [ factorySymbol ] . factory ,
1036+ } ;
1037+ }
1038+
1039+ ensureFactoryInitialized ( target ) ;
1040+
1041+ return Reflect . get ( target , key ) ;
1042+ } ,
1043+ set : ( target , key , value ) => {
1044+ if ( key === factorySymbol ) {
1045+ return false ;
1046+ }
1047+
1048+ ensureFactoryInitialized ( target ) ;
1049+
1050+ return Reflect . set ( target , key , value ) ;
1051+ } ,
1052+ ownKeys : ( target ) => {
1053+ ensureFactoryInitialized ( target ) ;
1054+
1055+ return Reflect . ownKeys ( target ) . filter ( ( k ) => k !== factorySymbol ) ;
1056+ } ,
1057+ } ;
1058+
1059+ export function magicFactory < T extends Record < any , any > > ( {
1060+ isAsync,
1061+ fn,
1062+ } : {
1063+ isAsync : boolean ;
1064+ fn : T | ( ( ) => T ) ;
1065+ } ) : T {
1066+ if ( typeof fn !== 'function' ) {
1067+ return fn ;
1068+ }
1069+
1070+ return new Proxy < T & MagicPlaceholder > (
1071+ {
1072+ // Trick for TS
1073+ ...( { } as T ) ,
1074+ [ factorySymbol ] : {
1075+ initialized : false ,
1076+ isAsync,
1077+ factory : fn ,
1078+ } ,
1079+ } ,
1080+ magicFactoryProxyHandler
1081+ ) ;
1082+ }
1083+
1084+ function tryExtractMagicFactory ( value : any ) : MagicPlaceholder [ typeof factorySymbol ] | undefined {
1085+ if ( factorySymbol in value ) {
1086+ return value [ factorySymbol ] ;
1087+ }
1088+ }
1089+
9981090/**
9991091 * Cache of global entries
10001092 */
0 commit comments