typia 6.7.0 → 6.7.1

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 (85) hide show
  1. package/lib/programmers/AssertProgrammer.d.ts +0 -1
  2. package/lib/programmers/AssertProgrammer.js.map +1 -1
  3. package/lib/programmers/CheckerProgrammer.d.ts +1 -1
  4. package/lib/programmers/FeatureProgrammer.d.ts +1 -1
  5. package/lib/programmers/IsProgrammer.d.ts +1 -1
  6. package/lib/programmers/RandomProgrammer.d.ts +10 -1
  7. package/lib/programmers/RandomProgrammer.js +62 -37
  8. package/lib/programmers/RandomProgrammer.js.map +1 -1
  9. package/lib/programmers/ValidateProgrammer.d.ts +1 -1
  10. package/lib/programmers/json/JsonIsParseProgrammer.d.ts +1 -1
  11. package/lib/programmers/json/JsonIsStringifyProgrammer.d.ts +1 -1
  12. package/lib/programmers/json/JsonStringifyProgrammer.d.ts +1 -1
  13. package/lib/programmers/json/JsonStringifyProgrammer.js +1 -3
  14. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  15. package/lib/programmers/json/JsonValidateParseProgrammer.d.ts +1 -1
  16. package/lib/programmers/json/JsonValidateStringifyProgrammer.d.ts +1 -1
  17. package/lib/programmers/misc/MiscCloneProgrammer.d.ts +1 -1
  18. package/lib/programmers/misc/MiscCloneProgrammer.js +33 -14
  19. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  20. package/lib/programmers/misc/MiscIsCloneProgrammer.d.ts +1 -1
  21. package/lib/programmers/misc/MiscIsPruneProgrammer.d.ts +1 -1
  22. package/lib/programmers/misc/MiscPruneProgrammer.d.ts +1 -1
  23. package/lib/programmers/misc/MiscValidateCloneProgrammer.d.ts +1 -1
  24. package/lib/programmers/misc/MiscValidatePruneProgrammer.d.ts +1 -1
  25. package/lib/programmers/notations/NotationGeneralProgrammer.d.ts +1 -1
  26. package/lib/programmers/notations/NotationGeneralProgrammer.js +30 -11
  27. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  28. package/lib/programmers/notations/NotationValidateGeneralProgrammer.d.ts +1 -1
  29. package/package.json +1 -1
  30. package/src/programmers/AssertProgrammer.ts +397 -398
  31. package/src/programmers/CheckerProgrammer.ts +1138 -1138
  32. package/src/programmers/FeatureProgrammer.ts +549 -549
  33. package/src/programmers/IsProgrammer.ts +1 -1
  34. package/src/programmers/RandomProgrammer.ts +112 -77
  35. package/src/programmers/ValidateProgrammer.ts +382 -382
  36. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +141 -141
  37. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +108 -108
  38. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +98 -98
  39. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  40. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +101 -101
  41. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +106 -106
  42. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +123 -123
  43. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +267 -267
  44. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +126 -126
  45. package/src/programmers/helpers/FunctionImporter.ts +97 -97
  46. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +91 -91
  47. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +91 -91
  48. package/src/programmers/http/HttpAssertQueryProgrammer.ts +93 -93
  49. package/src/programmers/http/HttpFormDataProgrammer.ts +278 -278
  50. package/src/programmers/http/HttpHeadersProgrammer.ts +347 -347
  51. package/src/programmers/http/HttpIsFormDataProgrammer.ts +102 -102
  52. package/src/programmers/http/HttpIsHeadersProgrammer.ts +102 -102
  53. package/src/programmers/http/HttpIsQueryProgrammer.ts +104 -104
  54. package/src/programmers/http/HttpQueryProgrammer.ts +298 -298
  55. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +85 -85
  56. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +85 -85
  57. package/src/programmers/http/HttpValidateQueryProgrammer.ts +87 -87
  58. package/src/programmers/json/JsonAssertParseProgrammer.ts +96 -96
  59. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +104 -104
  60. package/src/programmers/json/JsonIsParseProgrammer.ts +110 -110
  61. package/src/programmers/json/JsonIsStringifyProgrammer.ts +102 -102
  62. package/src/programmers/json/JsonStringifyProgrammer.ts +909 -910
  63. package/src/programmers/json/JsonValidateParseProgrammer.ts +87 -87
  64. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +111 -111
  65. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +87 -87
  66. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +87 -87
  67. package/src/programmers/misc/MiscCloneProgrammer.ts +781 -759
  68. package/src/programmers/misc/MiscIsCloneProgrammer.ts +93 -93
  69. package/src/programmers/misc/MiscIsPruneProgrammer.ts +94 -94
  70. package/src/programmers/misc/MiscPruneProgrammer.ts +560 -560
  71. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +104 -104
  72. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +98 -98
  73. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +91 -91
  74. package/src/programmers/notations/NotationGeneralProgrammer.ts +709 -685
  75. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +97 -97
  76. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +107 -107
  77. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +91 -91
  78. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +95 -95
  79. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +646 -646
  80. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +852 -852
  81. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +104 -104
  82. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +93 -93
  83. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +85 -85
  84. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +109 -109
  85. package/src/transformers/internal/GenericTransformer.ts +104 -104
@@ -1,398 +1,397 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { StatementFactory } from "../factories/StatementFactory";
5
- import { TypeFactory } from "../factories/TypeFactory";
6
-
7
- import { IProject } from "../transformers/IProject";
8
-
9
- import { CheckerProgrammer } from "./CheckerProgrammer";
10
- import { FeatureProgrammer } from "./FeatureProgrammer";
11
- import { IsProgrammer } from "./IsProgrammer";
12
- import { FunctionImporter } from "./helpers/FunctionImporter";
13
- import { OptionPredicator } from "./helpers/OptionPredicator";
14
- import { check_object } from "./internal/check_object";
15
-
16
- export namespace AssertProgrammer {
17
- export const decompose = (props: {
18
- project: IProject;
19
- equals: boolean;
20
- guard: boolean;
21
- importer: FunctionImporter;
22
- type: ts.Type;
23
- name: string | undefined;
24
- init: ts.Expression | undefined;
25
- inline?: boolean;
26
- }): FeatureProgrammer.IDecomposed => {
27
- const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose(props);
28
- const composed: FeatureProgrammer.IComposed = CheckerProgrammer.compose({
29
- ...props,
30
- config: {
31
- prefix: "$a",
32
- path: true,
33
- trace: true,
34
- numeric: OptionPredicator.numeric(props.project.options),
35
- equals: props.equals,
36
- atomist: (explore) => (entry) => (input) =>
37
- [
38
- ...(entry.expression ? [entry.expression] : []),
39
- ...(entry.conditions.length === 0
40
- ? []
41
- : entry.conditions.length === 1
42
- ? entry.conditions[0]!.map((cond) =>
43
- ts.factory.createLogicalOr(
44
- cond.expression,
45
- create_guard_call(props.importer)(
46
- explore.from === "top"
47
- ? ts.factory.createTrue()
48
- : ts.factory.createIdentifier("_exceptionable"),
49
- )(
50
- ts.factory.createIdentifier(
51
- explore.postfix
52
- ? `_path + ${explore.postfix}`
53
- : "_path",
54
- ),
55
- cond.expected,
56
- input,
57
- ),
58
- ),
59
- )
60
- : [
61
- ts.factory.createLogicalOr(
62
- entry.conditions
63
- .map((set) =>
64
- set
65
- .map((s) => s.expression)
66
- .reduce((a, b) =>
67
- ts.factory.createLogicalAnd(a, b),
68
- ),
69
- )
70
- .reduce((a, b) => ts.factory.createLogicalOr(a, b)),
71
- create_guard_call(props.importer)(
72
- explore.from === "top"
73
- ? ts.factory.createTrue()
74
- : ts.factory.createIdentifier("_exceptionable"),
75
- )(
76
- ts.factory.createIdentifier(
77
- explore.postfix
78
- ? `_path + ${explore.postfix}`
79
- : "_path",
80
- ),
81
- entry.expected,
82
- input,
83
- ),
84
- ),
85
- ]),
86
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
87
- combiner: combiner(props.equals)(props.project)(props.importer),
88
- joiner: joiner(props.equals)(props.project)(props.importer),
89
- success: ts.factory.createTrue(),
90
- },
91
- });
92
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
93
- undefined,
94
- undefined,
95
- [
96
- IdentifierFactory.parameter("input", TypeFactory.keyword("any")),
97
- Guardian.parameter(props.init),
98
- ],
99
- props.guard
100
- ? ts.factory.createTypePredicateNode(
101
- ts.factory.createToken(ts.SyntaxKind.AssertsKeyword),
102
- ts.factory.createIdentifier("input"),
103
- ts.factory.createTypeReferenceNode(
104
- props.name ??
105
- TypeFactory.getFullName(props.project.checker)(props.type),
106
- ),
107
- )
108
- : ts.factory.createTypeReferenceNode(
109
- props.name ??
110
- TypeFactory.getFullName(props.project.checker)(props.type),
111
- ),
112
- undefined,
113
- ts.factory.createBlock(
114
- [
115
- ts.factory.createIfStatement(
116
- ts.factory.createStrictEquality(
117
- ts.factory.createFalse(),
118
- ts.factory.createCallExpression(
119
- ts.factory.createIdentifier("__is"),
120
- undefined,
121
- [ts.factory.createIdentifier("input")],
122
- ),
123
- ),
124
- ts.factory.createBlock(
125
- [
126
- ts.factory.createExpressionStatement(
127
- ts.factory.createBinaryExpression(
128
- ts.factory.createIdentifier("_errorFactory"),
129
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
130
- ts.factory.createIdentifier("errorFactory"),
131
- ),
132
- ),
133
- ts.factory.createExpressionStatement(
134
- ts.factory.createCallExpression(
135
- ts.factory.createArrowFunction(
136
- undefined,
137
- undefined,
138
- composed.parameters,
139
- undefined,
140
- undefined,
141
- composed.body,
142
- ),
143
- undefined,
144
- [
145
- ts.factory.createIdentifier("input"),
146
- ts.factory.createStringLiteral("$input"),
147
- ts.factory.createTrue(),
148
- ],
149
- ),
150
- ),
151
- ],
152
- true,
153
- ),
154
- undefined,
155
- ),
156
- ...(props.guard === false
157
- ? [
158
- ts.factory.createReturnStatement(
159
- ts.factory.createIdentifier(`input`),
160
- ),
161
- ]
162
- : []),
163
- ],
164
- true,
165
- ),
166
- );
167
-
168
- return {
169
- functions: {
170
- ...is.functions,
171
- ...composed.functions,
172
- },
173
- statements: [
174
- ...is.statements,
175
- ...composed.statements,
176
- StatementFactory.constant("__is", is.arrow),
177
- StatementFactory.mut("_errorFactory"),
178
- ],
179
- arrow,
180
- };
181
- };
182
-
183
- export const write =
184
- (project: IProject) =>
185
- (modulo: ts.LeftHandSideExpression) =>
186
- (props: boolean | { equals: boolean; guard: boolean }) =>
187
- (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => {
188
- if (typeof props === "boolean") props = { equals: props, guard: false };
189
- const importer: FunctionImporter = new FunctionImporter(modulo.getText());
190
- const result: FeatureProgrammer.IDecomposed = decompose({
191
- ...props,
192
- project,
193
- importer,
194
- type,
195
- name,
196
- init,
197
- });
198
- return FeatureProgrammer.writeDecomposed({
199
- modulo,
200
- importer,
201
- result,
202
- });
203
- };
204
-
205
- const combiner =
206
- (equals: boolean) =>
207
- (project: IProject) =>
208
- (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
209
- (explore: CheckerProgrammer.IExplore) => {
210
- if (explore.tracable === false)
211
- return IsProgrammer.configure({
212
- object: assert_object(equals)(project)(importer),
213
- numeric: true,
214
- })(project)(importer).combiner(explore);
215
-
216
- const path: string = explore.postfix
217
- ? `_path + ${explore.postfix}`
218
- : "_path";
219
- return (logic) => (input, binaries, expected) =>
220
- logic === "and"
221
- ? binaries
222
- .map((binary) =>
223
- binary.combined
224
- ? binary.expression
225
- : ts.factory.createLogicalOr(
226
- binary.expression,
227
- create_guard_call(importer)(
228
- explore.source === "top"
229
- ? ts.factory.createTrue()
230
- : ts.factory.createIdentifier("_exceptionable"),
231
- )(ts.factory.createIdentifier(path), expected, input),
232
- ),
233
- )
234
- .reduce(ts.factory.createLogicalAnd)
235
- : ts.factory.createLogicalOr(
236
- binaries
237
- .map((binary) => binary.expression)
238
- .reduce(ts.factory.createLogicalOr),
239
- create_guard_call(importer)(
240
- explore.source === "top"
241
- ? ts.factory.createTrue()
242
- : ts.factory.createIdentifier("_exceptionable"),
243
- )(ts.factory.createIdentifier(path), expected, input),
244
- );
245
- // : (() => {
246
- // const addicted = binaries.slice();
247
- // if (
248
- // addicted[addicted.length - 1]!.combined === false
249
- // ) {
250
- // addicted.push({
251
- // combined: true,
252
- // expression: create_guard_call(importer)(
253
- // explore.source === "top"
254
- // ? ts.factory.createTrue()
255
- // : ts.factory.createIdentifier(
256
- // "_exceptionable",
257
- // ),
258
- // )(
259
- // ts.factory.createIdentifier(path),
260
- // expected,
261
- // input,
262
- // ),
263
- // });
264
- // }
265
- // return addicted
266
- // .map((b) => b.expression)
267
- // .reduce(ts.factory.createLogicalOr);
268
- // })();
269
- };
270
-
271
- const assert_object =
272
- (equals: boolean) => (project: IProject) => (importer: FunctionImporter) =>
273
- check_object({
274
- equals,
275
- assert: true,
276
- undefined: true,
277
- reduce: ts.factory.createLogicalAnd,
278
- positive: ts.factory.createTrue(),
279
- superfluous: (value) =>
280
- create_guard_call(importer)()(
281
- ts.factory.createAdd(
282
- ts.factory.createIdentifier("_path"),
283
- ts.factory.createCallExpression(importer.use("join"), undefined, [
284
- ts.factory.createIdentifier("key"),
285
- ]),
286
- ),
287
- "undefined",
288
- value,
289
- ),
290
- halt: (expr) =>
291
- ts.factory.createLogicalOr(
292
- ts.factory.createStrictEquality(
293
- ts.factory.createFalse(),
294
- ts.factory.createIdentifier("_exceptionable"),
295
- ),
296
- expr,
297
- ),
298
- })(project)(importer);
299
-
300
- const joiner =
301
- (equals: boolean) =>
302
- (project: IProject) =>
303
- (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({
304
- object: assert_object(equals)(project)(importer),
305
- array: (input, arrow) =>
306
- ts.factory.createCallExpression(
307
- IdentifierFactory.access(input)("every"),
308
- undefined,
309
- [arrow],
310
- ),
311
- failure: (value, expected, explore) =>
312
- create_guard_call(importer)(
313
- explore?.from === "top"
314
- ? ts.factory.createTrue()
315
- : ts.factory.createIdentifier("_exceptionable"),
316
- )(
317
- ts.factory.createIdentifier(
318
- explore?.postfix ? `_path + ${explore.postfix}` : "_path",
319
- ),
320
- expected,
321
- value,
322
- ),
323
- full: equals
324
- ? undefined
325
- : (condition) => (input, expected, explore) =>
326
- ts.factory.createLogicalOr(
327
- condition,
328
- create_guard_call(importer)(
329
- explore.from === "top"
330
- ? ts.factory.createTrue()
331
- : ts.factory.createIdentifier("_exceptionable"),
332
- )(ts.factory.createIdentifier("_path"), expected, input),
333
- ),
334
- });
335
-
336
- const create_guard_call =
337
- (importer: FunctionImporter) =>
338
- (exceptionable?: ts.Expression) =>
339
- (
340
- path: ts.Expression,
341
- expected: string,
342
- value: ts.Expression,
343
- ): ts.Expression =>
344
- ts.factory.createCallExpression(importer.use("guard"), undefined, [
345
- exceptionable ?? ts.factory.createIdentifier("_exceptionable"),
346
- ts.factory.createObjectLiteralExpression(
347
- [
348
- ts.factory.createPropertyAssignment("path", path),
349
- ts.factory.createPropertyAssignment(
350
- "expected",
351
- ts.factory.createStringLiteral(expected),
352
- ),
353
- ts.factory.createPropertyAssignment("value", value),
354
- ],
355
- true,
356
- ),
357
- ts.factory.createIdentifier("_errorFactory"),
358
- ]);
359
-
360
- export namespace Guardian {
361
- export const identifier = () => ts.factory.createIdentifier("errorFactory");
362
- export const parameter = (init: ts.Expression | undefined) =>
363
- IdentifierFactory.parameter(
364
- "errorFactory",
365
- type(),
366
- init ?? ts.factory.createToken(ts.SyntaxKind.QuestionToken),
367
- );
368
- export const type = () =>
369
- ts.factory.createFunctionTypeNode(
370
- undefined,
371
- [
372
- ts.factory.createParameterDeclaration(
373
- undefined,
374
- undefined,
375
- ts.factory.createIdentifier("p"),
376
- undefined,
377
- ts.factory.createImportTypeNode(
378
- ts.factory.createLiteralTypeNode(
379
- ts.factory.createStringLiteral("typia"),
380
- ),
381
- undefined,
382
- ts.factory.createQualifiedName(
383
- ts.factory.createIdentifier("TypeGuardError"),
384
- ts.factory.createIdentifier("IProps"),
385
- ),
386
- undefined,
387
- false,
388
- ),
389
- undefined,
390
- ),
391
- ],
392
- ts.factory.createTypeReferenceNode(
393
- ts.factory.createIdentifier("Error"),
394
- undefined,
395
- ),
396
- );
397
- }
398
- }
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../factories/StatementFactory";
5
+ import { TypeFactory } from "../factories/TypeFactory";
6
+
7
+ import { IProject } from "../transformers/IProject";
8
+
9
+ import { CheckerProgrammer } from "./CheckerProgrammer";
10
+ import { FeatureProgrammer } from "./FeatureProgrammer";
11
+ import { IsProgrammer } from "./IsProgrammer";
12
+ import { FunctionImporter } from "./helpers/FunctionImporter";
13
+ import { OptionPredicator } from "./helpers/OptionPredicator";
14
+ import { check_object } from "./internal/check_object";
15
+
16
+ export namespace AssertProgrammer {
17
+ export const decompose = (props: {
18
+ project: IProject;
19
+ equals: boolean;
20
+ guard: boolean;
21
+ importer: FunctionImporter;
22
+ type: ts.Type;
23
+ name: string | undefined;
24
+ init: ts.Expression | undefined;
25
+ }): FeatureProgrammer.IDecomposed => {
26
+ const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose(props);
27
+ const composed: FeatureProgrammer.IComposed = CheckerProgrammer.compose({
28
+ ...props,
29
+ config: {
30
+ prefix: "$a",
31
+ path: true,
32
+ trace: true,
33
+ numeric: OptionPredicator.numeric(props.project.options),
34
+ equals: props.equals,
35
+ atomist: (explore) => (entry) => (input) =>
36
+ [
37
+ ...(entry.expression ? [entry.expression] : []),
38
+ ...(entry.conditions.length === 0
39
+ ? []
40
+ : entry.conditions.length === 1
41
+ ? entry.conditions[0]!.map((cond) =>
42
+ ts.factory.createLogicalOr(
43
+ cond.expression,
44
+ create_guard_call(props.importer)(
45
+ explore.from === "top"
46
+ ? ts.factory.createTrue()
47
+ : ts.factory.createIdentifier("_exceptionable"),
48
+ )(
49
+ ts.factory.createIdentifier(
50
+ explore.postfix
51
+ ? `_path + ${explore.postfix}`
52
+ : "_path",
53
+ ),
54
+ cond.expected,
55
+ input,
56
+ ),
57
+ ),
58
+ )
59
+ : [
60
+ ts.factory.createLogicalOr(
61
+ entry.conditions
62
+ .map((set) =>
63
+ set
64
+ .map((s) => s.expression)
65
+ .reduce((a, b) =>
66
+ ts.factory.createLogicalAnd(a, b),
67
+ ),
68
+ )
69
+ .reduce((a, b) => ts.factory.createLogicalOr(a, b)),
70
+ create_guard_call(props.importer)(
71
+ explore.from === "top"
72
+ ? ts.factory.createTrue()
73
+ : ts.factory.createIdentifier("_exceptionable"),
74
+ )(
75
+ ts.factory.createIdentifier(
76
+ explore.postfix
77
+ ? `_path + ${explore.postfix}`
78
+ : "_path",
79
+ ),
80
+ entry.expected,
81
+ input,
82
+ ),
83
+ ),
84
+ ]),
85
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
86
+ combiner: combiner(props.equals)(props.project)(props.importer),
87
+ joiner: joiner(props.equals)(props.project)(props.importer),
88
+ success: ts.factory.createTrue(),
89
+ },
90
+ });
91
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
92
+ undefined,
93
+ undefined,
94
+ [
95
+ IdentifierFactory.parameter("input", TypeFactory.keyword("any")),
96
+ Guardian.parameter(props.init),
97
+ ],
98
+ props.guard
99
+ ? ts.factory.createTypePredicateNode(
100
+ ts.factory.createToken(ts.SyntaxKind.AssertsKeyword),
101
+ ts.factory.createIdentifier("input"),
102
+ ts.factory.createTypeReferenceNode(
103
+ props.name ??
104
+ TypeFactory.getFullName(props.project.checker)(props.type),
105
+ ),
106
+ )
107
+ : ts.factory.createTypeReferenceNode(
108
+ props.name ??
109
+ TypeFactory.getFullName(props.project.checker)(props.type),
110
+ ),
111
+ undefined,
112
+ ts.factory.createBlock(
113
+ [
114
+ ts.factory.createIfStatement(
115
+ ts.factory.createStrictEquality(
116
+ ts.factory.createFalse(),
117
+ ts.factory.createCallExpression(
118
+ ts.factory.createIdentifier("__is"),
119
+ undefined,
120
+ [ts.factory.createIdentifier("input")],
121
+ ),
122
+ ),
123
+ ts.factory.createBlock(
124
+ [
125
+ ts.factory.createExpressionStatement(
126
+ ts.factory.createBinaryExpression(
127
+ ts.factory.createIdentifier("_errorFactory"),
128
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
129
+ ts.factory.createIdentifier("errorFactory"),
130
+ ),
131
+ ),
132
+ ts.factory.createExpressionStatement(
133
+ ts.factory.createCallExpression(
134
+ ts.factory.createArrowFunction(
135
+ undefined,
136
+ undefined,
137
+ composed.parameters,
138
+ undefined,
139
+ undefined,
140
+ composed.body,
141
+ ),
142
+ undefined,
143
+ [
144
+ ts.factory.createIdentifier("input"),
145
+ ts.factory.createStringLiteral("$input"),
146
+ ts.factory.createTrue(),
147
+ ],
148
+ ),
149
+ ),
150
+ ],
151
+ true,
152
+ ),
153
+ undefined,
154
+ ),
155
+ ...(props.guard === false
156
+ ? [
157
+ ts.factory.createReturnStatement(
158
+ ts.factory.createIdentifier(`input`),
159
+ ),
160
+ ]
161
+ : []),
162
+ ],
163
+ true,
164
+ ),
165
+ );
166
+
167
+ return {
168
+ functions: {
169
+ ...is.functions,
170
+ ...composed.functions,
171
+ },
172
+ statements: [
173
+ ...is.statements,
174
+ ...composed.statements,
175
+ StatementFactory.constant("__is", is.arrow),
176
+ StatementFactory.mut("_errorFactory"),
177
+ ],
178
+ arrow,
179
+ };
180
+ };
181
+
182
+ export const write =
183
+ (project: IProject) =>
184
+ (modulo: ts.LeftHandSideExpression) =>
185
+ (props: boolean | { equals: boolean; guard: boolean }) =>
186
+ (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => {
187
+ if (typeof props === "boolean") props = { equals: props, guard: false };
188
+ const importer: FunctionImporter = new FunctionImporter(modulo.getText());
189
+ const result: FeatureProgrammer.IDecomposed = decompose({
190
+ ...props,
191
+ project,
192
+ importer,
193
+ type,
194
+ name,
195
+ init,
196
+ });
197
+ return FeatureProgrammer.writeDecomposed({
198
+ modulo,
199
+ importer,
200
+ result,
201
+ });
202
+ };
203
+
204
+ const combiner =
205
+ (equals: boolean) =>
206
+ (project: IProject) =>
207
+ (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
208
+ (explore: CheckerProgrammer.IExplore) => {
209
+ if (explore.tracable === false)
210
+ return IsProgrammer.configure({
211
+ object: assert_object(equals)(project)(importer),
212
+ numeric: true,
213
+ })(project)(importer).combiner(explore);
214
+
215
+ const path: string = explore.postfix
216
+ ? `_path + ${explore.postfix}`
217
+ : "_path";
218
+ return (logic) => (input, binaries, expected) =>
219
+ logic === "and"
220
+ ? binaries
221
+ .map((binary) =>
222
+ binary.combined
223
+ ? binary.expression
224
+ : ts.factory.createLogicalOr(
225
+ binary.expression,
226
+ create_guard_call(importer)(
227
+ explore.source === "top"
228
+ ? ts.factory.createTrue()
229
+ : ts.factory.createIdentifier("_exceptionable"),
230
+ )(ts.factory.createIdentifier(path), expected, input),
231
+ ),
232
+ )
233
+ .reduce(ts.factory.createLogicalAnd)
234
+ : ts.factory.createLogicalOr(
235
+ binaries
236
+ .map((binary) => binary.expression)
237
+ .reduce(ts.factory.createLogicalOr),
238
+ create_guard_call(importer)(
239
+ explore.source === "top"
240
+ ? ts.factory.createTrue()
241
+ : ts.factory.createIdentifier("_exceptionable"),
242
+ )(ts.factory.createIdentifier(path), expected, input),
243
+ );
244
+ // : (() => {
245
+ // const addicted = binaries.slice();
246
+ // if (
247
+ // addicted[addicted.length - 1]!.combined === false
248
+ // ) {
249
+ // addicted.push({
250
+ // combined: true,
251
+ // expression: create_guard_call(importer)(
252
+ // explore.source === "top"
253
+ // ? ts.factory.createTrue()
254
+ // : ts.factory.createIdentifier(
255
+ // "_exceptionable",
256
+ // ),
257
+ // )(
258
+ // ts.factory.createIdentifier(path),
259
+ // expected,
260
+ // input,
261
+ // ),
262
+ // });
263
+ // }
264
+ // return addicted
265
+ // .map((b) => b.expression)
266
+ // .reduce(ts.factory.createLogicalOr);
267
+ // })();
268
+ };
269
+
270
+ const assert_object =
271
+ (equals: boolean) => (project: IProject) => (importer: FunctionImporter) =>
272
+ check_object({
273
+ equals,
274
+ assert: true,
275
+ undefined: true,
276
+ reduce: ts.factory.createLogicalAnd,
277
+ positive: ts.factory.createTrue(),
278
+ superfluous: (value) =>
279
+ create_guard_call(importer)()(
280
+ ts.factory.createAdd(
281
+ ts.factory.createIdentifier("_path"),
282
+ ts.factory.createCallExpression(importer.use("join"), undefined, [
283
+ ts.factory.createIdentifier("key"),
284
+ ]),
285
+ ),
286
+ "undefined",
287
+ value,
288
+ ),
289
+ halt: (expr) =>
290
+ ts.factory.createLogicalOr(
291
+ ts.factory.createStrictEquality(
292
+ ts.factory.createFalse(),
293
+ ts.factory.createIdentifier("_exceptionable"),
294
+ ),
295
+ expr,
296
+ ),
297
+ })(project)(importer);
298
+
299
+ const joiner =
300
+ (equals: boolean) =>
301
+ (project: IProject) =>
302
+ (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({
303
+ object: assert_object(equals)(project)(importer),
304
+ array: (input, arrow) =>
305
+ ts.factory.createCallExpression(
306
+ IdentifierFactory.access(input)("every"),
307
+ undefined,
308
+ [arrow],
309
+ ),
310
+ failure: (value, expected, explore) =>
311
+ create_guard_call(importer)(
312
+ explore?.from === "top"
313
+ ? ts.factory.createTrue()
314
+ : ts.factory.createIdentifier("_exceptionable"),
315
+ )(
316
+ ts.factory.createIdentifier(
317
+ explore?.postfix ? `_path + ${explore.postfix}` : "_path",
318
+ ),
319
+ expected,
320
+ value,
321
+ ),
322
+ full: equals
323
+ ? undefined
324
+ : (condition) => (input, expected, explore) =>
325
+ ts.factory.createLogicalOr(
326
+ condition,
327
+ create_guard_call(importer)(
328
+ explore.from === "top"
329
+ ? ts.factory.createTrue()
330
+ : ts.factory.createIdentifier("_exceptionable"),
331
+ )(ts.factory.createIdentifier("_path"), expected, input),
332
+ ),
333
+ });
334
+
335
+ const create_guard_call =
336
+ (importer: FunctionImporter) =>
337
+ (exceptionable?: ts.Expression) =>
338
+ (
339
+ path: ts.Expression,
340
+ expected: string,
341
+ value: ts.Expression,
342
+ ): ts.Expression =>
343
+ ts.factory.createCallExpression(importer.use("guard"), undefined, [
344
+ exceptionable ?? ts.factory.createIdentifier("_exceptionable"),
345
+ ts.factory.createObjectLiteralExpression(
346
+ [
347
+ ts.factory.createPropertyAssignment("path", path),
348
+ ts.factory.createPropertyAssignment(
349
+ "expected",
350
+ ts.factory.createStringLiteral(expected),
351
+ ),
352
+ ts.factory.createPropertyAssignment("value", value),
353
+ ],
354
+ true,
355
+ ),
356
+ ts.factory.createIdentifier("_errorFactory"),
357
+ ]);
358
+
359
+ export namespace Guardian {
360
+ export const identifier = () => ts.factory.createIdentifier("errorFactory");
361
+ export const parameter = (init: ts.Expression | undefined) =>
362
+ IdentifierFactory.parameter(
363
+ "errorFactory",
364
+ type(),
365
+ init ?? ts.factory.createToken(ts.SyntaxKind.QuestionToken),
366
+ );
367
+ export const type = () =>
368
+ ts.factory.createFunctionTypeNode(
369
+ undefined,
370
+ [
371
+ ts.factory.createParameterDeclaration(
372
+ undefined,
373
+ undefined,
374
+ ts.factory.createIdentifier("p"),
375
+ undefined,
376
+ ts.factory.createImportTypeNode(
377
+ ts.factory.createLiteralTypeNode(
378
+ ts.factory.createStringLiteral("typia"),
379
+ ),
380
+ undefined,
381
+ ts.factory.createQualifiedName(
382
+ ts.factory.createIdentifier("TypeGuardError"),
383
+ ts.factory.createIdentifier("IProps"),
384
+ ),
385
+ undefined,
386
+ false,
387
+ ),
388
+ undefined,
389
+ ),
390
+ ],
391
+ ts.factory.createTypeReferenceNode(
392
+ ts.factory.createIdentifier("Error"),
393
+ undefined,
394
+ ),
395
+ );
396
+ }
397
+ }