parse.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. 'use strict';
  2. const { isObject } = require('./utils');
  3. const noop = () => {};
  4. /**
  5. * Parse task expressions from the argv._ (splat) array
  6. */
  7. module.exports = (register = noop) => {
  8. return function parse(app, ...rest) {
  9. if (rest.length === 1 && Array.isArray(rest[0])) rest = rest[0];
  10. let options = rest.find(val => isObject(val) && val.isTask !== true);
  11. rest = rest.filter(val => val !== options);
  12. let callback = rest.find(val => typeof val === 'function');
  13. let args = rest.filter(val => val !== options && val !== callback);
  14. let opts = { ...app.options, ...options };
  15. if (typeof args[0] === 'string' && Array.isArray(args[1])) {
  16. args = [args[0] + ':' + args[1].join(',')];
  17. }
  18. args = args.join(' ').split(' ');
  19. let missing = [];
  20. let result = [];
  21. for (const arg of args) {
  22. let segs = arg.split(':');
  23. if (segs.length > 2) {
  24. throw new SyntaxError('spaces must be used to separate multiple generator names');
  25. }
  26. let tasks = segs[1] ? segs[1].split(',') : segs[0].split(',');
  27. let name = segs[1] ? segs[0] : null;
  28. let task = { name: null, tasks: [] };
  29. tasks.forEach(val => {
  30. if (!app.tasks.has(val) && app.hasGenerator(name + '.' + val)) {
  31. result.push({ name: [name, val].join('.'), tasks: ['default'] });
  32. tasks = tasks.filter(v => v !== val);
  33. }
  34. });
  35. if (segs.length === 2 && tasks.length) {
  36. task.name = name;
  37. task.tasks = tasks;
  38. result.push(task);
  39. continue;
  40. }
  41. for (let key of tasks) {
  42. if ((!app.tasks.has(key) || app.taskStack.has(key)) && app.hasGenerator(key)) {
  43. if (app.name === 'default' && !key.startsWith('default.')) {
  44. key = `default.${key}`;
  45. }
  46. result.push({ name: key, tasks: ['default' ]});
  47. } else if (key && app.tasks.has(key)) {
  48. task.name = 'default';
  49. task.tasks.push(key);
  50. } else if (key) {
  51. missing.push(key);
  52. }
  53. }
  54. if (task.name) {
  55. result.push(task);
  56. }
  57. }
  58. if (rest.length && !result.length && app.name !== 'default') {
  59. if (app.hasGenerator('default')) {
  60. return parse(app.getGenerator('default'), ...rest);
  61. }
  62. }
  63. if (!rest.length && !result.length && !missing.length) {
  64. result = [{ name: 'default', tasks: ['default'] }];
  65. }
  66. if (missing.length && register(missing) === true) {
  67. return parse(app, ...rest);
  68. }
  69. register(result.map(task => task.name));
  70. return { options: opts, callback, tasks: result, missing };
  71. };
  72. };