theme.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { task } from 'gulp';
  2. import { SRC_ROOT, SRC_COMPONENTS_ROOT } from '../constants';
  3. import * as path from 'path';
  4. import * as fs from 'fs';
  5. task('theme', (done: () => void) => {
  6. let opts: GenerateThemeOptions = {
  7. src: path.join(SRC_COMPONENTS_ROOT),
  8. dest: path.join(SRC_ROOT, 'ionic-generate.scss')
  9. };
  10. generateThemeSource(opts);
  11. });
  12. export function generateThemeSource(opts: GenerateThemeOptions) {
  13. console.log(`[theme] src: ${opts.src}`);
  14. console.log(`[theme] desc: ${opts.dest}`);
  15. let components = getSourceComponents(opts);
  16. generateManifest(opts, components);
  17. }
  18. function generateManifest(opts: GenerateThemeOptions, components: Component[]) {
  19. components.forEach(c => {
  20. console.log(c.name);
  21. c.modes.forEach(m => {
  22. console.log(` ${m.mode} ${m.src}`);
  23. });
  24. });
  25. }
  26. function getSourceComponents(opts: GenerateThemeOptions) {
  27. let components: Component[] = [];
  28. function readFiles(src: string, fillFiles: string[]) {
  29. fs.readdirSync(src).forEach((file, index) => {
  30. var filePath = path.join(src, file);
  31. var fsStats = fs.statSync(filePath);
  32. if (fsStats.isDirectory()) {
  33. readFiles(filePath, fillFiles);
  34. } else if (fsStats.isFile()) {
  35. fillFiles.push(filePath);
  36. }
  37. });
  38. }
  39. let files: string[] = [];
  40. readFiles(opts.src, files);
  41. files = files.filter(f => f.slice(-5) === '.scss');
  42. files.sort();
  43. files.forEach(f => {
  44. var componentRoot = f.replace(opts.src + '/', '');
  45. var fileSplit = componentRoot.split('/');
  46. var componentName = fileSplit[0];
  47. var fileName = fileSplit[1];
  48. var component = components.find(c => c.name === componentName);
  49. if (!component) {
  50. component = {
  51. name: componentName,
  52. modes: []
  53. };
  54. components.push(component);
  55. }
  56. fileSplit = fileName.split('.');
  57. if (fileSplit.length === 3) {
  58. component.modes.push({
  59. src: f,
  60. mode: fileSplit[1]
  61. });
  62. } else {
  63. component.modes.unshift({
  64. src: f,
  65. mode: DEFAULT_MODE
  66. });
  67. }
  68. });
  69. console.log(`[theme] components: ${components.length}`);
  70. return components;
  71. }
  72. export interface GenerateThemeOptions {
  73. src: string;
  74. dest: string;
  75. includeModes?: string[];
  76. excludeModes?: string[];
  77. includeComponents?: string[];
  78. excludeComponents?: string[];
  79. }
  80. export interface Component {
  81. name: string;
  82. modes: FileDetails[];
  83. }
  84. export interface FileDetails {
  85. src: string;
  86. mode: string;
  87. }
  88. const DEFAULT_MODE = '*';