@duplojs/data-parser-tools 0.2.4 → 0.2.6
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 +167 -2
- package/dist/toJsonSchema/override.cjs +14 -0
- package/dist/toJsonSchema/override.d.ts +8 -1
- package/dist/toJsonSchema/override.mjs +14 -0
- package/dist/toJsonSchema/render.cjs +11 -12
- package/dist/toJsonSchema/render.d.ts +8 -8
- package/dist/toJsonSchema/render.mjs +11 -12
- package/dist/toJsonSchema/transformer/create.d.ts +9 -7
- package/dist/toJsonSchema/transformer/defaults/date.cjs +1 -2
- package/dist/toJsonSchema/transformer/defaults/date.mjs +1 -2
- package/dist/toJsonSchema/transformer/defaults/file.cjs +17 -0
- package/dist/toJsonSchema/transformer/defaults/file.d.ts +5 -0
- package/dist/toJsonSchema/transformer/defaults/file.mjs +15 -0
- package/dist/toJsonSchema/transformer/defaults/index.cjs +2 -0
- package/dist/toJsonSchema/transformer/defaults/index.d.ts +1 -1
- package/dist/toJsonSchema/transformer/defaults/index.mjs +2 -0
- package/dist/toJsonSchema/transformer/defaults/literal.cjs +4 -4
- package/dist/toJsonSchema/transformer/defaults/literal.mjs +4 -4
- package/dist/toJsonSchema/transformer/defaults/time.cjs +1 -1
- package/dist/toJsonSchema/transformer/defaults/time.mjs +1 -1
- package/dist/toJsonSchema/transformer/transformer.cjs +6 -3
- package/dist/toJsonSchema/transformer/transformer.d.ts +4 -4
- package/dist/toJsonSchema/transformer/transformer.mjs +7 -4
- package/dist/toTypescript/override.cjs +14 -0
- package/dist/toTypescript/override.d.ts +9 -1
- package/dist/toTypescript/override.mjs +14 -0
- package/dist/toTypescript/render.cjs +7 -1
- package/dist/toTypescript/render.d.ts +6 -6
- package/dist/toTypescript/render.mjs +7 -1
- package/dist/toTypescript/transformer/create.d.ts +10 -5
- package/dist/toTypescript/transformer/defaults/array.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/bigint.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/boolean.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/date.cjs +17 -7
- package/dist/toTypescript/transformer/defaults/date.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/date.mjs +19 -9
- package/dist/toTypescript/transformer/defaults/empty.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/file.cjs +13 -0
- package/dist/toTypescript/transformer/defaults/file.d.ts +1 -0
- package/dist/toTypescript/transformer/defaults/file.mjs +11 -0
- package/dist/toTypescript/transformer/defaults/index.cjs +2 -0
- package/dist/toTypescript/transformer/defaults/index.d.ts +1 -1
- package/dist/toTypescript/transformer/defaults/index.mjs +2 -0
- package/dist/toTypescript/transformer/defaults/lazy.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/literal.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/nil.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/nullable.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/number.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/object.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/optional.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/pipe.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/record.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/recover.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/string.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/templateLiteral.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/time.cjs +17 -7
- package/dist/toTypescript/transformer/defaults/time.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/time.mjs +18 -8
- package/dist/toTypescript/transformer/defaults/transform.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/tuple.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/union.d.ts +1 -2
- package/dist/toTypescript/transformer/defaults/unknown.d.ts +1 -2
- package/dist/toTypescript/transformer/hook.d.ts +3 -2
- package/dist/toTypescript/transformer/importTypesTransformer.cjs +10 -0
- package/dist/toTypescript/transformer/importTypesTransformer.d.ts +2 -0
- package/dist/toTypescript/transformer/importTypesTransformer.mjs +8 -0
- package/dist/toTypescript/transformer/transformer.cjs +11 -0
- package/dist/toTypescript/transformer/transformer.d.ts +4 -3
- package/dist/toTypescript/transformer/transformer.mjs +12 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -1,2 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
<a name="top"></a>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="https://utils.duplojs.dev/images/logo.png" alt="logo" width="250px" />
|
|
5
|
+
</p>
|
|
6
|
+
<p align="center">
|
|
7
|
+
<span style="font-size: 24px; font-weight: bold;">DataParser Tools</span>
|
|
8
|
+
</p>
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href='#'>
|
|
11
|
+
<img src='https://img.shields.io/badge/types-TypeScript-blue?logo=typescript&style=plastic' alt='coverage' />
|
|
12
|
+
</a>
|
|
13
|
+
<a href="#">
|
|
14
|
+
<img src="https://img.shields.io/badge/coverage-100%25-green?style=plastic" alt="lang">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/@duplojs/data-parser-tools">
|
|
17
|
+
<img src="https://img.shields.io/npm/v/@duplojs/data-parser-tools" alt="lang">
|
|
18
|
+
</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
`@duplojs/data-parser-tools` is a library that convert `dataParser` schema to choice format (typescript, jsonSchema)
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
To consume `@duplojs/data-parser-tools`, you need to install the npm package and zod.
|
|
26
|
+
```bash
|
|
27
|
+
npm install @duplojs/data-parser-tools@0 @duplojs/utils@1 @duplojs/server-utils@0
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Usage
|
|
31
|
+
|
|
32
|
+
The library exposes two converters:
|
|
33
|
+
- `@duplojs/data-parser-tools/toTypescript`
|
|
34
|
+
- `@duplojs/data-parser-tools/toJsonSchema`
|
|
35
|
+
|
|
36
|
+
### 1) Generate a TypeScript type with `render`
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { DPE } from "@duplojs/utils";
|
|
40
|
+
import { render, defaultTransformers } from "@duplojs/data-parser-tools/toTypescript";
|
|
41
|
+
|
|
42
|
+
const userSchema = DPE.object({
|
|
43
|
+
id: DPE.number(),
|
|
44
|
+
name: DPE.string(),
|
|
45
|
+
}).addIdentifier("User");
|
|
46
|
+
|
|
47
|
+
const tsType = render(userSchema, {
|
|
48
|
+
identifier: "User",
|
|
49
|
+
mode: "out",
|
|
50
|
+
transformers: defaultTransformers,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
console.log(tsType);
|
|
54
|
+
// export type User = { id: number; name: string; };
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`identifier` is the final exported name.
|
|
58
|
+
`mode` can be:
|
|
59
|
+
- `"out"`: output format (strict)
|
|
60
|
+
- `"in"`: input format (includes accepted input variants, for example date/time)
|
|
61
|
+
|
|
62
|
+
### 2) Generate a JSON Schema
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
import { DPE } from "@duplojs/utils";
|
|
66
|
+
import { render, defaultTransformers } from "@duplojs/data-parser-tools/toJsonSchema";
|
|
67
|
+
|
|
68
|
+
const userSchema = DPE.object({
|
|
69
|
+
id: DPE.number(),
|
|
70
|
+
name: DPE.string(),
|
|
71
|
+
}).addIdentifier("User");
|
|
72
|
+
|
|
73
|
+
const jsonSchema = render(userSchema, {
|
|
74
|
+
identifier: "User",
|
|
75
|
+
mode: "out",
|
|
76
|
+
transformers: defaultTransformers,
|
|
77
|
+
version: "jsonSchema7", // jsonSchema4 | jsonSchema7 | jsonSchema202012 | openApi3 | openApi31
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
console.log(jsonSchema.$ref); // "#/definitions/User"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 3) Add an identifier to a schema (`addIdentifier`)
|
|
84
|
+
|
|
85
|
+
`addIdentifier` clones the schema and attaches an internal reusable name during rendering.
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
const base = DPE.object({ value: DPE.string() });
|
|
89
|
+
const named = base.addIdentifier("MyNamedSchema");
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
If the name passed to `render({ identifier })` differs from the schema identifier, an alias is generated (for example: `export type PublicName = MyNamedSchema;`).
|
|
93
|
+
|
|
94
|
+
### 4) Use hooks
|
|
95
|
+
|
|
96
|
+
Hooks let you intercept/replace a schema before transformation.
|
|
97
|
+
- `output("next", schema)`: continue the hook chain
|
|
98
|
+
- `output("stop", schema)`: stop the chain and transform this schema
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { DPE } from "@duplojs/utils";
|
|
102
|
+
import { render, defaultTransformers, type TransformerHook } from "@duplojs/data-parser-tools/toTypescript";
|
|
103
|
+
|
|
104
|
+
const forceStringHook: TransformerHook = ({ output }) => output("stop", DPE.string());
|
|
105
|
+
|
|
106
|
+
const result = render(DPE.number(), {
|
|
107
|
+
identifier: "HookExample",
|
|
108
|
+
mode: "out",
|
|
109
|
+
transformers: defaultTransformers,
|
|
110
|
+
hooks: [forceStringHook],
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
console.log(result);
|
|
114
|
+
// export type HookExample = string;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 5) Recursive schemas
|
|
118
|
+
|
|
119
|
+
Recursive references are supported through `DPE.lazy(...)`.
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
import { DPE } from "@duplojs/utils";
|
|
123
|
+
import { render, defaultTransformers } from "@duplojs/data-parser-tools/toTypescript";
|
|
124
|
+
|
|
125
|
+
type Node = { children: Node[] };
|
|
126
|
+
|
|
127
|
+
const nodeSchema: DPE.Contract<Node> = DPE.object({
|
|
128
|
+
children: DPE.array(DPE.lazy(() => nodeSchema)),
|
|
129
|
+
}).addIdentifier("Node");
|
|
130
|
+
|
|
131
|
+
const result = render(nodeSchema, {
|
|
132
|
+
identifier: "Node",
|
|
133
|
+
mode: "out",
|
|
134
|
+
transformers: defaultTransformers,
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 6) Custom types: `date`, `time`, `file`
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
import { DPE } from "@duplojs/utils";
|
|
142
|
+
import { SDP } from "@duplojs/server-utils";
|
|
143
|
+
import { render, defaultTransformers } from "@duplojs/data-parser-tools/toTypescript";
|
|
144
|
+
|
|
145
|
+
const schema = DPE.object({
|
|
146
|
+
createdAt: DPE.date(),
|
|
147
|
+
startAt: DPE.time(),
|
|
148
|
+
avatar: SDP.file(),
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
const outType = render(schema, {
|
|
152
|
+
identifier: "PayloadOut",
|
|
153
|
+
mode: "out",
|
|
154
|
+
transformers: defaultTransformers,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
const inType = render(schema, {
|
|
158
|
+
identifier: "PayloadIn",
|
|
159
|
+
mode: "in",
|
|
160
|
+
transformers: defaultTransformers,
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
In practice:
|
|
165
|
+
- `date` / `time` in `"out"` produce template-literals (`date...`, `time...`)
|
|
166
|
+
- `date` / `time` in `"in"` also accept additional input variants
|
|
167
|
+
- `file` maps to `FileInterface` (imported from `@duplojs/server-utils/file`)
|
|
@@ -11,3 +11,17 @@ dataParser.dataParserInit.overrideHandler.setMethod("addIdentifier", (schema, id
|
|
|
11
11
|
newSchema.setIdentifier(identifier);
|
|
12
12
|
return newSchema;
|
|
13
13
|
});
|
|
14
|
+
dataParser.dataParserInit.overrideHandler.setMethod("setOverrideJsonSchema", (schema, overrideJsonSchema) => {
|
|
15
|
+
schema.definition.overrideJsonSchema = "schema" in overrideJsonSchema
|
|
16
|
+
? {
|
|
17
|
+
in: overrideJsonSchema,
|
|
18
|
+
out: overrideJsonSchema,
|
|
19
|
+
}
|
|
20
|
+
: overrideJsonSchema;
|
|
21
|
+
return schema;
|
|
22
|
+
});
|
|
23
|
+
dataParser.dataParserInit.overrideHandler.setMethod("addOverrideJsonSchema", (schema, overrideJsonSchema) => {
|
|
24
|
+
const newSchema = schema.clone();
|
|
25
|
+
newSchema.setOverrideJsonSchema(overrideJsonSchema);
|
|
26
|
+
return newSchema;
|
|
27
|
+
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type TransformerMode, type TransformerSuccess } from "./transformer/create";
|
|
2
|
+
export type OverrideJsonSchemaDataParser = Partial<Record<TransformerMode, TransformerSuccess>>;
|
|
1
3
|
declare module "@duplojs/utils/dataParser" {
|
|
2
4
|
interface DataParser {
|
|
3
5
|
/**
|
|
@@ -5,9 +7,14 @@ declare module "@duplojs/utils/dataParser" {
|
|
|
5
7
|
*/
|
|
6
8
|
setIdentifier(input: string): this;
|
|
7
9
|
addIdentifier(input: string): this;
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated this method mutated the dataParser by adding an override json schema
|
|
12
|
+
*/
|
|
13
|
+
setOverrideJsonSchema(schema: TransformerSuccess | OverrideJsonSchemaDataParser): this;
|
|
14
|
+
addOverrideJsonSchema(schema: TransformerSuccess | OverrideJsonSchemaDataParser): this;
|
|
8
15
|
}
|
|
9
16
|
interface DataParserDefinition {
|
|
10
17
|
identifier?: string;
|
|
18
|
+
overrideJsonSchema?: OverrideJsonSchemaDataParser;
|
|
11
19
|
}
|
|
12
20
|
}
|
|
13
|
-
export {};
|
|
@@ -9,3 +9,17 @@ dataParserInit.overrideHandler.setMethod("addIdentifier", (schema, identifier) =
|
|
|
9
9
|
newSchema.setIdentifier(identifier);
|
|
10
10
|
return newSchema;
|
|
11
11
|
});
|
|
12
|
+
dataParserInit.overrideHandler.setMethod("setOverrideJsonSchema", (schema, overrideJsonSchema) => {
|
|
13
|
+
schema.definition.overrideJsonSchema = "schema" in overrideJsonSchema
|
|
14
|
+
? {
|
|
15
|
+
in: overrideJsonSchema,
|
|
16
|
+
out: overrideJsonSchema,
|
|
17
|
+
}
|
|
18
|
+
: overrideJsonSchema;
|
|
19
|
+
return schema;
|
|
20
|
+
});
|
|
21
|
+
dataParserInit.overrideHandler.setMethod("addOverrideJsonSchema", (schema, overrideJsonSchema) => {
|
|
22
|
+
const newSchema = schema.clone();
|
|
23
|
+
newSchema.setOverrideJsonSchema(overrideJsonSchema);
|
|
24
|
+
return newSchema;
|
|
25
|
+
});
|
|
@@ -4,8 +4,8 @@ var utils = require('@duplojs/utils');
|
|
|
4
4
|
require('./transformer/index.cjs');
|
|
5
5
|
var kind = require('./kind.cjs');
|
|
6
6
|
var getRecursiveDataParser = require('../utils/getRecursiveDataParser.cjs');
|
|
7
|
-
var create = require('./transformer/create.cjs');
|
|
8
7
|
var transformer = require('./transformer/transformer.cjs');
|
|
8
|
+
var create = require('./transformer/create.cjs');
|
|
9
9
|
|
|
10
10
|
class DataParserToJsonSchemaRenderError extends utils.kindHeritage("data-parser-to-json-schema-render-error", kind.createToJsonSchemaKind("data-parser-to-json-schema-render-error"), Error) {
|
|
11
11
|
schema;
|
|
@@ -18,13 +18,12 @@ class DataParserToJsonSchemaRenderError extends utils.kindHeritage("data-parser-
|
|
|
18
18
|
}
|
|
19
19
|
function render(schema, params) {
|
|
20
20
|
const context = new Map(params.context);
|
|
21
|
-
const version = create.supportedVersions[params.version];
|
|
22
21
|
const result = transformer.transformer(schema, {
|
|
23
22
|
...params,
|
|
24
23
|
context,
|
|
25
24
|
mode: params.mode ?? "out",
|
|
26
25
|
hooks: params.hooks ?? [],
|
|
27
|
-
version,
|
|
26
|
+
version: params.version,
|
|
28
27
|
recursiveDataParsers: getRecursiveDataParser.getRecursiveDataParser(schema),
|
|
29
28
|
});
|
|
30
29
|
if (utils.E.isLeft(result)) {
|
|
@@ -43,26 +42,26 @@ function render(schema, params) {
|
|
|
43
42
|
...definitions,
|
|
44
43
|
[params.identifier]: built.schema,
|
|
45
44
|
};
|
|
46
|
-
if (version ===
|
|
47
|
-
|| version ===
|
|
45
|
+
if (params.version === "openApi3"
|
|
46
|
+
|| params.version === "openApi31") {
|
|
48
47
|
return {
|
|
49
|
-
$ref: transformer.buildRef(params.identifier, version),
|
|
50
|
-
openapi: version,
|
|
48
|
+
$ref: transformer.buildRef(params.identifier, params.version),
|
|
49
|
+
openapi: create.supportedVersions[params.version],
|
|
51
50
|
components: {
|
|
52
51
|
schemas: definitionsWithIdentifier,
|
|
53
52
|
},
|
|
54
53
|
};
|
|
55
54
|
}
|
|
56
|
-
if (version ===
|
|
55
|
+
if (params.version === "jsonSchema202012") {
|
|
57
56
|
return {
|
|
58
|
-
$ref: transformer.buildRef(params.identifier, version),
|
|
59
|
-
$schema: version,
|
|
57
|
+
$ref: transformer.buildRef(params.identifier, params.version),
|
|
58
|
+
$schema: params.version,
|
|
60
59
|
$defs: definitionsWithIdentifier,
|
|
61
60
|
};
|
|
62
61
|
}
|
|
63
62
|
return {
|
|
64
|
-
$ref: transformer.buildRef(params.identifier, version),
|
|
65
|
-
$schema: version,
|
|
63
|
+
$ref: transformer.buildRef(params.identifier, params.version),
|
|
64
|
+
$schema: create.supportedVersions[params.version],
|
|
66
65
|
definitions: definitionsWithIdentifier,
|
|
67
66
|
};
|
|
68
67
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type DP, type Or, type IsEqual } from "@duplojs/utils";
|
|
2
|
-
import { type DataParserErrorEither, type DataParserNotSupportedEither, type MapContext, type TransformerMode, type TransformerHook, type createTransformer, type
|
|
2
|
+
import { type DataParserErrorEither, type DataParserNotSupportedEither, type MapContext, type TransformerMode, type TransformerHook, type createTransformer, type MapperSupportedVersions, type JsonSchema, type SupportedVersions } from "./transformer";
|
|
3
3
|
declare const DataParserToJsonSchemaRenderError_base: new (params: {
|
|
4
4
|
"@DuplojsDataParserToolsToJsonSchema/data-parser-to-json-schema-render-error"?: unknown;
|
|
5
|
-
}, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsDataParserToolsToJsonSchema/data-parser-to-json-schema-render-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"data-parser-to-json-schema-render-error", unknown>, unknown>;
|
|
5
|
+
}, parentParams: readonly [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsDataParserToolsToJsonSchema/data-parser-to-json-schema-render-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"data-parser-to-json-schema-render-error", unknown>, unknown>;
|
|
6
6
|
export declare class DataParserToJsonSchemaRenderError extends DataParserToJsonSchemaRenderError_base {
|
|
7
7
|
schema: DP.DataParsers;
|
|
8
8
|
error: DataParserNotSupportedEither | DataParserErrorEither;
|
|
9
9
|
constructor(schema: DP.DataParsers, error: DataParserNotSupportedEither | DataParserErrorEither);
|
|
10
10
|
}
|
|
11
|
-
export interface RenderParams<GenericVersion extends
|
|
11
|
+
export interface RenderParams<GenericVersion extends SupportedVersions> {
|
|
12
12
|
readonly identifier: string;
|
|
13
13
|
readonly transformers: readonly ReturnType<typeof createTransformer>[];
|
|
14
14
|
readonly context?: MapContext;
|
|
@@ -16,12 +16,12 @@ export interface RenderParams<GenericVersion extends unknown> {
|
|
|
16
16
|
readonly hooks?: readonly TransformerHook[];
|
|
17
17
|
readonly version: GenericVersion;
|
|
18
18
|
}
|
|
19
|
-
type RenderResult<GenericVersion extends
|
|
19
|
+
type RenderResult<GenericVersion extends SupportedVersions> = Or<[
|
|
20
20
|
IsEqual<GenericVersion, "openApi3">,
|
|
21
21
|
IsEqual<GenericVersion, "openApi31">
|
|
22
22
|
]> extends true ? {
|
|
23
23
|
$ref: `#/components/schemas/${string}`;
|
|
24
|
-
openapi:
|
|
24
|
+
openapi: MapperSupportedVersions[GenericVersion];
|
|
25
25
|
components: {
|
|
26
26
|
schemas: Record<string, JsonSchema>;
|
|
27
27
|
};
|
|
@@ -30,12 +30,12 @@ type RenderResult<GenericVersion extends keyof SupportedVersions> = Or<[
|
|
|
30
30
|
IsEqual<GenericVersion, "jsonSchema4">
|
|
31
31
|
]> extends true ? {
|
|
32
32
|
$ref: `#/$defs/${string}`;
|
|
33
|
-
$schema:
|
|
33
|
+
$schema: MapperSupportedVersions[GenericVersion];
|
|
34
34
|
definitions: Record<string, JsonSchema>;
|
|
35
35
|
} : IsEqual<GenericVersion, "jsonSchema202012"> extends true ? {
|
|
36
36
|
$ref: `#/definitions/${string}`;
|
|
37
|
-
$schema:
|
|
37
|
+
$schema: MapperSupportedVersions[GenericVersion];
|
|
38
38
|
$defs: Record<string, JsonSchema>;
|
|
39
39
|
} : never;
|
|
40
|
-
export declare function render<GenericVersion extends
|
|
40
|
+
export declare function render<GenericVersion extends SupportedVersions>(schema: DP.DataParsers, params: RenderParams<GenericVersion>): RenderResult<GenericVersion>;
|
|
41
41
|
export {};
|
|
@@ -2,8 +2,8 @@ import { kindHeritage, E, unwrap, G } from '@duplojs/utils';
|
|
|
2
2
|
import './transformer/index.mjs';
|
|
3
3
|
import { createToJsonSchemaKind } from './kind.mjs';
|
|
4
4
|
import { getRecursiveDataParser } from '../utils/getRecursiveDataParser.mjs';
|
|
5
|
-
import { supportedVersions } from './transformer/create.mjs';
|
|
6
5
|
import { transformer, buildRef } from './transformer/transformer.mjs';
|
|
6
|
+
import { supportedVersions } from './transformer/create.mjs';
|
|
7
7
|
|
|
8
8
|
class DataParserToJsonSchemaRenderError extends kindHeritage("data-parser-to-json-schema-render-error", createToJsonSchemaKind("data-parser-to-json-schema-render-error"), Error) {
|
|
9
9
|
schema;
|
|
@@ -16,13 +16,12 @@ class DataParserToJsonSchemaRenderError extends kindHeritage("data-parser-to-jso
|
|
|
16
16
|
}
|
|
17
17
|
function render(schema, params) {
|
|
18
18
|
const context = new Map(params.context);
|
|
19
|
-
const version = supportedVersions[params.version];
|
|
20
19
|
const result = transformer(schema, {
|
|
21
20
|
...params,
|
|
22
21
|
context,
|
|
23
22
|
mode: params.mode ?? "out",
|
|
24
23
|
hooks: params.hooks ?? [],
|
|
25
|
-
version,
|
|
24
|
+
version: params.version,
|
|
26
25
|
recursiveDataParsers: getRecursiveDataParser(schema),
|
|
27
26
|
});
|
|
28
27
|
if (E.isLeft(result)) {
|
|
@@ -41,26 +40,26 @@ function render(schema, params) {
|
|
|
41
40
|
...definitions,
|
|
42
41
|
[params.identifier]: built.schema,
|
|
43
42
|
};
|
|
44
|
-
if (version ===
|
|
45
|
-
|| version ===
|
|
43
|
+
if (params.version === "openApi3"
|
|
44
|
+
|| params.version === "openApi31") {
|
|
46
45
|
return {
|
|
47
|
-
$ref: buildRef(params.identifier, version),
|
|
48
|
-
openapi: version,
|
|
46
|
+
$ref: buildRef(params.identifier, params.version),
|
|
47
|
+
openapi: supportedVersions[params.version],
|
|
49
48
|
components: {
|
|
50
49
|
schemas: definitionsWithIdentifier,
|
|
51
50
|
},
|
|
52
51
|
};
|
|
53
52
|
}
|
|
54
|
-
if (version ===
|
|
53
|
+
if (params.version === "jsonSchema202012") {
|
|
55
54
|
return {
|
|
56
|
-
$ref: buildRef(params.identifier, version),
|
|
57
|
-
$schema: version,
|
|
55
|
+
$ref: buildRef(params.identifier, params.version),
|
|
56
|
+
$schema: params.version,
|
|
58
57
|
$defs: definitionsWithIdentifier,
|
|
59
58
|
};
|
|
60
59
|
}
|
|
61
60
|
return {
|
|
62
|
-
$ref: buildRef(params.identifier, version),
|
|
63
|
-
$schema: version,
|
|
61
|
+
$ref: buildRef(params.identifier, params.version),
|
|
62
|
+
$schema: supportedVersions[params.version],
|
|
64
63
|
definitions: definitionsWithIdentifier,
|
|
65
64
|
};
|
|
66
65
|
}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { type DP, E } from "@duplojs/utils";
|
|
2
2
|
import type { JsonSchemaArray, JsonSchemaBigInt, JsonSchemaBoolean, JsonSchemaDate, JsonSchemaEmpty, JsonSchemaLiteral, JsonSchemaNil, JsonSchemaNullableAnyOf, JsonSchemaNumber, JsonSchemaObject, JsonSchemaRecord, JsonSchemaString, JsonSchemaTemplateLiteral, JsonSchemaTuple, JsonSchemaUnion, JsonSchemaUnknown, JsonSchemaTime } from "./defaults";
|
|
3
|
+
import { type OpenapiJsonSchemaFile } from "./defaults/file";
|
|
3
4
|
export interface JsonSchemaRef {
|
|
4
5
|
$ref: string;
|
|
5
6
|
}
|
|
6
7
|
export interface JsonSchemaAnyOf {
|
|
7
8
|
anyOf: JsonSchema[];
|
|
8
9
|
}
|
|
9
|
-
export type JsonSchema = JsonSchemaRef | JsonSchemaAnyOf | JsonSchemaArray | JsonSchemaBigInt | JsonSchemaBoolean | JsonSchemaDate | JsonSchemaEmpty | JsonSchemaLiteral | JsonSchemaNil | JsonSchemaNullableAnyOf | JsonSchemaNumber | JsonSchemaObject | JsonSchemaRecord | JsonSchemaString | JsonSchemaTemplateLiteral | JsonSchemaTuple | JsonSchemaUnion | JsonSchemaUnknown | JsonSchemaTime;
|
|
10
|
+
export type JsonSchema = JsonSchemaRef | JsonSchemaAnyOf | JsonSchemaArray | JsonSchemaBigInt | JsonSchemaBoolean | JsonSchemaDate | JsonSchemaEmpty | JsonSchemaLiteral | JsonSchemaNil | JsonSchemaNullableAnyOf | JsonSchemaNumber | JsonSchemaObject | JsonSchemaRecord | JsonSchemaString | JsonSchemaTemplateLiteral | JsonSchemaTuple | JsonSchemaUnion | JsonSchemaUnknown | JsonSchemaTime | OpenapiJsonSchemaFile;
|
|
10
11
|
export interface TransformerSuccess {
|
|
11
12
|
readonly schema: JsonSchema;
|
|
12
13
|
readonly isOptional: boolean;
|
|
13
14
|
}
|
|
14
|
-
export type TransformerSuccessEither = E.
|
|
15
|
-
export type DataParserNotSupportedEither = E.
|
|
16
|
-
export type DataParserErrorEither = E.
|
|
15
|
+
export type TransformerSuccessEither = E.Right<"buildSuccess", TransformerSuccess>;
|
|
16
|
+
export type DataParserNotSupportedEither = E.Left<"dataParserNotSupport", DP.DataParser>;
|
|
17
|
+
export type DataParserErrorEither = E.Left<"buildDataParserError", DP.DataParser>;
|
|
17
18
|
export interface MapContextValue {
|
|
18
19
|
readonly name: string;
|
|
19
20
|
readonly schema?: JsonSchema;
|
|
@@ -29,12 +30,13 @@ export declare const supportedVersions: {
|
|
|
29
30
|
readonly openApi3: "https://spec.openapis.org/oas/3.0.3";
|
|
30
31
|
readonly openApi31: "https://spec.openapis.org/oas/3.1.0";
|
|
31
32
|
};
|
|
32
|
-
export type
|
|
33
|
-
export type
|
|
33
|
+
export type MapperSupportedVersions = typeof supportedVersions;
|
|
34
|
+
export type SupportedVersions = keyof typeof supportedVersions;
|
|
35
|
+
export type SupportedVersionsUrl = typeof supportedVersions[SupportedVersions];
|
|
34
36
|
export interface TransformerParams {
|
|
35
37
|
readonly mode: TransformerMode;
|
|
36
38
|
readonly context: MapContext;
|
|
37
|
-
readonly version:
|
|
39
|
+
readonly version: SupportedVersions;
|
|
38
40
|
transformer(schema: DP.DataParser): MaybeTransformerEither;
|
|
39
41
|
success(result: JsonSchema, isOptional?: boolean): TransformerSuccessEither;
|
|
40
42
|
buildError(): DataParserErrorEither;
|
|
@@ -6,8 +6,7 @@ var create = require('../create.cjs');
|
|
|
6
6
|
const dateTransformer = create.createTransformer(utils.DP.dateKind.has, (schema, { success, mode, }) => {
|
|
7
7
|
const base = {
|
|
8
8
|
type: "string",
|
|
9
|
-
pattern: utils.D.
|
|
10
|
-
format: "date-time",
|
|
9
|
+
pattern: utils.D.serializeTheDateRegex.source,
|
|
11
10
|
};
|
|
12
11
|
if (mode === "in" && schema.definition.coerce) {
|
|
13
12
|
return success({
|
|
@@ -4,8 +4,7 @@ import { createTransformer } from '../create.mjs';
|
|
|
4
4
|
const dateTransformer = createTransformer(DP.dateKind.has, (schema, { success, mode, }) => {
|
|
5
5
|
const base = {
|
|
6
6
|
type: "string",
|
|
7
|
-
pattern: D.
|
|
8
|
-
format: "date-time",
|
|
7
|
+
pattern: D.serializeTheDateRegex.source,
|
|
9
8
|
};
|
|
10
9
|
if (mode === "in" && schema.definition.coerce) {
|
|
11
10
|
return success({
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var serverUtils = require('@duplojs/server-utils');
|
|
4
|
+
var create = require('../create.cjs');
|
|
5
|
+
|
|
6
|
+
const fileTransformer = create.createTransformer(serverUtils.SDP.fileKind.has, (schema, { success, version, buildError, }) => {
|
|
7
|
+
if (version !== "openApi3"
|
|
8
|
+
&& version !== "openApi31") {
|
|
9
|
+
return buildError();
|
|
10
|
+
}
|
|
11
|
+
return success({
|
|
12
|
+
type: "string",
|
|
13
|
+
format: "binary",
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
exports.fileTransformer = fileTransformer;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SDP } from '@duplojs/server-utils';
|
|
2
|
+
import { createTransformer } from '../create.mjs';
|
|
3
|
+
|
|
4
|
+
const fileTransformer = createTransformer(SDP.fileKind.has, (schema, { success, version, buildError, }) => {
|
|
5
|
+
if (version !== "openApi3"
|
|
6
|
+
&& version !== "openApi31") {
|
|
7
|
+
return buildError();
|
|
8
|
+
}
|
|
9
|
+
return success({
|
|
10
|
+
type: "string",
|
|
11
|
+
format: "binary",
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export { fileTransformer };
|
|
@@ -22,6 +22,7 @@ var tuple = require('./tuple.cjs');
|
|
|
22
22
|
var union = require('./union.cjs');
|
|
23
23
|
var unknown = require('./unknown.cjs');
|
|
24
24
|
var time = require('./time.cjs');
|
|
25
|
+
var file = require('./file.cjs');
|
|
25
26
|
|
|
26
27
|
const defaultTransformers = [
|
|
27
28
|
array.arrayTransformer,
|
|
@@ -46,6 +47,7 @@ const defaultTransformers = [
|
|
|
46
47
|
union.unionTransformer,
|
|
47
48
|
unknown.unknownTransformer,
|
|
48
49
|
time.timeTransformer,
|
|
50
|
+
file.fileTransformer,
|
|
49
51
|
];
|
|
50
52
|
|
|
51
53
|
exports.arrayTransformer = array.arrayTransformer;
|
|
@@ -20,4 +20,4 @@ export * from "./tuple";
|
|
|
20
20
|
export * from "./union";
|
|
21
21
|
export * from "./unknown";
|
|
22
22
|
export * from "./time";
|
|
23
|
-
export declare const defaultTransformers: readonly [(schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither];
|
|
23
|
+
export declare const defaultTransformers: readonly [(schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither, (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither];
|
|
@@ -20,6 +20,7 @@ import { tupleTransformer } from './tuple.mjs';
|
|
|
20
20
|
import { unionTransformer } from './union.mjs';
|
|
21
21
|
import { unknownTransformer } from './unknown.mjs';
|
|
22
22
|
import { timeTransformer } from './time.mjs';
|
|
23
|
+
import { fileTransformer } from './file.mjs';
|
|
23
24
|
|
|
24
25
|
const defaultTransformers = [
|
|
25
26
|
arrayTransformer,
|
|
@@ -44,6 +45,7 @@ const defaultTransformers = [
|
|
|
44
45
|
unionTransformer,
|
|
45
46
|
unknownTransformer,
|
|
46
47
|
timeTransformer,
|
|
48
|
+
fileTransformer,
|
|
47
49
|
];
|
|
48
50
|
|
|
49
51
|
export { arrayTransformer, bigIntTransformer, booleanTransformer, dateTransformer, defaultTransformers, emptyTransformer, lazyTransformer, literalTransformer, nilTransformer, nullableTransformer, numberTransformer, objectTransformer, optionalTransformer, pipeTransformer, recordTransformer, recoverTransformer, stringTransformer, templateLiteralTransformer, timeTransformer, transformTransformer, tupleTransformer, unionTransformer, unknownTransformer };
|
|
@@ -4,8 +4,8 @@ var utils = require('@duplojs/utils');
|
|
|
4
4
|
var create = require('../create.cjs');
|
|
5
5
|
|
|
6
6
|
function isOldVersion(version) {
|
|
7
|
-
return (version === "
|
|
8
|
-
|| version === "
|
|
7
|
+
return (version === "jsonSchema4"
|
|
8
|
+
|| version === "openApi3");
|
|
9
9
|
}
|
|
10
10
|
const literalTransformer = create.createTransformer(utils.DP.literalKind.has, (schema, { success, version, }) => {
|
|
11
11
|
const reduced = utils.A.reduce(schema.definition.value, utils.A.reduceFrom({
|
|
@@ -63,10 +63,10 @@ const literalTransformer = create.createTransformer(utils.DP.literalKind.has, (s
|
|
|
63
63
|
}))
|
|
64
64
|
.when(utils.isType("null"), () => nextWithObject(lastValue, {
|
|
65
65
|
literals: utils.A.push(lastValue.literals, utils.P.match(version)
|
|
66
|
-
.with("
|
|
66
|
+
.with("openApi3", utils.justReturn({
|
|
67
67
|
enum: [null],
|
|
68
68
|
}))
|
|
69
|
-
.with("
|
|
69
|
+
.with("jsonSchema4", utils.justReturn({
|
|
70
70
|
type: "null",
|
|
71
71
|
enum: [null],
|
|
72
72
|
}))
|
|
@@ -2,8 +2,8 @@ import { DP, A, P, isType, justReturn, pipe } from '@duplojs/utils';
|
|
|
2
2
|
import { createTransformer } from '../create.mjs';
|
|
3
3
|
|
|
4
4
|
function isOldVersion(version) {
|
|
5
|
-
return (version === "
|
|
6
|
-
|| version === "
|
|
5
|
+
return (version === "jsonSchema4"
|
|
6
|
+
|| version === "openApi3");
|
|
7
7
|
}
|
|
8
8
|
const literalTransformer = createTransformer(DP.literalKind.has, (schema, { success, version, }) => {
|
|
9
9
|
const reduced = A.reduce(schema.definition.value, A.reduceFrom({
|
|
@@ -61,10 +61,10 @@ const literalTransformer = createTransformer(DP.literalKind.has, (schema, { succ
|
|
|
61
61
|
}))
|
|
62
62
|
.when(isType("null"), () => nextWithObject(lastValue, {
|
|
63
63
|
literals: A.push(lastValue.literals, P.match(version)
|
|
64
|
-
.with("
|
|
64
|
+
.with("openApi3", justReturn({
|
|
65
65
|
enum: [null],
|
|
66
66
|
}))
|
|
67
|
-
.with("
|
|
67
|
+
.with("jsonSchema4", justReturn({
|
|
68
68
|
type: "null",
|
|
69
69
|
enum: [null],
|
|
70
70
|
}))
|
|
@@ -6,7 +6,7 @@ var create = require('../create.cjs');
|
|
|
6
6
|
const timeTransformer = create.createTransformer(utils.DP.timeKind.has, (schema, { success, mode, }) => {
|
|
7
7
|
const base = {
|
|
8
8
|
type: "string",
|
|
9
|
-
pattern: utils.D.
|
|
9
|
+
pattern: utils.D.serializeTheTimeRegex.source,
|
|
10
10
|
};
|
|
11
11
|
if (mode === "in" && schema.definition.coerce) {
|
|
12
12
|
return success({
|
|
@@ -4,7 +4,7 @@ import { createTransformer } from '../create.mjs';
|
|
|
4
4
|
const timeTransformer = createTransformer(DP.timeKind.has, (schema, { success, mode, }) => {
|
|
5
5
|
const base = {
|
|
6
6
|
type: "string",
|
|
7
|
-
pattern: D.
|
|
7
|
+
pattern: D.serializeTheTimeRegex.source,
|
|
8
8
|
};
|
|
9
9
|
if (mode === "in" && schema.definition.coerce) {
|
|
10
10
|
return success({
|