@duplojs/data-parser-tools 0.2.3 → 0.2.5

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.
Files changed (93) hide show
  1. package/README.md +167 -2
  2. package/dist/toJsonSchema/override.cjs +5 -4
  3. package/dist/toJsonSchema/override.mjs +5 -4
  4. package/dist/toJsonSchema/render.cjs +11 -12
  5. package/dist/toJsonSchema/render.d.ts +8 -8
  6. package/dist/toJsonSchema/render.mjs +11 -12
  7. package/dist/toJsonSchema/transformer/create.d.ts +9 -7
  8. package/dist/toJsonSchema/transformer/defaults/date.cjs +1 -2
  9. package/dist/toJsonSchema/transformer/defaults/date.mjs +1 -2
  10. package/dist/toJsonSchema/transformer/defaults/file.cjs +17 -0
  11. package/dist/toJsonSchema/transformer/defaults/file.d.ts +5 -0
  12. package/dist/toJsonSchema/transformer/defaults/file.mjs +15 -0
  13. package/dist/toJsonSchema/transformer/defaults/index.cjs +2 -0
  14. package/dist/toJsonSchema/transformer/defaults/index.d.ts +1 -1
  15. package/dist/toJsonSchema/transformer/defaults/index.mjs +2 -0
  16. package/dist/toJsonSchema/transformer/defaults/literal.cjs +59 -23
  17. package/dist/toJsonSchema/transformer/defaults/literal.d.ts +12 -4
  18. package/dist/toJsonSchema/transformer/defaults/literal.mjs +60 -24
  19. package/dist/toJsonSchema/transformer/defaults/nullable.cjs +11 -2
  20. package/dist/toJsonSchema/transformer/defaults/nullable.mjs +11 -2
  21. package/dist/toJsonSchema/transformer/defaults/object.cjs +1 -1
  22. package/dist/toJsonSchema/transformer/defaults/object.mjs +1 -1
  23. package/dist/toJsonSchema/transformer/defaults/optional.cjs +10 -1
  24. package/dist/toJsonSchema/transformer/defaults/optional.mjs +10 -1
  25. package/dist/toJsonSchema/transformer/defaults/time.cjs +1 -1
  26. package/dist/toJsonSchema/transformer/defaults/time.mjs +1 -1
  27. package/dist/toJsonSchema/transformer/defaults/union.cjs +3 -3
  28. package/dist/toJsonSchema/transformer/defaults/union.mjs +3 -3
  29. package/dist/toJsonSchema/transformer/transformer.cjs +10 -10
  30. package/dist/toJsonSchema/transformer/transformer.d.ts +5 -5
  31. package/dist/toJsonSchema/transformer/transformer.mjs +10 -10
  32. package/dist/toTypescript/index.cjs +2 -0
  33. package/dist/toTypescript/index.mjs +1 -0
  34. package/dist/toTypescript/override.cjs +5 -7
  35. package/dist/toTypescript/override.mjs +5 -7
  36. package/dist/toTypescript/render.cjs +7 -1
  37. package/dist/toTypescript/render.d.ts +6 -6
  38. package/dist/toTypescript/render.mjs +7 -1
  39. package/dist/toTypescript/transformer/create.d.ts +10 -5
  40. package/dist/toTypescript/transformer/defaults/array.d.ts +1 -2
  41. package/dist/toTypescript/transformer/defaults/bigint.d.ts +1 -2
  42. package/dist/toTypescript/transformer/defaults/boolean.d.ts +1 -2
  43. package/dist/toTypescript/transformer/defaults/date.cjs +17 -7
  44. package/dist/toTypescript/transformer/defaults/date.d.ts +1 -2
  45. package/dist/toTypescript/transformer/defaults/date.mjs +19 -9
  46. package/dist/toTypescript/transformer/defaults/empty.d.ts +1 -2
  47. package/dist/toTypescript/transformer/defaults/file.cjs +13 -0
  48. package/dist/toTypescript/transformer/defaults/file.d.ts +1 -0
  49. package/dist/toTypescript/transformer/defaults/file.mjs +11 -0
  50. package/dist/toTypescript/transformer/defaults/index.cjs +2 -0
  51. package/dist/toTypescript/transformer/defaults/index.d.ts +1 -1
  52. package/dist/toTypescript/transformer/defaults/index.mjs +2 -0
  53. package/dist/toTypescript/transformer/defaults/lazy.d.ts +1 -2
  54. package/dist/toTypescript/transformer/defaults/literal.d.ts +1 -2
  55. package/dist/toTypescript/transformer/defaults/nil.d.ts +1 -2
  56. package/dist/toTypescript/transformer/defaults/nullable.cjs +11 -2
  57. package/dist/toTypescript/transformer/defaults/nullable.d.ts +1 -2
  58. package/dist/toTypescript/transformer/defaults/nullable.mjs +11 -2
  59. package/dist/toTypescript/transformer/defaults/number.d.ts +1 -2
  60. package/dist/toTypescript/transformer/defaults/object.cjs +2 -10
  61. package/dist/toTypescript/transformer/defaults/object.d.ts +1 -2
  62. package/dist/toTypescript/transformer/defaults/object.mjs +2 -10
  63. package/dist/toTypescript/transformer/defaults/optional.cjs +11 -2
  64. package/dist/toTypescript/transformer/defaults/optional.d.ts +1 -2
  65. package/dist/toTypescript/transformer/defaults/optional.mjs +11 -2
  66. package/dist/toTypescript/transformer/defaults/pipe.d.ts +1 -2
  67. package/dist/toTypescript/transformer/defaults/record.cjs +2 -1
  68. package/dist/toTypescript/transformer/defaults/record.d.ts +1 -2
  69. package/dist/toTypescript/transformer/defaults/record.mjs +3 -2
  70. package/dist/toTypescript/transformer/defaults/recover.d.ts +1 -2
  71. package/dist/toTypescript/transformer/defaults/string.d.ts +1 -2
  72. package/dist/toTypescript/transformer/defaults/templateLiteral.d.ts +1 -2
  73. package/dist/toTypescript/transformer/defaults/time.cjs +17 -7
  74. package/dist/toTypescript/transformer/defaults/time.d.ts +1 -2
  75. package/dist/toTypescript/transformer/defaults/time.mjs +18 -8
  76. package/dist/toTypescript/transformer/defaults/transform.d.ts +1 -2
  77. package/dist/toTypescript/transformer/defaults/tuple.d.ts +1 -2
  78. package/dist/toTypescript/transformer/defaults/union.d.ts +1 -2
  79. package/dist/toTypescript/transformer/defaults/unknown.d.ts +1 -2
  80. package/dist/toTypescript/transformer/hook.d.ts +3 -2
  81. package/dist/toTypescript/transformer/importTypesTransformer.cjs +10 -0
  82. package/dist/toTypescript/transformer/importTypesTransformer.d.ts +2 -0
  83. package/dist/toTypescript/transformer/importTypesTransformer.mjs +8 -0
  84. package/dist/toTypescript/transformer/includesUndefinedTypeNode.cjs +16 -0
  85. package/dist/toTypescript/transformer/includesUndefinedTypeNode.d.ts +2 -0
  86. package/dist/toTypescript/transformer/includesUndefinedTypeNode.mjs +14 -0
  87. package/dist/toTypescript/transformer/index.cjs +2 -0
  88. package/dist/toTypescript/transformer/index.d.ts +1 -0
  89. package/dist/toTypescript/transformer/index.mjs +1 -0
  90. package/dist/toTypescript/transformer/transformer.cjs +8 -0
  91. package/dist/toTypescript/transformer/transformer.d.ts +4 -3
  92. package/dist/toTypescript/transformer/transformer.mjs +8 -0
  93. package/package.json +3 -2
package/README.md CHANGED
@@ -1,2 +1,167 @@
1
- # @duplojs/data-parser-tools
2
- [![NPM version](https://img.shields.io/npm/v/@duplojs/data-parser-tools)](https://www.npmjs.com/package/@duplojs/data-parser-tools)
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`)
@@ -6,7 +6,8 @@ dataParser.dataParserInit.overrideHandler.setMethod("setIdentifier", (schema, id
6
6
  schema.definition.identifier = identifier;
7
7
  return schema;
8
8
  });
9
- dataParser.dataParserInit.overrideHandler.setMethod("addIdentifier", (schema, identifier) => schema.construct({
10
- ...schema.definition,
11
- identifier,
12
- }));
9
+ dataParser.dataParserInit.overrideHandler.setMethod("addIdentifier", (schema, identifier) => {
10
+ const newSchema = schema.clone();
11
+ newSchema.setIdentifier(identifier);
12
+ return newSchema;
13
+ });
@@ -4,7 +4,8 @@ dataParserInit.overrideHandler.setMethod("setIdentifier", (schema, identifier) =
4
4
  schema.definition.identifier = identifier;
5
5
  return schema;
6
6
  });
7
- dataParserInit.overrideHandler.setMethod("addIdentifier", (schema, identifier) => schema.construct({
8
- ...schema.definition,
9
- identifier,
10
- }));
7
+ dataParserInit.overrideHandler.setMethod("addIdentifier", (schema, identifier) => {
8
+ const newSchema = schema.clone();
9
+ newSchema.setIdentifier(identifier);
10
+ return newSchema;
11
+ });
@@ -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 === create.supportedVersions.openApi3
47
- || version === create.supportedVersions.openApi31) {
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 === create.supportedVersions.jsonSchema202012) {
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 SupportedVersions, type JsonSchema } from "./transformer";
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 unknown> {
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 keyof SupportedVersions> = Or<[
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: SupportedVersions[GenericVersion];
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: SupportedVersions[GenericVersion];
33
+ $schema: MapperSupportedVersions[GenericVersion];
34
34
  definitions: Record<string, JsonSchema>;
35
35
  } : IsEqual<GenericVersion, "jsonSchema202012"> extends true ? {
36
36
  $ref: `#/definitions/${string}`;
37
- $schema: SupportedVersions[GenericVersion];
37
+ $schema: MapperSupportedVersions[GenericVersion];
38
38
  $defs: Record<string, JsonSchema>;
39
39
  } : never;
40
- export declare function render<GenericVersion extends keyof SupportedVersions>(schema: DP.DataParsers, params: RenderParams<GenericVersion>): RenderResult<GenericVersion>;
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 === supportedVersions.openApi3
45
- || version === supportedVersions.openApi31) {
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 === supportedVersions.jsonSchema202012) {
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,15 +1,16 @@
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
- readonly canBeUndefined: boolean;
13
+ readonly isOptional: boolean;
13
14
  }
14
15
  export type TransformerSuccessEither = E.EitherRight<"buildSuccess", TransformerSuccess>;
15
16
  export type DataParserNotSupportedEither = E.EitherLeft<"dataParserNotSupport", DP.DataParser>;
@@ -17,7 +18,7 @@ export type DataParserErrorEither = E.EitherLeft<"buildDataParserError", DP.Data
17
18
  export interface MapContextValue {
18
19
  readonly name: string;
19
20
  readonly schema?: JsonSchema;
20
- readonly canBeUndefined: boolean;
21
+ readonly isOptional: boolean;
21
22
  }
22
23
  export type MapContext = Map<DP.DataParsers, MapContextValue>;
23
24
  export type MaybeTransformerEither = TransformerSuccessEither | DataParserNotSupportedEither | DataParserErrorEither;
@@ -29,14 +30,15 @@ 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 SupportedVersions = typeof supportedVersions;
33
- export type SupportedVersionsUrl = typeof supportedVersions[keyof SupportedVersions];
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: SupportedVersionsUrl;
39
+ readonly version: SupportedVersions;
38
40
  transformer(schema: DP.DataParser): MaybeTransformerEither;
39
- success(result: JsonSchema, canBeUndefined?: boolean): TransformerSuccessEither;
41
+ success(result: JsonSchema, isOptional?: boolean): TransformerSuccessEither;
40
42
  buildError(): DataParserErrorEither;
41
43
  }
42
44
  export declare function createTransformer<GenericDataParser extends DP.DataParsers>(support: (schema: DP.DataParsers) => schema is GenericDataParser, builder: (schema: GenericDataParser, params: TransformerParams) => MaybeTransformerEither): (schema: DP.DataParsers, params: TransformerParams) => MaybeTransformerEither;
@@ -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.theDateRegex.source,
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.theDateRegex.source,
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,5 @@
1
+ export interface OpenapiJsonSchemaFile {
2
+ type: "string";
3
+ format: "binary";
4
+ }
5
+ export declare const fileTransformer: (schema: import("@duplojs/utils/dataParser").DataParsers, params: import("..").TransformerParams) => import("..").MaybeTransformerEither;
@@ -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 };
@@ -3,45 +3,81 @@
3
3
  var utils = require('@duplojs/utils');
4
4
  var create = require('../create.cjs');
5
5
 
6
- const literalTransformer = create.createTransformer(utils.DP.literalKind.has, (schema, { success, }) => {
6
+ function isOldVersion(version) {
7
+ return (version === "jsonSchema4"
8
+ || version === "openApi3");
9
+ }
10
+ const literalTransformer = create.createTransformer(utils.DP.literalKind.has, (schema, { success, version, }) => {
7
11
  const reduced = utils.A.reduce(schema.definition.value, utils.A.reduceFrom({
8
12
  literals: [],
9
- canBeUndefined: false,
13
+ isOptional: false,
10
14
  }), ({ element, lastValue, next, nextWithObject, }) => utils.P.match(element)
11
- .when(utils.isType("undefined"), () => nextWithObject(lastValue, { canBeUndefined: true }))
15
+ .when(utils.isType("undefined"), () => nextWithObject(lastValue, { isOptional: true }))
12
16
  .when(utils.isType("bigint"), (value) => nextWithObject(lastValue, {
13
- literals: utils.A.push(lastValue.literals, {
14
- const: value.toString(),
15
- type: "string",
16
- }),
17
+ literals: utils.A.push(lastValue.literals, isOldVersion(version)
18
+ ? {
19
+ enum: [value.toString()],
20
+ type: "string",
21
+ }
22
+ : {
23
+ const: value.toString(),
24
+ type: "string",
25
+ }),
17
26
  }))
18
27
  .when(utils.isType("string"), (value) => nextWithObject(lastValue, {
19
- literals: utils.A.push(lastValue.literals, {
20
- const: value,
21
- type: "string",
22
- }),
28
+ literals: utils.A.push(lastValue.literals, isOldVersion(version)
29
+ ? {
30
+ enum: [value],
31
+ type: "string",
32
+ }
33
+ : {
34
+ const: value,
35
+ type: "string",
36
+ }),
23
37
  }))
24
38
  .when(utils.isType("number"), (value) => nextWithObject(lastValue, {
25
- literals: utils.A.push(lastValue.literals, {
26
- const: value,
27
- type: Number.isInteger(value) ? "integer" : "number",
28
- }),
39
+ literals: utils.A.push(lastValue.literals, isOldVersion(version)
40
+ ? {
41
+ enum: [value],
42
+ type: Number.isInteger(value)
43
+ ? "integer"
44
+ : "number",
45
+ }
46
+ : {
47
+ const: value,
48
+ type: Number.isInteger(value)
49
+ ? "integer"
50
+ : "number",
51
+ }),
29
52
  }))
30
53
  .when(utils.isType("boolean"), (value) => nextWithObject(lastValue, {
31
- literals: utils.A.push(lastValue.literals, {
32
- const: value,
33
- type: "boolean",
34
- }),
54
+ literals: utils.A.push(lastValue.literals, isOldVersion(version)
55
+ ? {
56
+ enum: [value],
57
+ type: "boolean",
58
+ }
59
+ : {
60
+ const: value,
61
+ type: "boolean",
62
+ }),
35
63
  }))
36
64
  .when(utils.isType("null"), () => nextWithObject(lastValue, {
37
- literals: utils.A.push(lastValue.literals, {
38
- const: null,
65
+ literals: utils.A.push(lastValue.literals, utils.P.match(version)
66
+ .with("openApi3", utils.justReturn({
67
+ enum: [null],
68
+ }))
69
+ .with("jsonSchema4", utils.justReturn({
70
+ type: "null",
71
+ enum: [null],
72
+ }))
73
+ .otherwise(utils.justReturn({
39
74
  type: "null",
40
- }),
75
+ const: null,
76
+ }))),
41
77
  }))
42
78
  .otherwise(() => next(lastValue)));
43
79
  const schemaDefinition = utils.pipe(reduced.literals, utils.P.when(utils.A.lengthEqual(0), () => ({})), utils.P.when(utils.A.lengthEqual(1), utils.A.first), utils.P.otherwise((value) => ({ anyOf: value })));
44
- return success(schemaDefinition, reduced.canBeUndefined);
80
+ return success(schemaDefinition, reduced.isOptional);
45
81
  });
46
82
 
47
83
  exports.literalTransformer = literalTransformer;