You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.4 KiB
162 lines
4.4 KiB
import gulp from 'gulp';
|
|
import gf from 'get-google-fonts';
|
|
import concat from 'gulp-concat';
|
|
import autoprefixer from 'gulp-autoprefixer';
|
|
import cleanCSS from 'gulp-clean-css';
|
|
import * as dartSass from 'sass';
|
|
import gulpSass from 'gulp-sass';
|
|
import {deleteSync} from 'del';
|
|
import axios from 'axios';
|
|
import fs from 'fs-extra';
|
|
import path from 'path';
|
|
import imagemin from 'imagemin';
|
|
import imageminWebp from 'imagemin-webp';
|
|
import {config} from "./config.mjs";
|
|
const sass = gulpSass(dartSass);
|
|
|
|
async function prepareSrc(mixedSources) {
|
|
await fs.ensureDir(config.tempDir); // Erstellt das temporäre Verzeichnis, falls es noch nicht existiert
|
|
|
|
const localFilePaths = await Promise.all(mixedSources.map(async (source, index) => {
|
|
const filename = `resource_${index}${path.extname(source)}`;
|
|
const localPath = path.join(config.tempDir, filename);
|
|
|
|
if (/^https?:\/\//i.test(source)) {
|
|
// Source ist eine URL, also herunterladen
|
|
const response = await axios({ url: source, responseType: 'arraybuffer' });
|
|
await fs.writeFile(localPath, response.data);
|
|
} else {
|
|
// Source ist ein lokaler Pfad, also kopieren
|
|
return source;
|
|
}
|
|
|
|
return localPath;
|
|
}));
|
|
|
|
return localFilePaths;
|
|
}
|
|
|
|
|
|
function clean() {
|
|
cleanDist();
|
|
}
|
|
|
|
async function build() {
|
|
await cleanDist();
|
|
await copyPublic();
|
|
await buildCss();
|
|
await buildJs();
|
|
await buildImg();
|
|
await buildFont();
|
|
publish();
|
|
}
|
|
|
|
async function watch() {
|
|
await watchCss();
|
|
await watchJs();
|
|
await watchImg();
|
|
}
|
|
|
|
function cleanCss() {
|
|
deleteSync([config.del.css]);
|
|
}
|
|
|
|
async function buildCss() {
|
|
let sources;
|
|
for (let name in config.css) {
|
|
sources = await prepareSrc(Object.values(config.css[name]));
|
|
gulp.src(sources)
|
|
.pipe(sass().on('error',sass.logError))
|
|
.pipe(autoprefixer({cascade: true}))
|
|
.pipe(cleanCSS({compatibility: 'ie8'}))
|
|
.pipe(concat(name + '.css'))
|
|
.pipe(gulp.dest(config.dist + '/' + config.app))
|
|
}
|
|
}
|
|
|
|
function watchCss() {
|
|
gulp.watch(config.watch.css, gulp.series(buildCss))
|
|
}
|
|
|
|
function cleanJs() {
|
|
deleteSync([config.del.js]);
|
|
}
|
|
|
|
async function buildJs() {
|
|
let sources;
|
|
for (let name in config.js) {
|
|
sources = await prepareSrc(Object.values(config.js[name]));
|
|
gulp.src(sources)
|
|
.pipe(concat(name + '.js'))
|
|
.pipe(gulp.dest(config.dist + '/' + config.app))
|
|
}
|
|
}
|
|
|
|
function watchJs() {
|
|
gulp.watch(config.watch.js, gulp.series(buildJs));
|
|
}
|
|
|
|
function cleanFont() {
|
|
deleteSync([config.del.font]);
|
|
}
|
|
async function buildFont(){
|
|
for (let name in config.font) {
|
|
await new gf({
|
|
outputDir: config.dist + '/' + config.app + '/fonts/' + name,
|
|
cssFile: name + '.css',
|
|
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
|
|
overwriting: true
|
|
}).download(config.font[name]);
|
|
}
|
|
}
|
|
|
|
function cleanImg() {
|
|
deleteSync([config.del.img]);
|
|
}
|
|
|
|
async function buildImg(){
|
|
const files = await imagemin([config.watch.img], {
|
|
plugins: [
|
|
imageminWebp({ quality: 80 }),
|
|
],
|
|
});
|
|
|
|
// Verarbeite jede Datei und speichere sie
|
|
await files.forEach(file => {
|
|
const relativePath = path.relative(config.watch.img, file.sourcePath);
|
|
const outputPath = config.dist + '/' + config.app + '/' + relativePath.replace(path.extname(relativePath), '.webp').replace('../../', '');
|
|
console.log(outputPath);
|
|
// Stelle sicher, dass das Verzeichnis existiert
|
|
ensureDirectoryExistence(outputPath);
|
|
|
|
// Schreibe die konvertierte Datei in das Zielverzeichnis
|
|
fs.writeFileSync(outputPath, file.data);
|
|
});
|
|
}
|
|
|
|
function ensureDirectoryExistence(filePath) {
|
|
const dir = path.dirname(filePath);
|
|
if (!fs.existsSync(dir)) {
|
|
fs.mkdirSync(dir, { recursive: true });
|
|
}
|
|
}
|
|
|
|
function watchImg() {
|
|
gulp.watch(config.watch.img, gulp.series(buildImg))
|
|
}
|
|
|
|
async function cleanDist() {
|
|
deleteSync([config.del.dist]);
|
|
}
|
|
async function copyPublic(){
|
|
await gulp.src(config.watch.srcPublic)
|
|
.pipe(gulp.dest(config.dist + '/' + config.app))
|
|
}
|
|
|
|
function publish(){
|
|
deleteSync([config.publ]);
|
|
gulp.src(config.watch.dist)
|
|
.pipe(gulp.dest(config.publ))
|
|
}
|
|
|
|
export { clean, build, watch };
|