{"_id":"@demokit-ai/schema","_rev":"4-5928b2d01188c520ba454c5a625e2d9e","name":"@demokit-ai/schema","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"@demokit-ai/schema","version":"0.0.1","keywords":["openapi","swagger","schema","parser","relationships","demo"],"license":"MIT","_id":"@demokit-ai/schema@0.0.1","maintainers":[{"name":"kasava_ai","email":"ben@kasava.dev"}],"homepage":"https://github.com/your-org/demokit#readme","bugs":{"url":"https://github.com/your-org/demokit/issues"},"dist":{"shasum":"5a6b6fb3e7bb244c918a75f2ab508f1d65ae8f50","tarball":"https://registry.npmjs.org/@demokit-ai/schema/-/schema-0.0.1.tgz","fileCount":7,"integrity":"sha512-CWNXcJQLkoEAHWbyc9ZIsTVFUUyTctu8YyZSU/uG5Txrc8zZHl0nYetsxGh0owJtnlSoZE/wij07qkzo8thJOg==","signatures":[{"sig":"MEUCIQD0lRewHar3YK7IdB3VvnVUiPeNhxUNQZlbnuUsTzQRRwIgHfUysLmp4qKj4gDmV4UN2v9lMkPfxaA5o5vl7n9gMaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136314},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"f1052222929b50f8008592fc47c2ebfa589dc89c","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kasava_ai","email":"ben@kasava.dev"},"repository":{"url":"git+https://github.com/your-org/demokit.git","type":"git","directory":"packages/schema"},"_npmVersion":"11.6.2","description":"OpenAPI schema parsing with relationship detection for DemoKit","directories":{},"sideEffects":false,"_nodeVersion":"24.5.0","dependencies":{"openapi-types":"^12.1.3","@apidevtools/swagger-parser":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/schema_0.0.1_1766349489616_0.2011042632615574","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@demokit-ai/schema","version":"0.0.2","keywords":["openapi","swagger","schema","parser","relationships","demo"],"license":"MIT","_id":"@demokit-ai/schema@0.0.2","maintainers":[{"name":"kasava_ai","email":"ben@kasava.dev"}],"homepage":"https://github.com/your-org/demokit#readme","bugs":{"url":"https://github.com/your-org/demokit/issues"},"dist":{"shasum":"60b06a1b7f7a21e455204d3eddd1059585b8ea04","tarball":"https://registry.npmjs.org/@demokit-ai/schema/-/schema-0.0.2.tgz","fileCount":7,"integrity":"sha512-GXwWDJHFoWvOpXa0pWscKYNLR5TLDpFIMiZ+hn+OxkoiKrNnIJ5/GA6VcD0PUA+rVQ+V2RNKIzFcRICAm866jg==","signatures":[{"sig":"MEQCIG3KDrwTj9ZeR4kIieN//vGKX2XrMlowpzSLRBZY3m36AiALXfW0QPqAi68wyVtIN4/5g42qfuGlp0jSzpsAwIT1Nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147904},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"3b23f6a5b9e543c9cc830866da45f64098e181eb","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kasava_ai","email":"ben@kasava.dev"},"repository":{"url":"git+https://github.com/your-org/demokit.git","type":"git","directory":"packages/schema"},"_npmVersion":"11.6.2","description":"OpenAPI schema parsing with relationship detection for DemoKit","directories":{},"sideEffects":false,"_nodeVersion":"24.5.0","dependencies":{"@scalar/openapi-types":"^0.2.0","@scalar/openapi-parser":"^0.10.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/schema_0.0.2_1766366620615_0.7102369097511936","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@demokit-ai/schema","version":"0.1.0","keywords":["openapi","swagger","schema","parser","relationships","demo"],"license":"MIT","_id":"@demokit-ai/schema@0.1.0","maintainers":[{"name":"kasava_ai","email":"ben@kasava.dev"}],"homepage":"https://github.com/your-org/demokit#readme","bugs":{"url":"https://github.com/your-org/demokit/issues"},"dist":{"shasum":"351d44bbb130e52f7ccc17157c5a8924b985146e","tarball":"https://registry.npmjs.org/@demokit-ai/schema/-/schema-0.1.0.tgz","fileCount":7,"integrity":"sha512-jQ7uuWmWDIfuTusEjWoi+lOnX+nVGAn7TDpt305SmBbN7kTvzsl9h0SdK5mkHrhAU3kEuAh086sX3JMxMO+7iQ==","signatures":[{"sig":"MEUCIDyuWcvto3cXP6UYLb9MUxBLmlIAM+6Jnh0P27wn/oYjAiEA/mSACUHN460TRq5LlVFRVqRkO+Z3wCJ3HOi6r71o4pM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147904},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"90d143b9c375085e6bbdb3f7642dd6985b307b8f","scripts":{"dev":"tsup --watch","test":"vitest","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kasava_ai","email":"ben@kasava.dev"},"repository":{"url":"git+https://github.com/your-org/demokit.git","type":"git","directory":"packages/schema"},"_npmVersion":"11.6.2","description":"OpenAPI schema parsing with relationship detection for DemoKit","directories":{},"sideEffects":false,"_nodeVersion":"24.5.0","dependencies":{"@scalar/openapi-types":"^0.2.0","@scalar/openapi-parser":"^0.10.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2"},"_npmOperationalInternal":{"tmp":"tmp/schema_0.1.0_1766509492150_0.39366504570762517","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@demokit-ai/schema","version":"0.2.0","description":"OpenAPI schema parsing with relationship detection for DemoKit","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest","typecheck":"tsc --noEmit"},"dependencies":{"@scalar/openapi-parser":"^0.10.0","@scalar/openapi-types":"^0.2.0"},"devDependencies":{"tsup":"^8.3.5","typescript":"^5.7.2","vitest":"^2.1.8"},"keywords":["openapi","swagger","schema","parser","relationships","demo"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/your-org/demokit.git","directory":"packages/schema"},"sideEffects":false,"gitHead":"f7ebb99cf31cd49f486988cb5a66991e90f720d4","_id":"@demokit-ai/schema@0.2.0","bugs":{"url":"https://github.com/your-org/demokit/issues"},"homepage":"https://github.com/your-org/demokit#readme","_nodeVersion":"24.5.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-1KgbkYFZN1ptq3764HIzyKkemKSAiy3lYfjSxU2Yok2NL/evLZfCUwFDaogQEajwXpH7lgfQULkPdylB9fjbhQ==","shasum":"94666a878394b61444c8cb7f58ffd3fdd592e6cd","tarball":"https://registry.npmjs.org/@demokit-ai/schema/-/schema-0.2.0.tgz","fileCount":8,"unpackedSize":152815,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIH13A0V1P2aFC1R2ATEmpxQV/0vbK8nbd2r+qLDDr38ZAiEAm7DpreMm9gV3Y9GKmP3xyInHVMnC1IGa9L23hnYaVYg="}]},"_npmUser":{"name":"kasava_ai","email":"ben@kasava.dev"},"directories":{},"maintainers":[{"name":"kasava_ai","email":"ben@kasava.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/schema_0.2.0_1766856994132_0.2861331076192508"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-21T20:38:09.505Z","modified":"2025-12-27T17:36:34.482Z","0.0.1":"2025-12-21T20:38:09.750Z","0.0.2":"2025-12-22T01:23:40.768Z","0.1.0":"2025-12-23T17:04:52.310Z","0.2.0":"2025-12-27T17:36:34.274Z"},"bugs":{"url":"https://github.com/your-org/demokit/issues"},"license":"MIT","homepage":"https://github.com/your-org/demokit#readme","keywords":["openapi","swagger","schema","parser","relationships","demo"],"repository":{"type":"git","url":"git+https://github.com/your-org/demokit.git","directory":"packages/schema"},"description":"OpenAPI schema parsing with relationship detection for DemoKit","maintainers":[{"name":"kasava_ai","email":"ben@kasava.dev"}],"readme":"# @demokit-ai/schema\n\n![Tests](https://img.shields.io/badge/tests-79%20passing-brightgreen)\n![Coverage](https://img.shields.io/badge/coverage-13%25-red)\n\nOpenAPI schema parsing with relationship detection for DemoKit.\n\n## Installation\n\n```bash\nnpm install @demokit-ai/schema\n```\n\n## Features\n\n- **OpenAPI Parsing** - Parse OpenAPI 3.x specifications\n- **Relationship Detection** - Automatically detect model relationships\n- **Schema Normalization** - Convert to DemoKit's internal schema format\n- **Type Inference** - Infer property types and constraints\n- **Validation** - Validate schemas against OpenAPI spec\n- Full TypeScript support\n\n## Usage\n\n### Parse OpenAPI Spec\n\n```ts\nimport { parseOpenAPI } from '@demokit-ai/schema'\n\nconst schema = await parseOpenAPI('./openapi.yaml')\n\nconsole.log(schema.models)\n// {\n//   User: {\n//     properties: {\n//       id: { type: 'string', format: 'uuid' },\n//       name: { type: 'string' },\n//       email: { type: 'string', format: 'email' },\n//     },\n//     required: ['id', 'name', 'email'],\n//   },\n//   Order: { ... },\n// }\n\nconsole.log(schema.relationships)\n// [\n//   { from: { model: 'Order', field: 'userId' }, to: { model: 'User', field: 'id' }, type: 'many-to-one' },\n// ]\n```\n\n### Parse from URL\n\n```ts\nimport { parseOpenAPI } from '@demokit-ai/schema'\n\nconst schema = await parseOpenAPI('https://api.example.com/openapi.json')\n```\n\n### Parse from Object\n\n```ts\nimport { parseOpenAPIObject } from '@demokit-ai/schema'\n\nconst spec = {\n  openapi: '3.0.0',\n  paths: { ... },\n  components: {\n    schemas: {\n      User: { ... },\n    },\n  },\n}\n\nconst schema = parseOpenAPIObject(spec)\n```\n\n### Detect Relationships\n\n```ts\nimport { detectRelationships } from '@demokit-ai/schema'\n\nconst models = {\n  User: {\n    properties: {\n      id: { type: 'string' },\n    },\n  },\n  Order: {\n    properties: {\n      id: { type: 'string' },\n      userId: { type: 'string' },\n    },\n  },\n}\n\nconst relationships = detectRelationships(models)\n// [\n//   {\n//     from: { model: 'Order', field: 'userId' },\n//     to: { model: 'User', field: 'id' },\n//     type: 'many-to-one',\n//   },\n// ]\n```\n\n### Define Schema Manually\n\n```ts\nimport { defineSchema } from '@demokit-ai/schema'\n\nconst schema = defineSchema({\n  models: {\n    User: {\n      properties: {\n        id: { type: 'string', format: 'uuid' },\n        name: { type: 'string', minLength: 1 },\n        email: { type: 'string', format: 'email' },\n        role: { type: 'string', enum: ['admin', 'user', 'guest'] },\n        createdAt: { type: 'string', format: 'date-time' },\n      },\n      required: ['id', 'name', 'email'],\n    },\n    Order: {\n      properties: {\n        id: { type: 'string', format: 'uuid' },\n        userId: {\n          type: 'string',\n          relationshipTo: { model: 'User', field: 'id' },\n        },\n        total: { type: 'number', minimum: 0 },\n        status: { type: 'string', enum: ['pending', 'completed', 'cancelled'] },\n      },\n      required: ['id', 'userId', 'total', 'status'],\n    },\n  },\n})\n```\n\n### Validate Schema\n\n```ts\nimport { validateSchema } from '@demokit-ai/schema'\n\nconst result = validateSchema(schema)\n\nif (!result.valid) {\n  console.error('Schema errors:', result.errors)\n}\n```\n\n## API Reference\n\n### `parseOpenAPI(pathOrUrl)`\n\nParse an OpenAPI spec from a file path or URL.\n\nReturns: `Promise<DemokitSchema>`\n\n### `parseOpenAPIObject(spec)`\n\nParse an OpenAPI spec from a JavaScript object.\n\nReturns: `DemokitSchema`\n\n### `detectRelationships(models)`\n\nDetect relationships between models based on field naming conventions.\n\nReturns: `Relationship[]`\n\n### `defineSchema(options)`\n\nDefine a schema manually with full type inference.\n\nOptions:\n- `models` - Model definitions\n- `relationships` - Explicit relationship definitions (optional)\n\nReturns: `DemokitSchema`\n\n### `validateSchema(schema)`\n\nValidate a schema for correctness.\n\nReturns:\n- `valid` - Whether schema is valid\n- `errors` - Array of validation errors\n- `warnings` - Array of warnings\n\n## Types\n\n### `DemokitSchema`\n\n```ts\ninterface DemokitSchema {\n  version: string\n  models: Record<string, DataModel>\n  relationships: Relationship[]\n}\n```\n\n### `DataModel`\n\n```ts\ninterface DataModel {\n  properties: Record<string, PropertyDef>\n  required?: string[]\n}\n```\n\n### `PropertyDef`\n\n```ts\ninterface PropertyDef {\n  type: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object'\n  name?: string\n  format?: string\n  enum?: unknown[]\n  minimum?: number\n  maximum?: number\n  minLength?: number\n  maxLength?: number\n  pattern?: string\n  nullable?: boolean\n  default?: unknown\n  example?: unknown\n  relationshipTo?: { model: string; field: string }\n  items?: PropertyDef | DataModel\n}\n```\n\n### `Relationship`\n\n```ts\ninterface Relationship {\n  from: { model: string; field: string }\n  to: { model: string; field: string }\n  type: 'one-to-one' | 'one-to-many' | 'many-to-one' | 'many-to-many'\n}\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}