Skip to content

Commit

Permalink
[1.x] Introduce clean-orphaned-assets binary (#251)
Browse files Browse the repository at this point in the history
* Introduce script to purge orphaned assets

* Write to stderr

* Adopt "clean" naming
  • Loading branch information
timacdonald authored Dec 14, 2023
1 parent 6450b9f commit b77e7ad
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
91 changes: 91 additions & 0 deletions bin/clear-orphaned-assets.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env node

import { readFileSync, readdirSync, unlinkSync } from 'fs'
import { dirname } from 'path'

/*
* Argv helpers.
*/

const argument = (name, fallback) => {
const index = process.argv.findIndex(argument => argument.startsWith(`--${name}=`))

return index === -1
? fallback()
: process.argv[index].substring(`--${name}=`.length)
}

const option = (name) => process.argv.includes(`--${name}`)

/*
* Configuration.
*/

const dryRun = option(`dry-run`)
const quiet = option(`quiet`)
const wantsSsr = option('ssr')
const manifestPath = argument(`manifest`, () => wantsSsr ? `./bootstrap/ssr/ssr-manifest.json` : `./public/build/manifest.json`)
const assetsDirectory = argument(`assets`, () => `${dirname(manifestPath)}/assets`)

/*
* Helpers.
*/
const info = quiet ? (() => undefined) : console.log
const error = quiet ? (() => undefined) : console.error

/*
* Clean.
*/

const main = () => {
info(`Reading manifest [${manifestPath}].`)

const manifest = JSON.parse(readFileSync(manifestPath).toString())

const manifestKeys = Object.keys(manifest)

const isSsr = Array.isArray(manifest[manifestKeys[0]])

if (wantsSsr && ! isSsr) {
error('Did not expected SSR manifest.')

process.exit(1)
}

isSsr
? info(`SSR manifest found.`)
: info(`Non-SSR manifest found.`)

const manifestAssets = isSsr
? manifestKeys.flatMap(key => manifest[key])
: manifestKeys.map(key => manifest[key].file)

info(`Verify assets in [${assetsDirectory}].`)

const allAssets = readdirSync(assetsDirectory, { withFileTypes: true })

const orphanedAssets = allAssets.filter(file => file.isFile())
.filter(file => manifestAssets.findIndex(asset => asset.endsWith(`/${file.name}`)) === -1)

if (orphanedAssets.length === 0) {
info(`No ophaned assets found.`)
} else {
orphanedAssets.length === 1
? info(`[${orphanedAssets.length}] orphaned asset found.`)
: info(`[${orphanedAssets.length}] orphaned assets found.`)

orphanedAssets.forEach(asset => {
const path = `${assetsDirectory}/${asset.name}`

dryRun
? info(`Orphaned asset [${path}] would be removed.`)
: info(`Removing orphaned asset [${path}].`)

if (! dryRun) {
unlinkSync(path)
}
})
}
}

main()
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
"/dist",
"/inertia-helpers"
],
"bin": {
"clean-orphaned-assets": "bin/clean.js"
},
"scripts": {
"build": "npm run build-plugin && npm run build-inertia-helpers",
"build-plugin": "rm -rf dist && npm run build-plugin-types && npm run build-plugin-esm && cp src/dev-server-index.html dist/",
Expand Down

0 comments on commit b77e7ad

Please sign in to comment.