create-phaser-app
Version:
A boiler plate to start your phaser app with webpack4, babel7+ and Phaser 3
147 lines (120 loc) • 3.67 kB
JavaScript
import fs from 'fs';
import path from 'path';
import { pathToFileURL } from 'url';
import chalk from 'chalk';
import chalkTable from 'chalk-table';
import imagemin from 'imagemin';
import imageminJpegtran from 'imagemin-jpegtran';
import imageminPngquant from 'imagemin-pngquant';
import moment from 'moment';
import multimeter from 'multimeter';
import { forEach } from 'p-iteration';
function templateImageImportFile(embeddedLevel, inputDir, outputDir) {
const { layers, tilesets } = embeddedLevel;
const outputPath = `${outputDir}/images.js`;
const templateImgImport = (file, name) => {
let cleanName = kebabToCamel(name);
return `import ${cleanName} from './${file}';`;
};
const layersWithimages = layers.filter(layer => {
return layer.image;
});
const tileSetsWithImages = tilesets.filter(tileset => {
return tileset.image;
});
const layerImps = layersWithimages
.map(({ image, name }) => templateImgImport(image, name))
.join(`\n`)
.trim();
const tilesetImps = tileSetsWithImages
.map(({ image, name }) => templateImgImport(image, name))
.join(`\n`)
.trim();
const layerExps = layersWithimages
.map(({ name }) => {
let cleanName = kebabToCamel(name);
return `\t'${name}':${cleanName}`;
})
.join(',\n')
.trim();
const tilesetExps = tileSetsWithImages
.map(({ name }) => {
let cleanName = kebabToCamel(name);
return `\t'${name}':${cleanName}`;
})
.join(',\n')
.trim();
const f = (thing, chars) => {
return thing.length > 1 ? chars : '';
};
const notes = `/*
This file was generated
by the level-processor
${moment(new Date()).format('YYYY-MM-DD h:mm:ss a')}
*/`;
const layerImageExports = `${f(layerExps, '\t')}${layerExps}${f(
layerExps,
','
)}`;
const tilesetExports = `${f(layerExps, '\n')}${f(
tilesetExps,
'\t'
)}${tilesetExps}`;
const fileTemplate = `${notes}
${layerImps}${f(layerImps, '\n')}
${tilesetImps}${f(tilesetImps, '\n')}
export default {
${layerImageExports}
${tilesetExports}
};`;
return fs.writeFileSync(outputPath, fileTemplate);
}
function moveImageToProcessedFolder(inDir, outDir) {
return async function(img, index, list) {
//console.log(chalk.green(`📷 ${img}`));
const inPath = `${inDir}/${img}`.replace(/\\/g, '/');
const outPath = `${outDir}/${img}`.replace(/\\/g, '/');
let _compressedImg = await imagemin([inPath], {
destination: outDir,
glob: false,
plugins: [
imageminJpegtran(),
imageminPngquant({
quality: [0.6, 0.8]
})
]
});
return { img, moved: path.relative(inPath, outPath), data: _compressedImg };
};
}
async function moveLayerImages(embeddedLevel, inDir, outDir) {
const { layers } = embeddedLevel;
const layersWithimages = layers
.filter(layer => {
return layer.image;
})
.map(x => x.image);
let images = await Promise.all(
layersWithimages.map(moveImageToProcessedFolder(inDir, outDir))
);
if (images.length) {
let info = chalkTable(
{
columns: [
{ field: 'img', name: chalk.white(`📷`) },
{ field: 'moved', name: chalk.yellow('➥') }
]
},
images
);
console.log(info);
}
return images;
}
function kebabToCamel(name) {
return name.replace(/-([a-z])/g, function(g) {
return g[1].toUpperCase();
});
}
export default templateImageImportFile;
export { templateImageImportFile, moveLayerImages };