/** * @fileoverview Define namespace * @author NHN. * FE Development Lab * @dependency object.js, collection.js */ 'use strict'; var collection = require('./collection'); var object = require('./object'); /** * Define namespace * @param {string} namespace - Namespace (ex- 'foo.bar.baz') * @param {(object|function)} props - A set of modules or one module * @param {boolean} [isOverride] - Override the props to the namespace.
* (It removes previous properties of this namespace) * @returns {(object|function)} Defined namespace * @memberof tui.util * @example * //-- #1. Get Module --// * var util = require('tui-code-snippet'); // node, commonjs * var util = tui.util; // distribution file * * //-- #2. Use property --// * var neComp = util.defineNamespace; * neComp.listMenu = defineClass({ * init: function() { * // ... * } * }); */ function defineNamespace(namespace, props, isOverride) { var names, result, prevLast, last; names = namespace.split('.'); names.unshift(window); result = collection.reduce(names, function(obj, name) { obj[name] = obj[name] || {}; return obj[name]; }); if (isOverride) { last = names.pop(); prevLast = object.pick.apply(null, names); result = prevLast[last] = props; } else { object.extend(result, props); } return result; } module.exports = defineNamespace;