nl_tokens: Converts a namespace into a flat JSON Schema .
pl_tokens: function flatNamespaceToSchema ( ns , dataElementsSpecs , baseSchemaURL , baseTypeURL ) { const dataElements = dataElementsSpecs . byNamespace ( ns . namespace ) ; const schemaId = ` ${ baseSchemaURL } ${ namespaceToURLPathSegment ( ns . namespace ) } ` ; let schema = { $schema : 'http://json-schema.org/draft-04/schema#' , id : schemaId , title : "TODO: Figure out what the title should be." , definitions : { } } ; const expandedEntry = makeExpandedEntryDefinitions ( ns , baseSchemaURL ) ; if ( ns . description ) { schema . <mask> = ns . description ; } const defs = dataElements . sort ( function ( l , r ) { return l . identifier . name . localeCompare ( r . identifier . name ) ; } ) ; const entryRefs = [ ] ; for ( const def of defs ) { let schemaDef = { type : 'object' , properties : { } } ; let wholeDef = schemaDef ; const tbdParentDescriptions = [ ] ; let requiredProperties = [ ] ; if ( def . isEntry ) { requiredProperties = expandedEntry . required . slice ( ) ; } const tbdFieldDescriptions = [ ] ; if ( def . value ) { let { value , required , tbd } = convertDefinition ( def . value , dataElementsSpecs , ns , baseSchemaURL , baseTypeURL ) ; if ( required ) { requiredProperties . push ( 'Value' ) ; } schemaDef . properties . Value = value ; if ( tbd ) { schemaDef . properties . Value . description = def . value . text ? ( 'TBD: ' + def . value . text ) : tbdValueToString ( def . value ) ; } } if ( def . fields . length ) { for ( const field of def . fields ) { if ( ! ( field instanceof TBD ) && ! isValidField ( field ) ) { continue ; } const card = field . effectiveCard ; if ( card && card . isZeroedOut ) { continue ; } let { value , required , tbd } = convertDefinition ( field , dataElementsSpecs , ns , baseSchemaURL , baseTypeURL ) ; if ( tbd ) { tbdFieldDescriptions . push ( tbdValueToString ( field ) ) ; continue ; } const fieldName = field . identifier . name ; schemaDef . properties [ fieldName ] = value ; if ( required && ( requiredProperties . indexOf ( fieldName ) === - 1 ) ) { requiredProperties . push ( fieldName ) ; } } if ( def . isEntry ) { for ( const name in expandedEntry . properties ) { if ( ! ( name in schemaDef . properties ) ) { schemaDef . properties [ name ] = expandedEntry . properties [ name ] ; } } } } else if ( ! def . value ) { schemaDef . type = 'object' ; schemaDef . description = 'Empty DataElement?' ; } let descriptionList = [ ] ; if ( def . description ) { descriptionList . push ( def . description ) ; } if ( def . concepts . length ) { wholeDef . concepts = def . concepts . map ( ( concept ) => makeConceptEntry ( concept ) ) ; } if ( tbdParentDescriptions . length ) { tbdParentDescriptions [ 0 ] = 'TBD Parents: ' + tbdParentDescriptions [ 0 ] ; descriptionList = descriptionList . concat ( tbdParentDescriptions ) ; } if ( tbdFieldDescriptions . length ) { tbdFieldDescriptions [ 0 ] = 'TBD Fields: ' + tbdFieldDescriptions [ 0 ] ; descriptionList = descriptionList . concat ( tbdFieldDescriptions ) ; } if ( descriptionList . length ) { wholeDef . description = descriptionList . join ( '\n' ) ; } if ( requiredProperties . length ) { schemaDef . required = requiredProperties ; } schema . definitions [ def . identifier . name ] = wholeDef ; if ( def . isEntry && ( ! def . isAbstract ) ) { entryRefs . push ( { $ref : makeRef ( def . identifier , ns , baseSchemaURL ) } ) ; } } if ( entryRefs . length ) { schema . type = 'object' ; schema . anyOf = entryRefs ; } return { schemaId , schema } ; }