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

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 };