createExpectedOrder.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const _ = require('lodash');
  2. module.exports = function createExpectedOrder(input) {
  3. const order = {};
  4. let position = 0;
  5. input.forEach(item => {
  6. position += 1;
  7. if (_.isString(item) && item !== 'at-rules' && item !== 'rules') {
  8. order[item] = {
  9. position,
  10. };
  11. }
  12. if (item === 'rules' || item.type === 'rule') {
  13. // Convert 'rules' into extended pattern
  14. if (item === 'rules') {
  15. item = {
  16. type: 'rule',
  17. };
  18. }
  19. // It there are no nodes like that create array for them
  20. if (!order[item.type]) {
  21. order[item.type] = [];
  22. }
  23. const nodeData = {
  24. position,
  25. };
  26. if (item.selector) {
  27. nodeData.selector = item.selector;
  28. if (_.isString(item.selector)) {
  29. nodeData.selector = new RegExp(item.selector);
  30. }
  31. }
  32. order[item.type].push(nodeData);
  33. }
  34. if (item === 'at-rules' || item.type === 'at-rule') {
  35. // Convert 'at-rules' into extended pattern
  36. if (item === 'at-rules') {
  37. item = {
  38. type: 'at-rule',
  39. };
  40. }
  41. // It there are no nodes like that create array for them
  42. if (!order[item.type]) {
  43. order[item.type] = [];
  44. }
  45. const nodeData = {
  46. position,
  47. };
  48. if (item.name) {
  49. nodeData.name = item.name;
  50. }
  51. if (item.parameter) {
  52. nodeData.parameter = item.parameter;
  53. if (_.isString(item.parameter)) {
  54. nodeData.parameter = new RegExp(item.parameter);
  55. }
  56. }
  57. if (!_.isUndefined(item.hasBlock)) {
  58. nodeData.hasBlock = item.hasBlock;
  59. }
  60. order[item.type].push(nodeData);
  61. }
  62. });
  63. return order;
  64. };