pages/fullcalendar-main/tests/scripts/generate-index-iife.js
2024-03-06 14:33:17 +01:00

79 lines
2.2 KiB
JavaScript

import { join as joinPaths } from 'path'
import { fileURLToPath } from 'url'
import { readFile } from 'fs/promises'
import handlebars from 'handlebars'
import { execCapture } from '@fullcalendar-scripts/standard/utils/exec'
/*
TODO: don't always display prefix when doing config.log()
TODO: don't reinit rollup watcher on ANY change. Slow when not using fdescribe technique.
*/
const thisPkgDir = joinPaths(fileURLToPath(import.meta.url), '../..')
const templatePath = joinPaths(thisPkgDir, 'src/index.global.js.tpl')
/*
HACK: watch the transpiled directory, so bundling waits until tsc completes
*/
export function getWatchPaths(config) {
const transpileDir = joinPaths(config.pkgDir, 'dist/.tsout')
return [transpileDir, templatePath]
}
export default async function(config) {
const srcDir = joinPaths(config.pkgDir, 'src')
// mindepth 2 means subdirectories
let testPaths = await execCapture(
'find . -mindepth 2 -type f \\( -name \'*.ts\' -or -name \'*.tsx\' \\) -print0 | ' +
'xargs -0 grep -E "(fdescribe|fit)\\("',
{ cwd: srcDir },
).then(
(stdout) => strToLines(stdout).map((line) => line.trim().split(':')[0]),
() => {
return [] // TODO: somehow look at stderr string. if empty, simply no testPaths. if populated, real error
},
)
// the `find` command reports multiple matches per file. consolidate duplicates
testPaths = uniqueStrs(testPaths)
if (testPaths.length) {
config.log(
'Only test files that have fdescribe/fit:\n' +
testPaths.join('\n'),
)
} else {
// mindepth 2 means subdirectories
testPaths = strToLines((await execCapture(
'find . -mindepth 2 -type f \\( -name \'*.ts\' -or -name \'*.tsx\' \\)',
{ cwd: srcDir },
)))
config.log(`Using all ${testPaths.length} test files`)
}
const extensionlessTestPaths = testPaths.map((testPath) => testPath.replace(/\.tsx?$/, ''))
const templateText = await readFile(templatePath, 'utf8')
const template = handlebars.compile(templateText)
const code = template({ extensionlessTestPaths })
return code
}
function uniqueStrs(strs) {
const map = {}
for (const str of strs) {
map[str] = true
}
return Object.keys(map)
}
function strToLines(str) {
str = str.trim()
return str ? str.split('\n') : []
}