import type { BuildContext } from '@genesislcap/build-kit'; import { rm, run, resolveBin } from '@genesislcap/build-kit'; import consola from 'consola'; import { generateReactWrappers } from './react-wrapper-generator'; import { resolveCEMConfigArg } from './resolve-cem-config-path'; export default async (ctx: BuildContext) => { const { dirs: { cwd }, cli: { isDev, isBuild, options }, config: { clean, copyAssets }, enable: { apiExtractor, cemAnalyzer }, } = ctx; if (clean) { await rm(['dist', 'tsconfig.tsbuildinfo']); } if (Array.isArray(copyAssets)) { const copyfiles = await resolveBin('copyfiles'); copyAssets.forEach((glob) => { run(cwd, `${copyfiles} --verbose --up 1 src/${glob} ./dist/esm`); }); } const tsc = await resolveBin('tsc', 'typescript'); if (isDev) { // build a composite project in the working directory in watch mode run(cwd, `${tsc} -b ./tsconfig.json --verbose -w`); return; } else if (isBuild) { // build a composite project in the working directory run(cwd, `${tsc} -b ./tsconfig.json --verbose`); if (apiExtractor) { consola.log('\n@microsoft/api-extractor configuration detected'); const extractor = await resolveBin('api-extractor', '@microsoft/api-extractor'); run(cwd, `${extractor} run --local`); // API docs markdown is generated in the docs repo from the published .api.json files. } if (cemAnalyzer) { consola.log('\n@custom-elements-manifest/analyzer configuration detected'); const cem = await resolveBin('cem', '@custom-elements-manifest/analyzer'); const cemConfigArg = resolveCEMConfigArg(cwd); if (!cemConfigArg) { consola.warn( 'CEM config file not found in package root; skipping custom-elements-manifest analyze', ); } else { run(cwd, `${cem} analyze --config ${cemConfigArg}`); } } const reactWrappersResult = await generateReactWrappers(cwd); if (reactWrappersResult.generated) { consola.log(`\nReact wrappers generated: ${reactWrappersResult.path}`); } else { // strictNullChecks is off in this workspace, so boolean literal narrowing // doesn't apply to the discriminated union — cast to access the skipped variant. consola.debug( `React wrappers skipped: ${(reactWrappersResult as { reason: string }).reason}`, ); } } else { throw new Error(`Unrecognized command: ${JSON.stringify(options)}`); } };