diff --git a/.gitignore b/.gitignore index 1566b98..98bc422 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,3 @@ dist-ssr *.njsproj *.sln *.sw? -node_modules \ No newline at end of file diff --git a/libs/env_generator.js b/libs/env_generator.js index c10f24f..9851a5d 100644 --- a/libs/env_generator.js +++ b/libs/env_generator.js @@ -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') } } \ No newline at end of file diff --git a/libs/exec.js b/libs/exec.js deleted file mode 100644 index 19dec14..0000000 --- a/libs/exec.js +++ /dev/null @@ -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, - }) -} \ No newline at end of file diff --git a/libs/vite.js b/libs/vite.js new file mode 100644 index 0000000..f660d75 --- /dev/null +++ b/libs/vite.js @@ -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, + }, + } + } + +} \ No newline at end of file diff --git a/runner.js b/runner.js index 120afac..b4252fd 100644 --- a/runner.js +++ b/runner.js @@ -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(); \ No newline at end of file diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index fe441e5..0000000 --- a/vite.config.js +++ /dev/null @@ -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, - }, -})