feat(runner): update build-all command

This commit is contained in:
Haoyu Xu
2023-01-20 14:51:24 -05:00
parent 75d42ff271
commit 3791a77852
6 changed files with 146 additions and 155 deletions

1
.gitignore vendored
View File

@@ -37,4 +37,3 @@ dist-ssr
*.njsproj
*.sln
*.sw?
node_modules

View File

@@ -9,28 +9,22 @@ export default class EnvGenerator {
this.#assets = assets
}
async generate() {
return await this.#promise()
}
#promise() {
return new Promise((resolve, reject) => {
resolve([
`VITE_TITLE="${this.#operatorConfig.title}"`,
`VITE_FILENAME=${this.#operatorConfig.filename.replace('#', '%23')}`,
`VITE_LOGO_FILENAME=${this.#operatorConfig.logo}`,
`VITE_FALLBACK_FILENAME=${this.#operatorConfig.fallback_name.replace('#', '%23')}`,
`VITE_VIEWPORT_LEFT=${this.#operatorConfig.viewport_left}`,
`VITE_VIEWPORT_RIGHT=${this.#operatorConfig.viewport_right}`,
`VITE_VIEWPORT_TOP=${this.#operatorConfig.viewport_top}`,
`VITE_VIEWPORT_BOTTOM=${this.#operatorConfig.viewport_bottom}`,
`VITE_INVERT_FILTER=${this.#operatorConfig.invert_filter}`,
`VITE_IMAGE_WIDTH=2048`,
`VITE_IMAGE_HEIGHT=2048`,
`VITE_BACKGROUND_FILES=${JSON.stringify(this.#assets.backgrounds)}`,
`VITE_BACKGROUND_FOLDER=${this.#config.folder.background}`,
].join('\n'))
})
generate() {
return [
`VITE_TITLE="${this.#operatorConfig.title}"`,
`VITE_FILENAME=${this.#operatorConfig.filename.replace('#', '%23')}`,
`VITE_LOGO_FILENAME=${this.#operatorConfig.logo}`,
`VITE_FALLBACK_FILENAME=${this.#operatorConfig.fallback_name.replace('#', '%23')}`,
`VITE_VIEWPORT_LEFT=${this.#operatorConfig.viewport_left}`,
`VITE_VIEWPORT_RIGHT=${this.#operatorConfig.viewport_right}`,
`VITE_VIEWPORT_TOP=${this.#operatorConfig.viewport_top}`,
`VITE_VIEWPORT_BOTTOM=${this.#operatorConfig.viewport_bottom}`,
`VITE_INVERT_FILTER=${this.#operatorConfig.invert_filter}`,
`VITE_IMAGE_WIDTH=2048`,
`VITE_IMAGE_HEIGHT=2048`,
`VITE_BACKGROUND_FILES=${JSON.stringify(this.#assets.backgrounds)}`,
`VITE_BACKGROUND_FOLDER=${this.#config.folder.background}`,
].join('\n')
}
}

View File

@@ -1,26 +0,0 @@
import { execSync } from 'child_process'
import { createServer, build } from 'vite'
export function buildAll(config) {
for (const [key, _] of Object.entries(config.operators)) {
if (key.startsWith('_')) break;
console.log(execSync(`node runner.js build ${key}`).toString());
}
}
export function runDev(rootDir) {
; (async () => {
const server = await createServer({
root: rootDir,
})
await server.listen()
server.printUrls()
})()
}
export async function runBuild(rootDir) {
await build({
root: rootDir,
})
}

48
libs/vite.js Normal file
View File

@@ -0,0 +1,48 @@
import path from 'path'
import { createServer, build } from 'vite'
export default class Vite {
#config
#rootDir
#operatorName
constructor(config, operatorName, rootDir) {
this.#config = config
this.#operatorName = operatorName
this.#rootDir = rootDir
}
dev() {
; (async () => {
const server = await createServer(this.#viteConfig)
await server.listen()
server.printUrls()
})()
}
async build() {
await build(this.#viteConfig)
}
get #viteConfig() {
return {
base: "",
publicDir: path.resolve(this.#rootDir, this.#config.folder.release, this.#operatorName),
root: path.resolve(this.#rootDir),
resolve: {
alias: {
'@': path.resolve(this.#rootDir, './src'),
'!': path.resolve(this.#rootDir, this.#config.folder.operator, this.#operatorName),
'#': path.resolve(this.#config.basedir, this.#config.folder.operator, this.#operatorName, `${this.#config.operators[this.#operatorName].filename}.json`),
},
},
build: {
outDir: path.resolve(this.#rootDir, this.#config.folder.release, this.#operatorName),
emptyOutDir: false,
chunkSizeWarningLimit: 10000,
},
}
}
}

163
runner.js
View File

@@ -4,46 +4,49 @@ import { fileURLToPath } from 'url'
import getConfig from './libs/config.js'
import ProjectJson from './libs/project_json.js'
import EnvGenerator from './libs/env_generator.js'
import { write, rmdir, copy } from './libs/file.js'
import { write, rmdir, copy, writeSync, rm } from './libs/file.js'
import AssetsProcessor from './libs/assets_processor.js'
import init from './libs/initializer.js'
import directory from './libs/directory.js'
import { buildAll, runDev, runBuild } from './libs/exec.js'
import Vite from './libs/vite.js'
import { appendReadme } from './libs/append.js'
import Background from './libs/background.js'
async function main() {
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const config = getConfig(__dirname)
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const config = getConfig(__dirname)
const op = process.argv[2]
const OPERATOR_NAME = process.argv[3];
const op = process.argv[2]
let OPERATOR_NAMES = process.argv.slice(3);
const background = new Background(config, __dirname)
await background.process()
const background = new Background(config, __dirname)
await background.process()
const backgrounds = ['operator_bg.png', ...background.files]
/**
* Skip all, no need for OPERATOR_NAME
* build-all: build all assets
* directory: build directory.json
*/
switch (op) {
case 'build-all':
buildAll(config)
process.exit(0)
case 'directory':
directory(config, __dirname)
process.exit(0)
default:
break
}
directory(config, __dirname)
assert(OPERATOR_NAME !== undefined, 'Please set the operator name.')
/**
* Skip all, no need for OPERATOR_NAME
* build-all: build all assets
* directory: build directory.json
*/
switch (op) {
case 'directory':
process.exit(0)
case 'build-all':
for (const [key, _] of Object.entries(config.operators)) {
OPERATOR_NAMES.push(key)
}
default:
break
}
assert(OPERATOR_NAMES.length !== 0, 'Please set the operator name.')
for (const OPERATOR_NAME of OPERATOR_NAMES) {
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_FOLDER = path.join(__dirname, "public")
const SHOWCASE_PUBLIC_ASSSETS_FOLDER = path.join(SHOWCASE_PUBLIC_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 OPERATOR_SHARE_FOLDER = path.join(OPERATOR_SOURCE_FOLDER, '_share')
@@ -53,81 +56,79 @@ async function main() {
* readme: append a new line to README.md
*/
switch (op) {
case 'init':
init(OPERATOR_NAME, __dirname, EXTRACTED_FOLDER)
process.exit(0)
case 'readme':
appendReadme(config, OPERATOR_NAME, __dirname)
process.exit(0)
default:
break
case 'init':
init(OPERATOR_NAME, __dirname, EXTRACTED_FOLDER)
process.exit(0)
case 'readme':
appendReadme(config, OPERATOR_NAME, __dirname)
process.exit(0)
default:
break
}
rmdir(OPERATOR_RELEASE_FOLDER)
const backgrounds = ['operator_bg.png', ...background.files]
const projectJson = new ProjectJson(config, OPERATOR_NAME, __dirname, OPERATOR_SHARE_FOLDER, {
backgrounds
backgrounds
})
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)
assetsProcessor.process(SHOWCASE_PUBLIC_ASSSETS_FOLDER, EXTRACTED_FOLDER).then((content) => {
write(JSON.stringify(content.assetsJson, null), path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, `${config.operators[OPERATOR_NAME].filename}.json`))
})
const envGenerator = new EnvGenerator(config, OPERATOR_NAME, {
backgrounds
})
envGenerator.generate().then((content) => {
write(content, path.join(__dirname, '.env'))
write(JSON.stringify(content.assetsJson, null), path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME, `${config.operators[OPERATOR_NAME].filename}.json`))
})
const filesToCopy = [
...background.getFilesToCopy(SHOWCASE_PUBLIC_ASSSETS_FOLDER),
{
filename: 'preview.jpg',
source: path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME),
target: path.join(OPERATOR_RELEASE_FOLDER)
},
{
filename: 'operator_bg.png',
source: path.join(OPERATOR_SHARE_FOLDER, config.folder.background),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER, config.folder.background)
},
{
filename: `${config.operators[OPERATOR_NAME].logo}.png`,
source: path.join(OPERATOR_SHARE_FOLDER, 'logo'),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER)
},
{
filename: `${config.operators[OPERATOR_NAME].fallback_name}.png`,
source: path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER)
},
...background.getFilesToCopy(SHOWCASE_PUBLIC_ASSSETS_FOLDER),
{
filename: 'preview.jpg',
source: path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME),
target: path.join(OPERATOR_RELEASE_FOLDER)
},
{
filename: 'operator_bg.png',
source: path.join(OPERATOR_SHARE_FOLDER, config.folder.background),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER, config.folder.background)
},
{
filename: `${config.operators[OPERATOR_NAME].logo}.png`,
source: path.join(OPERATOR_SHARE_FOLDER, 'logo'),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER)
},
{
filename: `${config.operators[OPERATOR_NAME].fallback_name}.png`,
source: path.join(OPERATOR_SOURCE_FOLDER, OPERATOR_NAME),
target: path.join(SHOWCASE_PUBLIC_ASSSETS_FOLDER)
},
]
filesToCopy.forEach(async (file) => {
await copy(path.join(file.source, file.filename), path.join(file.target, file.filename))
filesToCopy.forEach((file) => {
copy(path.join(file.source, file.filename), path.join(file.target, file.filename))
})
const envPath = path.join(__dirname, '.env')
writeSync((new EnvGenerator(config, OPERATOR_NAME, {
backgrounds
})).generate(), envPath)
/**
* dev: run dev server
* build: build assets
*/
* dev: run dev server
* build: build assets
*/
const vite = new Vite(config, OPERATOR_NAME, __dirname)
switch (op) {
case 'dev':
runDev(__dirname)
break
case 'build':
await runBuild(__dirname)
case 'generate':
default:
rmdir(SHOWCASE_PUBLIC_FOLDER)
break
case 'dev':
vite.dev()
break
case 'build':
case 'build-all':
await vite.build()
rm(envPath)
break
default:
break
}
}
}
main();

View File

@@ -1,25 +0,0 @@
import { defineConfig } from 'vite'
import path from 'path'
import getConfig from './libs/config.js'
const data = {
config: getConfig(__dirname),
OPERATOR_NAME: process.argv[3],
}
// https://vitejs.dev/config/
export default defineConfig({
base: "",
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'!': path.resolve(data.config.basedir, data.config.folder.operator, data.OPERATOR_NAME),
'#': path.resolve(data.config.basedir, data.config.folder.operator, data.OPERATOR_NAME, `${data.config.operators[data.OPERATOR_NAME].filename}.json`),
},
},
build: {
outDir: path.resolve(data.config.basedir, data.config.folder.release, data.OPERATOR_NAME),
emptyOutDir: false,
chunkSizeWarningLimit: 10000,
},
})