build-pkg.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. //go:build !plan9
  4. package main
  5. import (
  6. "encoding/json"
  7. "fmt"
  8. "log"
  9. "os"
  10. "path"
  11. "github.com/tailscale/hujson"
  12. "tailscale.com/util/precompress"
  13. "tailscale.com/version"
  14. )
  15. func runBuildPkg() {
  16. buildOptions, err := commonPkgSetup(prodMode)
  17. if err != nil {
  18. log.Fatalf("Cannot setup: %v", err)
  19. }
  20. log.Printf("Linting...\n")
  21. if err := runYarn("lint"); err != nil {
  22. log.Fatalf("Linting failed: %v", err)
  23. }
  24. if err := cleanDir(*pkgDir); err != nil {
  25. log.Fatalf("Cannot clean %s: %v", *pkgDir, err)
  26. }
  27. buildOptions.Write = true
  28. buildOptions.MinifyWhitespace = true
  29. buildOptions.MinifyIdentifiers = true
  30. buildOptions.MinifySyntax = true
  31. runEsbuild(*buildOptions)
  32. if err := precompressWasm(); err != nil {
  33. log.Fatalf("Could not pre-recompress wasm: %v", err)
  34. }
  35. log.Printf("Generating types...\n")
  36. if err := runYarn("pkg-types"); err != nil {
  37. log.Fatalf("Type generation failed: %v", err)
  38. }
  39. if err := updateVersion(); err != nil {
  40. log.Fatalf("Cannot update version: %v", err)
  41. }
  42. if err := copyReadme(); err != nil {
  43. log.Fatalf("Cannot copy readme: %v", err)
  44. }
  45. log.Printf("Built package version %s", version.Long())
  46. }
  47. func precompressWasm() error {
  48. log.Printf("Pre-compressing main.wasm...\n")
  49. return precompress.Precompress(path.Join(*pkgDir, "main.wasm"), precompress.Options{
  50. FastCompression: *fastCompression,
  51. })
  52. }
  53. func updateVersion() error {
  54. packageJSONBytes, err := os.ReadFile("package.json.tmpl")
  55. if err != nil {
  56. return fmt.Errorf("Could not read package.json: %w", err)
  57. }
  58. var packageJSON map[string]any
  59. packageJSONBytes, err = hujson.Standardize(packageJSONBytes)
  60. if err != nil {
  61. return fmt.Errorf("Could not standardize template package.json: %w", err)
  62. }
  63. if err := json.Unmarshal(packageJSONBytes, &packageJSON); err != nil {
  64. return fmt.Errorf("Could not unmarshal package.json: %w", err)
  65. }
  66. packageJSON["version"] = version.Long()
  67. packageJSONBytes, err = json.MarshalIndent(packageJSON, "", " ")
  68. if err != nil {
  69. return fmt.Errorf("Could not marshal package.json: %w", err)
  70. }
  71. return os.WriteFile(path.Join(*pkgDir, "package.json"), packageJSONBytes, 0644)
  72. }
  73. func copyReadme() error {
  74. readmeBytes, err := os.ReadFile("README.pkg.md")
  75. if err != nil {
  76. return fmt.Errorf("Could not read README.pkg.md: %w", err)
  77. }
  78. return os.WriteFile(path.Join(*pkgDir, "README.md"), readmeBytes, 0644)
  79. }