refactor(runner): use global varibales

This commit is contained in:
Haoyu Xu
2023-01-20 15:09:53 -05:00
parent 3791a77852
commit 8981f2eb22
11 changed files with 68 additions and 102 deletions

13
.env
View File

@@ -1,13 +0,0 @@
VITE_TITLE="Arknights: It Does Wash the Strings / Ling - 明日方舟:濯缨 · 令"
VITE_FILENAME=dyn_illust_char_2023_ling_nian%239
VITE_LOGO_FILENAME=logo_sui
VITE_FALLBACK_FILENAME=char_2023_ling_nian%239
VITE_VIEWPORT_LEFT=0
VITE_VIEWPORT_RIGHT=0
VITE_VIEWPORT_TOP=0
VITE_VIEWPORT_BOTTOM=0
VITE_INVERT_FILTER=true
VITE_IMAGE_WIDTH=2048
VITE_IMAGE_HEIGHT=2048
VITE_BACKGROUND_FILES=["operator_bg.png","bg_anniversary_1.png","bg_iberia_1.png","bg_kazimierz_1.png","bg_main_victoria_1.png","bg_rhodes_day.png","bg_rhodes_night.png","bg_rogue_1.png","bg_siesta_1.png","bg_ursus_1.png","bg_yan_1.png"]
VITE_BACKGROUND_FOLDER=background

View File

@@ -1,18 +1,18 @@
import path from 'path' import path from 'path'
import { appendSync, readSync } from './file.js' import { appendSync, readSync } from './file.js'
export function appendReadme(config, operatorName, rootDir) { export function appendReadme() {
const operatorConfig = config.operators[operatorName] const operatorConfig = __config.operators[__operator_name]
const projectJson = JSON.parse(readSync(path.join(rootDir, config.folder.operator, operatorName, 'project.json'))) const projectJson = JSON.parse(readSync(path.join(__dirname, __config.folder.operator, __operator_name, 'project.json')))
appendSync( appendSync(
`\n| ${operatorConfig.title.split(' - ')[0].split('Arknights: ')[1]} | [Link](https://arknights.halyul.dev/${operatorConfig.link}/) | [Link](https://steamcommunity.com/sharedfiles/filedetails/?id=${projectJson.workshopid}) |`, `\n| ${operatorConfig.title.split(' - ')[0].split('Arknights: ')[1]} | [Link](https://arknights.halyul.dev/${operatorConfig.link}/) | [Link](https://steamcommunity.com/sharedfiles/filedetails/?id=${projectJson.workshopid}) |`,
path.join(rootDir, 'README.md') path.join(__dirname, 'README.md')
) )
} }
export function appendMainConfig(operatorName, rootDir) { export function appendMainConfig() {
appendSync( appendSync(
`\n ${operatorName}: !include config/${operatorName}.yaml`, `\n ${__operator_name}: !include config/${__operator_name}.yaml`,
path.join(rootDir, 'config.yaml') path.join(__dirname, 'config.yaml')
) )
} }

View File

@@ -3,25 +3,21 @@ import { copy, read, write } from './file.js'
import AlphaComposite from './alpha_composite.js' import AlphaComposite from './alpha_composite.js'
export default class AssetsProcessor { export default class AssetsProcessor {
#config
#operatorName
#operatorSourceFolder #operatorSourceFolder
#alphaCompositer #alphaCompositer
constructor(config, operatorName, rootDir) { constructor() {
this.#config = config this.#operatorSourceFolder = path.join(__dirname, __config.folder.operator)
this.#operatorName = operatorName this.#alphaCompositer = new AlphaComposite()
this.#operatorSourceFolder = path.join(rootDir, this.#config.folder.operator)
this.#alphaCompositer = new AlphaComposite(config, operatorName, rootDir)
} }
async process(publicAssetsDir, extractedDir) { async process(extractedDir) {
const BASE64_BINARY_PREFIX = 'data:application/octet-stream;base64,' const BASE64_BINARY_PREFIX = 'data:application/octet-stream;base64,'
const BASE64_PNG_PREFIX = 'data:image/png;base64,' const BASE64_PNG_PREFIX = 'data:image/png;base64,'
const assetsJson = {} const assetsJson = {}
const skelFilename = `${this.#config.operators[this.#operatorName].filename}.skel` const skelFilename = `${__config.operators[__operator_name].filename}.skel`
const skel = await read(path.join(extractedDir, skelFilename), null) const skel = await read(path.join(extractedDir, skelFilename), null)
const atlasFilename = `${this.#config.operators[this.#operatorName].filename}.atlas` const atlasFilename = `${__config.operators[__operator_name].filename}.atlas`
const atlas = await read(path.join(extractedDir, atlasFilename)) const atlas = await read(path.join(extractedDir, atlasFilename))
const dimensions = atlas.match(new RegExp(/^size:(.*),(.*)/gm))[0].replace('size: ', '').split(',') const dimensions = atlas.match(new RegExp(/^size:(.*),(.*)/gm))[0].replace('size: ', '').split(',')
const matches = atlas.match(new RegExp(/(.*).png/g)) const matches = atlas.match(new RegExp(/(.*).png/g))
@@ -32,9 +28,9 @@ export default class AssetsProcessor {
assetsJson[`./assets/${skelFilename.replace('#', '%23')}`] = BASE64_BINARY_PREFIX + skel.toString('base64') assetsJson[`./assets/${skelFilename.replace('#', '%23')}`] = BASE64_BINARY_PREFIX + skel.toString('base64')
assetsJson[`./assets/${atlasFilename.replace('#', '%23')}`] = BASE64_BINARY_PREFIX + Buffer.from(atlas).toString('base64') assetsJson[`./assets/${atlasFilename.replace('#', '%23')}`] = BASE64_BINARY_PREFIX + Buffer.from(atlas).toString('base64')
const fallbackFilename = `${this.#config.operators[this.#operatorName].fallback_name}.png` const fallbackFilename = `${__config.operators[__operator_name].fallback_name}.png`
const fallbackBuffer = await this.#alphaCompositer.process(fallbackFilename, extractedDir) const fallbackBuffer = await this.#alphaCompositer.process(fallbackFilename, extractedDir)
await write(fallbackBuffer, path.join(this.#operatorSourceFolder, this.#operatorName, fallbackFilename)) await write(fallbackBuffer, path.join(this.#operatorSourceFolder, __operator_name, fallbackFilename))
return { return {
dimensions, dimensions,
assetsJson assetsJson

View File

@@ -3,16 +3,12 @@ import fs from 'fs';
import sharp from "sharp"; import sharp from "sharp";
export default class Background { export default class Background {
#config
#rootDir
#backgroundFolder #backgroundFolder
#extractFolder #extractFolder
#files #files
constructor(config, rootDir) { constructor() {
this.#config = config; this.#backgroundFolder = path.join(__dirname, __config.folder.operator, '_share', __config.folder.background);
this.#rootDir = rootDir;
this.#backgroundFolder = path.join(rootDir, config.folder.operator, '_share', config.folder.background);
this.#extractFolder = path.join(this.#backgroundFolder, 'extracted'); this.#extractFolder = path.join(this.#backgroundFolder, 'extracted');
} }
@@ -60,7 +56,7 @@ export default class Background {
return { return {
filename: f.replace('_left', ''), filename: f.replace('_left', ''),
source: path.join(this.#backgroundFolder), source: path.join(this.#backgroundFolder),
target: path.join(publicAssetsDir, this.#config.folder.background) target: path.join(publicAssetsDir, __config.folder.background)
}; };
}) })
} }

View File

@@ -1,9 +1,9 @@
import path from 'path' import path from 'path'
import { read } from './yaml.js' import { read } from './yaml.js'
export default function (dirname) { export default function () {
return { return {
basedir: dirname, basedir: __dirname,
...read(path.join(dirname, 'config.yaml')) ...read(path.join(__dirname, 'config.yaml'))
} }
} }

View File

@@ -1,19 +1,19 @@
import path from 'path' import path from 'path'
import { writeSync, copy, rmdir } from './file.js' import { writeSync, copy, rmdir } from './file.js'
export default function (config, rootDir) { export default function () {
const targetFolder = path.join(rootDir, config.folder.release, config.folder.directory); const targetFolder = path.join(__dirname, __config.folder.release, __config.folder.directory);
const sourceFolder = path.join(rootDir, config.folder.operator); const sourceFolder = path.join(__dirname, __config.folder.operator);
rmdir(targetFolder); rmdir(targetFolder);
const filesToCopy = []; const filesToCopy = [];
const directoryJson = [] const directoryJson = []
for (const [key, value] of Object.entries(config.operators)) { for (const [key, value] of Object.entries(__config.operators)) {
filesToCopy.push(key); filesToCopy.push(key);
directoryJson.push(value); directoryJson.push(value);
} }
writeSync(JSON.stringify(directoryJson, null), path.join(targetFolder, "directory.json")) writeSync(JSON.stringify(directoryJson, null), path.join(targetFolder, "directory.json"))
filesToCopy.forEach((key) => { filesToCopy.forEach((key) => {
const filename = `${config.operators[key].filename}.json`; const filename = `${__config.operators[key].filename}.json`;
copy(path.join(sourceFolder, key, filename), path.join(targetFolder, filename)) copy(path.join(sourceFolder, key, filename), path.join(targetFolder, filename))
}) })
} }

View File

@@ -1,11 +1,9 @@
export default class EnvGenerator { export default class EnvGenerator {
#config
#assets #assets
#operatorConfig #operatorConfig
constructor(config, operatorName, assets) { constructor(assets) {
this.#config = config this.#operatorConfig = __config.operators[__operator_name]
this.#operatorConfig = config.operators[operatorName]
this.#assets = assets this.#assets = assets
} }
@@ -23,7 +21,7 @@ export default class EnvGenerator {
`VITE_IMAGE_WIDTH=2048`, `VITE_IMAGE_WIDTH=2048`,
`VITE_IMAGE_HEIGHT=2048`, `VITE_IMAGE_HEIGHT=2048`,
`VITE_BACKGROUND_FILES=${JSON.stringify(this.#assets.backgrounds)}`, `VITE_BACKGROUND_FILES=${JSON.stringify(this.#assets.backgrounds)}`,
`VITE_BACKGROUND_FOLDER=${this.#config.folder.background}`, `VITE_BACKGROUND_FOLDER=${__config.folder.background}`,
].join('\n') ].join('\n')
} }

View File

@@ -2,8 +2,8 @@ import path from 'path'
import { mkdir, copy } from './file.js' import { mkdir, copy } from './file.js'
import { appendMainConfig } from './append.js' import { appendMainConfig } from './append.js'
export default function init(operatorName, __dirname, extractedDir) { export default function init(extractedDir) {
mkdir(extractedDir) mkdir(extractedDir)
copy(path.join(__dirname, 'config', '_template.yaml'), path.join(__dirname, 'config', `${operatorName}.yaml`)) copy(path.join(__dirname, 'config', '_template.yaml'), path.join(__dirname, 'config', `${__operator_name}.yaml`))
appendMainConfig(operatorName, __dirname) appendMainConfig(__operator_name, __dirname)
} }

View File

@@ -13,14 +13,11 @@ export default class ProjectJson {
#rootDir #rootDir
#template #template
constructor(config, operatorName, __dirname, operatorShareFolder, assets) { constructor(operatorShareFolder, assets) {
this.#config = config this.#operatorSourceFolder = path.join(__dirname, __config.folder.operator)
this.#operatorName = operatorName
this.#operatorSourceFolder = path.join(__dirname, this.#config.folder.operator)
this.#operatorShareFolder = operatorShareFolder this.#operatorShareFolder = operatorShareFolder
this.#assets = assets this.#assets = assets
this.#rootDir = __dirname this.#template = this.#processYAML(readYAML(path.join(__dirname, 'config', '_project_json.yaml')))
this.#template = this.#processYAML(readYAML(path.join(this.#rootDir, 'config', '_project_json.yaml')))
} }
async load() { async load() {
@@ -32,7 +29,7 @@ export default class ProjectJson {
#getPath() { #getPath() {
// if exists, do not use the template // if exists, do not use the template
const defaultPath = path.join(this.#operatorSourceFolder, this.#operatorName, 'project.json') const defaultPath = path.join(this.#operatorSourceFolder, __operator_name, 'project.json')
if (exists(defaultPath)) { if (exists(defaultPath)) {
return defaultPath return defaultPath
} else { } else {
@@ -44,7 +41,7 @@ export default class ProjectJson {
this.#json = { this.#json = {
...this.#json, ...this.#json,
description: this.#template.description, description: this.#template.description,
title: this.#config.operators[this.#operatorName].title, title: __config.operators[__operator_name].title,
general: { general: {
...this.#json.general, ...this.#json.general,
localization: this.#template.localization, localization: this.#template.localization,
@@ -57,7 +54,7 @@ export default class ProjectJson {
} }
#processYAML(template) { #processYAML(template) {
const matcher = new Matcher(template.description, '${', '}', this.#config.operators[this.#operatorName]) const matcher = new Matcher(template.description, '${', '}', __config.operators[__operator_name])
if (matcher.match() !== null) { if (matcher.match() !== null) {
template.description = matcher.process() template.description = matcher.process()
} }
@@ -77,25 +74,25 @@ export default class ProjectJson {
{ {
key: "paddingleft", key: "paddingleft",
value: { value: {
value: this.#config.operators[this.#operatorName].viewport_left value: __config.operators[__operator_name].viewport_left
}, },
}, },
{ {
key: "paddingright", key: "paddingright",
value: { value: {
value: this.#config.operators[this.#operatorName].viewport_right value: __config.operators[__operator_name].viewport_right
}, },
}, },
{ {
key: "paddingtop", key: "paddingtop",
value: { value: {
value: this.#config.operators[this.#operatorName].viewport_top value: __config.operators[__operator_name].viewport_top
}, },
}, },
{ {
key: "paddingbottom", key: "paddingbottom",
value: { value: {
value: this.#config.operators[this.#operatorName].viewport_bottom value: __config.operators[__operator_name].viewport_bottom
}, },
}, },
] ]

View File

@@ -2,15 +2,6 @@ import path from 'path'
import { createServer, build } from 'vite' import { createServer, build } from 'vite'
export default class Vite { export default class Vite {
#config
#rootDir
#operatorName
constructor(config, operatorName, rootDir) {
this.#config = config
this.#operatorName = operatorName
this.#rootDir = rootDir
}
dev() { dev() {
; (async () => { ; (async () => {
@@ -28,17 +19,17 @@ export default class Vite {
get #viteConfig() { get #viteConfig() {
return { return {
base: "", base: "",
publicDir: path.resolve(this.#rootDir, this.#config.folder.release, this.#operatorName), publicDir: path.resolve(__dirname, __config.folder.release, __operator_name),
root: path.resolve(this.#rootDir), root: path.resolve(__dirname),
resolve: { resolve: {
alias: { alias: {
'@': path.resolve(this.#rootDir, './src'), '@': path.resolve(__dirname, './src'),
'!': path.resolve(this.#rootDir, this.#config.folder.operator, this.#operatorName), '!': path.resolve(__dirname, __config.folder.operator, __operator_name),
'#': path.resolve(this.#config.basedir, this.#config.folder.operator, this.#operatorName, `${this.#config.operators[this.#operatorName].filename}.json`), '#': path.resolve(__config.basedir, __config.folder.operator, __operator_name, `${__config.operators[__operator_name].filename}.json`),
}, },
}, },
build: { build: {
outDir: path.resolve(this.#rootDir, this.#config.folder.release, this.#operatorName), outDir: path.resolve(__dirname, __config.folder.release, __operator_name),
emptyOutDir: false, emptyOutDir: false,
chunkSizeWarningLimit: 10000, chunkSizeWarningLimit: 10000,
}, },

View File

@@ -13,17 +13,17 @@ import { appendReadme } from './libs/append.js'
import Background from './libs/background.js' import Background from './libs/background.js'
async function main() { async function main() {
const __dirname = path.dirname(fileURLToPath(import.meta.url)) global.__dirname = path.dirname(fileURLToPath(import.meta.url))
const config = getConfig(__dirname) global.__config = getConfig()
const op = process.argv[2] const op = process.argv[2]
let OPERATOR_NAMES = process.argv.slice(3); let OPERATOR_NAMES = process.argv.slice(3);
const background = new Background(config, __dirname) const background = new Background()
await background.process() await background.process()
const backgrounds = ['operator_bg.png', ...background.files] const backgrounds = ['operator_bg.png', ...background.files]
directory(config, __dirname) directory()
/** /**
* Skip all, no need for OPERATOR_NAME * Skip all, no need for OPERATOR_NAME
@@ -34,7 +34,7 @@ async function main() {
case 'directory': case 'directory':
process.exit(0) process.exit(0)
case 'build-all': case 'build-all':
for (const [key, _] of Object.entries(config.operators)) { for (const [key, _] of Object.entries(__config.operators)) {
OPERATOR_NAMES.push(key) OPERATOR_NAMES.push(key)
} }
default: default:
@@ -44,8 +44,9 @@ async function main() {
assert(OPERATOR_NAMES.length !== 0, 'Please set the operator name.') assert(OPERATOR_NAMES.length !== 0, 'Please set the operator name.')
for (const OPERATOR_NAME of OPERATOR_NAMES) { for (const OPERATOR_NAME of OPERATOR_NAMES) {
const OPERATOR_SOURCE_FOLDER = path.join(__dirname, config.folder.operator) global.__operator_name = OPERATOR_NAME
const OPERATOR_RELEASE_FOLDER = path.join(__dirname, config.folder.release, OPERATOR_NAME) const OPERATOR_SOURCE_FOLDER = path.join(__dirname, __config.folder.operator)
const OPERATOR_RELEASE_FOLDER = path.join(__dirname, __config.folder.release, OPERATOR_NAME)
const SHOWCASE_PUBLIC_ASSSETS_FOLDER = path.join(OPERATOR_RELEASE_FOLDER, "assets") const SHOWCASE_PUBLIC_ASSSETS_FOLDER = path.join(OPERATOR_RELEASE_FOLDER, "assets")
const EXTRACTED_FOLDER = path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, 'extracted') const EXTRACTED_FOLDER = path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, 'extracted')
const OPERATOR_SHARE_FOLDER = path.join(OPERATOR_SOURCE_FOLDER, '_share') const OPERATOR_SHARE_FOLDER = path.join(OPERATOR_SOURCE_FOLDER, '_share')
@@ -57,10 +58,10 @@ async function main() {
*/ */
switch (op) { switch (op) {
case 'init': case 'init':
init(OPERATOR_NAME, __dirname, EXTRACTED_FOLDER) init(EXTRACTED_FOLDER)
process.exit(0) process.exit(0)
case 'readme': case 'readme':
appendReadme(config, OPERATOR_NAME, __dirname) appendReadme()
process.exit(0) process.exit(0)
default: default:
break break
@@ -68,16 +69,16 @@ async function main() {
rmdir(OPERATOR_RELEASE_FOLDER) rmdir(OPERATOR_RELEASE_FOLDER)
const projectJson = new ProjectJson(config, OPERATOR_NAME, __dirname, OPERATOR_SHARE_FOLDER, { const projectJson = new ProjectJson(OPERATOR_SHARE_FOLDER, {
backgrounds backgrounds
}) })
projectJson.load().then((content) => { projectJson.load().then((content) => {
write(JSON.stringify(content, null, 2), path.join(OPERATOR_RELEASE_FOLDER, 'project.json')) write(JSON.stringify(content, null, 2), path.join(OPERATOR_RELEASE_FOLDER, 'project.json'))
}) })
const assetsProcessor = new AssetsProcessor(config, OPERATOR_NAME, __dirname) const assetsProcessor = new AssetsProcessor()
assetsProcessor.process(SHOWCASE_PUBLIC_ASSSETS_FOLDER, EXTRACTED_FOLDER).then((content) => { assetsProcessor.process(EXTRACTED_FOLDER).then((content) => {
write(JSON.stringify(content.assetsJson, null), path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, `${config.operators[OPERATOR_NAME].filename}.json`)) write(JSON.stringify(content.assetsJson, null), path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, `${__config.operators[OPERATOR_NAME].filename}.json`))
}) })
const filesToCopy = [ const filesToCopy = [
@@ -89,16 +90,16 @@ async function main() {
}, },
{ {
filename: 'operator_bg.png', filename: 'operator_bg.png',
source: path.join(OPERATOR_SHARE_FOLDER, config.folder.background), source: path.join(OPERATOR_SHARE_FOLDER, __config.folder.background),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER, config.folder.background) target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER, __config.folder.background)
}, },
{ {
filename: `${config.operators[OPERATOR_NAME].logo}.png`, filename: `${__config.operators[OPERATOR_NAME].logo}.png`,
source: path.join(OPERATOR_SHARE_FOLDER, 'logo'), source: path.join(OPERATOR_SHARE_FOLDER, 'logo'),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER) target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER)
}, },
{ {
filename: `${config.operators[OPERATOR_NAME].fallback_name}.png`, filename: `${__config.operators[OPERATOR_NAME].fallback_name}.png`,
source: path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME), source: path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER) target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER)
}, },
@@ -108,14 +109,14 @@ async function main() {
}) })
const envPath = path.join(__dirname, '.env') const envPath = path.join(__dirname, '.env')
writeSync((new EnvGenerator(config, OPERATOR_NAME, { writeSync((new EnvGenerator({
backgrounds backgrounds
})).generate(), envPath) })).generate(), envPath)
/** /**
* dev: run dev server * dev: run dev server
* build: build assets * build: build assets
*/ */
const vite = new Vite(config, OPERATOR_NAME, __dirname) const vite = new Vite(__config, OPERATOR_NAME, __dirname)
switch (op) { switch (op) {
case 'dev': case 'dev':
vite.dev() vite.dev()