-/*
- *
- * Copyright 2016 RIFT.IO Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-'use strict';
-
-// the models to be transformed into the output DSL JSON meta file
-var yang = [require('./json-nsd.json'), require('./json-vnfd.json')];
-
-var _ = require('lodash');
-var inet = require('./ietf-inet-types.yang.json');
-
-var utils = {
- resolvePath(obj, path) {
- // supports a.b, a[1] and foo[bar], etc.
- // where obj is ['nope', 'yes', {a: {b: 1}, foo: 2}]
- // then [1] returns 'yes'; [2].a.b returns 1; [2].a[foo] returns 2;
- path = path.split(/[\.\[\]]/).filter(d => d);
- return path.reduce((r, p) => {
- if (r) {
- return r[p];
- }
- }, obj);
- },
- assignPathValue(obj, path, value) {
- path = path.split(/[\.\[\]]/).filter(d => d);
- // enable look-ahead to determine if type is array or object
- const pathCopy = path.slice();
- // last item in path used to assign value on the resolved object
- const name = path.pop();
- const resolvedObj = path.reduce((r, p, i) => {
- if (typeof(r[p]) !== 'object') {
- // look-ahead to see if next path item is a number
- const isArray = !isNaN(parseInt(pathCopy[i + 1], 10));
- r[p] = isArray ? [] : {}
- }
- return r[p];
- }, obj);
- resolvedObj[name] = value;
- }
-};
-
-var isType = d => /^(leaf|leaf-list|list|container|choice|case|uses)$/.test(d);
-
-function deriveCardinalityFromProperty(property, typeName) {
- if (String(property.mandatory) === 'true') {
- return '1';
- }
- let min = 0, max = Infinity;
- if (property.hasOwnProperty('min-elements')) {
- min = parseInt(property['min-elements'], 10) || 0;
- }
- if (property.hasOwnProperty('max-elements')) {
- max = parseInt(property['max-elements'], 10) || Infinity;
- } else {
- if (!/^(list|leaf-list)$/.test(typeName)) {
- max = '1';
- }
- }
- if (min > max) {
- return String(min);
- }
- if (min === max) {
- return String(min);
- }
- return String(min) + '..' + (max === Infinity ? 'N' : max);
-}
-
-function cleanWhitespace(text) {
- if (typeof text === 'string') {
- return text.replace(/\s+/g, ' ');
- }
- return text;
-}
-
-function buildProperties(typeData, typeName) {
- var properties = [];
- Object.keys(typeData).forEach(name => {
- var property = typeData[name];
- var listKey = typeName === 'list' ? String(property.key).split(/\s/).filter(k => k && k !== 'undefined') : false;
- var meta = {
- name: name,
- type: typeName,
- description: cleanWhitespace(property.description),
- cardinality: deriveCardinalityFromProperty(property, typeName),
- 'data-type': property.type,
- properties: Object.keys(property).filter(isType).reduce((r, childType) => {
- return r.concat(buildProperties(property[childType], childType));
- }, [])
- };
- if (listKey) {
- meta.key = listKey;
- }
- properties.push(meta);
- });
- return properties;
-}
-
-function lookupUses(uses, yang) {
- function doLookup(lookupTypeName) {
- var key;
- // warn: hardcoded prefix support for mano-types - other prefixes will be ignored
- if (/^manotypes:/.test(lookupTypeName)) {
- var moduleName = lookupTypeName.split(':')[1];
- key = ['dependencies.mano-types.module.mano-types.grouping', moduleName].join('.');
- } else {
- var name = yang.name.replace(/^rw-/, '');
- key = ['dependencies', name, 'module', name, 'grouping', lookupTypeName].join('.');
- }
- return utils.resolvePath(yang, key);
- }
- if (typeof uses === 'object') {
- return Object.keys(uses).reduce((result, key) => {
- var found = doLookup(key);
- Object.keys(found).filter(isType).forEach(type => {
- var property = result[type] || (result[type] = {});
- Object.assign(property, found[type]);
- });
- return result;
- }, {});
- } else if (typeof uses === 'string') {
- return doLookup(uses);
- }
- return {};
-}
-
-function lookupTypedef(property, yang) {
- var key;
- var lookupTypeName = property.type;
- // warn: hardcoded prefix support - other prefixes will be ignored
- if (/^manotypes:/.test(lookupTypeName)) {
- var lookupName = lookupTypeName.split(':')[1];
- key = ['dependencies.mano-types.module.mano-types.typedef', lookupName].join('.');
- } else if (/^inet:/.test(lookupTypeName)) {
- var lookupName = lookupTypeName.split(':')[1];
- yang = inet;
- key = ['schema.module.ietf-inet-types.typedef', lookupName].join('.');
- }
- if (key) {
- return utils.resolvePath(yang, key);
- }
-}
-
-function resolveUses(property, yang) {
- var childData = property.uses;
- var resolved = lookupUses(childData, yang);
- //console.log('uses', childData, 'found', resolved);
- Object.keys(resolved).forEach(type => {
- var parentTypes = property[type] || (property[type] = {});
- // copy types into the parent types bucket
- Object.assign(parentTypes, resolveReferences(yang, resolved[type]));
- });
- delete property.uses;
-}
-
-function resolveTypedef(property, yang) {
- if (/:/.test(property.type)) {
- var found = lookupTypedef(property, yang);
- if (found) {
- Object.assign(property, found);
- }
- }
-}
-
-function resolveReferences(yang, data) {
- var dataClone = _.cloneDeep(data);
- function doResolve(typeData) {
- Object.keys(typeData).forEach(name => {
- var property = typeData[name];
- resolveTypedef(property, yang);
- Object.keys(property).filter(isType).forEach(childType => {
- if (childType === 'uses') {
- resolveUses(property, yang);
- } else {
- doResolve(property[childType]);
- }
- });
- });
- }
- doResolve(dataClone);
- return dataClone;
-}
-
-function module(yang) {
- let module;
- var name = yang.name.replace(/^rw-/, '');
- if (!name) {
- throw 'no name given in json yang';
- }
- const path = ['container', name + '-catalog'].join('.');
- module = utils.resolvePath(yang, path);
-
- if (!module) {
- module = utils.resolvePath(yang, ['schema', 'module', name, path].join('.'));
- }
- if (!module) {
- module = utils.resolvePath(yang, ['dependencies', name, 'module', name, path].join('.'));
- }
- if (!module) {
- throw 'cannot find the module' + name;
- }
-
- // module/agument/nsd:nsd-catalog/nsd:nsd/meta
- const augLeafPath = ['schema.module', 'rw-' + name, 'augment', '/' + name + ':' + name + '-catalog/' + name + ':' + name, 'leaf'];
- const meta = utils.resolvePath(yang, augLeafPath.concat('meta').join('.'));
-
- const putLeafPath = ['dependencies', name, 'module', name, path, 'list', name, 'leaf'];
-
- if (meta) {
- utils.assignPathValue(yang, putLeafPath.concat(['meta']).join('.'), meta);
- }
-
- // module/agument/nsd:nsd-catalog/nsd:nsd/logo
- const logo = utils.resolvePath(yang, augLeafPath.concat('logo').join('.'));
- if (logo) {
- utils.assignPathValue(yang, putLeafPath.concat(['logo']).join('.'), logo);
- }
- var data = module.list;
-
- return {name: name, data: resolveReferences(yang, data)};
-
-}
-
-function reduceModule(result, module) {
- result[module.name] = buildProperties(module.data, 'list')[0];
- return result;
-}
-
-var result = yang.map(module).reduce(reduceModule, {});
-
-console.log(JSON.stringify(result, null, 5));
+// /*
+// *
+// * Copyright 2016 RIFT.IO Inc
+// *
+// * Licensed under the Apache License, Version 2.0 (the "License");
+// * you may not use this file except in compliance with the License.
+// * You may obtain a copy of the License at
+// *
+// * http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// *
+// */
+
+// 'use strict';
+
+// // the models to be transformed into the output DSL JSON meta file
+// var yang = [require('./json-nsd.json'), require('./json-vnfd.json')];
+
+// var _ = require('lodash');
+// var inet = require('./ietf-inet-types.yang.json');
+
+// var utils = {
+// resolvePath(obj, path) {
+// // supports a.b, a[1] and foo[bar], etc.
+// // where obj is ['nope', 'yes', {a: {b: 1}, foo: 2}]
+// // then [1] returns 'yes'; [2].a.b returns 1; [2].a[foo] returns 2;
+// path = path.split(/[\.\[\]]/).filter(d => d);
+// return path.reduce((r, p) => {
+// if (r) {
+// return r[p];
+// }
+// }, obj);
+// },
+// assignPathValue(obj, path, value) {
+// path = path.split(/[\.\[\]]/).filter(d => d);
+// // enable look-ahead to determine if type is array or object
+// const pathCopy = path.slice();
+// // last item in path used to assign value on the resolved object
+// const name = path.pop();
+// const resolvedObj = path.reduce((r, p, i) => {
+// if (typeof(r[p]) !== 'object') {
+// // look-ahead to see if next path item is a number
+// const isArray = !isNaN(parseInt(pathCopy[i + 1], 10));
+// r[p] = isArray ? [] : {}
+// }
+// return r[p];
+// }, obj);
+// resolvedObj[name] = value;
+// }
+// };
+
+// var isType = d => /^(leaf|leaf-list|list|container|choice|case|uses)$/.test(d);
+
+// function deriveCardinalityFromProperty(property, typeName) {
+// if (String(property.mandatory) === 'true') {
+// return '1';
+// }
+// let min = 0, max = Infinity;
+// if (property.hasOwnProperty('min-elements')) {
+// min = parseInt(property['min-elements'], 10) || 0;
+// }
+// if (property.hasOwnProperty('max-elements')) {
+// max = parseInt(property['max-elements'], 10) || Infinity;
+// } else {
+// if (!/^(list|leaf-list)$/.test(typeName)) {
+// max = '1';
+// }
+// }
+// if (min > max) {
+// return String(min);
+// }
+// if (min === max) {
+// return String(min);
+// }
+// return String(min) + '..' + (max === Infinity ? 'N' : max);
+// }
+
+// function cleanWhitespace(text) {
+// if (typeof text === 'string') {
+// return text.replace(/\s+/g, ' ');
+// }
+// return text;
+// }
+
+// function buildProperties(typeData, typeName) {
+// var properties = [];
+// Object.keys(typeData).forEach(name => {
+// var property = typeData[name];
+// var listKey = typeName === 'list' ? String(property.key).split(/\s/).filter(k => k && k !== 'undefined') : false;
+// var meta = {
+// name: name,
+// type: typeName,
+// description: cleanWhitespace(property.description),
+// cardinality: deriveCardinalityFromProperty(property, typeName),
+// 'data-type': property.type,
+// properties: Object.keys(property).filter(isType).reduce((r, childType) => {
+// return r.concat(buildProperties(property[childType], childType));
+// }, [])
+// };
+// if (listKey) {
+// meta.key = listKey;
+// }
+// properties.push(meta);
+// });
+// return properties;
+// }
+
+// function lookupUses(uses, yang) {
+// function doLookup(lookupTypeName) {
+// var key;
+// // warn: hardcoded prefix support for mano-types - other prefixes will be ignored
+// if (/^manotypes:/.test(lookupTypeName)) {
+// var moduleName = lookupTypeName.split(':')[1];
+// key = ['dependencies.mano-types.module.mano-types.grouping', moduleName].join('.');
+// } else {
+// var name = yang.name.replace(/^rw-/, '');
+// key = ['dependencies', name, 'module', name, 'grouping', lookupTypeName].join('.');
+// }
+// return utils.resolvePath(yang, key);
+// }
+// if (typeof uses === 'object') {
+// return Object.keys(uses).reduce((result, key) => {
+// var found = doLookup(key);
+// Object.keys(found).filter(isType).forEach(type => {
+// var property = result[type] || (result[type] = {});
+// Object.assign(property, found[type]);
+// });
+// return result;
+// }, {});
+// } else if (typeof uses === 'string') {
+// return doLookup(uses);
+// }
+// return {};
+// }
+
+// function lookupTypedef(property, yang) {
+// var key;
+// var lookupTypeName = property.type;
+// // warn: hardcoded prefix support - other prefixes will be ignored
+// if (/^manotypes:/.test(lookupTypeName)) {
+// var lookupName = lookupTypeName.split(':')[1];
+// key = ['dependencies.mano-types.module.mano-types.typedef', lookupName].join('.');
+// } else if (/^inet:/.test(lookupTypeName)) {
+// var lookupName = lookupTypeName.split(':')[1];
+// yang = inet;
+// key = ['schema.module.ietf-inet-types.typedef', lookupName].join('.');
+// }
+// if (key) {
+// return utils.resolvePath(yang, key);
+// }
+// }
+
+// function resolveUses(property, yang) {
+// var childData = property.uses;
+// var resolved = lookupUses(childData, yang);
+// //console.log('uses', childData, 'found', resolved);
+// Object.keys(resolved).forEach(type => {
+// var parentTypes = property[type] || (property[type] = {});
+// // copy types into the parent types bucket
+// Object.assign(parentTypes, resolveReferences(yang, resolved[type]));
+// });
+// delete property.uses;
+// }
+
+// function resolveTypedef(property, yang) {
+// if (/:/.test(property.type)) {
+// var found = lookupTypedef(property, yang);
+// if (found) {
+// Object.assign(property, found);
+// }
+// }
+// }
+
+// function resolveReferences(yang, data) {
+// var dataClone = _.cloneDeep(data);
+// function doResolve(typeData) {
+// Object.keys(typeData).forEach(name => {
+// var property = typeData[name];
+// resolveTypedef(property, yang);
+// Object.keys(property).filter(isType).forEach(childType => {
+// if (childType === 'uses') {
+// resolveUses(property, yang);
+// } else {
+// doResolve(property[childType]);
+// }
+// });
+// });
+// }
+// doResolve(dataClone);
+// return dataClone;
+// }
+
+// function module(yang) {
+// let module;
+// var name = yang.name.replace(/^rw-/, '');
+// if (!name) {
+// throw 'no name given in json yang';
+// }
+// const path = ['container', name + '-catalog'].join('.');
+// module = utils.resolvePath(yang, path);
+
+// if (!module) {
+// module = utils.resolvePath(yang, ['schema', 'module', name, path].join('.'));
+// }
+// if (!module) {
+// module = utils.resolvePath(yang, ['dependencies', name, 'module', name, path].join('.'));
+// }
+// if (!module) {
+// throw 'cannot find the module' + name;
+// }
+
+// // module/agument/nsd:nsd-catalog/nsd:nsd/meta
+// const augLeafPath = ['schema.module', 'rw-' + name, 'augment', '/' + name + ':' + name + '-catalog/' + name + ':' + name, 'leaf'];
+// const meta = utils.resolvePath(yang, augLeafPath.concat('meta').join('.'));
+
+// const putLeafPath = ['dependencies', name, 'module', name, path, 'list', name, 'leaf'];
+
+// if (meta) {
+// utils.assignPathValue(yang, putLeafPath.concat(['meta']).join('.'), meta);
+// }
+
+// // module/agument/nsd:nsd-catalog/nsd:nsd/logo
+// const logo = utils.resolvePath(yang, augLeafPath.concat('logo').join('.'));
+// if (logo) {
+// utils.assignPathValue(yang, putLeafPath.concat(['logo']).join('.'), logo);
+// }
+// var data = module.list;
+
+// return {name: name, data: resolveReferences(yang, data)};
+
+// }
+
+// function reduceModule(result, module) {
+// result[module.name] = buildProperties(module.data, 'list')[0];
+// return result;
+// }
+
+// var result = yang.map(module).reduce(reduceModule, {});
+
+// console.log(JSON.stringify(result, null, 5));