{"_id":"@demsking/vue-jsonschema","_rev":"5-30cd2a6feb0cba3d246a6417e6aa28c9","name":"@demsking/vue-jsonschema","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.0":{"name":"@demsking/vue-jsonschema","version":"1.0.0","author":{"name":"Sébastien Ndemnou"},"license":"MIT","_id":"@demsking/vue-jsonschema@1.0.0","maintainers":[{"name":"demsking","email":"demsking@gmail.com"}],"dist":{"shasum":"7810ed7789320d191a08202eb2e38ded0776e1f7","tarball":"https://registry.npmjs.org/@demsking/vue-jsonschema/-/vue-jsonschema-1.0.0.tgz","fileCount":16,"integrity":"sha512-4oVpWvJ0Z/AmsRYN6NNXpXMy7mvJy3lKHsyS6sz6kklkqat10bGcAPV1Lq60tEjKohst26AO+vgpscuXsfm6vg==","signatures":[{"sig":"MEUCIQCFp12CoXjczfYSl6UZsuk2lzMIh5eOeraIHUHatWmY7QIgFL3QL5wSXDjDKrA0YoNMqqzdn9lOJhGSE2PVU2sSn20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101804},"main":"./dist/vue-jsonschema.cjs","type":"module","types":"./dist/vue-jsonschema.d.ts","module":"./dist/vue-jsonschema.js","exports":{".":{"types":"./dist/vue-jsonschema.d.ts","import":"./dist/vue-jsonschema.js","require":"./dist/vue-jsonschema.cjs"},"./utils":{"types":"./dist/schema-utils.d.ts","import":"./dist/schema-utils.js","require":"./dist/schema-utils.cjs"},"./vite-plugin":{"types":"./dist/vite-plugin-vue-jsonschema.d.ts","import":"./dist/vite-plugin-vue-jsonschema.js","require":"./dist/vite-plugin-vue-jsonschema.cjs"}},"gitHead":"95bc58d9fd661bfcd857bb980aac1934bd89e231","scripts":{"test":"vitest","build":"tsc && vite build","shell":"tmuxinator","format":"prettier --write src/","coverage":"vitest run --coverage"},"_npmUser":{"name":"demsking","email":"demsking@gmail.com"},"_npmVersion":"10.9.2","description":"Convert Vue component props to JSON Schema","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.28","jiti":"^2.6.1","vite":"^7.3.1","vitest":"^4.0.18","vue-tsc":"^3.2.4","prettier":"^3.8.1","typescript":"~5.9.3","vite-plugin-dts":"^4.5.4","@vue/compiler-sfc":"^3.5.28","vue-component-meta":"^3.2.4","@vitest/coverage-v8":"^4.0.18","prettier-plugin-curly":"^0.4.1"},"peerDependencies":{"typescript":">=5.0.0","vue-component-meta":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-jsonschema_1.0.0_1771452473139_0.07809938119509652","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@demsking/vue-jsonschema","version":"1.0.1","author":{"name":"Sébastien Ndemnou"},"license":"MIT","_id":"@demsking/vue-jsonschema@1.0.1","maintainers":[{"name":"demsking","email":"demsking@gmail.com"}],"dist":{"shasum":"02660fa53a62c441e7eb69592df8db5a2b782c40","tarball":"https://registry.npmjs.org/@demsking/vue-jsonschema/-/vue-jsonschema-1.0.1.tgz","fileCount":16,"integrity":"sha512-RTLGk1VQr/jfNC2BE06KGWMekZ3C17EXETyR5PHBp6v0K+Mnvol1EDSLaz8dn9x237XYtyP1rUemdj2qSkDJ5A==","signatures":[{"sig":"MEYCIQDIn62/fOH2/qZA2akqc0DcR4KyeY1NIwEnQ1kqXPIhywIhAK07m4FL3zT3YArr7VCLPF3id83LXx74BakUiMWQlZWQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102281},"main":"./dist/vue-jsonschema.cjs","type":"module","types":"./dist/vue-jsonschema.d.ts","module":"./dist/vue-jsonschema.js","exports":{".":{"types":"./dist/vue-jsonschema.d.ts","import":"./dist/vue-jsonschema.js","require":"./dist/vue-jsonschema.cjs"},"./utils":{"types":"./dist/schema-utils.d.ts","import":"./dist/schema-utils.js","require":"./dist/schema-utils.cjs"},"./vite-plugin":{"types":"./dist/vite-plugin-vue-jsonschema.d.ts","import":"./dist/vite-plugin-vue-jsonschema.js","require":"./dist/vite-plugin-vue-jsonschema.cjs"}},"gitHead":"2f07af7a3fadd3d22fc1ba30b6c7252bfb87a7e8","scripts":{"test":"vitest","build":"tsc && vite build","shell":"tmuxinator","format":"prettier --write src/","coverage":"vitest run --coverage"},"_npmUser":{"name":"demsking","email":"demsking@gmail.com"},"_npmVersion":"10.9.2","description":"Convert Vue component props to JSON Schema","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.28","jiti":"^2.6.1","vite":"^7.3.1","vitest":"^4.0.18","vue-tsc":"^3.2.4","prettier":"^3.8.1","typescript":"~5.9.3","vite-plugin-dts":"^4.5.4","@vue/compiler-sfc":"^3.5.28","vue-component-meta":"^3.2.4","@vitest/coverage-v8":"^4.0.18","prettier-plugin-curly":"^0.4.1"},"peerDependencies":{"typescript":">=5.0.0","vue-component-meta":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-jsonschema_1.0.1_1771495011275_0.7027658444013272","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@demsking/vue-jsonschema","version":"1.1.0","author":{"name":"Sébastien Ndemnou"},"license":"MIT","_id":"@demsking/vue-jsonschema@1.1.0","maintainers":[{"name":"demsking","email":"demsking@gmail.com"}],"dist":{"shasum":"f3d96b74ab67f67ba5a0ad269b1da139b8a3b5ff","tarball":"https://registry.npmjs.org/@demsking/vue-jsonschema/-/vue-jsonschema-1.1.0.tgz","fileCount":16,"integrity":"sha512-21nUCXdLRNPVum3iUT/zb3aXEpXFHl0MueiYJd9unx7dc7sajZ+HZWOlRuabWl+JLid11f139p1lBSNr4L0n5g==","signatures":[{"sig":"MEYCIQDHFGsu4yZQNdJ3D7SYdioPvZOomupE+9CiE7xDJruXJQIhAKR1fT5owCQL//nSv4Tbn9/kiO5Bc2DdJLAeIOWzO5gp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103306},"main":"./dist/vue-jsonschema.cjs","type":"module","types":"./dist/vue-jsonschema.d.ts","module":"./dist/vue-jsonschema.js","exports":{".":{"types":"./dist/vue-jsonschema.d.ts","import":"./dist/vue-jsonschema.js","require":"./dist/vue-jsonschema.cjs"},"./utils":{"types":"./dist/schema-utils.d.ts","import":"./dist/schema-utils.js","require":"./dist/schema-utils.cjs"},"./vite-plugin":{"types":"./dist/vite-plugin-vue-jsonschema.d.ts","import":"./dist/vite-plugin-vue-jsonschema.js","require":"./dist/vite-plugin-vue-jsonschema.cjs"}},"gitHead":"1a0548de26ef693c80129a24c0890ab0401b252d","scripts":{"test":"vitest","build":"tsc && vite build","shell":"tmuxinator","format":"prettier --write src/","coverage":"vitest run --coverage"},"_npmUser":{"name":"demsking","email":"demsking@gmail.com"},"_npmVersion":"10.9.2","description":"Convert Vue component props to JSON Schema","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.28","jiti":"^2.6.1","vite":"^7.3.1","vitest":"^4.0.18","vue-tsc":"^3.2.4","prettier":"^3.8.1","typescript":"~5.9.3","vite-plugin-dts":"^4.5.4","@vue/compiler-sfc":"^3.5.28","vue-component-meta":"^3.2.4","@vitest/coverage-v8":"^4.0.18","prettier-plugin-curly":"^0.4.1"},"peerDependencies":{"typescript":">=5.0.0","vue-component-meta":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-jsonschema_1.1.0_1771503542465_0.7729976687446718","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@demsking/vue-jsonschema","version":"1.2.0","author":{"name":"Sébastien Ndemnou"},"license":"MIT","_id":"@demsking/vue-jsonschema@1.2.0","maintainers":[{"name":"demsking","email":"demsking@gmail.com"}],"dist":{"shasum":"6fd29f8c10f1f0e081da0c776c52bcbe3769f9bd","tarball":"https://registry.npmjs.org/@demsking/vue-jsonschema/-/vue-jsonschema-1.2.0.tgz","fileCount":16,"integrity":"sha512-a8KvkJJTFgJ7SVoUTTO/DKoJHCKDlx8tp5IDaJa1OzSQOZ0qWreBHUCSN+oQ7CtfCE+ZPy1/nha2XpUDeqlk0g==","signatures":[{"sig":"MEYCIQC24ol8XNUgtLxP01eeeANooCGDMl/r5CfFHVUKhIL6FgIhAO+TPZMj0nUNerte1OGPkp9Xb+ARJslhakBDy23LzTpy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115269},"main":"./dist/vue-jsonschema.cjs","type":"module","types":"./dist/vue-jsonschema.d.ts","module":"./dist/vue-jsonschema.js","exports":{".":{"types":"./dist/vue-jsonschema.d.ts","import":"./dist/vue-jsonschema.js","require":"./dist/vue-jsonschema.cjs"},"./utils":{"types":"./dist/schema-utils.d.ts","import":"./dist/schema-utils.js","require":"./dist/schema-utils.cjs"},"./vite-plugin":{"types":"./dist/vite-plugin-vue-jsonschema.d.ts","import":"./dist/vite-plugin-vue-jsonschema.js","require":"./dist/vite-plugin-vue-jsonschema.cjs"}},"gitHead":"85ff4a62a5aa976f5beb1cbc62123867cc6a39d1","scripts":{"test":"vitest","build":"tsc && vite build","shell":"tmuxinator","format":"prettier --write src/","coverage":"vitest run --coverage"},"_npmUser":{"name":"demsking","email":"demsking@gmail.com"},"_npmVersion":"10.9.2","description":"Convert Vue component props to JSON Schema","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.28","jiti":"^2.6.1","vite":"^7.3.1","vitest":"^4.0.18","vue-tsc":"^3.2.4","prettier":"^3.8.1","typescript":"~5.9.3","vite-plugin-dts":"^4.5.4","@vue/compiler-sfc":"^3.5.28","vue-component-meta":"^3.2.4","@vitest/coverage-v8":"^4.0.18","prettier-plugin-curly":"^0.4.1"},"peerDependencies":{"typescript":">=5.0.0","vue-component-meta":">=2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vue-jsonschema_1.2.0_1771781881385_0.34434495247445374","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@demsking/vue-jsonschema","description":"Convert Vue component props to JSON Schema","author":{"name":"Sébastien Ndemnou"},"license":"MIT","version":"1.3.0","type":"module","main":"./dist/vue-jsonschema.cjs","module":"./dist/vue-jsonschema.js","types":"./dist/vue-jsonschema.d.ts","exports":{".":{"types":"./dist/vue-jsonschema.d.ts","import":"./dist/vue-jsonschema.js","require":"./dist/vue-jsonschema.cjs"},"./utils":{"types":"./dist/schema-utils.d.ts","import":"./dist/schema-utils.js","require":"./dist/schema-utils.cjs"},"./vite-plugin":{"types":"./dist/vite-plugin-vue-jsonschema.d.ts","import":"./dist/vite-plugin-vue-jsonschema.js","require":"./dist/vite-plugin-vue-jsonschema.cjs"}},"scripts":{"shell":"tmuxinator","build":"tsc && vite build","test":"vitest","coverage":"vitest run --coverage","format":"oxfmt","format:check":"oxfmt --check"},"peerDependencies":{"typescript":">=5.0.0","vue-component-meta":">=2.0.0"},"devDependencies":{"@vitest/coverage-v8":"^4.0.18","@vue/compiler-sfc":"^3.5.28","jiti":"^2.6.1","oxfmt":"^0.35.0","typescript":"~5.9.3","vite":"^7.3.1","vite-plugin-dts":"^4.5.4","vitest":"^4.0.18","vue":"^3.5.28","vue-component-meta":"^3.2.4","vue-tsc":"^3.2.4"},"_id":"@demsking/vue-jsonschema@1.3.0","gitHead":"508cc87af73c414161ed477510975678fcfaecce","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-Tut6ZNOYwsh4+gnVGQK6njnx2gDD5YnItZvTVVyDEnivxwcb9MNFd0P+PWzpBqpOsc8rk2AbqdIvWZGr47xQDQ==","shasum":"6924f83a60abfd5cbdf9a528c26817f5d5f257a6","tarball":"https://registry.npmjs.org/@demsking/vue-jsonschema/-/vue-jsonschema-1.3.0.tgz","fileCount":16,"unpackedSize":163658,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEazC9Wn3JpC6xDgTYyfkOGvAMVkLNqwWyV9WoOZ98VsAiBHkYvEI5uSvzBN5yCydx8sPwR44DZC50flrtzH8b9Idw=="}]},"_npmUser":{"name":"demsking","email":"demsking@gmail.com"},"directories":{},"maintainers":[{"name":"demsking","email":"demsking@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vue-jsonschema_1.3.0_1772718730770_0.7767368130107637"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-18T22:07:53.050Z","modified":"2026-03-05T13:52:11.036Z","1.0.0":"2026-02-18T22:07:53.288Z","1.0.1":"2026-02-19T09:56:51.437Z","1.1.0":"2026-02-19T12:19:02.604Z","1.2.0":"2026-02-22T17:38:01.578Z","1.3.0":"2026-03-05T13:52:10.916Z"},"author":{"name":"Sébastien Ndemnou"},"license":"MIT","description":"Convert Vue component props to JSON Schema","maintainers":[{"name":"demsking","email":"demsking@gmail.com"}],"readme":"# Vue JSON Schema Generator\n\nA production-ready library to extract JSON Schema from Vue 3 component props. Supports Composition API (`<script setup>`), Options API, and TypeScript.\n\n## Features\n\n- **Deep Parsing**: Extracts types, default values, enums, and required status.\n- **Deterministic IDs**: Adds a stable `id` to each schema node (root, properties, nested objects, array items).\n- **Tuple Arrays**: Emits `prefixItems` for TypeScript tuple props (JSON Schema tuple validation).\n- **Literal Inference**: Emits `const` for resolved TypeScript literal values (including generic literal substitutions).\n- **TypeScript Support**: Handles complex TypeScript types, including imported types.\n- **JSDoc Support**: Maps JSDoc comments (description, @default, @example) to JSON Schema fields.\n- **Custom Keywords**: Support for `@pattern`, `@min`, `@max`, `@minLength`, `@maxLength`, etc.\n- **Vite Plugin**: Generate JSON Schemas on the fly using a custom query (`?schema`).\n\n## Installation\n\n```bash\nnpm install vue-jsonschema\n```\n\n> [!NOTE]\n> This library requires `typescript` and `vue-component-meta` as peer dependencies. Ensure they are installed in your project.\n\n## Usage\n\n### Library\n\n```typescript\nimport { VueComponentParser } from 'vue-jsonschema';\n\nconst parser = new VueComponentParser('path/to/tsconfig.json');\nconst schema = parser.getComponentSchema('path/to/MyComponent.vue');\n\nconsole.log(JSON.stringify(schema, null, 2));\n```\n\n## Configuration\n\nBoth the library and the Vite plugin accept a `ParserOptions` object:\n\n| Prop                   | Type                                                                                                  | Description                                                                                                                      |\n| :--------------------- | :---------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- |\n| `tsconfigPath`         | `string`                                                                                              | **Required**. Path to your `tsconfig.json`.                                                                                      |\n| `ignoreProps`          | `string[]`                                                                                            | List of props to skip (e.g., `['key', 'ref']`).                                                                                  |\n| `customTags`           | `Array<string \\| { name: string; onSchemaParsed?: (componentPath, parent, rawValue) => boolean \\| void }>` | Extra JSDoc tags and optional schema handlers.                                                                                   |\n| `definePropsFunctions` | `string[]`                                                                                            | Prop macro names to parse. Defaults to `['defineProps']`; when set, it replaces the default list (e.g. `['defineSchemaProps']`). |\n| `schemaTypeWrappers`   | `string[]`                                                                                            | Type wrappers whose generic argument is parsed as props when no macro call exists (e.g. `MyCustomNamespace.DefineSchema<T>`).    |\n| `schemaTypeWrapperIgnoreProps` | `string[]`                                                                                   | Prop names to skip as JSON Schema when parsing schema type wrappers; their raw value is still passed to matching custom tag handlers. |\n| `opaqueTypeNames`      | `string[]`                                                                                            | Type names to treat as opaque JSON objects (skip deep schema parsing), e.g. `JsonSchema`, `JSONSchema7`.                          |\n| `idSeparator`          | `string`                                                                                              | Separator used when generating schema node IDs. Default: `\".\"`.                                                                  |\n\nWhen the parser needs transformed `.vue` temp files, it uses `TMPDIR` / `TEMP` / `TMP` (fallback: `/tmp`) and falls back to local temp files when relative imports are detected.\n\n### Examples\n\n#### Ignoring Props\n\n```typescript\nconst parser = new VueComponentParser({\n  tsconfigPath: './tsconfig.json',\n  ignoreProps: ['internalId', 'debugMode'],\n});\n```\n\n#### Custom JSDoc Tags\n\nIf you use custom JSDoc tags that you want included in the schema:\n\n```typescript\nconst parser = new VueComponentParser({\n  tsconfigPath: './tsconfig.json',\n  customTags: ['ui:widget', 'ui:options'],\n});\n```\n\nThese tags will be added to the schema under their respective names.\n\n> [!NOTE]\n> Custom tag keys are emitted using the exact casing from the component JSDoc tag.\n> Repeated custom tags are emitted as arrays in declaration order.\n\n#### Ignore Fields In Schema Type Wrappers\n\nIf you parse props from wrapper types and need to skip specific fields:\n\n```typescript\nconst parser = new VueComponentParser({\n  tsconfigPath: './tsconfig.json',\n  schemaTypeWrappers: ['MyCustomNamespace.DefineSchema'],\n  schemaTypeWrapperIgnoreProps: ['internal', 'secret'],\n});\n```\n\nThis omits `internal` and `secret` from the generated schema when they come from wrapper-derived props.\n\n#### Custom Tag Schema Handlers\n\nYou can attach transformation handlers to custom tags. This lets you parse/transform a custom tag schema or its parent node.\n\nInside schema-like helper types, you can use keys such as `$type` and `$i18nContext` and map them with `onSchemaParsed`:\n\n```ts\ntype TranslationField<T extends { context: string }> = {\n  $type: 'string';\n  $i18nContext: {\n    const: {\n      description: T['context'];\n    };\n  };\n};\n```\n\n```typescript\nconst parser = new VueComponentParser({\n  tsconfigPath: './tsconfig.json',\n  customTags: [\n    {\n      name: '$type',\n      onSchemaParsed: (componentPath, parent, rawValue) => {\n        if (\n          parent &&\n          (typeof rawValue === 'string' ||\n            (Array.isArray(rawValue) &&\n              rawValue.every((item) => typeof item === 'string')))\n        ) {\n          // e.g. use componentPath for per-component rules\n          if (!componentPath.endsWith('.vue')) return;\n          parent.type = rawValue;\n          return true; // consume the $type property\n        }\n      },\n    },\n  ],\n});\n```\n\nThis is emitted as:\n\n```json\n{\n  \"type\": \"string\",\n  \"$i18nContext\": {\n    \"description\": \"The morning greeting message\"\n  }\n}\n```\n\n## JSDoc Mapping\n\nThe following tags are automatically mapped to JSON Schema fields:\n\n| JSDoc Tag               | JSON Schema Field |\n| :---------------------- | :---------------- |\n| `@title`                | `title`           |\n| `@description`          | `description`     |\n| `@default`              | `default`         |\n| `@example`              | `example`         |\n| `@pattern`              | `pattern`         |\n| `@step` / `@multipleOf` | `multipleOf`      |\n| `@minimum` / `@min`     | `minimum`         |\n| `@maximum` / `@max`     | `maximum`         |\n| `@minLength`            | `minLength`       |\n| `@maxLength`            | `maxLength`       |\n| `@minItems`             | `minItems`        |\n| `@maxItems`             | `maxItems`        |\n\n### Vite Plugin\n\nAdd it to your `vite.config.ts`:\n\n```typescript\nimport vue from '@vitejs/plugin-vue';\n\nimport { defineConfig } from 'vite';\nimport { vueJsonSchemaPlugin } from 'vue-jsonschema/vite-plugin';\n\nexport default defineConfig({\n  plugins: [\n    vue(),\n    vueJsonSchemaPlugin({\n      tsconfigPath: './tsconfig.json', // optional, defaults to tsconfig.json\n    }),\n  ],\n});\n```\n\n## Usage\n\n```typescript\n// vite.config.ts\nimport { defineConfig } from 'vite';\nimport { vueJsonschema } from 'vue-jsonschema';\n\nexport default defineConfig({\n  plugins: [\n    vueJsonschema({\n      // Path to your tsconfig.json (required)\n      tsconfigPath: './tsconfig.json',\n      // Props to ignore (optional)\n      ignoreProps: ['metricsName'],\n      // Custom JSDoc tags to include (optional)\n      customTags: ['ui:widget', 'ui:options'],\n    }),\n  ],\n});\n```\n\nThe plugin will automatically generate a JSON schema file for each Vue component in your project. The schema file will be named `<Component>.schema.json` and placed in the same directory as the component.\n\n## JSDoc Tags Support\n\nThe following JSDoc tags are supported and mapped to JSON Schema fields:\n\n| JSDoc Tag              | JSON Schema Field   | Description                                 |\n| :--------------------- | :------------------ | :------------------------------------------ |\n| `@default`             | `default`           | Default value                               |\n| `@example`             | `example`           | Example value                               |\n| `@examples`            | `examples`          | List of example values (JSON array)         |\n| `@const`               | `const`             | Constant value                              |\n| `@readonly`            | `readOnly`          | Read-only property                          |\n| `@writeonly`           | `writeOnly`         | Write-only property                         |\n| `@comment`             | `$comment`          | Comment for schema maintainers              |\n| `@minimum`, `@min`     | `minimum`           | Minimum numeric value                       |\n| `@maximum`, `@max`     | `maximum`           | Maximum numeric value                       |\n| `@multipleOf`, `@step` | `multipleOf`        | Number must be a multiple of this value     |\n| `@minLength`           | `minLength`         | Minimum string length                       |\n| `@maxLength`           | `maxLength`         | Maximum string length                       |\n| `@pattern`             | `pattern`           | Regex pattern for string                    |\n| `@format`              | `format`            | String format (e.g., email, uri, date-time) |\n| `@minItems`            | `minItems`          | Minimum array items                         |\n| `@maxItems`            | `maxItems`          | Maximum array items                         |\n| `@dependentRequired`   | `dependentRequired` | Dependent required properties (JSON object) |\n| `@dependentSchemas`    | `dependentSchemas`  | Dependent schemas (JSON object)             |\n| `@contentMediaType`    | `contentMediaType`  | MIME type of string content                 |\n| `@contentEncoding`     | `contentEncoding`   | Encoding of string content                  |\n| `@contentSchema`       | `contentSchema`     | Schema for string content (JSON object)     |\n| `@ignore`              | -                   | Ignore property from schema                 |\n\nYou can also pass custom tags to the `customTags` option in `vite.config.ts` to include them in the schema.\n\n### Example\n\n```vue\n<script setup lang=\"ts\">\n  export interface Props {\n    /**\n     * The name of the user\n     * @default \"John Doe\"\n     * @minLength 3\n     */\n    name?: string;\n\n    /**\n     * The age of the user\n     * @minimum 18\n     * @maximum 100\n     */\n    age: number;\n\n    /**\n     * Status of the user\n     * @ignore\n     */\n    internalStatus?: string;\n  }\n\n  defineProps<Props>();\n</script>\n```\n\nThen you can import the schema in your project:\n\n```typescript\nimport MyComponentSchema from './components/MyComponent.vue?schema';\n\nconsole.log(MyComponentSchema);\n```\n\n## Type Mapping Notes\n\n### Tuple arrays use `prefixItems`\n\nFor tuple props like:\n\n```ts\ncoordinates: [number, number, string];\n```\n\nthe generated schema uses tuple validation:\n\n```json\n{\n  \"type\": \"array\",\n  \"prefixItems\": [\n    { \"type\": \"number\" },\n    { \"type\": \"number\" },\n    { \"type\": \"string\" }\n  ]\n}\n```\n\nRegular arrays still use `items`.\n\n### Generic literal substitution emits `const`\n\nFor generic literal object fields like:\n\n```ts\ntype MessageDefinitionContext<Context extends string> = { context: Context };\nhello?: MessageDefinitionContext<'Generic hello message'>;\n```\n\nthe generated field is:\n\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"context\": {\n      \"type\": \"string\",\n      \"const\": \"Generic hello message\"\n    }\n  }\n}\n```\n\n## License\n\nUnder the MIT license.\nSee [LICENSE](https://gitlab.com/demsking/vue-jsonschema/blob/main/LICENSE) file for\nmore details.\n","readmeFilename":"README.md"}