All files normalize.js

97.29% Statements 36/37
96.42% Branches 27/28
100% Functions 3/3
97.22% Lines 35/36

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86        1x     1x 1x   1x     1x 1x     2837x         2837x 4x           2833x 634x 570x   64x       2199x 112x     2087x         2087x 2087x 2087x 4961x 1314x 1314x   3647x 137x 137x   3510x 1176x 1176x   2334x   2087x                       327x   327x 323x   4x       1x  
'use strict';
 
/* eslint no-use-before-define: ["error", { "functions": false }] */
 
const { error } = require( './error.js' );
const {
	convertBenjaminArrayToZList, isArray, isReference, isString,
	makeMappedResultEnvelope } = require( './utils.js' );
const { SchemaFactory } = require( './schema' );
 
const mixedFactory = SchemaFactory.MIXED();
// Canonical form syntax is a superset of normal form syntax, so this validator
// captures mixed forms.
const mixedZ1Validator = mixedFactory.create( 'Z1' );
const mixedZ99Validator = mixedFactory.create( 'Z99' );
 
function isQuote( ZObject ) {
	return mixedZ99Validator.validate( ZObject );
}
 
// the input is assumed to be a well-formed ZObject, or else the behaviour is undefined
function normalize( o ) {
	if ( isQuote( o ) ) {
		return {
			Z1K1: normalize( o.Z1K1 ),
			Z99K1: o.Z99K1
		};
	}
 
	if ( isString( o ) ) {
		if ( isReference( o ) ) {
			return { Z1K1: 'Z9', Z9K1: o };
		} else {
			return { Z1K1: 'Z6', Z6K1: o };
		}
	}
 
	if ( isArray( o ) ) {
		return convertBenjaminArrayToZList( o.map( normalize ), false );
	}
 
	Iif ( o.Z1K1 === 'Z5' &&
		( o.Z5K1.Z1K1 === error.syntax_error || o.Z5K1.Z1K1 === error.not_wellformed ) ) {
		return o;
	}
 
	const keys = Object.keys( o );
	const result = {};
	for ( let i = 0; i < keys.length; i++ ) {
		if ( keys[ i ] === 'Z1K1' && ( o.Z1K1 === 'Z6' || o.Z1K1 === 'Z9' ) ) {
			result.Z1K1 = o.Z1K1;
			continue;
		}
		if ( keys[ i ] === 'Z6K1' && isString( o.Z6K1 ) ) {
			result.Z6K1 = o.Z6K1;
			continue;
		}
		if ( keys[ i ] === 'Z9K1' && isString( o.Z9K1 ) ) {
			result.Z9K1 = o.Z9K1;
			continue;
		}
		result[ keys[ i ] ] = normalize( o[ keys[ i ] ] );
	}
	return result;
}
 
/**
 * Normalizes a canonical ZObject. Returns a Z22/'Evaluation result' containing the normalized
 * ZObject or a Z5/Error (in the metadata map of the Z22).
 *
 * @param {Object} o a ZObject
 * @return {Object} a Z22 / Evaluation result
 */
 
function normalizeExport( o ) {
	const status = mixedZ1Validator.validateStatus( o );
 
	if ( status.isValid() ) {
		return makeMappedResultEnvelope( normalize( o ), null );
	} else {
		return makeMappedResultEnvelope( null, status.getZ5() );
	}
}
 
module.exports = normalizeExport;