import { defineConfig } from 'tsdown'
import { argv } from '../../scripts/tsdown-args.mjs'

/** @import {Options} from 'tsdown' */

const config = [
  { dir: 'composables', files: ['codeRepl.ts', 'pdf.ts', 'rustRepl.ts', 'size.ts', 'audio.ts', 'demo.ts', 'mark.ts'] },
  { dir: 'utils', files: ['http.ts', 'link.ts', 'sleep.ts'] },
  { dir: '', files: ['index.ts', 'options.ts'] },
]

const clientExternal = [
  /.*\.vue$/,
  /composables\/.*\.js$/,
  /utils\/.*\.js$/,
  /.*\/options\.js$/,
  /shared\/index\.js$/,
]

export default defineConfig((cli) => {
  /** @type {Options}  */
  const DEFAULT_OPTIONS = {
    dts: true,
    sourcemap: false,
    format: 'esm',
    clean: !cli.watch,
  }

  /** @type {Options[]} */
  const options = []

  // shared
  options.push({
    ...DEFAULT_OPTIONS,
    entry: ['./src/shared/index.ts'],
    outDir: './lib/shared',
  })

  if (argv.node) {
    options.push({
      ...DEFAULT_OPTIONS,
      entry: ['./src/node/index.ts'],
      outDir: './lib/node',
      target: 'node20.6.0',
      external: ['markdown-it', /^@?vuepress/],
    })
  }

  if (argv.client) {
    options.push(...config.map(({ dir, files }) => ({
      ...DEFAULT_OPTIONS,
      entry: files.map(file => `./src/client/${dir}/${file}`),
      outDir: `./lib/client/${dir}`,
      external: clientExternal,
    })))
  }
  return options
})
