mirror of
https://github.com/hanzoai/shadcn.git
synced 2026-10-30 18:22:59 +00:00
* refactor: decouple @hanzo/ui from hanzogui Make @hanzo/ui shadcn-only — no hanzogui/Tamagui coupling. - remove primitives/bases (gui/admin/svelte/vue) re-exports - drop @hanzogui peerDependencies + peerDependenciesMeta entries - add check-no-hanzogui guard, wired into build - fix latent NodeJS.Timeout types to keep the build green * refactor: remove duplicate @hanzo/brand from the monorepo @hanzo/brand is owned by the standalone hanzoai/brand (the npm-canonical source); this monorepo's copy was unused and had drifted. - delete pkg/brand - add check-no-brand-pkg guard (wired into `check`) so it can't reappear * refactor(ui): stop importing from the app; use own cn util pkg/ui pulled `cn` from @/lib/utils (../../app) — an inverted dependency on the consuming app. Point the animation components at pkg/ui's own cn and drop the @/app, @/registry, @/lib tsconfig path aliases. * fix(ui): type errors; stop tracking the root lockfile - ModelCard: lucide-react dropped the Github icon → use Code - drawer: annotate DrawerTrigger/DrawerClose (radix type portability) - untrack root pnpm-lock.yaml; CI → --no-frozen-lockfile * release: bump @hanzo/ui to 5.7.0 * refactor: rename pkg/ → pkgs/, merge packages/ into it standardize on 'pkgs/': move pkg/* and packages/* into pkgs/. Update workspace globs, CI, scripts, and config references accordingly.
124 lines
2.8 KiB
TypeScript
124 lines
2.8 KiB
TypeScript
import { afterEach, describe, expect, test, vi } from "vitest"
|
|
|
|
import type { Config } from "../../src/utils/get-config"
|
|
|
|
// Mock dependencies.
|
|
vi.mock("../../src/registry/namespaces", () => ({
|
|
resolveRegistryNamespaces: vi.fn().mockResolvedValue(["@foo"]),
|
|
}))
|
|
|
|
vi.mock("../../src/registry/api", () => ({
|
|
getRegistriesIndex: vi.fn().mockResolvedValue({
|
|
"@foo": "https://foo.com/r/{name}.json",
|
|
}),
|
|
}))
|
|
|
|
vi.mock("../../src/utils/spinner", () => ({
|
|
spinner: vi.fn().mockReturnValue({
|
|
start: vi.fn().mockReturnValue({
|
|
succeed: vi.fn(),
|
|
fail: vi.fn(),
|
|
stop: vi.fn(),
|
|
}),
|
|
}),
|
|
}))
|
|
|
|
vi.mock("fs-extra", () => ({
|
|
default: {
|
|
writeFile: vi.fn().mockResolvedValue(undefined),
|
|
},
|
|
}))
|
|
|
|
import { ensureRegistriesInConfig } from "../../src/utils/registries"
|
|
import fs from "fs-extra"
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
const baseConfig: Config = {
|
|
$schema: "",
|
|
style: "new-york",
|
|
tailwind: {
|
|
config: "",
|
|
css: "",
|
|
baseColor: "",
|
|
cssVariables: true,
|
|
prefix: "",
|
|
},
|
|
rsc: false,
|
|
tsx: true,
|
|
aliases: {
|
|
components: "@/components",
|
|
utils: "@/lib/utils",
|
|
ui: "@/components/ui",
|
|
lib: "@/lib",
|
|
hooks: "@/hooks",
|
|
},
|
|
registries: {},
|
|
resolvedPaths: {
|
|
cwd: "/tmp/test-project",
|
|
tailwindConfig: "",
|
|
tailwindCss: "",
|
|
utils: "",
|
|
components: "",
|
|
lib: "",
|
|
hooks: "",
|
|
ui: "",
|
|
},
|
|
}
|
|
|
|
describe("ensureRegistriesInConfig", () => {
|
|
test("does not write to disk when writeFile is false", async () => {
|
|
const { config, newRegistries } = await ensureRegistriesInConfig(
|
|
["@foo/bar"],
|
|
baseConfig,
|
|
{ writeFile: false }
|
|
)
|
|
|
|
// Should still return the updated config with new registries.
|
|
expect(newRegistries).toEqual(["@foo"])
|
|
expect(config.registries?.["@foo"]).toBe(
|
|
"https://foo.com/r/{name}.json"
|
|
)
|
|
|
|
// Should NOT have written to disk.
|
|
expect(fs.writeFile).not.toHaveBeenCalled()
|
|
})
|
|
|
|
test("writes to disk when writeFile is true", async () => {
|
|
await ensureRegistriesInConfig(["@foo/bar"], baseConfig, {
|
|
writeFile: true,
|
|
})
|
|
|
|
expect(fs.writeFile).toHaveBeenCalledTimes(1)
|
|
expect(fs.writeFile).toHaveBeenCalledWith(
|
|
expect.stringContaining("components.json"),
|
|
expect.any(String),
|
|
"utf-8"
|
|
)
|
|
})
|
|
|
|
test("writes to disk by default (writeFile not specified)", async () => {
|
|
await ensureRegistriesInConfig(["@foo/bar"], baseConfig)
|
|
|
|
expect(fs.writeFile).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
test("does not write when no new registries are found", async () => {
|
|
const configWithRegistry: Config = {
|
|
...baseConfig,
|
|
registries: {
|
|
"@foo": "https://foo.com/r/{name}.json",
|
|
},
|
|
}
|
|
|
|
await ensureRegistriesInConfig(["@foo/bar"], configWithRegistry, {
|
|
writeFile: true,
|
|
})
|
|
|
|
// No new registries, so no write.
|
|
expect(fs.writeFile).not.toHaveBeenCalled()
|
|
})
|
|
})
|