@standard-community/standard-openapi 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/dist/default-C7_LgS8R.cjs +1 -0
- package/dist/default-PnsbTDiK.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -1
- package/dist/zod-B4Z3YRnT.js +1 -0
- package/dist/zod-hd0-fbCt.cjs +1 -0
- package/package.json +33 -3
package/README.md
CHANGED
|
@@ -5,3 +5,51 @@
|
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
7
|
Standard Schema Validator's OpenAPI Schema Converter
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Install the main package -
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
pnpm add @standard-community/standard-openapi
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
For some specific vendor, install the respective package also -
|
|
18
|
+
|
|
19
|
+
| Vendor | Package |
|
|
20
|
+
| ------- | ------- |
|
|
21
|
+
| Zod | `zod-openapi` |
|
|
22
|
+
| Valibot | `@standard-community/standard-json` `@valibot/to-json-schema` `json-schema-walker` |
|
|
23
|
+
| ArkType | `@standard-community/standard-json` `json-schema-walker` |
|
|
24
|
+
| Effect Schema | `@standard-community/standard-json` `json-schema-walker` |
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { toOpenAPISchema } from "@standard-community/standard-openapi";
|
|
30
|
+
|
|
31
|
+
// Define your schema
|
|
32
|
+
const schema = v.pipe(
|
|
33
|
+
v.object({
|
|
34
|
+
myString: v.string(),
|
|
35
|
+
myUnion: v.union([v.number(), v.boolean()]),
|
|
36
|
+
}),
|
|
37
|
+
v.description("My neat object schema"),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
// Convert it to OpenAPI Schema
|
|
41
|
+
const openapiSchema = await toOpenAPISchema(schema);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Compatibility
|
|
45
|
+
|
|
46
|
+
List of supported validators -
|
|
47
|
+
|
|
48
|
+
| Vendor | Supported |
|
|
49
|
+
| ------- | ------- |
|
|
50
|
+
| Zod | ✅ |
|
|
51
|
+
| Valibot | ✅ |
|
|
52
|
+
| ArkType | ✅ |
|
|
53
|
+
| Effect Schema | 🛠️ |
|
|
54
|
+
|
|
55
|
+
You can check the compatibility versions at [standardschema.dev](https://standardschema.dev/)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var d=Object.defineProperty;var i=(e,t)=>d(e,"name",{value:t,configurable:!0});var u=require("json-schema-walker"),p=require("@standard-community/standard-json");const y=["$ref","definitions","title","multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","enum","type","not","allOf","oneOf","anyOf","items","properties","additionalProperties","description","format","default","nullable","discriminator","readOnly","writeOnly","example","externalDocs","deprecated","xml"];class c extends Error{static{i(this,"InvalidTypeError")}constructor(t){super(t),this.name="InvalidTypeError",this.message=t}}const f="x-",v=i(async(e,t)=>{if(typeof e!="object")return e;if(e.type){const r=new u.Walker;return await r.loadSchema({definitions:t.definitions||[],...e,$schema:t.$schema},{dereference:!0,cloneSchema:!0,dereferenceOptions:{dereference:{circular:"ignore"}}}),await r.walk(s,r.vocabularies.DRAFT_07),"definitions"in r.rootSchema&&(r.rootSchema.definitions=void 0),r.rootSchema}if(Array.isArray(e)){const r=e;if(r.includes("null")){const o=r.filter(a=>a!=="null");return{type:o.length===1?o[0]:o,nullable:!0}}}return e},"handleDefinition"),x=i(async e=>{const t=new u.Walker;await t.loadSchema(e),await t.walk(s,t.vocabularies.DRAFT_07);const n=t.rootSchema;if(n?.definitions)for(const r in n.definitions){const l=n.definitions[r];n.definitions[r]=await v(l,e)}return n},"convert");function w(e){return typeof e!="object"||(e.$schema=void 0,e.$id=void 0,"id"in e&&(e.id=void 0)),e}i(w,"stripIllegalKeywords");function s(e){let t=e;return t&&(t=w(t),t=S(t),t=M(t),t=O(t),t=k(t),t=T(t),t=$(t),t=P(t),typeof t.patternProperties=="object"&&(t=g(t)),t.type==="array"&&typeof t.items>"u"&&(t.items={}),t=j(t),t)}i(s,"convertSchema");const b=new Set(["null","boolean","object","array","number","string","integer"]);function A(e){if(typeof e=="object"&&!Array.isArray(e)&&(e&&"$ref"in e&&e.$ref||e&&"properties"in e&&e.properties))return;const t=Array.isArray(e)?e:[e];for(const n of t)if(n&&!b.has(n))throw new c(`Type "${n}" is not a valid type`)}i(A,"validateType");function O(e){const t=e.dependencies;if(typeof t!="object")return e;e.dependencies=void 0,Array.isArray(e.allOf)||(e.allOf=[]);for(const n in t){const r={oneOf:[{not:{required:[n]}},{required:[n,t[n]].flat()}]};e.allOf.push(r)}return e}i(O,"convertDependencies");function k(e){for(const t of["oneOf","anyOf"]){const n=e[t];if(!n)continue;if(!Array.isArray(n)||!n.some(o=>o.type==="null"))return e;const l=n.filter(o=>o.type!=="null");for(const o of l)o.nullable=!0;e[t]=l}return e}i(k,"convertNullable");function S(e){if(typeof e!="object"||e.type===void 0)return e;if(A(e.type),Array.isArray(e.type)){e.type.includes("null")&&(e.nullable=!0);const t=e.type.filter(n=>n!=="null");t.length===0?e.type=void 0:t.length===1?e.type=t[0]:(e.type=void 0,e.anyOf=t.map(n=>({type:n})))}else e.type==="null"&&(e.type=void 0,e.nullable=!0);return e}i(S,"convertTypes");function g(e){return e["x-patternProperties"]=e.patternProperties,e.patternProperties=void 0,e.additionalProperties??=!0,e}i(g,"convertPatternProperties");function j(e){const t=Object.keys(e);for(const n of t)if(!n.startsWith(f)&&!y.includes(n)){const r=`${f}${n}`;e[r]=e[n],e[n]=void 0}return e}i(j,"convertIllegalKeywordsAsExtensions");function P(e){return e.examples&&Array.isArray(e.examples)&&(e.example=e.examples[0],e.examples=void 0),e}i(P,"convertExamples");function M(e){return typeof e.const<"u"&&(e.enum=[e.const],e.const=void 0),e}i(M,"rewriteConst");function T(e){return typeof e!="object"||"if"in e&&e.if&&e.then&&(e.oneOf=[{allOf:[e.if,e.then].filter(Boolean)},{allOf:[{not:e.if},e.else].filter(Boolean)}],e.if=void 0,e.then=void 0,e.else=void 0),e}i(T,"rewriteIfThenElse");function $(e){return typeof e.exclusiveMaximum=="number"&&(e.maximum=e.exclusiveMaximum,e.exclusiveMaximum=!0),typeof e.exclusiveMinimum=="number"&&(e.minimum=e.exclusiveMinimum,e.exclusiveMinimum=!0),e}i($,"rewriteExclusiveMinMax");const E=i(async e=>{const t=p.toJsonSchema(e);return{schema:await x(t)}},"generator");exports.generator=E;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var r=(e,t)=>a(e,"name",{value:t,configurable:!0});import{Walker as f}from"json-schema-walker";import{toJsonSchema as d}from"@standard-community/standard-json";const y=["$ref","definitions","title","multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","maxProperties","minProperties","required","enum","type","not","allOf","oneOf","anyOf","items","properties","additionalProperties","description","format","default","nullable","discriminator","readOnly","writeOnly","example","externalDocs","deprecated","xml"];class c extends Error{static{r(this,"InvalidTypeError")}constructor(t){super(t),this.name="InvalidTypeError",this.message=t}}const u="x-",v=r(async(e,t)=>{if(typeof e!="object")return e;if(e.type){const i=new f;return await i.loadSchema({definitions:t.definitions||[],...e,$schema:t.$schema},{dereference:!0,cloneSchema:!0,dereferenceOptions:{dereference:{circular:"ignore"}}}),await i.walk(s,i.vocabularies.DRAFT_07),"definitions"in i.rootSchema&&(i.rootSchema.definitions=void 0),i.rootSchema}if(Array.isArray(e)){const i=e;if(i.includes("null")){const o=i.filter(p=>p!=="null");return{type:o.length===1?o[0]:o,nullable:!0}}}return e},"handleDefinition"),x=r(async e=>{const t=new f;await t.loadSchema(e),await t.walk(s,t.vocabularies.DRAFT_07);const n=t.rootSchema;if(n?.definitions)for(const i in n.definitions){const l=n.definitions[i];n.definitions[i]=await v(l,e)}return n},"convert");function w(e){return typeof e!="object"||(e.$schema=void 0,e.$id=void 0,"id"in e&&(e.id=void 0)),e}r(w,"stripIllegalKeywords");function s(e){let t=e;return t&&(t=w(t),t=g(t),t=m(t),t=O(t),t=S(t),t=M(t),t=T(t),t=j(t),typeof t.patternProperties=="object"&&(t=k(t)),t.type==="array"&&typeof t.items>"u"&&(t.items={}),t=P(t),t)}r(s,"convertSchema");const b=new Set(["null","boolean","object","array","number","string","integer"]);function A(e){if(typeof e=="object"&&!Array.isArray(e)&&(e&&"$ref"in e&&e.$ref||e&&"properties"in e&&e.properties))return;const t=Array.isArray(e)?e:[e];for(const n of t)if(n&&!b.has(n))throw new c(`Type "${n}" is not a valid type`)}r(A,"validateType");function O(e){const t=e.dependencies;if(typeof t!="object")return e;e.dependencies=void 0,Array.isArray(e.allOf)||(e.allOf=[]);for(const n in t){const i={oneOf:[{not:{required:[n]}},{required:[n,t[n]].flat()}]};e.allOf.push(i)}return e}r(O,"convertDependencies");function S(e){for(const t of["oneOf","anyOf"]){const n=e[t];if(!n)continue;if(!Array.isArray(n)||!n.some(o=>o.type==="null"))return e;const l=n.filter(o=>o.type!=="null");for(const o of l)o.nullable=!0;e[t]=l}return e}r(S,"convertNullable");function g(e){if(typeof e!="object"||e.type===void 0)return e;if(A(e.type),Array.isArray(e.type)){e.type.includes("null")&&(e.nullable=!0);const t=e.type.filter(n=>n!=="null");t.length===0?e.type=void 0:t.length===1?e.type=t[0]:(e.type=void 0,e.anyOf=t.map(n=>({type:n})))}else e.type==="null"&&(e.type=void 0,e.nullable=!0);return e}r(g,"convertTypes");function k(e){return e["x-patternProperties"]=e.patternProperties,e.patternProperties=void 0,e.additionalProperties??=!0,e}r(k,"convertPatternProperties");function P(e){const t=Object.keys(e);for(const n of t)if(!n.startsWith(u)&&!y.includes(n)){const i=`${u}${n}`;e[i]=e[n],e[n]=void 0}return e}r(P,"convertIllegalKeywordsAsExtensions");function j(e){return e.examples&&Array.isArray(e.examples)&&(e.example=e.examples[0],e.examples=void 0),e}r(j,"convertExamples");function m(e){return typeof e.const<"u"&&(e.enum=[e.const],e.const=void 0),e}r(m,"rewriteConst");function M(e){return typeof e!="object"||"if"in e&&e.if&&e.then&&(e.oneOf=[{allOf:[e.if,e.then].filter(Boolean)},{allOf:[{not:e.if},e.else].filter(Boolean)}],e.if=void 0,e.then=void 0,e.else=void 0),e}r(M,"rewriteIfThenElse");function T(e){return typeof e.exclusiveMaximum=="number"&&(e.maximum=e.exclusiveMaximum,e.exclusiveMaximum=!0),typeof e.exclusiveMinimum=="number"&&(e.minimum=e.exclusiveMinimum,e.exclusiveMinimum=!0),e}r(T,"rewriteExclusiveMinMax");const $=r(async e=>{const t=d(e);return{schema:await x(t)}},"generator");export{$ as generator};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var n=(e,r)=>a(e,"name",{value:r,configurable:!0});const o=n(async e=>{const r=e["~standard"].vendor;let t;switch(r){case"arktype":case"effect":case"valibot":t=Promise.resolve().then(function(){return require("./default-C7_LgS8R.cjs")});break;case"zod":t=Promise.resolve().then(function(){return require("./zod-hd0-fbCt.cjs")});break;default:throw new Error(`standard-openapi: Unsupported schema vendor "${r}"`)}return await(await t).generator(e)},"toOpenAPISchema");exports.toOpenAPISchema=o;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as zod_openapi from 'zod-openapi';
|
|
2
|
+
|
|
1
3
|
/** The Standard Schema interface. */
|
|
2
4
|
interface StandardSchemaV1<Input = unknown, Output = Input> {
|
|
3
5
|
/** The Standard Schema properties. */
|
|
@@ -55,6 +57,6 @@ declare namespace StandardSchemaV1 {
|
|
|
55
57
|
export { };
|
|
56
58
|
}
|
|
57
59
|
|
|
58
|
-
declare const toOpenAPISchema: (
|
|
60
|
+
declare const toOpenAPISchema: (schema: StandardSchemaV1) => Promise<zod_openapi.SchemaResult>;
|
|
59
61
|
|
|
60
62
|
export { toOpenAPISchema };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as zod_openapi from 'zod-openapi';
|
|
2
|
+
|
|
1
3
|
/** The Standard Schema interface. */
|
|
2
4
|
interface StandardSchemaV1<Input = unknown, Output = Input> {
|
|
3
5
|
/** The Standard Schema properties. */
|
|
@@ -55,6 +57,6 @@ declare namespace StandardSchemaV1 {
|
|
|
55
57
|
export { };
|
|
56
58
|
}
|
|
57
59
|
|
|
58
|
-
declare const toOpenAPISchema: (
|
|
60
|
+
declare const toOpenAPISchema: (schema: StandardSchemaV1) => Promise<zod_openapi.SchemaResult>;
|
|
59
61
|
|
|
60
62
|
export { toOpenAPISchema };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var o=Object.defineProperty;var t=(e,a)=>o(e,"name",{value:a,configurable:!0});const n=t(async e=>{const a=e["~standard"].vendor;let r;switch(a){case"arktype":case"effect":case"valibot":r=import("./default-PnsbTDiK.js");break;case"zod":r=import("./zod-B4Z3YRnT.js");break;default:throw new Error(`standard-openapi: Unsupported schema vendor "${a}"`)}return await(await r).generator(e)},"toOpenAPISchema");export{n as toOpenAPISchema};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var t=Object.defineProperty;var o=(e,r)=>t(e,"name",{value:r,configurable:!0});import{createSchema as a}from"zod-openapi";const c=o((e,r)=>a(e,r),"generator");export{c as generator};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var a=(e,r)=>t(e,"name",{value:r,configurable:!0});var c=require("zod-openapi");const n=a((e,r)=>c.createSchema(e,r),"generator");exports.generator=n;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@standard-community/standard-openapi",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -41,11 +41,41 @@
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@standard-community/standard-json": "^0.1.0",
|
|
46
|
+
"json-schema-walker": "^2.0.0",
|
|
47
|
+
"zod-openapi": "^4.0.0"
|
|
48
|
+
},
|
|
49
|
+
"peerDependenciesMeta": {
|
|
50
|
+
"zod-openapi": {
|
|
51
|
+
"optional": true
|
|
52
|
+
},
|
|
53
|
+
"@standard-community/standard-json": {
|
|
54
|
+
"optional": true
|
|
55
|
+
},
|
|
56
|
+
"json-schema-walker": {
|
|
57
|
+
"optional": true
|
|
58
|
+
}
|
|
59
|
+
},
|
|
44
60
|
"devDependencies": {
|
|
61
|
+
"@apidevtools/json-schema-ref-parser": "^11.9.3",
|
|
62
|
+
"@biomejs/biome": "^1.9.4",
|
|
45
63
|
"@standard-schema/spec": "^1.0.0",
|
|
46
|
-
"
|
|
64
|
+
"@types/json-schema": "^7.0.15",
|
|
65
|
+
"arktype": "^2.1.9",
|
|
66
|
+
"husky": "^9.1.7",
|
|
67
|
+
"is-ci": "^4.1.0",
|
|
68
|
+
"nano-staged": "^0.8.0",
|
|
69
|
+
"openapi-types": "^12.1.3",
|
|
70
|
+
"pkgroll": "^2.5.1",
|
|
71
|
+
"typescript": "^5.8.2",
|
|
72
|
+
"valibot": "1.0.0-rc.4",
|
|
73
|
+
"vitest": "^3.0.8",
|
|
74
|
+
"zod": "^3.24.2"
|
|
47
75
|
},
|
|
48
76
|
"scripts": {
|
|
49
|
-
"build": "pkgroll --minify --clean-dist"
|
|
77
|
+
"build": "pkgroll --minify --clean-dist",
|
|
78
|
+
"test": "vitest",
|
|
79
|
+
"format": "biome check --write ."
|
|
50
80
|
}
|
|
51
81
|
}
|