build.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /** Run the complete repository build and bind its client artifacts to their public environment. */
  2. import { spawnSync } from 'node:child_process'
  3. import { rmSync } from 'node:fs'
  4. import { resolve } from 'node:path'
  5. import { parseArgs } from 'node:util'
  6. import {
  7. CLIENT_BUILD_RECORD_PATH,
  8. clientBuildProcessEnvironment,
  9. repositoryCommitHash,
  10. resolveClientBuildEnvironment,
  11. writeClientBuildRecord,
  12. } from './client-build-environment.ts'
  13. import { pnpmInvocation } from './pnpm-invocation.ts'
  14. /** Run one package script through the package manager that invoked this build. */
  15. function runScript(script: string, environment: NodeJS.ProcessEnv): void {
  16. const invocation = pnpmInvocation(['run', script], environment)
  17. const result = spawnSync(invocation.command, invocation.args, {
  18. cwd: resolve(import.meta.dirname, '..'),
  19. env: environment,
  20. stdio: 'inherit',
  21. })
  22. if (result.error !== undefined) throw result.error
  23. if (result.status !== 0) {
  24. throw new Error(`build: ${script} exited with ${String(result.status ?? result.signal)}`)
  25. }
  26. }
  27. /** Run the full build selected by `--profile` or `DSH_BUILD_CLIENT_PROFILE`. */
  28. function main(): void {
  29. const { values } = parseArgs({
  30. options: { profile: { type: 'string' } },
  31. allowPositionals: false,
  32. })
  33. const root = resolve(import.meta.dirname, '..')
  34. const parentEnvironment = {
  35. ...process.env,
  36. DSH_CLIENT_COMMIT_HASH: repositoryCommitHash(root, process.env),
  37. }
  38. const clientEnvironment = resolveClientBuildEnvironment(parentEnvironment, values.profile)
  39. const buildEnvironment = clientBuildProcessEnvironment(parentEnvironment, clientEnvironment)
  40. rmSync(resolve(root, CLIENT_BUILD_RECORD_PATH), { force: true })
  41. runScript('build:lib', buildEnvironment)
  42. runScript('build:web', buildEnvironment)
  43. const record = writeClientBuildRecord(root, clientEnvironment)
  44. console.log(
  45. `build: recorded ${String(record.artifacts.fileCount)} client artifact(s) with ${String(Object.keys(record.environment).length)} public value(s)`,
  46. )
  47. }
  48. if (import.meta.main) main()