Files
2017-06-21 09:33:06 -05:00

116 lines
2.5 KiB
TypeScript

import { task } from 'gulp';
import { SRC_ROOT, SRC_COMPONENTS_ROOT } from '../constants';
import * as path from 'path';
import * as fs from 'fs';
task('theme', (done: () => void) => {
let opts: GenerateThemeOptions = {
src: path.join(SRC_COMPONENTS_ROOT),
dest: path.join(SRC_ROOT, 'ionic-generate.scss')
};
generateThemeSource(opts);
});
export function generateThemeSource(opts: GenerateThemeOptions) {
console.log(`[theme] src: ${opts.src}`);
console.log(`[theme] desc: ${opts.dest}`);
let components = getSourceComponents(opts);
generateManifest(opts, components);
}
function generateManifest(opts: GenerateThemeOptions, components: Component[]) {
components.forEach(c => {
console.log(c.name);
c.modes.forEach(m => {
console.log(` ${m.mode} ${m.src}`);
});
});
}
function getSourceComponents(opts: GenerateThemeOptions) {
let components: Component[] = [];
function readFiles(src: string, fillFiles: string[]) {
fs.readdirSync(src).forEach((file, index) => {
var filePath = path.join(src, file);
var fsStats = fs.statSync(filePath);
if (fsStats.isDirectory()) {
readFiles(filePath, fillFiles);
} else if (fsStats.isFile()) {
fillFiles.push(filePath);
}
});
}
let files: string[] = [];
readFiles(opts.src, files);
files = files.filter(f => f.slice(-5) === '.scss');
files.sort();
files.forEach(f => {
var componentRoot = f.replace(opts.src + '/', '');
var fileSplit = componentRoot.split('/');
var componentName = fileSplit[0];
var fileName = fileSplit[1];
var component = components.find(c => c.name === componentName);
if (!component) {
component = {
name: componentName,
modes: []
};
components.push(component);
}
fileSplit = fileName.split('.');
if (fileSplit.length === 3) {
component.modes.push({
src: f,
mode: fileSplit[1]
});
} else {
component.modes.unshift({
src: f,
mode: DEFAULT_MODE
});
}
});
console.log(`[theme] components: ${components.length}`);
return components;
}
export interface GenerateThemeOptions {
src: string;
dest: string;
includeModes?: string[];
excludeModes?: string[];
includeComponents?: string[];
excludeComponents?: string[];
}
export interface Component {
name: string;
modes: FileDetails[];
}
export interface FileDetails {
src: string;
mode: string;
}
const DEFAULT_MODE = '*';