@@ -13,6 +13,7 @@ let parser: any = require('json-schema-ref-parser')
1313
1414type idToSchema = { [ id : string ] : any }
1515
16+ // All .schema files found in template directories
1617async function templateSchemas ( templateDirs : string [ ] , feedback : fg . Feedback ) : Promise < idToSchema > {
1718 let map : idToSchema = { }
1819 for ( let dir of templateDirs ) {
@@ -27,10 +28,11 @@ async function templateSchemas(templateDirs: string[], feedback: fg.Feedback): P
2728 return map
2829}
2930
30- async function findRequires ( schema : any , map : idToSchema , found : idToSchema , feedback : fg . Feedback ) : Promise < void > {
31+ // Find recursive requires
32+ async function findRequires ( schema : any , map : idToSchema , found : idToSchema , resolver : any , feedback : fg . Feedback ) : Promise < void > {
3133 let addRequired = async ( required : string ) => {
3234 if ( ! found [ required ] ) {
33- let schema = map [ required ] || await getSchema ( required , feedback )
35+ let schema = map [ required ] || await getSchema ( required , feedback , resolver )
3436 if ( ! schema ) {
3537 feedback ( fg . FeedbackType . error , `Schema ${ required } cannot be found` )
3638 } else {
@@ -45,7 +47,7 @@ async function findRequires(schema: any, map: idToSchema, found: idToSchema, fee
4547 await addRequired ( required )
4648 }
4749 } else {
48- await findRequires ( val , map , found , feedback )
50+ await findRequires ( val , map , found , resolver , feedback )
4951 }
5052 }
5153 }
@@ -55,14 +57,15 @@ async function findRequires(schema: any, map: idToSchema, found: idToSchema, fee
5557async function getSchema ( path : string , feedback : fg . Feedback , resolver ?: any ) : Promise < any > {
5658 let schema
5759 try {
58- let noref = await parser . dereference ( path , { template : resolver } )
60+ let noref = await parser . dereference ( path , { resolve : { template : resolver } } )
5961 schema = allof ( noref )
6062 } catch ( err ) {
6163 feedback ( fg . FeedbackType . error , err )
6264 }
6365 return schema
6466}
6567
68+ // Merge together multiple schemas
6669function mergeSchemas ( allSchema : any , schemas : any [ ] ) {
6770 for ( let schema of schemas ) {
6871 allSchema . properties = { ...allSchema . properties , ...schema . properties }
@@ -75,20 +78,23 @@ function mergeSchemas(allSchema: any, schemas: any[]) {
7578}
7679
7780// Process the root schema to generate all schemas
78- // 1) A property can $ref to a property definition to reuse a type like address. Ref resolver includes.
79- // 2) $requires:[] can be in a property or at the top. This is handled by finding all of the referenced schemas and then merging.
81+ // 1) A property can $ref to a property definition to reuse a type like address.
82+ // Ref resolver includes template: for referring to template files.
83+ // 2) $requires:[] can be in a property or at the top.
84+ // This is handled by finding all of the referenced schemas and then merging.
8085export async function processSchemas ( schemaPath : string , templateDirs : string [ ] , feedback : fg . Feedback )
8186 : Promise < any > {
8287 let allRequired = await templateSchemas ( templateDirs , feedback )
8388 let resolver : any = {
84- canRead : true ,
85- read ( file : string ) : any {
86- return allRequired [ ppath . basename ( file ) ]
89+ canRead : / t e m p l a t e : / ,
90+ read ( file : any ) : any {
91+ let base = file . url . substring ( file . url . indexOf ( ':' ) + 1 )
92+ return allRequired [ base ]
8793 }
8894 }
8995 let formSchema = await getSchema ( schemaPath , feedback , resolver )
9096 let required = { }
91- await findRequires ( formSchema , allRequired , required , feedback )
97+ await findRequires ( formSchema , allRequired , required , resolver , feedback )
9298 let allSchema = clone ( formSchema )
9399 if ( ! allSchema . required ) allSchema . required = [ ]
94100 if ( ! allSchema . $expectedOnly ) allSchema . $expectedOnly = [ ]
@@ -99,7 +105,7 @@ export async function processSchemas(schemaPath: string, templateDirs: string[],
99105 // Default to properties in root schema
100106 allSchema . $public = Object . keys ( formSchema . properties )
101107 }
102- mergeSchemas ( allSchema , Object . values ( allRequired ) ) ;
108+ mergeSchemas ( allSchema , Object . values ( required ) ) ;
103109
104110 return new s . Schema ( schemaPath , allSchema )
105111}
0 commit comments