typia 3.4.21 → 3.4.23

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 (127) hide show
  1. package/README.md +57 -23
  2. package/lib/programmers/AssertProgrammer.js +79 -70
  3. package/lib/programmers/AssertProgrammer.js.map +1 -1
  4. package/lib/programmers/IsProgrammer.d.ts +1 -0
  5. package/lib/programmers/IsProgrammer.js +4 -0
  6. package/lib/programmers/IsProgrammer.js.map +1 -1
  7. package/lib/programmers/ValidateProgrammer.js +68 -59
  8. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  9. package/lib/programmers/helpers/OptionPredicator.d.ts +1 -0
  10. package/lib/programmers/helpers/OptionPredicator.js +4 -0
  11. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  12. package/lib/programmers/internal/application_schema.js +23 -21
  13. package/lib/programmers/internal/application_schema.js.map +1 -1
  14. package/lib/programmers/internal/check_dynamic_properties.js +5 -0
  15. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  16. package/lib/programmers/internal/check_object.d.ts +1 -0
  17. package/lib/programmers/internal/check_object.js.map +1 -1
  18. package/lib/transformers/ITransformOptions.d.ts +10 -0
  19. package/package.json +2 -2
  20. package/src/IValidation.ts +21 -21
  21. package/src/Primitive.ts +82 -82
  22. package/src/TypeGuardError.ts +36 -36
  23. package/src/executable/internal/CommandParser.ts +15 -15
  24. package/src/factories/CommentFactory.ts +10 -10
  25. package/src/factories/ExpressionFactory.ts +66 -66
  26. package/src/factories/IdentifierFactory.ts +72 -72
  27. package/src/factories/LiteralFactory.ts +44 -44
  28. package/src/factories/StatementFactory.ts +60 -60
  29. package/src/factories/TemplateFactory.ts +56 -56
  30. package/src/factories/TypeFactory.ts +101 -101
  31. package/src/factories/ValueFactory.ts +12 -12
  32. package/src/functional/$every.ts +11 -11
  33. package/src/functional/$is_email.ts +5 -5
  34. package/src/functional/$is_ipv4.ts +5 -5
  35. package/src/functional/$is_ipv6.ts +5 -5
  36. package/src/functional/$is_url.ts +5 -5
  37. package/src/functional/$is_uuid.ts +5 -5
  38. package/src/functional/$join.ts +50 -50
  39. package/src/functional/$report.ts +15 -15
  40. package/src/functional/$rest.ts +3 -3
  41. package/src/functional/$string.ts +37 -37
  42. package/src/functional/$tail.ts +6 -6
  43. package/src/index.ts +4 -4
  44. package/src/metadata/IJsDocTagInfo.ts +10 -10
  45. package/src/metadata/IMetadata.ts +25 -25
  46. package/src/metadata/IMetadataApplication.ts +7 -7
  47. package/src/metadata/IMetadataConstant.ts +16 -16
  48. package/src/metadata/IMetadataEntry.ts +6 -6
  49. package/src/metadata/IMetadataObject.ts +29 -29
  50. package/src/metadata/IMetadataProperty.ts +11 -11
  51. package/src/metadata/MetadataConstant.ts +3 -3
  52. package/src/metadata/MetadataObject.ts +131 -131
  53. package/src/metadata/MetadataProperty.ts +64 -64
  54. package/src/programmers/ApplicationProgrammer.ts +55 -55
  55. package/src/programmers/AssertProgrammer.ts +36 -29
  56. package/src/programmers/IsProgrammer.ts +5 -0
  57. package/src/programmers/ValidateProgrammer.ts +36 -29
  58. package/src/programmers/helpers/AtomicPredicator.ts +15 -15
  59. package/src/programmers/helpers/FunctionImporeter.ts +31 -31
  60. package/src/programmers/helpers/IExpressionEntry.ts +10 -10
  61. package/src/programmers/helpers/OptionPredicator.ts +4 -0
  62. package/src/programmers/helpers/StringifyJoinder.ts +111 -111
  63. package/src/programmers/helpers/StringifyPredicator.ts +18 -18
  64. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  65. package/src/programmers/internal/application_array.ts +47 -47
  66. package/src/programmers/internal/application_boolean.ts +17 -17
  67. package/src/programmers/internal/application_constant.ts +29 -29
  68. package/src/programmers/internal/application_default_string.ts +32 -32
  69. package/src/programmers/internal/application_native.ts +29 -29
  70. package/src/programmers/internal/application_number.ts +76 -76
  71. package/src/programmers/internal/application_schema.ts +9 -6
  72. package/src/programmers/internal/application_string.ts +49 -49
  73. package/src/programmers/internal/application_templates.ts +27 -27
  74. package/src/programmers/internal/application_tuple.ts +29 -29
  75. package/src/programmers/internal/check_dynamic_properties.ts +164 -146
  76. package/src/programmers/internal/check_everything.ts +25 -25
  77. package/src/programmers/internal/check_length.ts +46 -46
  78. package/src/programmers/internal/check_native.ts +9 -9
  79. package/src/programmers/internal/check_object.ts +43 -42
  80. package/src/programmers/internal/check_string.ts +24 -24
  81. package/src/programmers/internal/check_string_tags.ts +63 -63
  82. package/src/programmers/internal/check_template.ts +50 -50
  83. package/src/programmers/internal/decode_union_object.ts +73 -73
  84. package/src/programmers/internal/feature_object_entries.ts +49 -49
  85. package/src/programmers/internal/metadata_to_pattern.ts +31 -31
  86. package/src/programmers/internal/stringify_dynamic_properties.ts +164 -164
  87. package/src/programmers/internal/stringify_native.ts +8 -8
  88. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  89. package/src/programmers/internal/template_to_pattern.ts +15 -15
  90. package/src/schemas/IJsonApplication.ts +9 -9
  91. package/src/schemas/IJsonComponents.ts +26 -26
  92. package/src/transform.ts +20 -20
  93. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
  94. package/src/transformers/FileTransformer.ts +49 -49
  95. package/src/transformers/IProject.ts +11 -11
  96. package/src/transformers/ITransformOptions.ts +11 -0
  97. package/src/transformers/NodeTransformer.ts +19 -19
  98. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
  99. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -36
  100. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -32
  101. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -32
  102. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -32
  103. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -36
  104. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -36
  105. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -38
  106. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -32
  107. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -32
  108. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -31
  109. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -32
  110. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -38
  111. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -38
  112. package/src/transformers/features/validators/AssertTransformer.ts +43 -43
  113. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -35
  114. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -35
  115. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -35
  116. package/src/transformers/features/validators/IsTransformer.ts +43 -43
  117. package/src/transformers/features/validators/ValidateTransformer.ts +43 -43
  118. package/src/typings/Atomic.ts +17 -17
  119. package/src/typings/ClassProperties.ts +5 -5
  120. package/src/typings/OmitNever.ts +3 -3
  121. package/src/typings/SpecialFields.ts +3 -3
  122. package/src/typings/Writable.ts +11 -11
  123. package/src/utils/ArrayUtil.ts +49 -49
  124. package/src/utils/Escaper.ts +50 -50
  125. package/src/utils/MapUtil.ts +14 -14
  126. package/src/utils/PatternUtil.ts +30 -30
  127. package/src/utils/Singleton.ts +17 -17
@@ -1,81 +1,81 @@
1
- import { Metadata } from "../../metadata/Metadata";
2
- import { MetadataObject } from "../../metadata/MetadataObject";
3
- import { MetadataProperty } from "../../metadata/MetadataProperty";
4
-
5
- import { ArrayUtil } from "../../utils/ArrayUtil";
6
- import { MapUtil } from "../../utils/MapUtil";
7
-
8
- export namespace UnionPredicator {
9
- export interface ISpecialized {
10
- index: number;
11
- object: MetadataObject;
12
- property: MetadataProperty;
13
- neighbour: boolean;
14
- }
15
-
16
- export function object(targets: MetadataObject[]): Array<ISpecialized> {
17
- // PROPERTY MATRIX
18
- const matrix: Map<string, Array<MetadataProperty | null>> = new Map();
19
- for (const obj of targets)
20
- for (const prop of obj.properties) {
21
- const key: string | null = prop.key.getSoleLiteral();
22
- if (key !== null)
23
- MapUtil.take(matrix, key, () =>
24
- ArrayUtil.repeat(targets.length, () => null),
25
- );
26
- }
27
- targets.forEach((obj, i) => {
28
- for (const prop of obj.properties) {
29
- const key: string | null = prop.key.getSoleLiteral();
30
- if (key !== null) matrix.get(key)![i] = prop;
31
- }
32
- });
33
-
34
- // EXPLORE SPECIALIZERS
35
- const output: ISpecialized[] = [];
36
- targets.forEach((obj, i) => {
37
- const children: ISpecializedProperty[] = [];
38
- obj.properties.forEach((prop) => {
39
- // MUST BE REQUIRED
40
- if (prop.value.required === false) return;
41
- const key: string | null = prop.key.getSoleLiteral();
42
- if (key === null) return;
43
-
44
- // FIND NEIGHBORHOOD PROPERTIES
45
- const neighbors: MetadataProperty[] = matrix
46
- .get(key)!
47
- .filter(
48
- (oppo, k) => i !== k && oppo !== null,
49
- ) as MetadataProperty[];
50
-
51
- // NO NEIGHBORHOOD
52
- const unique: boolean =
53
- neighbors.length === 0 ||
54
- neighbors.every(
55
- (n) => !Metadata.intersects(prop.value, n.value, false),
56
- );
57
- if (unique === true)
58
- children.push({
59
- property: prop,
60
- neighbour: neighbors.length !== 0,
61
- });
62
- });
63
- if (children.length === 0) return;
64
-
65
- const top: ISpecializedProperty =
66
- children.find((child) => child.property.value.isConstant()) ||
67
- children[0]!;
68
- output.push({
69
- index: i,
70
- object: obj,
71
- ...top,
72
- });
73
- });
74
- return output;
75
- }
76
- }
77
-
78
- interface ISpecializedProperty {
79
- property: MetadataProperty;
80
- neighbour: boolean;
81
- }
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { MetadataObject } from "../../metadata/MetadataObject";
3
+ import { MetadataProperty } from "../../metadata/MetadataProperty";
4
+
5
+ import { ArrayUtil } from "../../utils/ArrayUtil";
6
+ import { MapUtil } from "../../utils/MapUtil";
7
+
8
+ export namespace UnionPredicator {
9
+ export interface ISpecialized {
10
+ index: number;
11
+ object: MetadataObject;
12
+ property: MetadataProperty;
13
+ neighbour: boolean;
14
+ }
15
+
16
+ export function object(targets: MetadataObject[]): Array<ISpecialized> {
17
+ // PROPERTY MATRIX
18
+ const matrix: Map<string, Array<MetadataProperty | null>> = new Map();
19
+ for (const obj of targets)
20
+ for (const prop of obj.properties) {
21
+ const key: string | null = prop.key.getSoleLiteral();
22
+ if (key !== null)
23
+ MapUtil.take(matrix, key, () =>
24
+ ArrayUtil.repeat(targets.length, () => null),
25
+ );
26
+ }
27
+ targets.forEach((obj, i) => {
28
+ for (const prop of obj.properties) {
29
+ const key: string | null = prop.key.getSoleLiteral();
30
+ if (key !== null) matrix.get(key)![i] = prop;
31
+ }
32
+ });
33
+
34
+ // EXPLORE SPECIALIZERS
35
+ const output: ISpecialized[] = [];
36
+ targets.forEach((obj, i) => {
37
+ const children: ISpecializedProperty[] = [];
38
+ obj.properties.forEach((prop) => {
39
+ // MUST BE REQUIRED
40
+ if (prop.value.required === false) return;
41
+ const key: string | null = prop.key.getSoleLiteral();
42
+ if (key === null) return;
43
+
44
+ // FIND NEIGHBORHOOD PROPERTIES
45
+ const neighbors: MetadataProperty[] = matrix
46
+ .get(key)!
47
+ .filter(
48
+ (oppo, k) => i !== k && oppo !== null,
49
+ ) as MetadataProperty[];
50
+
51
+ // NO NEIGHBORHOOD
52
+ const unique: boolean =
53
+ neighbors.length === 0 ||
54
+ neighbors.every(
55
+ (n) => !Metadata.intersects(prop.value, n.value, false),
56
+ );
57
+ if (unique === true)
58
+ children.push({
59
+ property: prop,
60
+ neighbour: neighbors.length !== 0,
61
+ });
62
+ });
63
+ if (children.length === 0) return;
64
+
65
+ const top: ISpecializedProperty =
66
+ children.find((child) => child.property.value.isConstant()) ||
67
+ children[0]!;
68
+ output.push({
69
+ index: i,
70
+ object: obj,
71
+ ...top,
72
+ });
73
+ });
74
+ return output;
75
+ }
76
+ }
77
+
78
+ interface ISpecializedProperty {
79
+ property: MetadataProperty;
80
+ neighbour: boolean;
81
+ }
@@ -1,47 +1,47 @@
1
- import { Metadata } from "../../metadata/Metadata";
2
- import { IJsonComponents } from "../../schemas/IJsonComponents";
3
- import { IJsonSchema } from "../../schemas/IJsonSchema";
4
-
5
- import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
- import { application_schema } from "./application_schema";
7
-
8
- /**
9
- * @internal
10
- */
11
- export const application_array =
12
- (options: ApplicationProgrammer.IOptions) =>
13
- (components: IJsonComponents) =>
14
- (tuple?: IJsonSchema.ITuple) =>
15
- (
16
- metadata: Metadata,
17
- nullable: boolean,
18
- attribute: IJsonSchema.IAttribute,
19
- ): IJsonSchema.IArray => {
20
- // SCHEMA
21
- const output: IJsonSchema.IArray = {
22
- type: "array",
23
- items: application_schema(options)(components)(false)(
24
- metadata,
25
- attribute,
26
- ),
27
- nullable,
28
- "x-typia-tuple": tuple,
29
- ...attribute,
30
- };
31
-
32
- // RANGE
33
- for (const tag of attribute["x-typia-metaTags"] || [])
34
- if (tag.kind === "minItems") output.minItems = tag.value;
35
- else if (tag.kind === "maxItems") output.maxItems = tag.value;
36
- else if (tag.kind === "items") {
37
- if (tag.minimum !== undefined)
38
- output.minItems =
39
- tag.minimum.value +
40
- (tag.minimum.include === true ? 0 : 1);
41
- if (tag.maximum !== undefined)
42
- output.maxItems =
43
- tag.maximum.value -
44
- (tag.maximum.include === true ? 0 : 1);
45
- }
46
- return output;
47
- };
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
3
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
4
+
5
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
+ import { application_schema } from "./application_schema";
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export const application_array =
12
+ (options: ApplicationProgrammer.IOptions) =>
13
+ (components: IJsonComponents) =>
14
+ (tuple?: IJsonSchema.ITuple) =>
15
+ (
16
+ metadata: Metadata,
17
+ nullable: boolean,
18
+ attribute: IJsonSchema.IAttribute,
19
+ ): IJsonSchema.IArray => {
20
+ // SCHEMA
21
+ const output: IJsonSchema.IArray = {
22
+ type: "array",
23
+ items: application_schema(options)(components)(false)(
24
+ metadata,
25
+ attribute,
26
+ ),
27
+ nullable,
28
+ "x-typia-tuple": tuple,
29
+ ...attribute,
30
+ };
31
+
32
+ // RANGE
33
+ for (const tag of attribute["x-typia-metaTags"] || [])
34
+ if (tag.kind === "minItems") output.minItems = tag.value;
35
+ else if (tag.kind === "maxItems") output.maxItems = tag.value;
36
+ else if (tag.kind === "items") {
37
+ if (tag.minimum !== undefined)
38
+ output.minItems =
39
+ tag.minimum.value +
40
+ (tag.minimum.include === true ? 0 : 1);
41
+ if (tag.maximum !== undefined)
42
+ output.maxItems =
43
+ tag.maximum.value -
44
+ (tag.maximum.include === true ? 0 : 1);
45
+ }
46
+ return output;
47
+ };
@@ -1,17 +1,17 @@
1
- import { IJsonSchema } from "../../module";
2
- import { application_default } from "./application_default";
3
-
4
- /**
5
- * @internal
6
- */
7
- export const application_boolean = (
8
- nullable: boolean,
9
- attribute: IJsonSchema.IAttribute,
10
- ): IJsonSchema.IBoolean => ({
11
- type: "boolean",
12
- nullable,
13
- ...attribute,
14
- default: application_default(attribute)(
15
- (def) => def === "true" || def === "false",
16
- )((str) => Boolean(str)),
17
- });
1
+ import { IJsonSchema } from "../../module";
2
+ import { application_default } from "./application_default";
3
+
4
+ /**
5
+ * @internal
6
+ */
7
+ export const application_boolean = (
8
+ nullable: boolean,
9
+ attribute: IJsonSchema.IAttribute,
10
+ ): IJsonSchema.IBoolean => ({
11
+ type: "boolean",
12
+ nullable,
13
+ ...attribute,
14
+ default: application_default(attribute)(
15
+ (def) => def === "true" || def === "false",
16
+ )((str) => Boolean(str)),
17
+ });
@@ -1,29 +1,29 @@
1
- import { MetadataConstant } from "../../metadata/MetadataConstant";
2
- import { IJsonSchema } from "../../schemas/IJsonSchema";
3
-
4
- import { application_default } from "./application_default";
5
-
6
- /**
7
- * @internal
8
- */
9
- export const application_constant = (
10
- constant: MetadataConstant,
11
- nullable: boolean,
12
- attribute: IJsonSchema.IAttribute,
13
- ): IJsonSchema.IEnumeration<any> => ({
14
- type: constant.type,
15
- enum: constant.values as any,
16
- nullable,
17
- ...attribute,
18
- default: application_default(attribute)((def) =>
19
- constant.values.some((v) => v.toString() === def),
20
- )(
21
- constant.type === "string"
22
- ? (str) => str
23
- : constant.type === "number"
24
- ? (str) => Number(str)
25
- : constant.type === "boolean"
26
- ? (str) => Boolean(str)
27
- : (str) => BigInt(str) as any,
28
- ),
29
- });
1
+ import { MetadataConstant } from "../../metadata/MetadataConstant";
2
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
3
+
4
+ import { application_default } from "./application_default";
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export const application_constant = (
10
+ constant: MetadataConstant,
11
+ nullable: boolean,
12
+ attribute: IJsonSchema.IAttribute,
13
+ ): IJsonSchema.IEnumeration<any> => ({
14
+ type: constant.type,
15
+ enum: constant.values as any,
16
+ nullable,
17
+ ...attribute,
18
+ default: application_default(attribute)((def) =>
19
+ constant.values.some((v) => v.toString() === def),
20
+ )(
21
+ constant.type === "string"
22
+ ? (str) => str
23
+ : constant.type === "number"
24
+ ? (str) => Number(str)
25
+ : constant.type === "boolean"
26
+ ? (str) => Boolean(str)
27
+ : (str) => BigInt(str) as any,
28
+ ),
29
+ });
@@ -1,32 +1,32 @@
1
- import { Metadata } from "../../metadata/Metadata";
2
-
3
- import { IJsonSchema } from "../../module";
4
- import { application_default } from "./application_default";
5
-
6
- /**
7
- * @internal
8
- */
9
- export const application_default_string =
10
- (meta: Metadata, attribute: IJsonSchema.IAttribute) =>
11
- (schema: IJsonSchema.IString) =>
12
- application_default(attribute)((str) => {
13
- const conditions: boolean[] = [];
14
-
15
- // OTHER ATOMIC TYPES
16
- if (meta.atomics.find((t) => t === "number" || t === "bigint"))
17
- conditions.push(Number.isNaN(Number(str)));
18
- if (meta.atomics.find((t) => t === "boolean"))
19
- conditions.push(str !== "true" && str !== "false");
20
- for (const constant of meta.constants)
21
- for (const value of constant.values)
22
- conditions.push(str !== value.toString());
23
-
24
- // CONSIDER TAGS
25
- if (schema.minLength !== undefined)
26
- conditions.push(str.length >= schema.minLength);
27
- if (schema.maxLength !== undefined)
28
- conditions.push(str.length <= schema.maxLength);
29
- if (schema.pattern !== undefined)
30
- conditions.push(new RegExp(schema.pattern).test(str));
31
- return conditions.every((c) => c);
32
- })((str) => str);
1
+ import { Metadata } from "../../metadata/Metadata";
2
+
3
+ import { IJsonSchema } from "../../module";
4
+ import { application_default } from "./application_default";
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export const application_default_string =
10
+ (meta: Metadata, attribute: IJsonSchema.IAttribute) =>
11
+ (schema: IJsonSchema.IString) =>
12
+ application_default(attribute)((str) => {
13
+ const conditions: boolean[] = [];
14
+
15
+ // OTHER ATOMIC TYPES
16
+ if (meta.atomics.find((t) => t === "number" || t === "bigint"))
17
+ conditions.push(Number.isNaN(Number(str)));
18
+ if (meta.atomics.find((t) => t === "boolean"))
19
+ conditions.push(str !== "true" && str !== "false");
20
+ for (const constant of meta.constants)
21
+ for (const value of constant.values)
22
+ conditions.push(str !== value.toString());
23
+
24
+ // CONSIDER TAGS
25
+ if (schema.minLength !== undefined)
26
+ conditions.push(str.length >= schema.minLength);
27
+ if (schema.maxLength !== undefined)
28
+ conditions.push(str.length <= schema.maxLength);
29
+ if (schema.pattern !== undefined)
30
+ conditions.push(new RegExp(schema.pattern).test(str));
31
+ return conditions.every((c) => c);
32
+ })((str) => str);
@@ -1,29 +1,29 @@
1
- import { IJsonComponents } from "../../schemas/IJsonComponents";
2
-
3
- import { IJsonSchema } from "../../module";
4
- import { ApplicationProgrammer } from "../ApplicationProgrammer";
5
-
6
- export const application_native =
7
- (options: ApplicationProgrammer.IOptions) =>
8
- (components: IJsonComponents) =>
9
- (name: string) =>
10
- (
11
- nullable: boolean,
12
- attribute: IJsonSchema.IAttribute,
13
- ): IJsonSchema.IReference => {
14
- const key: string = name + (nullable ? ".Nullable" : "");
15
- if (components.schemas[key] === undefined)
16
- components.schemas[key] = {
17
- type: "object",
18
- $id:
19
- options.purpose === "ajv"
20
- ? options.prefix + "/" + key
21
- : undefined,
22
- properties: {},
23
- nullable,
24
- };
25
- return {
26
- $ref: `#/components/schemas/${name}`,
27
- ...attribute,
28
- };
29
- };
1
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
2
+
3
+ import { IJsonSchema } from "../../module";
4
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
5
+
6
+ export const application_native =
7
+ (options: ApplicationProgrammer.IOptions) =>
8
+ (components: IJsonComponents) =>
9
+ (name: string) =>
10
+ (
11
+ nullable: boolean,
12
+ attribute: IJsonSchema.IAttribute,
13
+ ): IJsonSchema.IReference => {
14
+ const key: string = name + (nullable ? ".Nullable" : "");
15
+ if (components.schemas[key] === undefined)
16
+ components.schemas[key] = {
17
+ type: "object",
18
+ $id:
19
+ options.purpose === "ajv"
20
+ ? options.prefix + "/" + key
21
+ : undefined,
22
+ properties: {},
23
+ nullable,
24
+ };
25
+ return {
26
+ $ref: `#/components/schemas/${name}`,
27
+ ...attribute,
28
+ };
29
+ };
@@ -1,76 +1,76 @@
1
- import { IJsonSchema } from "../../module";
2
- import { application_default } from "./application_default";
3
-
4
- /**
5
- * @internal
6
- */
7
- export const application_number = (
8
- nullable: boolean,
9
- attribute: IJsonSchema.IAttribute,
10
- ): IJsonSchema.INumber => {
11
- const output: IJsonSchema.INumber = {
12
- type: "number",
13
- nullable,
14
- ...attribute,
15
- };
16
- for (const tag of attribute["x-typia-metaTags"] || []) {
17
- // CHECK TYPE
18
- if (
19
- tag.kind === "type" &&
20
- (tag.value === "int" || tag.value === "uint")
21
- )
22
- output.type = "integer";
23
- // RANGE TAG
24
- else if (tag.kind === "minimum") output.minimum = tag.value;
25
- else if (tag.kind === "maximum") output.maximum = tag.value;
26
- else if (tag.kind === "range") {
27
- if (tag.minimum !== undefined)
28
- if (tag.minimum.include === true)
29
- output.minimum = tag.minimum.value;
30
- else output.exclusiveMinimum = tag.minimum.value;
31
- if (tag.maximum !== undefined)
32
- if (tag.maximum.include === true)
33
- output.maximum = tag.maximum.value;
34
- else output.exclusiveMaximum = tag.maximum.value;
35
- }
36
- // MULTIPLE-OF
37
- else if (tag.kind === "multipleOf") output.multipleOf = tag.value;
38
- }
39
-
40
- // WHEN UNSIGNED INT
41
- if (
42
- output.type === "integer" &&
43
- (attribute["x-typia-metaTags"] || []).find(
44
- (tag) => tag.kind === "type" && tag.value === "uint",
45
- )
46
- )
47
- if (output.minimum === undefined || output.minimum < 0)
48
- output.minimum = 0;
49
- else if (
50
- output.exclusiveMinimum === undefined ||
51
- output.exclusiveMinimum < 0
52
- ) {
53
- delete output.exclusiveMinimum;
54
- output.maximum = 0;
55
- }
56
-
57
- // DEFAULT CONFIGURATION
58
- output.default = application_default(attribute)((str) => {
59
- const value: number = Number(str);
60
- const conditions: boolean[] = [!Number.isNaN(value)];
61
- if (output.minimum !== undefined)
62
- conditions.push(value >= output.minimum);
63
- if (output.maximum !== undefined)
64
- conditions.push(value <= output.maximum);
65
- if (output.exclusiveMinimum !== undefined)
66
- conditions.push(value > output.exclusiveMinimum);
67
- if (output.exclusiveMaximum !== undefined)
68
- conditions.push(value < output.exclusiveMaximum);
69
- if (output.multipleOf !== undefined)
70
- conditions.push(value % output.multipleOf === 0);
71
- return conditions.every((cond) => cond);
72
- })((str) => Number(str));
73
-
74
- // RETURNS
75
- return output;
76
- };
1
+ import { IJsonSchema } from "../../module";
2
+ import { application_default } from "./application_default";
3
+
4
+ /**
5
+ * @internal
6
+ */
7
+ export const application_number = (
8
+ nullable: boolean,
9
+ attribute: IJsonSchema.IAttribute,
10
+ ): IJsonSchema.INumber => {
11
+ const output: IJsonSchema.INumber = {
12
+ type: "number",
13
+ nullable,
14
+ ...attribute,
15
+ };
16
+ for (const tag of attribute["x-typia-metaTags"] || []) {
17
+ // CHECK TYPE
18
+ if (
19
+ tag.kind === "type" &&
20
+ (tag.value === "int" || tag.value === "uint")
21
+ )
22
+ output.type = "integer";
23
+ // RANGE TAG
24
+ else if (tag.kind === "minimum") output.minimum = tag.value;
25
+ else if (tag.kind === "maximum") output.maximum = tag.value;
26
+ else if (tag.kind === "range") {
27
+ if (tag.minimum !== undefined)
28
+ if (tag.minimum.include === true)
29
+ output.minimum = tag.minimum.value;
30
+ else output.exclusiveMinimum = tag.minimum.value;
31
+ if (tag.maximum !== undefined)
32
+ if (tag.maximum.include === true)
33
+ output.maximum = tag.maximum.value;
34
+ else output.exclusiveMaximum = tag.maximum.value;
35
+ }
36
+ // MULTIPLE-OF
37
+ else if (tag.kind === "multipleOf") output.multipleOf = tag.value;
38
+ }
39
+
40
+ // WHEN UNSIGNED INT
41
+ if (
42
+ output.type === "integer" &&
43
+ (attribute["x-typia-metaTags"] || []).find(
44
+ (tag) => tag.kind === "type" && tag.value === "uint",
45
+ )
46
+ )
47
+ if (output.minimum === undefined || output.minimum < 0)
48
+ output.minimum = 0;
49
+ else if (
50
+ output.exclusiveMinimum === undefined ||
51
+ output.exclusiveMinimum < 0
52
+ ) {
53
+ delete output.exclusiveMinimum;
54
+ output.maximum = 0;
55
+ }
56
+
57
+ // DEFAULT CONFIGURATION
58
+ output.default = application_default(attribute)((str) => {
59
+ const value: number = Number(str);
60
+ const conditions: boolean[] = [!Number.isNaN(value)];
61
+ if (output.minimum !== undefined)
62
+ conditions.push(value >= output.minimum);
63
+ if (output.maximum !== undefined)
64
+ conditions.push(value <= output.maximum);
65
+ if (output.exclusiveMinimum !== undefined)
66
+ conditions.push(value > output.exclusiveMinimum);
67
+ if (output.exclusiveMaximum !== undefined)
68
+ conditions.push(value < output.exclusiveMaximum);
69
+ if (output.multipleOf !== undefined)
70
+ conditions.push(value % output.multipleOf === 0);
71
+ return conditions.every((cond) => cond);
72
+ })((str) => Number(str));
73
+
74
+ // RETURNS
75
+ return output;
76
+ };
@@ -83,13 +83,16 @@ export const application_schema =
83
83
  const tuple: IJsonSchema.ITuple = application_tuple(options)(
84
84
  components,
85
85
  )(items, meta.nullable, attribute);
86
- if (options.purpose === "ajv") union.push(tuple);
86
+ if (options.purpose === "swagger" && items.length === 0)
87
+ throw new Error(
88
+ "Error on typia.application(): swagger does not support zero length tuple type.",
89
+ );
90
+ else if (
91
+ options.purpose === "ajv" &&
92
+ !items[items.length - 1]?.rest
93
+ )
94
+ union.push(tuple);
87
95
  else {
88
- if (items.length === 0)
89
- throw new Error(
90
- "Error on typia.application(): swagger does not support zero length tuple type.",
91
- );
92
-
93
96
  // SWAGGER DOES NOT SUPPORT TUPLE TYPE YET
94
97
  const merged: Metadata = items.reduce((x, y) =>
95
98
  Metadata.merge(x, y),