typia 5.2.6 → 5.3.0-dev.20231112

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 (202) hide show
  1. package/lib/factories/ExpressionFactory.js +14 -16
  2. package/lib/factories/ExpressionFactory.js.map +1 -1
  3. package/lib/factories/JsonMetadataFactory.d.ts +1 -1
  4. package/lib/factories/JsonMetadataFactory.js +2 -2
  5. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  6. package/lib/factories/LiteralFactory.js +2 -0
  7. package/lib/factories/LiteralFactory.js.map +1 -1
  8. package/lib/factories/MetadataCollection.d.ts +2 -2
  9. package/lib/factories/MetadataFactory.d.ts +1 -1
  10. package/lib/factories/MetadataFactory.js +236 -170
  11. package/lib/factories/MetadataFactory.js.map +1 -1
  12. package/lib/factories/NumericRangeFactory.d.ts +2 -2
  13. package/lib/factories/NumericRangeFactory.js +41 -21
  14. package/lib/factories/NumericRangeFactory.js.map +1 -1
  15. package/lib/factories/ProtobufFactory.d.ts +1 -1
  16. package/lib/factories/ProtobufFactory.js +2 -2
  17. package/lib/factories/ProtobufFactory.js.map +1 -1
  18. package/lib/factories/internal/metadata/MetadataHelper.js +3 -2
  19. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  20. package/lib/factories/internal/metadata/iterate_metadata_constant.js +13 -8
  21. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  22. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +8 -5
  23. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  24. package/lib/functional/$from.d.ts +3 -0
  25. package/lib/functional/$from.js +9 -0
  26. package/lib/functional/$from.js.map +1 -0
  27. package/lib/functional/Namespace.js +7 -0
  28. package/lib/functional/Namespace.js.map +1 -1
  29. package/lib/module.d.ts +1 -0
  30. package/lib/module.js +2 -5
  31. package/lib/module.js.map +1 -1
  32. package/lib/programmers/CheckerProgrammer.js +11 -16
  33. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  34. package/lib/programmers/RandomProgrammer.js +1 -1
  35. package/lib/programmers/RandomProgrammer.js.map +1 -1
  36. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  37. package/lib/programmers/http/HttpHeadersProgrammer.js +1 -1
  38. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  39. package/lib/programmers/http/HttpParameterProgrammer.js +1 -1
  40. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  41. package/lib/programmers/http/HttpQueryProgrammer.js +1 -1
  42. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  43. package/lib/programmers/internal/application_array.js +8 -0
  44. package/lib/programmers/internal/application_array.js.map +1 -1
  45. package/lib/programmers/internal/application_number.js +8 -1
  46. package/lib/programmers/internal/application_number.js.map +1 -1
  47. package/lib/programmers/internal/application_string.js +8 -1
  48. package/lib/programmers/internal/application_string.js.map +1 -1
  49. package/lib/programmers/internal/check_array_length.js +7 -4
  50. package/lib/programmers/internal/check_array_length.js.map +1 -1
  51. package/lib/programmers/internal/check_bigint.js +7 -4
  52. package/lib/programmers/internal/check_bigint.js.map +1 -1
  53. package/lib/programmers/internal/check_number.js +7 -4
  54. package/lib/programmers/internal/check_number.js.map +1 -1
  55. package/lib/programmers/internal/check_string.js +7 -4
  56. package/lib/programmers/internal/check_string.js.map +1 -1
  57. package/lib/programmers/internal/metadata_to_pattern.js +3 -1
  58. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  59. package/lib/programmers/json/JsonAssertParseProgrammer.js +1 -1
  60. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  61. package/lib/programmers/json/JsonIsParseProgrammer.js +1 -1
  62. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  63. package/lib/programmers/json/JsonStringifyProgrammer.js +3 -8
  64. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  65. package/lib/programmers/json/JsonValidateParseProgrammer.js +1 -1
  66. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  67. package/lib/programmers/misc/MiscCloneProgrammer.js +19 -24
  68. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  69. package/lib/programmers/misc/MiscLiteralsProgrammer.js +1 -1
  70. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  71. package/lib/programmers/misc/MiscPruneProgrammer.js +11 -16
  72. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  73. package/lib/programmers/notations/NotationGeneralProgrammer.js +11 -16
  74. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  75. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +1 -1
  76. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  77. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +38 -42
  78. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  79. package/lib/programmers/protobuf/ProtobufMessageProgrammer.d.ts +1 -1
  80. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +22 -25
  81. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  82. package/lib/reflect.d.ts +3 -0
  83. package/lib/reflect.js +13 -0
  84. package/lib/reflect.js.map +1 -0
  85. package/lib/schemas/json/IJsonSchema.d.ts +1 -0
  86. package/lib/schemas/metadata/IMetadataApplication.d.ts +2 -2
  87. package/lib/schemas/metadata/{IMetadataCollection.d.ts → IMetadataComponents.d.ts} +1 -1
  88. package/lib/schemas/metadata/{IMetadataCollection.js → IMetadataComponents.js} +1 -1
  89. package/lib/schemas/metadata/IMetadataComponents.js.map +1 -0
  90. package/lib/schemas/metadata/IMetadataConstant.d.ts +1 -1
  91. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +2 -2
  92. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  93. package/lib/schemas/metadata/Metadata.js +82 -173
  94. package/lib/schemas/metadata/Metadata.js.map +1 -1
  95. package/lib/schemas/metadata/MetadataAlias.js +1 -1
  96. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  97. package/lib/schemas/metadata/MetadataApplication.d.ts +13 -0
  98. package/lib/schemas/metadata/MetadataApplication.js +30 -0
  99. package/lib/schemas/metadata/MetadataApplication.js.map +1 -0
  100. package/lib/schemas/metadata/MetadataArrayType.js +1 -1
  101. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -1
  102. package/lib/schemas/metadata/MetadataAtomic.d.ts +3 -0
  103. package/lib/schemas/metadata/MetadataAtomic.js +42 -0
  104. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  105. package/lib/schemas/metadata/MetadataComponents.d.ts +16 -0
  106. package/lib/schemas/metadata/MetadataComponents.js +151 -0
  107. package/lib/schemas/metadata/MetadataComponents.js.map +1 -0
  108. package/lib/schemas/metadata/MetadataConstant.d.ts +9 -1
  109. package/lib/schemas/metadata/MetadataConstant.js +29 -0
  110. package/lib/schemas/metadata/MetadataConstant.js.map +1 -1
  111. package/lib/schemas/metadata/MetadataEscaped.js +4 -4
  112. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -1
  113. package/lib/schemas/metadata/MetadataObject.js +2 -2
  114. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  115. package/lib/schemas/metadata/MetadataProperty.js +4 -4
  116. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  117. package/lib/schemas/metadata/MetadataTupleType.js +1 -1
  118. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -1
  119. package/lib/transformers/CallExpressionTransformer.js +5 -2
  120. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  121. package/lib/transformers/features/json/JsonApplicationTransformer.d.ts +1 -1
  122. package/lib/transformers/features/json/JsonApplicationTransformer.js +4 -5
  123. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  124. package/lib/transformers/features/reflect/ReflectMetadataTransformer.d.ts +5 -0
  125. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js +58 -0
  126. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js.map +1 -0
  127. package/package.json +2 -2
  128. package/src/Primitive.ts +135 -135
  129. package/src/executable/TypiaSetupWizard.ts +142 -142
  130. package/src/executable/setup/CommandExecutor.ts +8 -8
  131. package/src/factories/ExpressionFactory.ts +12 -13
  132. package/src/factories/JsonMetadataFactory.ts +53 -50
  133. package/src/factories/LiteralFactory.ts +2 -0
  134. package/src/factories/MetadataCollection.ts +282 -282
  135. package/src/factories/MetadataFactory.ts +55 -22
  136. package/src/factories/NumericRangeFactory.ts +56 -17
  137. package/src/factories/ProtobufFactory.ts +5 -2
  138. package/src/factories/internal/metadata/MetadataHelper.ts +7 -4
  139. package/src/factories/internal/metadata/emplace_metadata_object.ts +178 -178
  140. package/src/factories/internal/metadata/iterate_metadata_constant.ts +10 -8
  141. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +9 -8
  142. package/src/functional/$from.ts +5 -0
  143. package/src/functional/$stoll.ts +8 -8
  144. package/src/functional/Namespace.ts +175 -168
  145. package/src/module.ts +1 -19
  146. package/src/programmers/AssertProgrammer.ts +322 -322
  147. package/src/programmers/CheckerProgrammer.ts +16 -17
  148. package/src/programmers/IsProgrammer.ts +258 -258
  149. package/src/programmers/RandomProgrammer.ts +4 -1
  150. package/src/programmers/ValidateProgrammer.ts +350 -350
  151. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  152. package/src/programmers/helpers/ProtobufUtil.ts +3 -2
  153. package/src/programmers/http/HttpHeadersProgrammer.ts +4 -1
  154. package/src/programmers/http/HttpParameterProgrammer.ts +4 -1
  155. package/src/programmers/http/HttpQueryProgrammer.ts +4 -1
  156. package/src/programmers/internal/application_array.ts +8 -0
  157. package/src/programmers/internal/application_number.ts +8 -1
  158. package/src/programmers/internal/application_string.ts +8 -1
  159. package/src/programmers/internal/check_array_length.ts +5 -2
  160. package/src/programmers/internal/check_bigint.ts +5 -2
  161. package/src/programmers/internal/check_dynamic_key.ts +178 -178
  162. package/src/programmers/internal/check_dynamic_properties.ts +202 -202
  163. package/src/programmers/internal/check_number.ts +5 -2
  164. package/src/programmers/internal/check_object.ts +62 -62
  165. package/src/programmers/internal/check_string.ts +5 -3
  166. package/src/programmers/internal/metadata_to_pattern.ts +3 -1
  167. package/src/programmers/json/JsonAssertParseProgrammer.ts +1 -0
  168. package/src/programmers/json/JsonIsParseProgrammer.ts +1 -0
  169. package/src/programmers/json/JsonStringifyProgrammer.ts +959 -960
  170. package/src/programmers/json/JsonValidateParseProgrammer.ts +1 -0
  171. package/src/programmers/misc/MiscCloneProgrammer.ts +787 -786
  172. package/src/programmers/misc/MiscLiteralsProgrammer.ts +4 -1
  173. package/src/programmers/misc/MiscPruneProgrammer.ts +549 -548
  174. package/src/programmers/notations/NotationGeneralProgrammer.ts +717 -716
  175. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +1 -0
  176. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +872 -882
  177. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +21 -21
  178. package/src/reflect.ts +24 -0
  179. package/src/schemas/json/IJsonSchema.ts +1 -0
  180. package/src/schemas/metadata/IMetadataApplication.ts +2 -2
  181. package/src/schemas/metadata/{IMetadataCollection.ts → IMetadataComponents.ts} +1 -1
  182. package/src/schemas/metadata/IMetadataConstant.ts +1 -1
  183. package/src/schemas/metadata/IMetadataTypeTag.ts +9 -2
  184. package/src/schemas/metadata/Metadata.ts +18 -91
  185. package/src/schemas/metadata/MetadataAlias.ts +1 -1
  186. package/src/schemas/metadata/MetadataApplication.ts +44 -0
  187. package/src/schemas/metadata/MetadataArrayType.ts +1 -1
  188. package/src/schemas/metadata/MetadataAtomic.ts +44 -0
  189. package/src/schemas/metadata/MetadataComponents.ts +98 -0
  190. package/src/schemas/metadata/MetadataConstant.ts +44 -1
  191. package/src/schemas/metadata/MetadataEscaped.ts +4 -4
  192. package/src/schemas/metadata/MetadataObject.ts +2 -2
  193. package/src/schemas/metadata/MetadataProperty.ts +4 -7
  194. package/src/schemas/metadata/MetadataTupleType.ts +1 -1
  195. package/src/transform.ts +35 -35
  196. package/src/transformers/CallExpressionTransformer.ts +5 -2
  197. package/src/transformers/features/json/JsonApplicationTransformer.ts +7 -4
  198. package/src/transformers/features/{misc/MetadataTransformer.ts → reflect/ReflectMetadataTransformer.ts} +25 -8
  199. package/lib/schemas/metadata/IMetadataCollection.js.map +0 -1
  200. package/lib/transformers/features/misc/MetadataTransformer.d.ts +0 -5
  201. package/lib/transformers/features/misc/MetadataTransformer.js +0 -55
  202. package/lib/transformers/features/misc/MetadataTransformer.js.map +0 -1
@@ -209,23 +209,22 @@ export namespace CheckerProgrammer {
209
209
  trace: config.trace,
210
210
  path: config.path,
211
211
  prefix: config.prefix,
212
- initializer:
213
- ({ checker }) =>
214
- (importer) =>
215
- (type) => {
216
- const collection: MetadataCollection =
217
- new MetadataCollection();
218
- const result = MetadataFactory.analyze(checker)({
219
- escape: false,
220
- constant: true,
221
- absorb: true,
222
- })(collection)(type);
223
- if (result.success === false)
224
- throw TransformerError.from(`typia.${importer.method}`)(
225
- result.errors,
226
- );
227
- return [collection, result.data];
228
- },
212
+ initializer: (project) => (importer) => (type) => {
213
+ const collection: MetadataCollection = new MetadataCollection();
214
+ const result = MetadataFactory.analyze(
215
+ project.checker,
216
+ project.context,
217
+ )({
218
+ escape: false,
219
+ constant: true,
220
+ absorb: true,
221
+ })(collection)(type);
222
+ if (result.success === false)
223
+ throw TransformerError.from(`typia.${importer.method}`)(
224
+ result.errors,
225
+ );
226
+ return [collection, result.data];
227
+ },
229
228
  addition: config.addition,
230
229
  decoder: () =>
231
230
  config.decoder?.() ?? decode(project)(config)(importer),
@@ -1,258 +1,258 @@
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
- (project: IProject) =>
25
- (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
26
- prefix: "$i",
27
- equals: !!options?.object,
28
- trace: false,
29
- path: false,
30
- numeric: OptionPredicator.numeric({
31
- numeric: options?.numeric,
32
- }),
33
- atomist: () => (entry) => () =>
34
- [
35
- ...(entry.expression ? [entry.expression] : []),
36
- ...(entry.conditions.length === 0
37
- ? []
38
- : [
39
- entry.conditions
40
- .map((set) =>
41
- set
42
- .map((s) => s.expression)
43
- .reduce((a, b) =>
44
- ts.factory.createLogicalAnd(a, b),
45
- ),
46
- )
47
- .reduce((a, b) =>
48
- ts.factory.createLogicalOr(a, b),
49
- ),
50
- ]),
51
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
52
- combiner: () => (type: "and" | "or") => {
53
- const initial: ts.TrueLiteral | ts.FalseLiteral =
54
- type === "and"
55
- ? ts.factory.createTrue()
56
- : ts.factory.createFalse();
57
- const binder =
58
- type === "and"
59
- ? ts.factory.createLogicalAnd
60
- : ts.factory.createLogicalOr;
61
- return (
62
- _input: ts.Expression,
63
- binaries: CheckerProgrammer.IBinary[],
64
- ) =>
65
- binaries.length
66
- ? binaries
67
- .map((binary) => binary.expression)
68
- .reduce((x, y) => binder(x, y))
69
- : initial;
70
- },
71
- joiner: {
72
- object:
73
- options?.object ||
74
- check_object({
75
- equals: !!options?.object,
76
- undefined: OptionPredicator.undefined({
77
- undefined: options?.undefined,
78
- }),
79
- assert: true,
80
- reduce: ts.factory.createLogicalAnd,
81
- positive: ts.factory.createTrue(),
82
- superfluous: () => ts.factory.createFalse(),
83
- })(project)(importer),
84
- array: (input, arrow) =>
85
- ts.factory.createCallExpression(
86
- IdentifierFactory.access(input)("every"),
87
- undefined,
88
- [arrow],
89
- ),
90
- failure: () => ts.factory.createFalse(),
91
- },
92
- success: ts.factory.createTrue(),
93
- });
94
-
95
- export namespace CONFIG {
96
- export interface IOptions {
97
- numeric: boolean;
98
- undefined: boolean;
99
- object: (
100
- input: ts.Expression,
101
- entries: IExpressionEntry<ts.Expression>[],
102
- ) => ts.Expression;
103
- }
104
- }
105
-
106
- /* -----------------------------------------------------------
107
- WRITERS
108
- ----------------------------------------------------------- */
109
- export const write =
110
- (project: IProject) =>
111
- (modulo: ts.LeftHandSideExpression, disable?: boolean) =>
112
- (equals: boolean) => {
113
- const importer: FunctionImporter =
114
- disable === <any>{}
115
- ? disable_function_importer_declare(
116
- new FunctionImporter(modulo.getText()),
117
- )
118
- : new FunctionImporter(modulo.getText());
119
-
120
- // CONFIGURATION
121
- const config: CheckerProgrammer.IConfig = {
122
- ...configure({
123
- object: check_object({
124
- equals,
125
- undefined: OptionPredicator.undefined(project.options),
126
- assert: true,
127
- reduce: ts.factory.createLogicalAnd,
128
- positive: ts.factory.createTrue(),
129
- superfluous: () => ts.factory.createFalse(),
130
- })(project)(importer),
131
- numeric: OptionPredicator.numeric(project.options),
132
- })(project)(importer),
133
- trace: equals,
134
- addition: () => importer.declare(modulo),
135
- };
136
-
137
- config.decoder = () => (input, target, explore) => {
138
- if (
139
- target.size() === 1 &&
140
- target.objects.length === 1 &&
141
- target.isRequired() === true &&
142
- target.nullable === false
143
- ) {
144
- // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
145
- const obj: MetadataObject = target.objects[0]!;
146
- if (
147
- obj._Is_simple(explore.from === "top" ? 0 : 1) &&
148
- (equals === false ||
149
- OptionPredicator.undefined(project.options) ===
150
- false)
151
- )
152
- return ts.factory.createLogicalAnd(
153
- ExpressionFactory.isObject({
154
- checkNull: true,
155
- checkArray: false,
156
- })(input),
157
- config.joiner.object(
158
- ts.factory.createAsExpression(
159
- input,
160
- TypeFactory.keyword("any"),
161
- ),
162
- feature_object_entries(config as any)(importer)(
163
- obj,
164
- )(
165
- ts.factory.createAsExpression(
166
- input,
167
- TypeFactory.keyword("any"),
168
- ),
169
- "top",
170
- ),
171
- ),
172
- );
173
- }
174
- return CheckerProgrammer.decode(project)(config)(importer)(
175
- input,
176
- target,
177
- explore,
178
- );
179
- };
180
-
181
- // GENERATE CHECKER
182
- return CheckerProgrammer.write(project)(config)(importer);
183
- };
184
-
185
- export const write_function_statements =
186
- (project: IProject) =>
187
- (importer: FunctionImporter) =>
188
- (collection: MetadataCollection) => {
189
- const config = configure()(project)(importer);
190
- const objects =
191
- CheckerProgrammer.write_object_functions(project)(config)(
192
- importer,
193
- )(collection);
194
- const unions =
195
- CheckerProgrammer.write_union_functions(project)(config)(
196
- importer,
197
- )(collection);
198
- const arrays =
199
- CheckerProgrammer.write_array_functions(project)(config)(
200
- importer,
201
- )(collection);
202
- const tuples =
203
- CheckerProgrammer.write_tuple_functions(project)(config)(
204
- importer,
205
- )(collection);
206
-
207
- return [
208
- ...objects.filter((_, i) =>
209
- importer.hasLocal(`${config.prefix}o${i}`),
210
- ),
211
- ...unions.filter((_, i) =>
212
- importer.hasLocal(`${config.prefix}u${i}`),
213
- ),
214
- ...arrays.filter((_, i) =>
215
- importer.hasLocal(`${config.prefix}a${i}`),
216
- ),
217
- ...tuples.filter((_, i) =>
218
- importer.hasLocal(`${config.prefix}t${i}`),
219
- ),
220
- ];
221
- };
222
-
223
- /* -----------------------------------------------------------
224
- DECODERS
225
- ----------------------------------------------------------- */
226
- export const decode = (project: IProject) => (importer: FunctionImporter) =>
227
- CheckerProgrammer.decode(project)(configure()(project)(importer))(
228
- importer,
229
- );
230
-
231
- export const decode_object =
232
- (project: IProject) => (importer: FunctionImporter) =>
233
- CheckerProgrammer.decode_object(configure()(project)(importer))(
234
- importer,
235
- );
236
-
237
- export const decode_to_json =
238
- (checkNull: boolean) =>
239
- (input: ts.Expression): ts.Expression =>
240
- ts.factory.createLogicalAnd(
241
- ExpressionFactory.isObject({
242
- checkArray: false,
243
- checkNull,
244
- })(input),
245
- ts.factory.createStrictEquality(
246
- ts.factory.createStringLiteral("function"),
247
- ValueFactory.TYPEOF(
248
- IdentifierFactory.access(input)("toJSON"),
249
- ),
250
- ),
251
- );
252
-
253
- export const decode_functional = (input: ts.Expression) =>
254
- ts.factory.createStrictEquality(
255
- ts.factory.createStringLiteral("function"),
256
- ValueFactory.TYPEOF(input),
257
- );
258
- }
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
+ (project: IProject) =>
25
+ (importer: FunctionImporter): CheckerProgrammer.IConfig => ({
26
+ prefix: "$i",
27
+ equals: !!options?.object,
28
+ trace: false,
29
+ path: false,
30
+ numeric: OptionPredicator.numeric({
31
+ numeric: options?.numeric,
32
+ }),
33
+ atomist: () => (entry) => () =>
34
+ [
35
+ ...(entry.expression ? [entry.expression] : []),
36
+ ...(entry.conditions.length === 0
37
+ ? []
38
+ : [
39
+ entry.conditions
40
+ .map((set) =>
41
+ set
42
+ .map((s) => s.expression)
43
+ .reduce((a, b) =>
44
+ ts.factory.createLogicalAnd(a, b),
45
+ ),
46
+ )
47
+ .reduce((a, b) =>
48
+ ts.factory.createLogicalOr(a, b),
49
+ ),
50
+ ]),
51
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
52
+ combiner: () => (type: "and" | "or") => {
53
+ const initial: ts.TrueLiteral | ts.FalseLiteral =
54
+ type === "and"
55
+ ? ts.factory.createTrue()
56
+ : ts.factory.createFalse();
57
+ const binder =
58
+ type === "and"
59
+ ? ts.factory.createLogicalAnd
60
+ : ts.factory.createLogicalOr;
61
+ return (
62
+ _input: ts.Expression,
63
+ binaries: CheckerProgrammer.IBinary[],
64
+ ) =>
65
+ binaries.length
66
+ ? binaries
67
+ .map((binary) => binary.expression)
68
+ .reduce((x, y) => binder(x, y))
69
+ : initial;
70
+ },
71
+ joiner: {
72
+ object:
73
+ options?.object ||
74
+ check_object({
75
+ equals: !!options?.object,
76
+ undefined: OptionPredicator.undefined({
77
+ undefined: options?.undefined,
78
+ }),
79
+ assert: true,
80
+ reduce: ts.factory.createLogicalAnd,
81
+ positive: ts.factory.createTrue(),
82
+ superfluous: () => ts.factory.createFalse(),
83
+ })(project)(importer),
84
+ array: (input, arrow) =>
85
+ ts.factory.createCallExpression(
86
+ IdentifierFactory.access(input)("every"),
87
+ undefined,
88
+ [arrow],
89
+ ),
90
+ failure: () => ts.factory.createFalse(),
91
+ },
92
+ success: ts.factory.createTrue(),
93
+ });
94
+
95
+ export namespace CONFIG {
96
+ export interface IOptions {
97
+ numeric: boolean;
98
+ undefined: boolean;
99
+ object: (
100
+ input: ts.Expression,
101
+ entries: IExpressionEntry<ts.Expression>[],
102
+ ) => ts.Expression;
103
+ }
104
+ }
105
+
106
+ /* -----------------------------------------------------------
107
+ WRITERS
108
+ ----------------------------------------------------------- */
109
+ export const write =
110
+ (project: IProject) =>
111
+ (modulo: ts.LeftHandSideExpression, disable?: boolean) =>
112
+ (equals: boolean) => {
113
+ const importer: FunctionImporter =
114
+ disable === <any>{}
115
+ ? disable_function_importer_declare(
116
+ new FunctionImporter(modulo.getText()),
117
+ )
118
+ : new FunctionImporter(modulo.getText());
119
+
120
+ // CONFIGURATION
121
+ const config: CheckerProgrammer.IConfig = {
122
+ ...configure({
123
+ object: check_object({
124
+ equals,
125
+ undefined: OptionPredicator.undefined(project.options),
126
+ assert: true,
127
+ reduce: ts.factory.createLogicalAnd,
128
+ positive: ts.factory.createTrue(),
129
+ superfluous: () => ts.factory.createFalse(),
130
+ })(project)(importer),
131
+ numeric: OptionPredicator.numeric(project.options),
132
+ })(project)(importer),
133
+ trace: equals,
134
+ addition: () => importer.declare(modulo),
135
+ };
136
+
137
+ config.decoder = () => (input, target, explore) => {
138
+ if (
139
+ target.size() === 1 &&
140
+ target.objects.length === 1 &&
141
+ target.isRequired() === true &&
142
+ target.nullable === false
143
+ ) {
144
+ // ONLY WHEN OBJECT WITH SOME ATOMIC PROPERTIES
145
+ const obj: MetadataObject = target.objects[0]!;
146
+ if (
147
+ obj._Is_simple(explore.from === "top" ? 0 : 1) &&
148
+ (equals === false ||
149
+ OptionPredicator.undefined(project.options) ===
150
+ false)
151
+ )
152
+ return ts.factory.createLogicalAnd(
153
+ ExpressionFactory.isObject({
154
+ checkNull: true,
155
+ checkArray: false,
156
+ })(input),
157
+ config.joiner.object(
158
+ ts.factory.createAsExpression(
159
+ input,
160
+ TypeFactory.keyword("any"),
161
+ ),
162
+ feature_object_entries(config as any)(importer)(
163
+ obj,
164
+ )(
165
+ ts.factory.createAsExpression(
166
+ input,
167
+ TypeFactory.keyword("any"),
168
+ ),
169
+ "top",
170
+ ),
171
+ ),
172
+ );
173
+ }
174
+ return CheckerProgrammer.decode(project)(config)(importer)(
175
+ input,
176
+ target,
177
+ explore,
178
+ );
179
+ };
180
+
181
+ // GENERATE CHECKER
182
+ return CheckerProgrammer.write(project)(config)(importer);
183
+ };
184
+
185
+ export const write_function_statements =
186
+ (project: IProject) =>
187
+ (importer: FunctionImporter) =>
188
+ (collection: MetadataCollection) => {
189
+ const config = configure()(project)(importer);
190
+ const objects =
191
+ CheckerProgrammer.write_object_functions(project)(config)(
192
+ importer,
193
+ )(collection);
194
+ const unions =
195
+ CheckerProgrammer.write_union_functions(project)(config)(
196
+ importer,
197
+ )(collection);
198
+ const arrays =
199
+ CheckerProgrammer.write_array_functions(project)(config)(
200
+ importer,
201
+ )(collection);
202
+ const tuples =
203
+ CheckerProgrammer.write_tuple_functions(project)(config)(
204
+ importer,
205
+ )(collection);
206
+
207
+ return [
208
+ ...objects.filter((_, i) =>
209
+ importer.hasLocal(`${config.prefix}o${i}`),
210
+ ),
211
+ ...unions.filter((_, i) =>
212
+ importer.hasLocal(`${config.prefix}u${i}`),
213
+ ),
214
+ ...arrays.filter((_, i) =>
215
+ importer.hasLocal(`${config.prefix}a${i}`),
216
+ ),
217
+ ...tuples.filter((_, i) =>
218
+ importer.hasLocal(`${config.prefix}t${i}`),
219
+ ),
220
+ ];
221
+ };
222
+
223
+ /* -----------------------------------------------------------
224
+ DECODERS
225
+ ----------------------------------------------------------- */
226
+ export const decode = (project: IProject) => (importer: FunctionImporter) =>
227
+ CheckerProgrammer.decode(project)(configure()(project)(importer))(
228
+ importer,
229
+ );
230
+
231
+ export const decode_object =
232
+ (project: IProject) => (importer: FunctionImporter) =>
233
+ CheckerProgrammer.decode_object(configure()(project)(importer))(
234
+ importer,
235
+ );
236
+
237
+ export const decode_to_json =
238
+ (checkNull: boolean) =>
239
+ (input: ts.Expression): ts.Expression =>
240
+ ts.factory.createLogicalAnd(
241
+ ExpressionFactory.isObject({
242
+ checkArray: false,
243
+ checkNull,
244
+ })(input),
245
+ ts.factory.createStrictEquality(
246
+ ts.factory.createStringLiteral("function"),
247
+ ValueFactory.TYPEOF(
248
+ IdentifierFactory.access(input)("toJSON"),
249
+ ),
250
+ ),
251
+ );
252
+
253
+ export const decode_functional = (input: ts.Expression) =>
254
+ ts.factory.createStrictEquality(
255
+ ts.factory.createStringLiteral("function"),
256
+ ValueFactory.TYPEOF(input),
257
+ );
258
+ }
@@ -37,7 +37,10 @@ export namespace RandomProgrammer {
37
37
  return (type: ts.Type, name?: string) => {
38
38
  // INITIALIZE METADATA
39
39
  const collection: MetadataCollection = new MetadataCollection();
40
- const result = MetadataFactory.analyze(project.checker)({
40
+ const result = MetadataFactory.analyze(
41
+ project.checker,
42
+ project.context,
43
+ )({
41
44
  escape: false,
42
45
  constant: true,
43
46
  absorb: true,