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.
143 lines
3.7 KiB
143 lines
3.7 KiB
import yargs from 'yargs';
|
|
import gulp from 'gulp';
|
|
import gf from 'get-google-fonts';
|
|
import sharp from 'gulp-sharp-responsive';
|
|
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 {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(){
|
|
await gulp.src(config.watch.img)
|
|
.pipe(sharp({
|
|
formats: [{format: 'webp'}]
|
|
}))
|
|
.pipe(gulp.dest(config.dist + '/' + config.app));
|
|
}
|
|
|
|
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 };
|