mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-18 19:21:34 +08:00
116 lines
2.5 KiB
TypeScript
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 = '*';
|