4chan-XZ/tools/rollup.js
2023-04-22 05:40:54 +02:00

117 lines
3.0 KiB
JavaScript

import { rollup } from 'rollup'
import typescript from '@rollup/plugin-typescript'
import setupFileInliner from './rollup-plugin-inline-file.js'
import { dirname, resolve } from 'path'
import { fileURLToPath } from 'url'
import generateMetadata from '../src/meta/metadata.js'
import { copyFile, readFile, writeFile } from 'fs/promises'
import importBase64 from './rollup-plugin-base64.js'
import generateManifestJson from '../src/meta/manifestJson.js'
const __dirname = dirname(fileURLToPath(import.meta.url))
const buildDir = resolve(__dirname, '../dist/')
let channel = ''
if (process.argv.includes('-beta')) {
channel = '-beta'
} else if (process.argv.includes('-noupdate')) {
channel = '-noupdate'
}
;(async () => {
const packageJson = JSON.parse(
await readFile(resolve(__dirname, '../package.json'), 'utf-8')
)
const metadata = await generateMetadata(packageJson, channel)
const license = await readFile(resolve(__dirname, '../LICENSE'), 'utf8')
const version = JSON.parse(
await readFile(resolve(__dirname, '../version.json'), 'utf-8')
)
const inlineFile = await setupFileInliner(packageJson)
const bundle = await rollup({
input: resolve(__dirname, '../src/main/Main.js'),
plugins: [
typescript(),
inlineFile({
include: ['**/*.html', '**/*.css'],
}),
importBase64({
include: [
'**/*.png',
'**/*.gif',
'**/*.wav',
'**/*.woff',
'**/*.woff2',
],
}),
inlineFile({
include: '**/package.json',
wrap: false,
transformer(input) {
const data = JSON.parse(input)
return `export default ${JSON.stringify(data.meta, undefined, 1)};`
},
}),
inlineFile({
include: '**/*.json',
exclude: '**/package.json',
wrap: false,
transformer(input) {
return `export default ${input};`
},
}),
],
})
/** @type {import('rollup').OutputOptions} */
const sharedBundleOpts = {
format: 'iife',
generatedCode: {
// needed for possible circular dependencies
constBindings: false,
},
// Can't be none as long as the root file defined exports
// exports: 'none',
}
// user script
await bundle.write({
...sharedBundleOpts,
banner: metadata + license,
// file: '../builds/test/rollupOutput.js',
file: resolve(buildDir, `${packageJson.meta.path}${channel}.user.js`),
})
// chrome extension
const crxDir = resolve(buildDir, 'crx')
await bundle.write({
...sharedBundleOpts,
banner: license,
file: resolve(crxDir, 'script.js'),
})
await copyFile(
resolve(__dirname, '../src/meta/eventPage.js'),
resolve(crxDir, 'eventPage.js')
)
writeFile(
resolve(crxDir, 'manifest.json'),
generateManifestJson(packageJson, version, channel)
)
for (const file of ['icon16.png', 'icon48.png', 'icon128.png']) {
await copyFile(
resolve(__dirname, '../src/meta/', file),
resolve(crxDir, file)
)
}
})()