1+ import { startCase } from 'lodash'
2+
13import * as types from './types'
4+ import { lazyGetter } from './types/utils'
5+
6+ interface ExtendHelper {
7+ /** Creates a new type based on the definition. */
8+ ( memberDef : any ) : any
9+
10+ cached ( def : any ) : any
11+ cachedField ( fieldDef : any ) : any
12+ cachedObjectField ( fieldDef : any ) : any
13+ }
214
315function compileRegistry ( schemaDef : any ) {
416 const registry = Object . create ( null )
@@ -21,6 +33,56 @@ function compileRegistry(schemaDef: any) {
2133 return acc
2234 } , { } )
2335
36+ const memberCache = new Map ( )
37+ const fieldCache = new Map ( )
38+ const objectFieldCache = new Map ( )
39+
40+ const extendHelper : ExtendHelper = Object . assign ( extendMember , {
41+ cached ( def : any ) {
42+ let member = memberCache . get ( def )
43+ if ( ! member ) {
44+ member = extendMember ( def )
45+ memberCache . set ( def , member )
46+ }
47+ return member
48+ } ,
49+
50+ cachedField ( fieldDef : any ) {
51+ let field = fieldCache . get ( fieldDef )
52+ if ( ! field ) {
53+ const { name, ...type } = fieldDef
54+ field = {
55+ name,
56+ type : extendMember ( type ) ,
57+ }
58+ fieldCache . set ( fieldDef , field )
59+ }
60+ return field
61+ } ,
62+
63+ cachedObjectField ( fieldDef : any ) {
64+ let field = objectFieldCache . get ( fieldDef )
65+ if ( ! field ) {
66+ const { name, fieldset, group, ...rest } = fieldDef
67+
68+ field = {
69+ name,
70+ group,
71+ fieldset,
72+ }
73+
74+ lazyGetter ( field , 'type' , ( ) => {
75+ return extendMember ( {
76+ ...rest ,
77+ title : fieldDef . title || startCase ( name ) ,
78+ } )
79+ } )
80+ objectFieldCache . set ( fieldDef , field )
81+ }
82+ return field
83+ } ,
84+ } )
85+
2486 schemaDef . types . forEach ( add )
2587
2688 return {
@@ -39,7 +101,7 @@ function compileRegistry(schemaDef: any) {
39101
40102 function extendMember ( memberDef : any ) {
41103 ensure ( memberDef . type )
42- return registry [ memberDef . type ] . extend ( memberDef , extendMember ) . get ( )
104+ return registry [ memberDef . type ] . extend ( memberDef , extendHelper ) . get ( )
43105 }
44106
45107 function add ( typeDef : any ) {
0 commit comments