createICSSRules.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. const createImports = (imports, postcss, mode = "rule") => {
  2. return Object.keys(imports).map((path) => {
  3. const aliases = imports[path];
  4. const declarations = Object.keys(aliases).map((key) =>
  5. postcss.decl({
  6. prop: key,
  7. value: aliases[key],
  8. raws: { before: "\n " },
  9. })
  10. );
  11. const hasDeclarations = declarations.length > 0;
  12. const rule =
  13. mode === "rule"
  14. ? postcss.rule({
  15. selector: `:import('${path}')`,
  16. raws: { after: hasDeclarations ? "\n" : "" },
  17. })
  18. : postcss.atRule({
  19. name: "icss-import",
  20. params: `'${path}'`,
  21. raws: { after: hasDeclarations ? "\n" : "" },
  22. });
  23. if (hasDeclarations) {
  24. rule.append(declarations);
  25. }
  26. return rule;
  27. });
  28. };
  29. const createExports = (exports, postcss, mode = "rule") => {
  30. const declarations = Object.keys(exports).map((key) =>
  31. postcss.decl({
  32. prop: key,
  33. value: exports[key],
  34. raws: { before: "\n " },
  35. })
  36. );
  37. if (declarations.length === 0) {
  38. return [];
  39. }
  40. const rule =
  41. mode === "rule"
  42. ? postcss.rule({
  43. selector: `:export`,
  44. raws: { after: "\n" },
  45. })
  46. : postcss.atRule({
  47. name: "icss-export",
  48. raws: { after: "\n" },
  49. });
  50. rule.append(declarations);
  51. return [rule];
  52. };
  53. const createICSSRules = (imports, exports, postcss, mode) => [
  54. ...createImports(imports, postcss, mode),
  55. ...createExports(exports, postcss, mode),
  56. ];
  57. module.exports = createICSSRules;