/** * Prepare the HMDesign submodule for this app (runs as `postinstall`, or `npm run hm:build`). * * HMDesign is consumed as a git submodule (vendor/HMDesign) whose `packages/ui` is an npm workspace of this * repo, so `@hm-design/ui` resolves to vendor/HMDesign/packages/ui and its dependencies are installed into * this repo's node_modules. The package exports compiled `dist/` (JS, types, theme CSS, fonts), which Git * does not carry, so it has to be built once after install. * * HMDesign's own package build (vendor/HMDesign/scripts/build-package.mjs) reads TypeScript and shadcn from * `/node_modules/...` by absolute path. Instead of a second full `npm ci` inside the submodule * (Storybook and friends), point that folder at this repo's node_modules with a directory junction. The * submodule's .gitignore already ignores node_modules/, so its working tree stays clean. * * Nothing inside the submodule is edited. */ import { existsSync, lstatSync, symlinkSync, statSync } from "node:fs" import path from "node:path" import { fileURLToPath } from "node:url" import { execFileSync } from "node:child_process" const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..") const hm = path.join(root, "vendor", "HMDesign") const uiPkg = path.join(hm, "packages", "ui") const force = process.argv.includes("--force") if (!existsSync(path.join(uiPkg, "package.json"))) { console.error("[setup-hmdesign] vendor/HMDesign is empty. Run: git submodule update --init --recursive") process.exit(1) } const hmNodeModules = path.join(hm, "node_modules") const rootNodeModules = path.join(root, "node_modules") if (!existsSync(hmNodeModules)) { symlinkSync(rootNodeModules, hmNodeModules, "junction") console.log("[setup-hmdesign] linked vendor/HMDesign/node_modules -> node_modules") } else if (!lstatSync(hmNodeModules).isSymbolicLink()) { console.log("[setup-hmdesign] vendor/HMDesign/node_modules is a real folder; using it as is") } const distEntry = path.join(uiPkg, "dist", "index.js") const srcIndex = path.join(uiPkg, "src", "index.ts") const stale = !existsSync(distEntry) || statSync(srcIndex).mtimeMs > statSync(distEntry).mtimeMs if (force || stale) { console.log("[setup-hmdesign] building @hm-design/ui (vendor/HMDesign/packages/ui/dist)") execFileSync(process.execPath, [path.join(hm, "scripts", "build-package.mjs"), "ui"], { cwd: uiPkg, stdio: "inherit" }) } else { console.log("[setup-hmdesign] @hm-design/ui dist is up to date") }