A system for building static webapps
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix(cli): issue where old build files are retained

+74 -2
+31 -1
deno.lock
··· 2 2 "version": "5", 3 3 "specifiers": { 4 4 "jsr:@b-fuze/deno-dom@~0.1.56": "0.1.56", 5 + "jsr:@cliffy/ansi@1.0.0": "1.0.0", 6 + "jsr:@luca/esbuild-deno-loader@~0.11.1": "0.11.1", 5 7 "jsr:@rodney/parsedown@^1.4.3": "1.4.3", 6 8 "jsr:@std/assert@^1.0.17": "1.0.19", 7 9 "jsr:@std/assert@^1.0.19": "1.0.19", 8 10 "jsr:@std/async@^1.1.0": "1.2.0", 11 + "jsr:@std/bytes@^1.0.2": "1.0.6", 9 12 "jsr:@std/data-structures@^1.0.10": "1.0.10", 10 13 "jsr:@std/dotenv@~0.225.6": "0.225.6", 14 + "jsr:@std/encoding@^1.0.5": "1.0.10", 15 + "jsr:@std/fmt@^1.0.9": "1.0.9", 11 16 "jsr:@std/fs@^1.0.23": "1.0.23", 12 17 "jsr:@std/html@^1.0.5": "1.0.5", 13 18 "jsr:@std/internal@^1.0.12": "1.0.12", 19 + "jsr:@std/path@^1.0.6": "1.1.4", 14 20 "jsr:@std/path@^1.1.4": "1.1.4", 15 21 "jsr:@std/semver@^1.0.8": "1.0.8", 16 22 "jsr:@std/testing@^1.0.17": "1.0.17", ··· 33 39 "@b-fuze/deno-dom@0.1.56": { 34 40 "integrity": "8030e2dc1d8750f1682b53462ab893d9c3470f2287feecbe22f44a88c54ab148" 35 41 }, 42 + "@cliffy/ansi@1.0.0": { 43 + "integrity": "987008f74e50aa72cc1517ffccc769711734a14927bc4599e052efe1b9a840e2", 44 + "dependencies": [ 45 + "jsr:@std/fmt" 46 + ] 47 + }, 48 + "@luca/esbuild-deno-loader@0.11.1": { 49 + "integrity": "dc020d16d75b591f679f6b9288b10f38bdb4f24345edb2f5732affa1d9885267", 50 + "dependencies": [ 51 + "jsr:@std/bytes", 52 + "jsr:@std/encoding", 53 + "jsr:@std/path@^1.0.6" 54 + ] 55 + }, 36 56 "@rodney/parsedown@1.4.3": { 37 57 "integrity": "fd5cbee4554286fc835a0157f7cb28d2c4de6ac82ed62b6b2f91291eaa9fbb2f" 38 58 }, ··· 45 65 "@std/async@1.2.0": { 46 66 "integrity": "c059c6f6d95ca7cc012ae8e8d7164d1697113d54b0b679e4372b354b11c2dee5" 47 67 }, 68 + "@std/bytes@1.0.6": { 69 + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" 70 + }, 48 71 "@std/data-structures@1.0.10": { 49 72 "integrity": "f574f86b0e07c69b9edc555fcc814b57d29258bad39fd5a34ba8a80ecf033cfe" 50 73 }, 51 74 "@std/dotenv@0.225.6": { 52 75 "integrity": "1d6f9db72f565bd26790fa034c26e45ecb260b5245417be76c2279e5734c421b" 53 76 }, 77 + "@std/encoding@1.0.10": { 78 + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" 79 + }, 80 + "@std/fmt@1.0.9": { 81 + "integrity": "2487343e8899fb2be5d0e3d35013e54477ada198854e52dd05ed0422eddcabe0" 82 + }, 54 83 "@std/fs@1.0.23": { 55 84 "integrity": "3ecbae4ce4fee03b180fa710caff36bb5adb66631c46a6460aaad49515565a37", 56 85 "dependencies": [ 57 - "jsr:@std/path" 86 + "jsr:@std/internal", 87 + "jsr:@std/path@^1.1.4" 58 88 ] 59 89 }, 60 90 "@std/html@1.0.5": {
+7 -1
packages/cli/commands/build/extension.ts
··· 5 5 import esbuild from 'esbuild' 6 6 import { logError, logInfo, logSuccess } from '../../utils/ui.ts' 7 7 import type { CivilityConfig } from '../../utils/config.ts' 8 - import { copyStaticFiles, wrapBuildOperation } from '../../utils/build.ts' 8 + import { cleanOldChunks, copyStaticFiles, wrapBuildOperation } from '../../utils/build.ts' 9 9 10 10 type Platform = 'chrome' | 'firefox' 11 11 ··· 222 222 // Ensure output directory exists 223 223 await Deno.mkdir(outDir, { recursive: true }) 224 224 225 + // Clean up old chunk files from previous builds 226 + await cleanOldChunks(outDir) 227 + 225 228 // Read and transform manifest 226 229 const manifestPath = join(sourceDir, 'manifest.json') 227 230 if (!await exists(manifestPath)) { ··· 318 321 319 322 // Ensure output directory exists 320 323 await Deno.mkdir(outDir, { recursive: true }) 324 + 325 + // Clean up old chunk files from previous builds 326 + await cleanOldChunks(outDir) 321 327 322 328 // Initial build of manifest and static files 323 329 await buildManifestAndStatic(sourceDir, staticDir, outDir, platform)
+7
packages/cli/commands/build/pwa.ts
··· 2 2 import { denoPlugins } from '@luca/esbuild-deno-loader' 3 3 import { resolve } from '@std/path' 4 4 import esbuild from 'esbuild' 5 + import { cleanOldChunks } from '../../utils/build.ts' 5 6 import { logError, logInfo, logSuccess, logWarning } from '../../utils/ui.ts' 6 7 import type { CivilityConfig } from '../../utils/config.ts' 7 8 ··· 83 84 meta: BuildMeta, 84 85 ): Promise<void> { 85 86 try { 87 + const outdir = buildOptions.outdir as string 88 + await cleanOldChunks(outdir) 89 + 86 90 const start = performance.now() 87 91 const result = await esbuild.build(buildOptions) 88 92 const assets = result.metafile ··· 106 110 meta: BuildMeta, 107 111 ): Promise<esbuild.BuildContext> { 108 112 try { 113 + const outdir = buildOptions.outdir as string 114 + await cleanOldChunks(outdir) 115 + 109 116 const buildWithCallback: esbuild.BuildOptions = { 110 117 ...buildOptions, 111 118 plugins: [
+29
packages/cli/utils/build.ts
··· 120 120 export function logBuildStart(input: string, output: string): void { 121 121 logInfo(`Building from ${theme.bold(input)} to ${theme.bold(output)}`) 122 122 } 123 + 124 + /** 125 + * Cleans up old esbuild-generated files from the output directory. 126 + * Removes all .js, .css, and .map files while preserving other files 127 + * like static assets, HTML, JSON, icons, images, etc. 128 + */ 129 + export async function cleanOldChunks(outdir: string): Promise<number> { 130 + if (!await exists(outdir)) { 131 + return 0 132 + } 133 + 134 + let cleanedCount = 0 135 + 136 + for await (const entry of Deno.readDir(outdir)) { 137 + if (entry.isFile) { 138 + const ext = entry.name.split('.').pop() 139 + if (ext === 'js' || ext === 'css' || ext === 'map') { 140 + await Deno.remove(`${outdir}/${entry.name}`) 141 + cleanedCount++ 142 + } 143 + } 144 + } 145 + 146 + if (cleanedCount > 0) { 147 + logInfo(`Cleaned ${cleanedCount} old build file(s)`) 148 + } 149 + 150 + return cleanedCount 151 + }