You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.0 KiB

  1. var _ = require('lodash');
  2. var path = require('path');
  3. var handleUntyped = function(layout) {
  4. return function(type, pkg) {
  5. if (type === '__untyped__') {
  6. return pkg;
  7. }
  8. return layout(type, pkg);
  9. };
  10. };
  11. var defaultLayouts = {
  12. byType: handleUntyped(function(type, pkg) {
  13. return path.join(type, pkg);
  14. }),
  15. byComponent: handleUntyped(function(type, pkg) {
  16. return path.join(pkg, type);
  17. })
  18. };
  19. module.exports = {
  20. /**
  21. * Resolves named layouts, returns functions as is
  22. *
  23. * @param {string | Function} layout name or layout function
  24. * @param { Function } fail handler
  25. * @returns {Function} layout function
  26. */
  27. getLayout: function(layout, fail) {
  28. if (_.isFunction(layout)) {
  29. return layout;
  30. }
  31. if (!_.isString(layout)) {
  32. fail('Layout should be specified by name or as a function');
  33. }
  34. if (_(defaultLayouts).has(layout)) {
  35. return defaultLayouts[layout];
  36. }
  37. fail('The following named layouts are supported: ' + _.keys(defaultLayouts).join(', '));
  38. }
  39. };