{"_id":"@cyia/vscode-valibot-config","_rev":"3-e52c3d3ee25b8c6bac6c5aa9e4192ab7","name":"@cyia/vscode-valibot-config","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.7":{"name":"@cyia/vscode-valibot-config","version":"1.0.7","keywords":["vscode","configuration","valibot","schema","extension","settings","reactive"],"author":{"name":"wszgrcy"},"_id":"@cyia/vscode-valibot-config@1.0.7","maintainers":[{"name":"wszgrcy","email":"wszgrcy@gmail.com"}],"homepage":"https://github.com/wszgrcy/vscode-toolkit/tree/main/packages/valibot-config#readme","bugs":{"url":"https://github.com/wszgrcy/vscode-toolkit/issues"},"dist":{"shasum":"795258c623b31e5682249b95d6308a365669f4b7","tarball":"https://registry.npmjs.org/@cyia/vscode-valibot-config/-/vscode-valibot-config-1.0.7.tgz","fileCount":9,"integrity":"sha512-bMhkYrlpSPYnryAowjNPNk83t2QTckXcQzZad/2l5PiJNDCjJL/SF+pa07P2jkyikd0Gfq5Yp97nutL7TpYZEQ==","signatures":[{"sig":"MEQCIE+WQHaGI3md9vHiGkiIsNfvcR9/xUp7Xn3gAaJQmiK3AiAp069cQhJZtmDLSkT3fNk9yg4TnUBwH56B6uo4VyXC2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59875},"type":"module","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.mjs"},"./valibot-to-vscode-config":{"types":"./valibot-to-vscode-config.d.ts","import":"./valibot-to-vscode-config.mjs"}},"gitHead":"fdcde31405a272af5cab8fa6add7729bf72a9a88","scripts":{"test":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts && vscode-test","coverage":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts && vscode-test --coverage","test:build":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts"},"_npmUser":{"name":"wszgrcy","email":"wszgrcy@gmail.com"},"repository":{"url":"git+https://github.com/wszgrcy/vscode-toolkit.git","type":"git"},"_npmVersion":"11.6.1","description":"VSCode configuration manager based on Valibot schemas","directories":{},"sideEffects":false,"_nodeVersion":"24.10.0","dependencies":{"rfdc":"^1.4.1","valibot":"^1.3.1","es-toolkit":"^1.46.0","fast-equals":"^6.0.0","static-injector":"^6.3.1","@piying/valibot-visit":"^1.3.8","@valibot/to-json-schema":"^1.6.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/vscode-valibot-config_1.0.7_1777373013840_0.04124365331000579","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@cyia/vscode-valibot-config","version":"1.0.8","keywords":["vscode","configuration","valibot","schema","extension","settings","reactive"],"author":{"name":"wszgrcy"},"_id":"@cyia/vscode-valibot-config@1.0.8","maintainers":[{"name":"wszgrcy","email":"wszgrcy@gmail.com"}],"homepage":"https://github.com/wszgrcy/vscode-toolkit/tree/main/packages/valibot-config#readme","bugs":{"url":"https://github.com/wszgrcy/vscode-toolkit/issues"},"dist":{"shasum":"93443580396d24e5156f23f15386ef590d13c3d9","tarball":"https://registry.npmjs.org/@cyia/vscode-valibot-config/-/vscode-valibot-config-1.0.8.tgz","fileCount":9,"integrity":"sha512-JEDX3cE5JZou8J6a/jk8fL/fvTJZrB9H4krz1++v0Xmh8+KB3ZV44Dc/egaNz7W3hxgDPNN/VivM9BWjbM9O7Q==","signatures":[{"sig":"MEQCIHL7AcQc08vUHpXeHvc+eGSoyBhhJ3NnZpdp5Lo6aXLQAiBtJI0XEDhaBr1PbOb9SVvbTV8FOh5qjeKk3awE4fe5hQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cyia%2fvscode-valibot-config@1.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":58500},"type":"module","types":"./index.d.ts","exports":{".":{"types":"./index.d.ts","import":"./index.mjs"},"./valibot-to-vscode-config":{"types":"./valibot-to-vscode-config.d.ts","import":"./valibot-to-vscode-config.mjs"}},"gitHead":"d469e25d138a6f62694a2fb1a2bf571769c55716","scripts":{"test":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts && vscode-test","coverage":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts && vscode-test --coverage","test:build":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0fce4dd-861f-4fd2-b571-2c068ced12bd"}},"repository":{"url":"git+https://github.com/wszgrcy/vscode-toolkit.git","type":"git"},"_npmVersion":"11.12.1","description":"VSCode configuration manager based on Valibot schemas","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"rfdc":"^1.4.1","valibot":"^1.3.1","es-toolkit":"^1.46.0","fast-equals":"^6.0.0","static-injector":"^6.3.1","@piying/valibot-visit":"^1.3.8","@valibot/to-json-schema":"^1.6.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/vscode-valibot-config_1.0.8_1777377728417_0.9426220742701894","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@cyia/vscode-valibot-config","version":"1.1.0","description":"VSCode configuration manager based on Valibot schemas","author":{"name":"wszgrcy"},"sideEffects":false,"type":"module","scripts":{"test:build":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts","test":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts && vscode-test","coverage":"rimraf -g ./test-dist && tsx ./script/test.esbuild.ts && vscode-test --coverage"},"repository":{"type":"git","url":"git+https://github.com/wszgrcy/vscode-toolkit.git"},"homepage":"https://github.com/wszgrcy/vscode-toolkit/tree/main/packages/valibot-config#readme","bugs":{"url":"https://github.com/wszgrcy/vscode-toolkit/issues"},"keywords":["vscode","configuration","valibot","schema","extension","settings","reactive"],"exports":{".":{"types":"./index.d.ts","import":"./index.mjs"},"./valibot-to-vscode-config":{"types":"./valibot-to-vscode-config.d.ts","import":"./valibot-to-vscode-config.mjs"}},"dependencies":{"valibot":"^1.3.1","fast-equals":"^6.0.0","@piying/valibot-visit":"^1.3.8","static-injector":"^6.3.1","rfdc":"^1.4.1","es-toolkit":"^1.46.0","@valibot/to-json-schema":"^1.6.0"},"gitHead":"e20abee006b128df6c5e9437b3e473dea80270ad","types":"./index.d.ts","_id":"@cyia/vscode-valibot-config@1.1.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-wdpl6RR/ydXRgIdGkq1aCPwvV6Iwt/n6pVsZ92MXFLuzfMVAToh2Je+gvZq0hfBdQb4PEcMiGm7szw5S/azEnA==","shasum":"1c6fda6ba0fc87fa448cd74d421359f278146789","tarball":"https://registry.npmjs.org/@cyia/vscode-valibot-config/-/vscode-valibot-config-1.1.0.tgz","fileCount":9,"unpackedSize":59731,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cyia%2fvscode-valibot-config@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC5zt1qEvNQgpvk9EJGigV0u9ReudAJVkPwUn6BFKys4wIgfPwefdt+RD5FqGw56dqZv9JoERqCTL0MoLUG+y8vtEY="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b0fce4dd-861f-4fd2-b571-2c068ced12bd"}},"directories":{},"maintainers":[{"name":"wszgrcy","email":"wszgrcy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vscode-valibot-config_1.1.0_1783006414772_0.8655753453675865"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-28T10:43:33.770Z","modified":"2026-07-02T15:33:35.372Z","1.0.7":"2026-04-28T10:43:33.988Z","1.0.8":"2026-04-28T12:02:08.572Z","1.1.0":"2026-07-02T15:33:35.018Z"},"bugs":{"url":"https://github.com/wszgrcy/vscode-toolkit/issues"},"author":{"name":"wszgrcy"},"homepage":"https://github.com/wszgrcy/vscode-toolkit/tree/main/packages/valibot-config#readme","keywords":["vscode","configuration","valibot","schema","extension","settings","reactive"],"repository":{"type":"git","url":"git+https://github.com/wszgrcy/vscode-toolkit.git"},"description":"VSCode configuration manager based on Valibot schemas","maintainers":[{"name":"wszgrcy","email":"wszgrcy@gmail.com"}],"readme":"# @cyia/vscode-valibot-config\n\n<div align=\"center\">\n\n🌐 [English](README.md) | [中文](./README.zh-CN.md)\n\n</div>\n\nVSCode configuration manager based on Valibot schemas. Provides reactive signals that automatically sync with VS Code's workspace settings, with built-in validation and real-time update support.\n\n## Features\n\n- **Schema Validation**: Define configuration structure using Valibot schemas\n- **Reactive Signals**: Configuration values are exposed as writable signals with automatic change detection\n- **Deep Nesting**: Full support for nested object configurations\n- **Real-time Updates**: Automatically listens to VS Code configuration changes\n- **JSON Schema Export**: Generate VSCode-compatible JSON Schema from Valibot schemas\n- **Type Safety**: End-to-end TypeScript type inference from schema definitions\n- **Deep Equality**: Uses deep comparison to prevent unnecessary signal updates\n- **Union & Variant Support**: Handles complex union types and discriminated unions\n\n## Installation\n\n```bash\nnpm install @cyia/vscode-valibot-config\n# or\npnpm add @cyia/vscode-valibot-config\n```\n\n## Usage\n\n### Basic Example\n\n```typescript\nimport * as v from 'valibot';\nimport { createConfig } from '@cyia/vscode-valibot-config';\n\n// Define configuration schema\nconst configSchema = v.object({\n  enabled: v.boolean(),\n  timeout: v.pipe(v.number(), v.minValue(100), v.maxValue(5000)),\n  theme: v.picklist(['dark', 'light', 'auto']),\n  tags: v.array(v.string()),\n  nested: v.object({\n    host: v.string(),\n    port: v.number(),\n  }),\n});\n\n// Create reactive configuration\nconst proxy = createConfig(configSchema, 'myExtension');\nconst config = proxy.root();\n\n// Read values (call as function)\nconsole.log(config.enabled()); // true\nconsole.log(config.timeout()); // 1000\nconsole.log(config.nested.host()); // \"localhost\"\n\n// Set values\nawait config.enabled.set(false);\nawait config.timeout.set(2000);\n\n// Update values with function\nawait config.theme.update((current) => (current === 'dark' ? 'light' : 'dark'));\n\n// Nested objects\nawait config.nested.set({ host: 'api.example.com', port: 8080 });\n```\n\n### Signal API\n\nEach configuration property returns a signal with the following methods:\n\n| Method              | Description                              |\n| ------------------- | ---------------------------------------- |\n| `signal()`          | Get current value                        |\n| `signal.set(value)` | Set new value (updates VS Code settings) |\n| `signal.update(fn)` | Update using previous value              |\n\n### JSON Schema Generation\n\nConvert Valibot schemas to VSCode `contributes.configuration.properties` format:\n\n```typescript\nimport * as v from 'valibot';\nimport { valibotToVscodeConfig } from '@cyia/vscode-valibot-config';\nimport { asVirtualGroup } from '@piying/valibot-visit';\n\nconst schema = v.object({\n  name: v.pipe(v.string(), v.description('The user name')),\n  role: v.pipe(\n    v.picklist(['admin', 'user']),\n    v.metadata({\n      enumOptions: [\n        { label: 'Administrator', description: 'Full access' },\n        { label: 'Regular User', description: 'Limited access' },\n      ],\n    }),\n  ),\n});\n\nconst jsonSchema = valibotToVscodeConfig(schema, {\n  title: 'My Extension Config',\n  prefix: 'myExtension',\n  id: 'myExtension.schema.json',\n  order: 1,\n});\n```\n\n### Writing to `package.json`\n\nUse `writePackageJsonConfig` to automatically write configuration into your VS Code extension's `package.json` file:\n\n```typescript\nimport * as v from 'valibot';\nimport { writePackageJsonConfig } from '@cyia/vscode-valibot-config';\n\nconst schema = v.object({\n  apiKey: v.string(),\n  maxRetries: v.pipe(v.number(), v.minValue(1), v.maxValue(10)),\n});\n\n// Write to file\nconst writer = writePackageJsonConfig(schema, {\n  title: 'My Extension Config',\n  prefix: 'myExtension',\n});\nawait writer('./package.json');\n// The generated package.json will automatically add:\n// \"contributes\": {\n//   \"configuration\": {\n//     \"title\": \"My Extension Config\",\n//     \"properties\": {\n//       \"myExtension.apiKey\": { \"type\": \"string\" },\n//       \"myExtension.maxRetries\": { \"type\": \"number\" }\n//     }\n//   }\n// }\n\n// Or manipulate the object directly\nconst packageJson = {\n  name: 'my-extension',\n  contributes: {} as any,\n};\nwriter(packageJson);\n```\n\n### Advanced Options\n\n#### Using `metadata` for Enhanced UI\n\n```typescript\nconst schema = v.object({\n  mode: v.pipe(\n    v.picklist(['fast', 'balanced', 'quality']),\n    v.metadata({\n      isOptional: true,\n      enumOptions: [\n        { label: 'Fast', description: 'Best performance' },\n        { label: 'Balanced', description: 'Balanced trade-off' },\n        { label: 'Quality', description: 'Best output quality' },\n      ],\n    }),\n  ),\n});\n```\n\n#### Virtual Groups\n\nObjects inside `intersect` are merged, allowing nested merging:\n\n```typescript\nimport { asVirtualGroup } from '@piying/valibot-visit';\n\nconst schema = v.object({\n  network: v.pipe(\n    v.intersect([\n      v.object({ proxy: v.string() }),\n      v.object({ timeout: v.number() }),\n    ]),\n    asVirtualGroup(),\n  ),\n});\n```\n","readmeFilename":"README.md"}