diff --git a/build_fast.ts b/build_fast.ts new file mode 100644 index 0000000..f9c4845 --- /dev/null +++ b/build_fast.ts @@ -0,0 +1,49 @@ +import { $, build } from 'bun'; +import { readdirSync, statSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import chalk from 'chalk'; + +function getFiles(baseDir: string, dir?: string, filesArr?: string[]) { + dir = dir ?? baseDir; + filesArr = filesArr ?? []; + const files = readdirSync(dir); + for (const file of files) { + const name = join(dir, file); + if (statSync(name).isDirectory()) { + getFiles(baseDir, name, filesArr); + } else { + filesArr.push(name); + } + } + return filesArr; +} + +console.log(chalk.cyan('Removing old build artifacts...\n')); +await $`rm -rf ./public/resources/scripts/ ./public/assets.json ./public/sw.js ./public/sw-full.js`.quiet(); + +console.log(chalk.cyan('Bundling TypeScript and modules...\n')); +const srcFilesArr = getFiles(join(import.meta.dir, 'src')); +await build({ + entrypoints: srcFilesArr, + outdir: './public/', + target: 'browser', + root: './src/', + minify: { + syntax: true, + whitespace: true, + identifiers: false, + }, +}); + +console.log(chalk.cyan('Generating assets list...\n')); +const publicDir = join(import.meta.dir, 'public'); +writeFileSync( + join(publicDir, 'assets.json'), + JSON.stringify( + getFiles(publicDir).map((asset) => { + return asset.replace(new RegExp(`^${publicDir}`), '').replace(/\/index\.html$/, '/'); + }) + ) +); + +console.log(chalk.green('Build complete!\n')); diff --git a/package.json b/package.json index 4e860bf..cc616dd 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "dev": "NODE_ENV=development DEBUG=app:* bun --hot run ./index.ts", "lint": "eslint ./src/", "lint:fix": "eslint --fix ./src/", - "build": "bun run ./build.ts" + "build": "bun run ./build.ts", + "build:fast": "bun run ./build_fast.ts" }, "dependencies": { "chalk": "^5.3.0",