typia 5.0.0-dev.20230823 → 5.0.0-dev.2023084

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 (217) hide show
  1. package/lib/Primitive.d.ts +14 -12
  2. package/lib/Resolved.d.ts +46 -0
  3. package/lib/{schemas/metadata/IMetadataResolved.js → Resolved.js} +1 -1
  4. package/lib/Resolved.js.map +1 -0
  5. package/lib/factories/MetadataFactory.d.ts +1 -1
  6. package/lib/factories/MetadataTagFactory.js +10 -8
  7. package/lib/factories/MetadataTagFactory.js.map +1 -1
  8. package/lib/factories/ProtobufFactory.js +4 -3
  9. package/lib/factories/ProtobufFactory.js.map +1 -1
  10. package/lib/factories/internal/metadata/emend_metadata_atomics.js +6 -6
  11. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  12. package/lib/factories/internal/metadata/explore_metadata.js +3 -3
  13. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  14. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +1 -1
  15. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  16. package/lib/factories/internal/metadata/iterate_metadata_collection.js +6 -6
  17. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  18. package/lib/factories/internal/metadata/iterate_metadata_native.js +2 -10
  19. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  20. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +6 -6
  21. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  22. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -2
  23. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  24. package/lib/functional/$ProtobufWriter.js.map +1 -1
  25. package/lib/json.d.ts +15 -15
  26. package/lib/misc.d.ts +42 -42
  27. package/lib/module.d.ts +18 -17
  28. package/lib/module.js +1 -0
  29. package/lib/module.js.map +1 -1
  30. package/lib/programmers/AssertProgrammer.js +1 -1
  31. package/lib/programmers/AssertProgrammer.js.map +1 -1
  32. package/lib/programmers/CheckerProgrammer.js +7 -7
  33. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  34. package/lib/programmers/IsProgrammer.js +2 -2
  35. package/lib/programmers/IsProgrammer.js.map +1 -1
  36. package/lib/programmers/RandomProgrammer.js +311 -136
  37. package/lib/programmers/RandomProgrammer.js.map +1 -1
  38. package/lib/programmers/ValidateProgrammer.js +1 -1
  39. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  40. package/lib/programmers/helpers/AtomicPredicator.js +2 -2
  41. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  42. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  43. package/lib/programmers/helpers/FunctionImporeter.js +2 -1
  44. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  45. package/lib/programmers/helpers/ProtobufUtil.js +2 -2
  46. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  47. package/lib/programmers/helpers/StringifyPredicator.js +1 -2
  48. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  49. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  50. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  51. package/lib/programmers/internal/application_default_string.js +2 -2
  52. package/lib/programmers/internal/application_default_string.js.map +1 -1
  53. package/lib/programmers/internal/application_resolved.d.ts +2 -2
  54. package/lib/programmers/internal/application_resolved.js.map +1 -1
  55. package/lib/programmers/internal/application_schema.js +7 -7
  56. package/lib/programmers/internal/application_schema.js.map +1 -1
  57. package/lib/programmers/internal/metadata_to_pattern.js +4 -4
  58. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  59. package/lib/programmers/internal/stringify_dynamic_properties.js +2 -1
  60. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  61. package/lib/programmers/json/JsonStringifyProgrammer.js +20 -14
  62. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  63. package/lib/programmers/misc/MiscAssertCloneProgrammer.js +1 -1
  64. package/lib/programmers/misc/MiscAssertCloneProgrammer.js.map +1 -1
  65. package/lib/programmers/misc/MiscCloneProgrammer.js +114 -33
  66. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  67. package/lib/programmers/misc/MiscIsCloneProgrammer.js +1 -1
  68. package/lib/programmers/misc/MiscIsCloneProgrammer.js.map +1 -1
  69. package/lib/programmers/misc/MiscLiteralsProgrammer.js +3 -3
  70. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  71. package/lib/programmers/misc/MiscPruneProgrammer.js +2 -2
  72. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  73. package/lib/programmers/misc/MiscValidateCloneProgrammer.js +1 -1
  74. package/lib/programmers/misc/MiscValidateCloneProgrammer.js.map +1 -1
  75. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +3 -3
  76. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  77. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +3 -3
  78. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  79. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +1 -1
  80. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  81. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +2 -2
  82. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  83. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +1 -1
  84. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  85. package/lib/protobuf.d.ts +631 -10
  86. package/lib/protobuf.js +13 -13
  87. package/lib/protobuf.js.map +1 -1
  88. package/lib/schemas/metadata/IMetadata.d.ts +4 -4
  89. package/lib/schemas/metadata/IMetadataAtomic.d.ts +12 -0
  90. package/lib/schemas/metadata/IMetadataAtomic.js +3 -0
  91. package/lib/schemas/metadata/IMetadataAtomic.js.map +1 -0
  92. package/lib/schemas/metadata/{IMetadataResolved.d.ts → IMetadataEscaped.d.ts} +1 -1
  93. package/lib/schemas/metadata/IMetadataEscaped.js +3 -0
  94. package/lib/schemas/metadata/IMetadataEscaped.js.map +1 -0
  95. package/lib/schemas/metadata/Metadata.d.ts +4 -4
  96. package/lib/schemas/metadata/Metadata.js +64 -59
  97. package/lib/schemas/metadata/Metadata.js.map +1 -1
  98. package/lib/schemas/metadata/{MetadataResolved.d.ts → MetadataEscaped.d.ts} +3 -3
  99. package/lib/schemas/metadata/{MetadataResolved.js → MetadataEscaped.js} +11 -11
  100. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -0
  101. package/lib/tags/ExclusiveMaximum.d.ts +8 -0
  102. package/lib/tags/ExclusiveMaximum.js +3 -0
  103. package/lib/tags/ExclusiveMaximum.js.map +1 -0
  104. package/lib/tags/ExclusiveMinimum.d.ts +8 -0
  105. package/lib/tags/ExclusiveMinimum.js +3 -0
  106. package/lib/tags/ExclusiveMinimum.js.map +1 -0
  107. package/lib/tags/Format.d.ts +8 -0
  108. package/lib/tags/Format.js +3 -0
  109. package/lib/tags/Format.js.map +1 -0
  110. package/lib/tags/MaxItems.d.ts +8 -0
  111. package/lib/tags/MaxItems.js +3 -0
  112. package/lib/tags/MaxItems.js.map +1 -0
  113. package/lib/tags/MaxLength.d.ts +8 -0
  114. package/lib/tags/MaxLength.js +3 -0
  115. package/lib/tags/MaxLength.js.map +1 -0
  116. package/lib/tags/Maximum.d.ts +8 -0
  117. package/lib/tags/Maximum.js +3 -0
  118. package/lib/tags/Maximum.js.map +1 -0
  119. package/lib/tags/MinItems.d.ts +8 -0
  120. package/lib/tags/MinItems.js +3 -0
  121. package/lib/tags/MinItems.js.map +1 -0
  122. package/lib/tags/MinLength.d.ts +8 -0
  123. package/lib/tags/MinLength.js +3 -0
  124. package/lib/tags/MinLength.js.map +1 -0
  125. package/lib/tags/Minimum.d.ts +8 -0
  126. package/lib/tags/Minimum.js +3 -0
  127. package/lib/tags/Minimum.js.map +1 -0
  128. package/lib/tags/MultipleOf.d.ts +8 -0
  129. package/lib/tags/MultipleOf.js +3 -0
  130. package/lib/tags/MultipleOf.js.map +1 -0
  131. package/lib/tags/Pattern.d.ts +8 -0
  132. package/lib/tags/Pattern.js +3 -0
  133. package/lib/tags/Pattern.js.map +1 -0
  134. package/lib/tags/TagBase.d.ts +10 -0
  135. package/lib/tags/TagBase.js +3 -0
  136. package/lib/tags/TagBase.js.map +1 -0
  137. package/lib/tags/Type.d.ts +13 -0
  138. package/lib/tags/Type.js +3 -0
  139. package/lib/tags/Type.js.map +1 -0
  140. package/lib/tags/index.d.ts +12 -0
  141. package/lib/tags/index.js +29 -0
  142. package/lib/tags/index.js.map +1 -0
  143. package/lib/transformers/features/json/JsonApplicationTransformer.js +2 -2
  144. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  145. package/lib/transformers/features/misc/MetadataTransformer.js +1 -1
  146. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  147. package/lib/utils/RandomGenerator.js +3 -2
  148. package/lib/utils/RandomGenerator.js.map +1 -1
  149. package/package.json +2 -1
  150. package/src/Primitive.ts +135 -131
  151. package/src/Resolved.ts +116 -0
  152. package/src/factories/MetadataFactory.ts +46 -46
  153. package/src/factories/MetadataTagFactory.ts +366 -364
  154. package/src/factories/ProtobufFactory.ts +268 -266
  155. package/src/factories/internal/metadata/emend_metadata_atomics.ts +35 -33
  156. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  157. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +63 -59
  158. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  159. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -219
  160. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  161. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  162. package/src/functional/$ProtobufWriter.ts +151 -151
  163. package/src/json.ts +648 -648
  164. package/src/misc.ts +651 -651
  165. package/src/module.ts +709 -708
  166. package/src/programmers/AssertProgrammer.ts +281 -279
  167. package/src/programmers/CheckerProgrammer.ts +1174 -1173
  168. package/src/programmers/IsProgrammer.ts +241 -239
  169. package/src/programmers/RandomProgrammer.ts +874 -578
  170. package/src/programmers/ValidateProgrammer.ts +307 -305
  171. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  172. package/src/programmers/helpers/FunctionImporeter.ts +91 -89
  173. package/src/programmers/helpers/ProtobufUtil.ts +29 -29
  174. package/src/programmers/helpers/StringifyPredicator.ts +12 -13
  175. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -27
  176. package/src/programmers/internal/application_default_string.ts +37 -33
  177. package/src/programmers/internal/application_resolved.ts +55 -55
  178. package/src/programmers/internal/application_schema.ts +157 -157
  179. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  180. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  181. package/src/programmers/json/JsonStringifyProgrammer.ts +995 -987
  182. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  183. package/src/programmers/misc/MiscCloneProgrammer.ts +775 -587
  184. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  185. package/src/programmers/misc/MiscLiteralsProgrammer.ts +64 -64
  186. package/src/programmers/misc/MiscPruneProgrammer.ts +544 -542
  187. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  188. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -66
  189. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +673 -669
  190. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +814 -814
  191. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -75
  192. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  193. package/src/protobuf.ts +881 -249
  194. package/src/schemas/metadata/IMetadata.ts +27 -28
  195. package/src/schemas/metadata/IMetadataAtomic.ts +13 -0
  196. package/src/schemas/metadata/{IMetadataResolved.ts → IMetadataEscaped.ts} +6 -6
  197. package/src/schemas/metadata/Metadata.ts +643 -637
  198. package/src/schemas/metadata/{MetadataResolved.ts → MetadataEscaped.ts} +51 -51
  199. package/src/tags/ExclusiveMaximum.ts +8 -0
  200. package/src/tags/ExclusiveMinimum.ts +8 -0
  201. package/src/tags/Format.ts +29 -0
  202. package/src/tags/MaxItems.ts +8 -0
  203. package/src/tags/MaxLength.ts +8 -0
  204. package/src/tags/Maximum.ts +8 -0
  205. package/src/tags/MinItems.ts +8 -0
  206. package/src/tags/MinLength.ts +8 -0
  207. package/src/tags/Minimum.ts +8 -0
  208. package/src/tags/MultipleOf.ts +10 -0
  209. package/src/tags/Pattern.ts +8 -0
  210. package/src/tags/TagBase.ts +17 -0
  211. package/src/tags/Type.ts +30 -0
  212. package/src/tags/index.ts +12 -0
  213. package/src/transformers/features/json/JsonApplicationTransformer.ts +111 -111
  214. package/src/transformers/features/misc/MetadataTransformer.ts +53 -53
  215. package/src/utils/RandomGenerator.ts +83 -81
  216. package/lib/schemas/metadata/IMetadataResolved.js.map +0 -1
  217. package/lib/schemas/metadata/MetadataResolved.js.map +0 -1
@@ -1,239 +1,241 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { TypeFactory } from "../factories/TypeFactory";
7
- import { ValueFactory } from "../factories/ValueFactory";
8
-
9
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
10
-
11
- import { IProject } from "../transformers/IProject";
12
-
13
- import { CheckerProgrammer } from "./CheckerProgrammer";
14
- import { FunctionImporter } from "./helpers/FunctionImporeter";
15
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
16
- import { OptionPredicator } from "./helpers/OptionPredicator";
17
- import { disable_function_importer_declare } from "./helpers/disable_function_importer_declare";
18
- import { check_object } from "./internal/check_object";
19
- import { feature_object_entries } from "./internal/feature_object_entries";
20
-
21
- export namespace IsProgrammer {
22
- export const configure =
23
- (options?: Partial<CONFIG.IOptions>) =>
24
- (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
25
- prefix: "$i",
26
- trace: false,
27
- path: false,
28
- equals: !!options?.object,
29
- numeric: OptionPredicator.numeric({
30
- numeric: options?.numeric,
31
- }),
32
- atomist: () => (entry) => () =>
33
- [
34
- entry.expression,
35
- ...entry.tags.map((tag) => tag.expression),
36
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
37
- combiner: () => (type: "and" | "or") => {
38
- const initial: ts.TrueLiteral | ts.FalseLiteral =
39
- type === "and"
40
- ? ts.factory.createTrue()
41
- : ts.factory.createFalse();
42
- const binder =
43
- type === "and"
44
- ? ts.factory.createLogicalAnd
45
- : ts.factory.createLogicalOr;
46
- return (
47
- _input: ts.Expression,
48
- binaries: CheckerProgrammer.IBinary[],
49
- ) =>
50
- binaries.length
51
- ? binaries
52
- .map((binary) => binary.expression)
53
- .reduce((x, y) => binder(x, y))
54
- : initial;
55
- },
56
- joiner: {
57
- object:
58
- options?.object ||
59
- check_object({
60
- equals: !!options?.object,
61
- undefined: OptionPredicator.undefined({
62
- undefined: options?.undefined,
63
- }),
64
- assert: true,
65
- reduce: ts.factory.createLogicalAnd,
66
- positive: ts.factory.createTrue(),
67
- superfluous: () => ts.factory.createFalse(),
68
- })(importer),
69
- array: (input, arrow) =>
70
- ts.factory.createCallExpression(
71
- IdentifierFactory.access(input)("every"),
72
- undefined,
73
- [arrow],
74
- ),
75
- failure: () => ts.factory.createFalse(),
76
- },
77
- success: ts.factory.createTrue(),
78
- });
79
-
80
- export namespace CONFIG {
81
- export interface IOptions {
82
- numeric: boolean;
83
- undefined: boolean;
84
- object: (
85
- input: ts.Expression,
86
- entries: IExpressionEntry<ts.Expression>[],
87
- ) => ts.Expression;
88
- }
89
- }
90
-
91
- /* -----------------------------------------------------------
92
- WRITERS
93
- ----------------------------------------------------------- */
94
- export const write =
95
- (project: IProject) =>
96
- (modulo: ts.LeftHandSideExpression, disable?: boolean) =>
97
- (equals: boolean) => {
98
- const importer: FunctionImporter =
99
- disable === <any>{}
100
- ? disable_function_importer_declare(new FunctionImporter())
101
- : new FunctionImporter();
102
-
103
- // CONFIGURATION
104
- const config: CheckerProgrammer.IConfig = {
105
- ...configure({
106
- object: check_object({
107
- equals,
108
- undefined: OptionPredicator.undefined(project.options),
109
- assert: true,
110
- reduce: ts.factory.createLogicalAnd,
111
- positive: ts.factory.createTrue(),
112
- superfluous: () => ts.factory.createFalse(),
113
- })(importer),
114
- numeric: OptionPredicator.numeric(project.options),
115
- })(importer),
116
- trace: equals,
117
- addition: () => importer.declare(modulo),
118
- };
119
-
120
- config.decoder =
121
- () => (input, target, explore, tags, jsDocTags) => {
122
- if (
123
- target.size() === 1 &&
124
- target.objects.length === 1 &&
125
- target.isRequired() === true &&
126
- target.nullable === false
127
- ) {
128
- // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
129
- const obj: MetadataObject = target.objects[0]!;
130
- if (
131
- obj._Is_simple(explore.from === "top" ? 0 : 1) &&
132
- (equals === false ||
133
- OptionPredicator.undefined(project.options) ===
134
- false)
135
- )
136
- return ts.factory.createLogicalAnd(
137
- ExpressionFactory.isObject({
138
- checkNull: true,
139
- checkArray: false,
140
- })(input),
141
- config.joiner.object(
142
- ts.factory.createAsExpression(
143
- input,
144
- TypeFactory.keyword("any"),
145
- ),
146
- feature_object_entries(config as any)(
147
- importer,
148
- )(obj)(
149
- ts.factory.createAsExpression(
150
- input,
151
- TypeFactory.keyword("any"),
152
- ),
153
- "top",
154
- ),
155
- ),
156
- );
157
- }
158
- return CheckerProgrammer.decode(project)(config)(importer)(
159
- input,
160
- target,
161
- explore,
162
- tags,
163
- jsDocTags,
164
- );
165
- };
166
-
167
- // GENERATE CHECKER
168
- return CheckerProgrammer.write(project)(config)(importer);
169
- };
170
-
171
- export const write_function_statements =
172
- (project: IProject) =>
173
- (importer: FunctionImporter) =>
174
- (collection: MetadataCollection) => {
175
- const config = configure()(importer);
176
- const objects =
177
- CheckerProgrammer.write_object_functions(project)(config)(
178
- importer,
179
- )(collection);
180
- const unions =
181
- CheckerProgrammer.write_union_functions(project)(config)(
182
- importer,
183
- )(collection);
184
- const arrays =
185
- CheckerProgrammer.write_array_functions(project)(config)(
186
- importer,
187
- )(collection);
188
- const tuples =
189
- CheckerProgrammer.write_tuple_functions(project)(config)(
190
- importer,
191
- )(collection);
192
-
193
- return [
194
- ...objects.filter((_, i) =>
195
- importer.hasLocal(`${config.prefix}o${i}`),
196
- ),
197
- ...unions.filter((_, i) =>
198
- importer.hasLocal(`${config.prefix}u${i}`),
199
- ),
200
- ...arrays.filter((_, i) =>
201
- importer.hasLocal(`${config.prefix}a${i}`),
202
- ),
203
- ...tuples.filter((_, i) =>
204
- importer.hasLocal(`${config.prefix}t${i}`),
205
- ),
206
- ];
207
- };
208
-
209
- /* -----------------------------------------------------------
210
- DECODERS
211
- ----------------------------------------------------------- */
212
- export const decode = (project: IProject) => (importer: FunctionImporter) =>
213
- CheckerProgrammer.decode(project)(configure()(importer))(importer);
214
-
215
- export const decode_object = (importer: FunctionImporter) =>
216
- CheckerProgrammer.decode_object(configure()(importer))(importer);
217
-
218
- export const decode_to_json =
219
- (checkNull: boolean) =>
220
- (input: ts.Expression): ts.Expression =>
221
- ts.factory.createLogicalAnd(
222
- ExpressionFactory.isObject({
223
- checkArray: false,
224
- checkNull,
225
- })(input),
226
- ts.factory.createStrictEquality(
227
- ts.factory.createStringLiteral("function"),
228
- ValueFactory.TYPEOF(
229
- IdentifierFactory.access(input)("toJSON"),
230
- ),
231
- ),
232
- );
233
-
234
- export const decode_functional = (input: ts.Expression) =>
235
- ts.factory.createStrictEquality(
236
- ts.factory.createStringLiteral("function"),
237
- ValueFactory.TYPEOF(input),
238
- );
239
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { TypeFactory } from "../factories/TypeFactory";
7
+ import { ValueFactory } from "../factories/ValueFactory";
8
+
9
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
10
+
11
+ import { IProject } from "../transformers/IProject";
12
+
13
+ import { CheckerProgrammer } from "./CheckerProgrammer";
14
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
15
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
16
+ import { OptionPredicator } from "./helpers/OptionPredicator";
17
+ import { disable_function_importer_declare } from "./helpers/disable_function_importer_declare";
18
+ import { check_object } from "./internal/check_object";
19
+ import { feature_object_entries } from "./internal/feature_object_entries";
20
+
21
+ export namespace IsProgrammer {
22
+ export const configure =
23
+ (options?: Partial<CONFIG.IOptions>) =>
24
+ (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
25
+ prefix: "$i",
26
+ trace: false,
27
+ path: false,
28
+ equals: !!options?.object,
29
+ numeric: OptionPredicator.numeric({
30
+ numeric: options?.numeric,
31
+ }),
32
+ atomist: () => (entry) => () =>
33
+ [
34
+ entry.expression,
35
+ ...entry.tags.map((tag) => tag.expression),
36
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
37
+ combiner: () => (type: "and" | "or") => {
38
+ const initial: ts.TrueLiteral | ts.FalseLiteral =
39
+ type === "and"
40
+ ? ts.factory.createTrue()
41
+ : ts.factory.createFalse();
42
+ const binder =
43
+ type === "and"
44
+ ? ts.factory.createLogicalAnd
45
+ : ts.factory.createLogicalOr;
46
+ return (
47
+ _input: ts.Expression,
48
+ binaries: CheckerProgrammer.IBinary[],
49
+ ) =>
50
+ binaries.length
51
+ ? binaries
52
+ .map((binary) => binary.expression)
53
+ .reduce((x, y) => binder(x, y))
54
+ : initial;
55
+ },
56
+ joiner: {
57
+ object:
58
+ options?.object ||
59
+ check_object({
60
+ equals: !!options?.object,
61
+ undefined: OptionPredicator.undefined({
62
+ undefined: options?.undefined,
63
+ }),
64
+ assert: true,
65
+ reduce: ts.factory.createLogicalAnd,
66
+ positive: ts.factory.createTrue(),
67
+ superfluous: () => ts.factory.createFalse(),
68
+ })(importer),
69
+ array: (input, arrow) =>
70
+ ts.factory.createCallExpression(
71
+ IdentifierFactory.access(input)("every"),
72
+ undefined,
73
+ [arrow],
74
+ ),
75
+ failure: () => ts.factory.createFalse(),
76
+ },
77
+ success: ts.factory.createTrue(),
78
+ });
79
+
80
+ export namespace CONFIG {
81
+ export interface IOptions {
82
+ numeric: boolean;
83
+ undefined: boolean;
84
+ object: (
85
+ input: ts.Expression,
86
+ entries: IExpressionEntry<ts.Expression>[],
87
+ ) => ts.Expression;
88
+ }
89
+ }
90
+
91
+ /* -----------------------------------------------------------
92
+ WRITERS
93
+ ----------------------------------------------------------- */
94
+ export const write =
95
+ (project: IProject) =>
96
+ (modulo: ts.LeftHandSideExpression, disable?: boolean) =>
97
+ (equals: boolean) => {
98
+ const importer: FunctionImporter =
99
+ disable === <any>{}
100
+ ? disable_function_importer_declare(
101
+ new FunctionImporter(modulo.getText()),
102
+ )
103
+ : new FunctionImporter(modulo.getText());
104
+
105
+ // CONFIGURATION
106
+ const config: CheckerProgrammer.IConfig = {
107
+ ...configure({
108
+ object: check_object({
109
+ equals,
110
+ undefined: OptionPredicator.undefined(project.options),
111
+ assert: true,
112
+ reduce: ts.factory.createLogicalAnd,
113
+ positive: ts.factory.createTrue(),
114
+ superfluous: () => ts.factory.createFalse(),
115
+ })(importer),
116
+ numeric: OptionPredicator.numeric(project.options),
117
+ })(importer),
118
+ trace: equals,
119
+ addition: () => importer.declare(modulo),
120
+ };
121
+
122
+ config.decoder =
123
+ () => (input, target, explore, tags, jsDocTags) => {
124
+ if (
125
+ target.size() === 1 &&
126
+ target.objects.length === 1 &&
127
+ target.isRequired() === true &&
128
+ target.nullable === false
129
+ ) {
130
+ // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
131
+ const obj: MetadataObject = target.objects[0]!;
132
+ if (
133
+ obj._Is_simple(explore.from === "top" ? 0 : 1) &&
134
+ (equals === false ||
135
+ OptionPredicator.undefined(project.options) ===
136
+ false)
137
+ )
138
+ return ts.factory.createLogicalAnd(
139
+ ExpressionFactory.isObject({
140
+ checkNull: true,
141
+ checkArray: false,
142
+ })(input),
143
+ config.joiner.object(
144
+ ts.factory.createAsExpression(
145
+ input,
146
+ TypeFactory.keyword("any"),
147
+ ),
148
+ feature_object_entries(config as any)(
149
+ importer,
150
+ )(obj)(
151
+ ts.factory.createAsExpression(
152
+ input,
153
+ TypeFactory.keyword("any"),
154
+ ),
155
+ "top",
156
+ ),
157
+ ),
158
+ );
159
+ }
160
+ return CheckerProgrammer.decode(project)(config)(importer)(
161
+ input,
162
+ target,
163
+ explore,
164
+ tags,
165
+ jsDocTags,
166
+ );
167
+ };
168
+
169
+ // GENERATE CHECKER
170
+ return CheckerProgrammer.write(project)(config)(importer);
171
+ };
172
+
173
+ export const write_function_statements =
174
+ (project: IProject) =>
175
+ (importer: FunctionImporter) =>
176
+ (collection: MetadataCollection) => {
177
+ const config = configure()(importer);
178
+ const objects =
179
+ CheckerProgrammer.write_object_functions(project)(config)(
180
+ importer,
181
+ )(collection);
182
+ const unions =
183
+ CheckerProgrammer.write_union_functions(project)(config)(
184
+ importer,
185
+ )(collection);
186
+ const arrays =
187
+ CheckerProgrammer.write_array_functions(project)(config)(
188
+ importer,
189
+ )(collection);
190
+ const tuples =
191
+ CheckerProgrammer.write_tuple_functions(project)(config)(
192
+ importer,
193
+ )(collection);
194
+
195
+ return [
196
+ ...objects.filter((_, i) =>
197
+ importer.hasLocal(`${config.prefix}o${i}`),
198
+ ),
199
+ ...unions.filter((_, i) =>
200
+ importer.hasLocal(`${config.prefix}u${i}`),
201
+ ),
202
+ ...arrays.filter((_, i) =>
203
+ importer.hasLocal(`${config.prefix}a${i}`),
204
+ ),
205
+ ...tuples.filter((_, i) =>
206
+ importer.hasLocal(`${config.prefix}t${i}`),
207
+ ),
208
+ ];
209
+ };
210
+
211
+ /* -----------------------------------------------------------
212
+ DECODERS
213
+ ----------------------------------------------------------- */
214
+ export const decode = (project: IProject) => (importer: FunctionImporter) =>
215
+ CheckerProgrammer.decode(project)(configure()(importer))(importer);
216
+
217
+ export const decode_object = (importer: FunctionImporter) =>
218
+ CheckerProgrammer.decode_object(configure()(importer))(importer);
219
+
220
+ export const decode_to_json =
221
+ (checkNull: boolean) =>
222
+ (input: ts.Expression): ts.Expression =>
223
+ ts.factory.createLogicalAnd(
224
+ ExpressionFactory.isObject({
225
+ checkArray: false,
226
+ checkNull,
227
+ })(input),
228
+ ts.factory.createStrictEquality(
229
+ ts.factory.createStringLiteral("function"),
230
+ ValueFactory.TYPEOF(
231
+ IdentifierFactory.access(input)("toJSON"),
232
+ ),
233
+ ),
234
+ );
235
+
236
+ export const decode_functional = (input: ts.Expression) =>
237
+ ts.factory.createStrictEquality(
238
+ ts.factory.createStringLiteral("function"),
239
+ ValueFactory.TYPEOF(input),
240
+ );
241
+ }