diff --git a/app/registry/blocks/field/Field.vue b/app/registry/blocks/field/Field.vue new file mode 100644 index 0000000..5ff6cb4 --- /dev/null +++ b/app/registry/blocks/field/Field.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/registry/blocks/field/FieldContent.vue b/app/registry/blocks/field/FieldContent.vue new file mode 100644 index 0000000..70d5d7e --- /dev/null +++ b/app/registry/blocks/field/FieldContent.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/registry/blocks/field/FieldDescription.vue b/app/registry/blocks/field/FieldDescription.vue new file mode 100644 index 0000000..b46304f --- /dev/null +++ b/app/registry/blocks/field/FieldDescription.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/registry/blocks/field/FieldError.vue b/app/registry/blocks/field/FieldError.vue new file mode 100644 index 0000000..6d918cb --- /dev/null +++ b/app/registry/blocks/field/FieldError.vue @@ -0,0 +1,47 @@ + + + diff --git a/app/registry/blocks/field/FieldGroup.vue b/app/registry/blocks/field/FieldGroup.vue new file mode 100644 index 0000000..1e25ab1 --- /dev/null +++ b/app/registry/blocks/field/FieldGroup.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/registry/blocks/field/FieldLabel.vue b/app/registry/blocks/field/FieldLabel.vue new file mode 100644 index 0000000..6f37231 --- /dev/null +++ b/app/registry/blocks/field/FieldLabel.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/registry/blocks/field/FieldLegend.vue b/app/registry/blocks/field/FieldLegend.vue new file mode 100644 index 0000000..11a1fad --- /dev/null +++ b/app/registry/blocks/field/FieldLegend.vue @@ -0,0 +1,21 @@ + + + diff --git a/app/registry/blocks/field/FieldSeparator.vue b/app/registry/blocks/field/FieldSeparator.vue new file mode 100644 index 0000000..5524e1f --- /dev/null +++ b/app/registry/blocks/field/FieldSeparator.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/registry/blocks/field/FieldSet.vue b/app/registry/blocks/field/FieldSet.vue new file mode 100644 index 0000000..52bfee5 --- /dev/null +++ b/app/registry/blocks/field/FieldSet.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/registry/blocks/field/FieldTitle.vue b/app/registry/blocks/field/FieldTitle.vue new file mode 100644 index 0000000..ce620fa --- /dev/null +++ b/app/registry/blocks/field/FieldTitle.vue @@ -0,0 +1,15 @@ + + + diff --git a/app/registry/blocks/field/index.ts b/app/registry/blocks/field/index.ts new file mode 100644 index 0000000..cf2450a --- /dev/null +++ b/app/registry/blocks/field/index.ts @@ -0,0 +1,10 @@ +export { default as Field } from "./Field.vue"; +export { default as FieldContent } from "./FieldContent.vue"; +export { default as FieldDescription } from "./FieldDescription.vue"; +export { default as FieldError, type FieldErrorItem } from "./FieldError.vue"; +export { default as FieldGroup } from "./FieldGroup.vue"; +export { default as FieldLabel } from "./FieldLabel.vue"; +export { default as FieldLegend } from "./FieldLegend.vue"; +export { default as FieldSeparator } from "./FieldSeparator.vue"; +export { default as FieldSet } from "./FieldSet.vue"; +export { default as FieldTitle } from "./FieldTitle.vue"; diff --git a/content/docs/2.components/18.form.md b/content/docs/2.components/18.form.md index 6d6f15a..c8625e1 100644 --- a/content/docs/2.components/18.form.md +++ b/content/docs/2.components/18.form.md @@ -14,11 +14,10 @@ name: FormDemo ## Installation -Add the shadcn-vue controls you want to compose, then add Stackhacker UI's form layer. +Add the shadcn-vue controls you want to compose, then add Stackhacker UI's form layer. `form-field` installs the Stackhacker UI `field` primitive and `form` dependency automatically. ```bash -npx shadcn-vue@latest add field input textarea select -npx shadcn-vue@latest add "https://ui.stackhacker.io/r/form.json" +npx shadcn-vue@latest add input textarea select npx shadcn-vue@latest add "https://ui.stackhacker.io/r/form-field.json" ``` diff --git a/content/docs/2.components/19.form-field.md b/content/docs/2.components/19.form-field.md index 110ffe8..4b0e9b8 100644 --- a/content/docs/2.components/19.form-field.md +++ b/content/docs/2.components/19.form-field.md @@ -13,7 +13,7 @@ name: FormFieldDemo ## Installation ```bash -npx shadcn-vue@latest add field input +npx shadcn-vue@latest add input npx shadcn-vue@latest add "https://ui.stackhacker.io/r/form-field.json" ``` diff --git a/package.json b/package.json index bf100d7..18d6fe9 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,8 @@ "shiki": "^3.23.0", "tinyexec": "^1.1.2", "tsx": "^4.21.0", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vue-tsc": "3.2.7" }, "lint-staged": { "*.+(ts|tsx|vue)": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ffd859..b07a923 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 2.2.1(magicast@0.5.2)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.33(typescript@5.9.3)) '@nuxthub/core': specifier: ^0.10.7 - version: 0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3) + version: 0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)) '@tailwindcss/vite': specifier: ^4.2.4 version: 4.2.4(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -47,7 +47,7 @@ importers: version: 14.2.1(vue@3.5.33(typescript@5.9.3)) '@vueuse/nuxt': specifier: ^14.2.1 - version: 14.2.1(0895705a234f124fe6cc4d60018a72e6) + version: 14.2.1(24d76999579b197a7535c4a6e00bc63c) ai: specifier: ^6.0.170 version: 6.0.170(zod@4.3.6) @@ -71,10 +71,10 @@ importers: version: 0.554.0(vue@3.5.33(typescript@5.9.3)) nuxt: specifier: ^4.4.4 - version: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3) + version: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3) nuxt-og-image: specifier: ^6.4.9 - version: 6.4.9(82ee8ec1fc12eec2a1ea8b8962b562de) + version: 6.4.9(7a285cc96e75bb83682e9a10f65d3e89) reka-ui: specifier: ^2.9.6 version: 2.9.6(vue@3.5.33(typescript@5.9.3)) @@ -133,6 +133,9 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 + vue-tsc: + specifier: 3.2.7 + version: 3.2.7(typescript@5.9.3) packages: @@ -6914,6 +6917,12 @@ packages: pinia: optional: true + vue-tsc@3.2.7: + resolution: {integrity: sha512-zc1tL3HoQni1zGTGrwBVRQb7rGP5SWdu/m4rGB6JcnAC5MT5LFZIxF7Y+EJEnt4hGF23d60rXH7gRjHGb5KQQQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + vue@3.5.33: resolution: {integrity: sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==} peerDependencies: @@ -8252,7 +8261,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.4(0bc9a8b81088588abe76c15d5337a36b)': + '@nuxt/nitro-server@4.4.4(70fd0b683e40957c6cf721b656a433c6)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 @@ -8271,7 +8280,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(oxc-parser@0.128.0)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(srvx@0.11.15) - nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3) nypm: 0.6.6 ohash: 2.0.11 pathe: 2.0.3 @@ -8339,7 +8348,7 @@ snapshots: rc9: 3.0.1 std-env: 4.1.0 - '@nuxt/vite-builder@4.4.4(73c4c6f1230a92aa0be2c20e8a16f65c)': + '@nuxt/vite-builder@4.4.4(3753187a1b5639c1f33be5f548422478)': dependencies: '@nuxt/kit': 4.4.4(magicast@0.5.2) '@rollup/plugin-replace': 6.0.3(rollup@4.60.2) @@ -8357,7 +8366,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3) nypm: 0.6.6 pathe: 2.0.3 pkg-types: 2.3.1 @@ -8368,7 +8377,7 @@ snapshots: unenv: 2.0.0-rc.24 vite: 7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) vite-node: 5.3.0(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-checker: 0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vite-plugin-checker: 0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3)) vue: 3.5.33(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -8400,7 +8409,7 @@ snapshots: - vue-tsc - yaml - '@nuxthub/core@0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)': + '@nuxthub/core@0.10.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1)(magicast@0.5.2)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))': dependencies: '@cloudflare/workers-types': 4.20260307.1 '@nuxt/kit': 4.4.4(magicast@0.5.2) @@ -8422,7 +8431,7 @@ snapshots: scule: 1.3.0 std-env: 3.10.0 tinyglobby: 0.2.16 - tsdown: 0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3) + tsdown: 0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)) ufo: 1.6.4 uncrypto: 0.1.3 unstorage: 1.17.5(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(ioredis@5.10.1) @@ -9776,13 +9785,13 @@ snapshots: '@vueuse/metadata@14.2.1': {} - '@vueuse/nuxt@14.2.1(0895705a234f124fe6cc4d60018a72e6)': + '@vueuse/nuxt@14.2.1(24d76999579b197a7535c4a6e00bc63c)': dependencies: '@nuxt/kit': 4.4.4(magicast@0.5.2) '@vueuse/core': 14.2.1(vue@3.5.33(typescript@5.9.3)) '@vueuse/metadata': 14.2.1 local-pkg: 1.1.2 - nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3) vue: 3.5.33(typescript@5.9.3) transitivePeerDependencies: - magicast @@ -12454,7 +12463,7 @@ snapshots: transitivePeerDependencies: - magicast - nuxt-og-image@6.4.9(82ee8ec1fc12eec2a1ea8b8962b562de): + nuxt-og-image@6.4.9(7a285cc96e75bb83682e9a10f65d3e89): dependencies: '@clack/prompts': 1.3.0 '@nuxt/kit': 4.4.4(magicast@0.5.2) @@ -12470,8 +12479,8 @@ snapshots: magic-string: 0.30.21 magicast: 0.5.2 mocked-exports: 0.1.1 - nuxt-site-config: 4.0.8(8bd70a983877065b0fc8982f33cd9f6f) - nuxtseo-shared: 5.1.3(7c6dd3e8b8bbc4e9eb04185bcb3e4d53) + nuxt-site-config: 4.0.8(6476653fdda2ee6b287b7691dacb7845) + nuxtseo-shared: 5.1.3(09843af268f3dcc42f6fd9f08b313f09) nypm: 0.6.6 ofetch: 1.5.1 ohash: 2.0.11 @@ -12519,12 +12528,12 @@ snapshots: - magicast - vue - nuxt-site-config@4.0.8(8bd70a983877065b0fc8982f33cd9f6f): + nuxt-site-config@4.0.8(6476653fdda2ee6b287b7691dacb7845): dependencies: '@nuxt/kit': 4.4.4(magicast@0.5.2) h3: 1.15.11 nuxt-site-config-kit: 4.0.8(magicast@0.5.2)(vue@3.5.33(typescript@5.9.3)) - nuxtseo-shared: 5.1.3(7c6dd3e8b8bbc4e9eb04185bcb3e4d53) + nuxtseo-shared: 5.1.3(09843af268f3dcc42f6fd9f08b313f09) pathe: 2.0.3 pkg-types: 2.3.1 site-config-stack: 4.0.8(vue@3.5.33(typescript@5.9.3)) @@ -12537,16 +12546,16 @@ snapshots: - vue - zod - nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3): + nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.2)(typescript@5.9.3) '@nuxt/cli': 3.35.1(@nuxt/schema@4.4.4)(cac@6.7.14)(commander@13.1.0)(magicast@0.5.2) '@nuxt/devtools': 3.2.4(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.33(typescript@5.9.3)) '@nuxt/kit': 4.4.4(magicast@0.5.2) - '@nuxt/nitro-server': 4.4.4(0bc9a8b81088588abe76c15d5337a36b) + '@nuxt/nitro-server': 4.4.4(70fd0b683e40957c6cf721b656a433c6) '@nuxt/schema': 4.4.4 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.4(magicast@0.5.2)) - '@nuxt/vite-builder': 4.4.4(73c4c6f1230a92aa0be2c20e8a16f65c) + '@nuxt/vite-builder': 4.4.4(3753187a1b5639c1f33be5f548422478) '@unhead/vue': 2.1.13(vue@3.5.33(typescript@5.9.3)) '@vue/shared': 3.5.33 chokidar: 5.0.0 @@ -12667,7 +12676,7 @@ snapshots: - xml2js - yaml - nuxtseo-shared@5.1.3(7c6dd3e8b8bbc4e9eb04185bcb3e4d53): + nuxtseo-shared@5.1.3(09843af268f3dcc42f6fd9f08b313f09): dependencies: '@clack/prompts': 1.3.0 '@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.2)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -12676,7 +12685,7 @@ snapshots: birpc: 4.0.0 consola: 3.4.2 defu: 6.1.7 - nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@24.12.2)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(commander@13.1.0)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0)))(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260307.1)(@libsql/client@0.17.3)(@opentelemetry/api@1.9.0))(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.2)(optionator@0.9.4)(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(rollup@4.60.2))(rollup@4.60.2)(srvx@0.11.15)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3))(yaml@2.8.3) ofetch: 1.5.1 pathe: 2.0.3 pkg-types: 2.3.1 @@ -12686,7 +12695,7 @@ snapshots: ufo: 1.6.4 vue: 3.5.33(typescript@5.9.3) optionalDependencies: - nuxt-site-config: 4.0.8(8bd70a983877065b0fc8982f33cd9f6f) + nuxt-site-config: 4.0.8(6476653fdda2ee6b287b7691dacb7845) zod: 4.3.6 transitivePeerDependencies: - magicast @@ -13495,7 +13504,7 @@ snapshots: glob: 13.0.6 package-json-from-dist: 1.0.1 - rolldown-plugin-dts@0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3): + rolldown-plugin-dts@0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)): dependencies: '@babel/generator': 7.29.1 '@babel/parser': 7.29.3 @@ -13508,6 +13517,7 @@ snapshots: rolldown: 1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optionalDependencies: typescript: 5.9.3 + vue-tsc: 3.2.7(typescript@5.9.3) transitivePeerDependencies: - oxc-resolver @@ -14158,7 +14168,7 @@ snapshots: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - tsdown@0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3): + tsdown@0.18.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14169,7 +14179,7 @@ snapshots: obug: 2.1.1 picomatch: 4.0.4 rolldown: 1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - rolldown-plugin-dts: 0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3) + rolldown-plugin-dts: 0.20.0(rolldown@1.0.0-beta.57(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0))(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3)) semver: 7.7.4 tinyexec: 1.1.2 tinyglobby: 0.2.16 @@ -14496,7 +14506,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-checker@0.13.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.7(typescript@5.9.3)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -14512,6 +14522,7 @@ snapshots: eslint: 9.39.4(jiti@2.6.1) optionator: 0.9.4 typescript: 5.9.3 + vue-tsc: 3.2.7(typescript@5.9.3) vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.4(magicast@0.5.2))(vite@7.3.2(@types/node@24.12.2)(jiti@2.6.1)(lightningcss@1.32.0)(stylus@0.57.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: @@ -14639,6 +14650,12 @@ snapshots: optionalDependencies: '@vue/compiler-sfc': 3.5.34 + vue-tsc@3.2.7(typescript@5.9.3): + dependencies: + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.2.7 + typescript: 5.9.3 + vue@3.5.33(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.33 diff --git a/renovate.json b/renovate.json index cb2d3ef..5738986 100644 --- a/renovate.json +++ b/renovate.json @@ -1,76 +1,72 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ - "github>nuxt/renovate-config-nuxt" + "github>nuxt/renovate-config-nuxt", + ":approveMajorUpdates" ], + "automergeType": "pr", + "ignoreTests": false, + "platformAutomerge": false, "packageRules": [ { - "description": "Keep pnpm security overrides manually managed", - "matchDepTypes": [ - "overrides" - ], - "enabled": false + "description": "Keep unclassified non-major updates individual", + "matchUpdateTypes": ["minor", "patch", "pin", "pinDigest", "digest", "lockFileMaintenance"], + "groupName": null, + "groupSlug": null }, { - "description": "Major updates require manual approval", - "matchUpdateTypes": [ - "major" - ], - "dependencyDashboardApproval": true + "description": "Keep major updates individual", + "matchUpdateTypes": ["major"], + "groupName": null, + "groupSlug": null, + "automerge": false }, { - "description": "Group Nuxt ecosystem updates", - "groupName": "nuxt ecosystem", - "matchPackageNames": [ - "nuxt", - "@nuxt/*", - "@nuxthub/*", - "@vueuse/nuxt", - "nuxt-og-image", - "nuxt-shiki" - ] + "description": "Wait three days for npm releases", + "matchDatasources": ["npm"], + "minimumReleaseAge": "3 days", + "schedule": ["at any time"] }, { - "description": "Group shadcn and UI registry updates", - "groupName": "shadcn ecosystem", - "matchPackageNames": [ - "shadcn-nuxt", - "shadcn-vue", - "shadcn-vue-registry", - "reka-ui", - "@lucide/vue", - "lucide-vue-next" - ] + "description": "Automerge non-major updates after CI", + "matchUpdateTypes": ["minor", "patch", "pin", "pinDigest", "digest", "lockFileMaintenance"], + "automerge": true }, { - "description": "Group styling stack updates", - "groupName": "styling stack", - "matchPackageNames": [ - "tailwindcss", - "@tailwindcss/vite", - "tailwind-merge", - "class-variance-authority", - "clsx", - "tw-animate-css" - ] + "description": "Group Nuxt core minor and patch updates", + "matchUpdateTypes": ["minor", "patch"], + "matchPackageNames": ["nuxt"], + "groupName": "Nuxt core", + "groupSlug": "nuxt-core" }, { - "description": "Group build and quality tooling updates", - "groupName": "tooling", - "matchPackageNames": [ - "eslint", - "typescript", - "tsx", - "@types/node", - "lint-staged" - ] + "description": "Group shadcn and Reka minor and patch updates", + "matchUpdateTypes": ["minor", "patch"], + "matchPackageNames": ["shadcn-nuxt", "shadcn-vue", "shadcn-vue-registry", "reka-ui"], + "groupName": "shadcn and Reka", + "groupSlug": "shadcn-reka" }, { - "description": "Keep AI SDK updates isolated", - "groupName": "ai sdk", - "matchPackageNames": [ - "ai" - ] + "description": "Group Tailwind minor and patch updates", + "matchUpdateTypes": ["minor", "patch"], + "matchPackageNames": ["tailwindcss", "@tailwindcss/*"], + "groupName": "Tailwind", + "groupSlug": "tailwind" + }, + { + "description": "Group AI SDK minor and patch updates", + "matchUpdateTypes": ["minor", "patch"], + "matchPackageNames": ["ai", "@ai-sdk/*"], + "groupName": "AI SDK", + "groupSlug": "ai-sdk" } - ] + ], + "vulnerabilityAlerts": { + "dependencyDashboardApproval": false, + "groupName": null, + "groupSlug": null, + "minimumReleaseAge": null, + "prCreation": "immediate", + "schedule": [] + } } diff --git a/scripts/registry-build.ts b/scripts/registry-build.ts index dbc3d54..0b41f85 100644 --- a/scripts/registry-build.ts +++ b/scripts/registry-build.ts @@ -1,6 +1,6 @@ import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; -import { mkdir, readFile, unlink, writeFile } from "node:fs/promises"; +import { cp, mkdir, readFile, rm, rmdir, unlink, writeFile } from "node:fs/promises"; import pkg from "../package.json"; import components from "../components.json"; import { generateShadcnRegistry } from "shadcn-vue-registry"; @@ -13,6 +13,10 @@ import { x } from "tinyexec"; const cwd = resolve(__dirname, "../"); const registryPath = resolve(cwd, "./app/registry"); const outputPath = resolve(cwd, "./public/r/"); + const fieldBlockPath = resolve(registryPath, "blocks/field"); + const fieldUiPath = resolve(registryPath, "components/ui/field"); + const fieldUiParentPath = resolve(registryPath, "components/ui"); + const fieldComponentsPath = resolve(registryPath, "components"); const config = { root: cwd, name: pkg.name, @@ -27,12 +31,26 @@ import { x } from "tinyexec"; const customItemNames = new Set(registryJson.items.map(item => item.name)); const itemPackageDependencies: Record = { "chat-message": ["@lucide/vue"], + "field": ["@vueuse/core", "reka-ui"], }; for (const item of registryJson.items) { const dependencies = new Set(item.dependencies ?? []); const registryDependencies = new Set(item.registryDependencies ?? []); + if (item.name === "field") { + await rm(fieldUiPath, { recursive: true, force: true }); + await mkdir(fieldUiPath, { recursive: true }); + await cp(fieldBlockPath, fieldUiPath, { recursive: true }); + + item.type = "registry:ui"; + item.files = item.files.map(file => ({ + ...file, + path: file.path.replace("blocks/field", "components/ui/field"), + type: "registry:ui", + })); + } + for (const dependency of itemPackageDependencies[item.name] ?? []) { dependencies.add(dependency); } @@ -46,6 +64,7 @@ import { x } from "tinyexec"; if ( content.includes(`../${dependency}`) || content.includes(`@/components/${dependency}`) + || content.includes(`@/components/ui/${dependency}`) ) { registryDependencies.add(dependency); } @@ -67,14 +86,20 @@ import { x } from "tinyexec"; await mkdir(outputPath, { recursive: true }); console.log(`āœ“ Output directory created: ${outputPath}`); - await x("shadcn-vue", ["build", "-c", registryPath, "-o", outputPath], { - nodeOptions: { - cwd, - shell: true, - }, - }); - - await unlink(registryJsonPath); + try { + await x("shadcn-vue", ["build", "-c", registryPath, "-o", outputPath], { + nodeOptions: { + cwd, + shell: true, + }, + }); + } + finally { + await unlink(registryJsonPath).catch(() => {}); + await rm(fieldUiPath, { recursive: true, force: true }); + await rmdir(fieldUiParentPath).catch(() => {}); + await rmdir(fieldComponentsPath).catch(() => {}); + } console.log("\nāœ“ Registry build complete"); console.log("Registry files available at:\n /r/registry.json\n /r/{name}.json"); diff --git a/scripts/registry-verify.ts b/scripts/registry-verify.ts index 08ffc6d..5a048f7 100644 --- a/scripts/registry-verify.ts +++ b/scripts/registry-verify.ts @@ -4,8 +4,13 @@ import registryConfig from "../registry.config"; interface RegistryItem { name: string; + type?: string; dependencies?: string[]; registryDependencies?: string[]; + files?: Array<{ + path?: string; + type?: string; + }>; } interface RegistryIndex { @@ -66,6 +71,27 @@ function assertExactValues(itemName: string, fieldName: string, actual: string[] } } +function assertFieldRegistryUiOutput(item: RegistryItem) { + if (item.type !== "registry:ui") { + errors.push(`field: expected type registry:ui, received ${item.type ?? "missing"}`); + } + + if (!item.files?.length) { + errors.push("field: expected registry files under components/ui/field"); + return; + } + + for (const file of item.files) { + if (file.type !== "registry:ui") { + errors.push(`field: expected file ${file.path ?? "missing"} type registry:ui, received ${file.type ?? "missing"}`); + } + + if (!file.path?.startsWith("components/ui/field/")) { + errors.push(`field: expected file path under components/ui/field, received ${file.path ?? "missing"}`); + } + } +} + const registryIndex = await readRegistryIndex(); if (registryIndex?.homepage !== expectedHomepage) { errors.push(`registry: expected homepage ${expectedHomepage}, received ${registryIndex?.homepage ?? "missing"}`); @@ -167,9 +193,13 @@ const expectedItems: Record = { dependencies: [], registryDependencies: [], }, + "field": { + dependencies: ["@vueuse/core", "reka-ui"], + registryDependencies: [], + }, "form-field": { dependencies: [], - registryDependencies: ["field", stackhackerDependency("form")], + registryDependencies: [stackhackerDependency("field"), stackhackerDependency("form")], }, }; @@ -196,6 +226,10 @@ for (const [name, expected] of Object.entries(expectedItems)) { assertExactValues(name, "package dependency", item.dependencies ?? [], expected.dependencies ?? []); assertExactValues(name, "registry dependency", item.registryDependencies ?? [], expected.registryDependencies ?? []); + + if (name === "field") { + assertFieldRegistryUiOutput(item); + } } if (errors.length > 0) {