typia 7.0.0-dev.20240929 → 7.0.0-dev.20241001

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 (172) hide show
  1. package/lib/index.mjs +25 -25
  2. package/lib/index.mjs.map +1 -1
  3. package/lib/programmers/AssertProgrammer.js +34 -27
  4. package/lib/programmers/AssertProgrammer.js.map +1 -1
  5. package/lib/programmers/CheckerProgrammer.d.ts +5 -1
  6. package/lib/programmers/CheckerProgrammer.js +432 -348
  7. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  8. package/lib/programmers/FeatureProgrammer.d.ts +91 -28
  9. package/lib/programmers/FeatureProgrammer.js +165 -138
  10. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  11. package/lib/programmers/IsProgrammer.d.ts +5 -1
  12. package/lib/programmers/IsProgrammer.js +87 -66
  13. package/lib/programmers/IsProgrammer.js.map +1 -1
  14. package/lib/programmers/RandomProgrammer.js +83 -68
  15. package/lib/programmers/RandomProgrammer.js.map +1 -1
  16. package/lib/programmers/TypiaProgrammer.d.ts +2 -2
  17. package/lib/programmers/TypiaProgrammer.js +79 -75
  18. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  19. package/lib/programmers/ValidateProgrammer.js +45 -19
  20. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  21. package/lib/programmers/helpers/CloneJoiner.js +4 -1
  22. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  23. package/lib/programmers/helpers/NotationJoiner.d.ts +2 -1
  24. package/lib/programmers/helpers/NotationJoiner.js +34 -33
  25. package/lib/programmers/helpers/NotationJoiner.js.map +1 -1
  26. package/lib/programmers/helpers/PruneJoiner.js +4 -1
  27. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  28. package/lib/programmers/helpers/RandomJoiner.d.ts +1 -1
  29. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  30. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  31. package/lib/programmers/helpers/StringifyJoinder.js +4 -1
  32. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  33. package/lib/programmers/helpers/StringifyPredicator.d.ts +1 -1
  34. package/lib/programmers/helpers/StringifyPredicator.js +4 -3
  35. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  36. package/lib/programmers/helpers/UnionExplorer.d.ts +52 -12
  37. package/lib/programmers/helpers/UnionExplorer.js +184 -120
  38. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  39. package/lib/programmers/helpers/UnionPredicator.d.ts +1 -1
  40. package/lib/programmers/helpers/UnionPredicator.js +7 -7
  41. package/lib/programmers/http/HttpFormDataProgrammer.js +77 -70
  42. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  43. package/lib/programmers/http/HttpHeadersProgrammer.js +69 -68
  44. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  45. package/lib/programmers/http/HttpQueryProgrammer.js +69 -62
  46. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  47. package/lib/programmers/internal/application_escaped.js +4 -4
  48. package/lib/programmers/internal/application_escaped.js.map +1 -1
  49. package/lib/programmers/internal/application_templates.js +8 -2
  50. package/lib/programmers/internal/application_templates.js.map +1 -1
  51. package/lib/programmers/internal/application_union_discriminator.d.ts +1 -1
  52. package/lib/programmers/internal/application_union_discriminator.js +6 -6
  53. package/lib/programmers/internal/application_union_discriminator.js.map +1 -1
  54. package/lib/programmers/internal/application_v30_object.js +6 -3
  55. package/lib/programmers/internal/application_v30_object.js.map +1 -1
  56. package/lib/programmers/internal/application_v31_object.js +4 -1
  57. package/lib/programmers/internal/application_v31_object.js.map +1 -1
  58. package/lib/programmers/internal/check_array_length.js +21 -26
  59. package/lib/programmers/internal/check_array_length.js.map +1 -1
  60. package/lib/programmers/internal/check_bigint.js +18 -26
  61. package/lib/programmers/internal/check_bigint.js.map +1 -1
  62. package/lib/programmers/internal/check_dynamic_key.d.ts +1 -5
  63. package/lib/programmers/internal/check_dynamic_key.js +109 -91
  64. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  65. package/lib/programmers/internal/check_dynamic_properties.js +88 -90
  66. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  67. package/lib/programmers/internal/check_native.js +8 -5
  68. package/lib/programmers/internal/check_native.js.map +1 -1
  69. package/lib/programmers/internal/check_number.js +59 -65
  70. package/lib/programmers/internal/check_number.js.map +1 -1
  71. package/lib/programmers/internal/check_object.js +31 -22
  72. package/lib/programmers/internal/check_object.js.map +1 -1
  73. package/lib/programmers/internal/check_string.js +18 -26
  74. package/lib/programmers/internal/check_string.js.map +1 -1
  75. package/lib/programmers/internal/check_template.js +20 -21
  76. package/lib/programmers/internal/check_template.js.map +1 -1
  77. package/lib/programmers/internal/check_union_array_like.js +68 -53
  78. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  79. package/lib/programmers/internal/decode_union_object.js +59 -49
  80. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  81. package/lib/programmers/internal/feature_object_entries.js +31 -33
  82. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  83. package/lib/programmers/internal/llm_schema_escaped.js +29 -11
  84. package/lib/programmers/internal/llm_schema_escaped.js.map +1 -1
  85. package/lib/programmers/internal/llm_schema_object.js +4 -1
  86. package/lib/programmers/internal/llm_schema_object.js.map +1 -1
  87. package/lib/programmers/internal/metadata_to_pattern.js +44 -41
  88. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  89. package/lib/programmers/internal/postfix_of_tuple.d.ts +1 -1
  90. package/lib/programmers/internal/postfix_of_tuple.js +3 -0
  91. package/lib/programmers/internal/postfix_of_tuple.js.map +1 -1
  92. package/lib/programmers/internal/prune_object_properties.js +6 -3
  93. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  94. package/lib/programmers/internal/random_custom.js +8 -14
  95. package/lib/programmers/internal/random_custom.js.map +1 -1
  96. package/lib/programmers/internal/stringify_dynamic_properties.js +4 -1
  97. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  98. package/lib/programmers/internal/stringify_regular_properties.js +4 -4
  99. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  100. package/lib/programmers/internal/template_to_pattern.js +10 -5
  101. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  102. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +1 -2
  103. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +3 -0
  104. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  105. package/lib/programmers/json/JsonStringifyProgrammer.js +154 -91
  106. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  107. package/lib/programmers/misc/MiscCloneProgrammer.js +221 -154
  108. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  109. package/lib/programmers/misc/MiscPruneProgrammer.js +139 -89
  110. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  111. package/lib/programmers/notations/NotationGeneralProgrammer.d.ts +4 -1
  112. package/lib/programmers/notations/NotationGeneralProgrammer.js +257 -148
  113. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  114. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +32 -24
  115. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  116. package/lib/utils/NamingConvention/NamingConvention.js +41 -47
  117. package/lib/utils/NamingConvention/NamingConvention.js.map +1 -1
  118. package/package.json +1 -1
  119. package/src/programmers/AssertProgrammer.ts +44 -37
  120. package/src/programmers/CheckerProgrammer.ts +394 -358
  121. package/src/programmers/FeatureProgrammer.ts +327 -267
  122. package/src/programmers/IsProgrammer.ts +93 -76
  123. package/src/programmers/RandomProgrammer.ts +18 -9
  124. package/src/programmers/TypiaProgrammer.ts +48 -34
  125. package/src/programmers/ValidateProgrammer.ts +56 -29
  126. package/src/programmers/helpers/CloneJoiner.ts +4 -1
  127. package/src/programmers/helpers/NotationJoiner.ts +85 -83
  128. package/src/programmers/helpers/ProtobufUtil.ts +2 -2
  129. package/src/programmers/helpers/PruneJoiner.ts +4 -1
  130. package/src/programmers/helpers/RandomJoiner.ts +5 -2
  131. package/src/programmers/helpers/RandomRanger.ts +8 -1
  132. package/src/programmers/helpers/StringifyJoinder.ts +4 -1
  133. package/src/programmers/helpers/StringifyPredicator.ts +4 -3
  134. package/src/programmers/helpers/UnionExplorer.ts +277 -179
  135. package/src/programmers/helpers/UnionPredicator.ts +5 -5
  136. package/src/programmers/http/HttpFormDataProgrammer.ts +135 -114
  137. package/src/programmers/http/HttpHeadersProgrammer.ts +145 -120
  138. package/src/programmers/http/HttpQueryProgrammer.ts +137 -116
  139. package/src/programmers/internal/application_escaped.ts +6 -6
  140. package/src/programmers/internal/application_templates.ts +8 -6
  141. package/src/programmers/internal/application_union_discriminator.ts +6 -6
  142. package/src/programmers/internal/application_v30_object.ts +6 -3
  143. package/src/programmers/internal/application_v31_object.ts +4 -1
  144. package/src/programmers/internal/application_v31_tuple.ts +1 -1
  145. package/src/programmers/internal/check_array_length.ts +31 -30
  146. package/src/programmers/internal/check_bigint.ts +31 -31
  147. package/src/programmers/internal/check_dynamic_key.ts +155 -126
  148. package/src/programmers/internal/check_dynamic_properties.ts +152 -154
  149. package/src/programmers/internal/check_native.ts +11 -5
  150. package/src/programmers/internal/check_number.ts +88 -84
  151. package/src/programmers/internal/check_object.ts +45 -31
  152. package/src/programmers/internal/check_string.ts +31 -30
  153. package/src/programmers/internal/check_template.ts +34 -32
  154. package/src/programmers/internal/check_union_array_like.ts +245 -228
  155. package/src/programmers/internal/decode_union_object.ts +92 -75
  156. package/src/programmers/internal/feature_object_entries.ts +36 -36
  157. package/src/programmers/internal/llm_schema_escaped.ts +36 -13
  158. package/src/programmers/internal/llm_schema_object.ts +4 -1
  159. package/src/programmers/internal/metadata_to_pattern.ts +31 -23
  160. package/src/programmers/internal/postfix_of_tuple.ts +3 -0
  161. package/src/programmers/internal/prune_object_properties.ts +6 -3
  162. package/src/programmers/internal/random_custom.ts +24 -23
  163. package/src/programmers/internal/stringify_dynamic_properties.ts +4 -1
  164. package/src/programmers/internal/stringify_regular_properties.ts +7 -7
  165. package/src/programmers/internal/template_to_pattern.ts +12 -4
  166. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +3 -0
  167. package/src/programmers/json/JsonStringifyProgrammer.ts +151 -104
  168. package/src/programmers/misc/MiscCloneProgrammer.ts +255 -204
  169. package/src/programmers/misc/MiscPruneProgrammer.ts +149 -116
  170. package/src/programmers/notations/NotationGeneralProgrammer.ts +307 -211
  171. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +25 -21
  172. package/src/utils/NamingConvention/NamingConvention.ts +40 -42
@@ -19,68 +19,76 @@ import { OptionPredicator } from "./helpers/OptionPredicator";
19
19
  import { check_object } from "./internal/check_object";
20
20
 
21
21
  export namespace IsProgrammer {
22
- export const configure =
23
- (options?: Partial<CONFIG.IOptions>) =>
24
- (project: ITypiaContext) =>
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) => ts.factory.createLogicalAnd(a, b)),
44
- )
45
- .reduce((a, b) => ts.factory.createLogicalOr(a, b)),
46
- ]),
47
- ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
48
- combiner: (next) => {
49
- const initial: ts.TrueLiteral | ts.FalseLiteral =
50
- next.logic === "and"
51
- ? ts.factory.createTrue()
52
- : ts.factory.createFalse();
53
- const binder =
54
- next.logic === "and"
55
- ? ts.factory.createLogicalAnd
56
- : ts.factory.createLogicalOr;
57
- return next.binaries.length
58
- ? next.binaries.map((binary) => binary.expression).reduce(binder)
59
- : initial;
60
- },
61
- joiner: {
62
- object:
63
- options?.object ||
64
- check_object({
65
- equals: !!options?.object,
66
- undefined: OptionPredicator.undefined({
67
- undefined: options?.undefined,
22
+ export const configure = (props: {
23
+ options?: Partial<CONFIG.IOptions>;
24
+ context: ITypiaContext;
25
+ importer: FunctionImporter;
26
+ }): CheckerProgrammer.IConfig => ({
27
+ prefix: "$i",
28
+ equals: !!props.options?.object,
29
+ trace: false,
30
+ path: false,
31
+ numeric: OptionPredicator.numeric({
32
+ numeric: props.options?.numeric,
33
+ }),
34
+ atomist: ({ entry }) =>
35
+ [
36
+ ...(entry.expression ? [entry.expression] : []),
37
+ ...(entry.conditions.length === 0
38
+ ? []
39
+ : [
40
+ entry.conditions
41
+ .map((set) =>
42
+ set
43
+ .map((s) => s.expression)
44
+ .reduce((a, b) => ts.factory.createLogicalAnd(a, b)),
45
+ )
46
+ .reduce((a, b) => ts.factory.createLogicalOr(a, b)),
47
+ ]),
48
+ ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
49
+ combiner: (next) => {
50
+ const initial: ts.TrueLiteral | ts.FalseLiteral =
51
+ next.logic === "and"
52
+ ? ts.factory.createTrue()
53
+ : ts.factory.createFalse();
54
+ const binder =
55
+ next.logic === "and"
56
+ ? ts.factory.createLogicalAnd
57
+ : ts.factory.createLogicalOr;
58
+ return next.binaries.length
59
+ ? next.binaries.map((binary) => binary.expression).reduce(binder)
60
+ : initial;
61
+ },
62
+ joiner: {
63
+ object: props.options?.object
64
+ ? (v) => props.options!.object!(v)
65
+ : (v) =>
66
+ check_object({
67
+ config: {
68
+ equals: !!props.options?.object,
69
+ undefined: OptionPredicator.undefined({
70
+ undefined: props.options?.undefined,
71
+ }),
72
+ assert: true,
73
+ reduce: ts.factory.createLogicalAnd,
74
+ positive: ts.factory.createTrue(),
75
+ superfluous: () => ts.factory.createFalse(),
76
+ },
77
+ context: props.context,
78
+ importer: props.importer,
79
+ entries: v.entries,
80
+ input: v.input,
68
81
  }),
69
- assert: true,
70
- reduce: ts.factory.createLogicalAnd,
71
- positive: ts.factory.createTrue(),
72
- superfluous: () => ts.factory.createFalse(),
73
- })(project)(importer),
74
- array: (props) =>
75
- ts.factory.createCallExpression(
76
- IdentifierFactory.access(props.input)("every"),
77
- undefined,
78
- [props.arrow],
79
- ),
80
- failure: () => ts.factory.createFalse(),
81
- },
82
- success: ts.factory.createTrue(),
83
- });
82
+ array: (props) =>
83
+ ts.factory.createCallExpression(
84
+ IdentifierFactory.access(props.input)("every"),
85
+ undefined,
86
+ [props.arrow],
87
+ ),
88
+ failure: () => ts.factory.createFalse(),
89
+ },
90
+ success: ts.factory.createTrue(),
91
+ });
84
92
 
85
93
  export namespace CONFIG {
86
94
  export interface IOptions {
@@ -113,16 +121,27 @@ export namespace IsProgrammer {
113
121
  // CONFIGURATION
114
122
  const config: CheckerProgrammer.IConfig = {
115
123
  ...configure({
116
- object: check_object({
117
- equals: props.config.equals,
118
- undefined: OptionPredicator.undefined(props.context.options),
119
- assert: true,
120
- reduce: ts.factory.createLogicalAnd,
121
- positive: ts.factory.createTrue(),
122
- superfluous: () => ts.factory.createFalse(),
123
- })(props.context)(props.importer),
124
- numeric: OptionPredicator.numeric(props.context.options),
125
- })(props.context)(props.importer),
124
+ options: {
125
+ object: (v) =>
126
+ check_object({
127
+ config: {
128
+ equals: props.config.equals,
129
+ undefined: OptionPredicator.undefined(props.context.options),
130
+ assert: true,
131
+ reduce: ts.factory.createLogicalAnd,
132
+ positive: ts.factory.createTrue(),
133
+ superfluous: () => ts.factory.createFalse(),
134
+ },
135
+ context: props.context,
136
+ importer: props.importer,
137
+ entries: v.entries,
138
+ input: v.input,
139
+ }),
140
+ numeric: OptionPredicator.numeric(props.context.options),
141
+ },
142
+ context: props.context,
143
+ importer: props.importer,
144
+ }),
126
145
  trace: props.config.equals,
127
146
  };
128
147
 
@@ -168,9 +187,7 @@ export namespace IsProgrammer {
168
187
  importer: FunctionImporter;
169
188
  collection: MetadataCollection;
170
189
  }) => {
171
- const config: CheckerProgrammer.IConfig = configure()(props.context)(
172
- props.importer,
173
- );
190
+ const config: CheckerProgrammer.IConfig = configure(props);
174
191
  const next = {
175
192
  ...props,
176
193
  config,
@@ -212,7 +229,7 @@ export namespace IsProgrammer {
212
229
  }) =>
213
230
  CheckerProgrammer.decode({
214
231
  context: props.context,
215
- config: configure()(props.context)(props.importer),
232
+ config: configure(props),
216
233
  importer: props.importer,
217
234
  metadata: props.metadata,
218
235
  input: props.input,
@@ -227,7 +244,7 @@ export namespace IsProgrammer {
227
244
  explore: FeatureProgrammer.IExplore;
228
245
  }) =>
229
246
  CheckerProgrammer.decode_object({
230
- config: configure()(props.context)(props.importer),
247
+ config: configure(props),
231
248
  importer: props.importer,
232
249
  object: props.object,
233
250
  input: props.input,
@@ -481,8 +481,11 @@ export namespace RandomProgrammer {
481
481
  ? "uint"
482
482
  : "double";
483
483
  const multiply = tags.find((t) => t.kind === "multipleOf");
484
- return random_custom(coalesce(props.importer))("number")(tags)(
485
- RandomRanger.number({
484
+ return random_custom({
485
+ accessor: coalesce(props.importer),
486
+ type: "number",
487
+ tags,
488
+ expression: RandomRanger.number({
486
489
  config: {
487
490
  type,
488
491
  transform: (value) => ExpressionFactory.number(value),
@@ -502,7 +505,7 @@ export namespace RandomProgrammer {
502
505
  },
503
506
  tags,
504
507
  }),
505
- );
508
+ });
506
509
  });
507
510
 
508
511
  const decode_bigint = (props: {
@@ -510,8 +513,11 @@ export namespace RandomProgrammer {
510
513
  atomic: MetadataAtomic;
511
514
  }): ts.Expression[] =>
512
515
  (props.atomic.tags.length ? props.atomic.tags : [[]]).map((tags) =>
513
- random_custom(coalesce(props.importer))("bigint")(tags)(
514
- RandomRanger.number({
516
+ random_custom({
517
+ accessor: coalesce(props.importer),
518
+ type: "bigint",
519
+ tags,
520
+ expression: RandomRanger.number({
515
521
  config: {
516
522
  type: tags.find(
517
523
  (t) =>
@@ -535,7 +541,7 @@ export namespace RandomProgrammer {
535
541
  },
536
542
  tags,
537
543
  }),
538
- ),
544
+ }),
539
545
  );
540
546
 
541
547
  const decode_string = (props: {
@@ -543,8 +549,11 @@ export namespace RandomProgrammer {
543
549
  atomic: MetadataAtomic;
544
550
  }): ts.Expression[] =>
545
551
  (props.atomic.tags.length ? props.atomic.tags : [[]]).map((tags) =>
546
- random_custom(coalesce(props.importer))("string")(tags)(
547
- (() => {
552
+ random_custom({
553
+ accessor: coalesce(props.importer),
554
+ type: "string",
555
+ tags,
556
+ expression: (() => {
548
557
  for (const t of tags)
549
558
  if (t.kind === "format")
550
559
  return ts.factory.createCallExpression(
@@ -582,7 +591,7 @@ export namespace RandomProgrammer {
582
591
  tail ? [tail] : undefined,
583
592
  );
584
593
  })(),
585
- ),
594
+ }),
586
595
  );
587
596
 
588
597
  const decode_array = (props: {
@@ -7,47 +7,54 @@ import { ImportTransformer } from "../transformers/ImportTransformer";
7
7
  import transform from "../transform";
8
8
 
9
9
  export namespace TypiaProgrammer {
10
- export interface IProps {
10
+ export interface ILocation {
11
11
  input: string;
12
12
  output: string;
13
13
  project: string;
14
14
  }
15
15
 
16
- export const build = async (props: TypiaProgrammer.IProps): Promise<void> => {
17
- props.input = path.resolve(props.input);
18
- props.output = path.resolve(props.output);
16
+ export const build = async (
17
+ location: TypiaProgrammer.ILocation,
18
+ ): Promise<void> => {
19
+ location.input = path.resolve(location.input);
20
+ location.output = path.resolve(location.output);
19
21
 
20
- if ((await is_directory(props.input)) === false)
22
+ if ((await is_directory(location.input)) === false)
21
23
  throw new URIError(
22
24
  "Error on TypiaGenerator.generate(): input path is not a directory.",
23
25
  );
24
- else if (fs.existsSync(props.output) === false)
25
- await fs.promises.mkdir(props.output, { recursive: true });
26
- else if ((await is_directory(props.output)) === false) {
27
- const parent: string = path.join(props.output, "..");
26
+ else if (fs.existsSync(location.output) === false)
27
+ await fs.promises.mkdir(location.output, { recursive: true });
28
+ else if ((await is_directory(location.output)) === false) {
29
+ const parent: string = path.join(location.output, "..");
28
30
  if ((await is_directory(parent)) === false)
29
31
  throw new URIError(
30
32
  "Error on TypiaGenerator.generate(): output path is not a directory.",
31
33
  );
32
- await fs.promises.mkdir(props.output);
34
+ await fs.promises.mkdir(location.output);
33
35
  }
34
36
 
35
37
  // CREATE PROGRAM
36
38
  const { options: compilerOptions } = ts.parseJsonConfigFileContent(
37
- ts.readConfigFile(props.project, ts.sys.readFile).config,
39
+ ts.readConfigFile(location.project, ts.sys.readFile).config,
38
40
  {
39
41
  fileExists: ts.sys.fileExists,
40
42
  readFile: ts.sys.readFile,
41
43
  readDirectory: ts.sys.readDirectory,
42
44
  useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
43
45
  },
44
- path.dirname(props.project),
46
+ path.dirname(location.project),
45
47
  );
46
48
 
47
49
  const program: ts.Program = ts.createProgram(
48
50
  await (async () => {
49
51
  const container: string[] = [];
50
- await gather(props)(container)(props.input)(props.output);
52
+ await gather({
53
+ location,
54
+ container,
55
+ from: location.input,
56
+ to: location.output,
57
+ });
51
58
  return container;
52
59
  })(),
53
60
  compilerOptions,
@@ -61,10 +68,10 @@ export namespace TypiaProgrammer {
61
68
  .filter(
62
69
  (file) =>
63
70
  !file.isDeclarationFile &&
64
- path.resolve(file.fileName).indexOf(props.input) !== -1,
71
+ path.resolve(file.fileName).indexOf(location.input) !== -1,
65
72
  ),
66
73
  [
67
- ImportTransformer.transform(props.input)(props.output),
74
+ ImportTransformer.transform(location.input)(location.output),
68
75
  transform(
69
76
  program,
70
77
  ((compilerOptions.plugins as any[]) ?? []).find(
@@ -117,7 +124,7 @@ export namespace TypiaProgrammer {
117
124
  for (const file of result.transformed) {
118
125
  const to: string = path
119
126
  .resolve(file.fileName)
120
- .replace(props.input, props.output);
127
+ .replace(location.input, location.output);
121
128
 
122
129
  const content: string = printer.printFile(file);
123
130
  await fs.promises.writeFile(to, content, "utf8");
@@ -129,24 +136,31 @@ export namespace TypiaProgrammer {
129
136
  return stat.isDirectory();
130
137
  };
131
138
 
132
- const gather =
133
- (props: IProps) =>
134
- (container: string[]) =>
135
- (from: string) =>
136
- async (to: string) => {
137
- if (from === props.output) return;
138
- else if (fs.existsSync(to) === false) await fs.promises.mkdir(to);
139
-
140
- for (const file of await fs.promises.readdir(from)) {
141
- const next: string = path.join(from, file);
142
- const stat: fs.Stats = await fs.promises.stat(next);
143
-
144
- if (stat.isDirectory()) {
145
- await gather(props)(container)(next)(path.join(to, file));
146
- continue;
147
- } else if (is_supported_extension(file)) container.push(next);
148
- }
149
- };
139
+ const gather = async (props: {
140
+ location: ILocation;
141
+ container: string[];
142
+ from: string;
143
+ to: string;
144
+ }) => {
145
+ if (props.from === props.location.output) return;
146
+ else if (fs.existsSync(props.to) === false)
147
+ await fs.promises.mkdir(props.to);
148
+
149
+ for (const file of await fs.promises.readdir(props.from)) {
150
+ const next: string = path.join(props.from, file);
151
+ const stat: fs.Stats = await fs.promises.stat(next);
152
+
153
+ if (stat.isDirectory()) {
154
+ await gather({
155
+ location: props.location,
156
+ container: props.container,
157
+ from: next,
158
+ to: path.join(props.to, file),
159
+ });
160
+ continue;
161
+ } else if (is_supported_extension(file)) props.container.push(next);
162
+ }
163
+ };
150
164
 
151
165
  const is_supported_extension = (filename: string): boolean => {
152
166
  return (
@@ -12,6 +12,7 @@ import { CheckerProgrammer } from "./CheckerProgrammer";
12
12
  import { FeatureProgrammer } from "./FeatureProgrammer";
13
13
  import { IsProgrammer } from "./IsProgrammer";
14
14
  import { FunctionImporter } from "./helpers/FunctionImporter";
15
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
15
16
  import { OptionPredicator } from "./helpers/OptionPredicator";
16
17
  import { check_everything } from "./internal/check_everything";
17
18
  import { check_object } from "./internal/check_object";
@@ -251,9 +252,20 @@ const combine =
251
252
  (next) => {
252
253
  if (next.explore.tracable === false)
253
254
  return IsProgrammer.configure({
254
- object: validate_object(props),
255
- numeric: true,
256
- })(props.context)(props.importer).combiner(next);
255
+ options: {
256
+ object: (v) =>
257
+ validate_object({
258
+ context: props.context,
259
+ importer: props.importer,
260
+ config: props.config,
261
+ entries: v.entries,
262
+ input: v.input,
263
+ }),
264
+ numeric: true,
265
+ },
266
+ context: props.context,
267
+ importer: props.importer,
268
+ }).combiner(next);
257
269
 
258
270
  const path: string = next.explore.postfix
259
271
  ? `_path + ${next.explore.postfix}`
@@ -297,42 +309,57 @@ const validate_object = (props: {
297
309
  config: ValidateProgrammer.IConfig;
298
310
  context: ITypiaContext;
299
311
  importer: FunctionImporter;
312
+ entries: IExpressionEntry<ts.Expression>[];
313
+ input: ts.Expression;
300
314
  }) =>
301
315
  check_object({
302
- equals: props.config.equals,
303
- undefined: true,
304
- assert: false,
305
- reduce: ts.factory.createLogicalAnd,
306
- positive: ts.factory.createTrue(),
307
- superfluous: (input) =>
308
- create_report_call({
309
- path: ts.factory.createAdd(
310
- ts.factory.createIdentifier("_path"),
311
- ts.factory.createCallExpression(
312
- props.importer.use("join"),
313
- undefined,
314
- [ts.factory.createIdentifier("key")],
316
+ config: {
317
+ equals: props.config.equals,
318
+ undefined: true,
319
+ assert: false,
320
+ reduce: ts.factory.createLogicalAnd,
321
+ positive: ts.factory.createTrue(),
322
+ superfluous: (input) =>
323
+ create_report_call({
324
+ path: ts.factory.createAdd(
325
+ ts.factory.createIdentifier("_path"),
326
+ ts.factory.createCallExpression(
327
+ props.importer.use("join"),
328
+ undefined,
329
+ [ts.factory.createIdentifier("key")],
330
+ ),
315
331
  ),
332
+ expected: "undefined",
333
+ input,
334
+ }),
335
+ halt: (expr) =>
336
+ ts.factory.createLogicalOr(
337
+ ts.factory.createStrictEquality(
338
+ ts.factory.createFalse(),
339
+ ts.factory.createIdentifier("_exceptionable"),
340
+ ),
341
+ expr,
316
342
  ),
317
- expected: "undefined",
318
- input,
319
- }),
320
- halt: (expr) =>
321
- ts.factory.createLogicalOr(
322
- ts.factory.createStrictEquality(
323
- ts.factory.createFalse(),
324
- ts.factory.createIdentifier("_exceptionable"),
325
- ),
326
- expr,
327
- ),
328
- })(props.context)(props.importer);
343
+ },
344
+ context: props.context,
345
+ importer: props.importer,
346
+ entries: props.entries,
347
+ input: props.input,
348
+ });
329
349
 
330
350
  const joiner = (props: {
331
351
  config: ValidateProgrammer.IConfig;
332
352
  context: ITypiaContext;
333
353
  importer: FunctionImporter;
334
354
  }): CheckerProgrammer.IConfig.IJoiner => ({
335
- object: validate_object(props),
355
+ object: (v) =>
356
+ validate_object({
357
+ context: props.context,
358
+ importer: props.importer,
359
+ config: props.config,
360
+ entries: v.entries,
361
+ input: v.input,
362
+ }),
336
363
  array: (props) =>
337
364
  check_everything(
338
365
  ts.factory.createCallExpression(
@@ -68,7 +68,10 @@ export namespace CloneJoiner {
68
68
  ts.factory.createIfStatement(
69
69
  ts.factory.createCallExpression(
70
70
  ts.factory.createIdentifier(
71
- `RegExp(/${metadata_to_pattern(true)(entry.key)}/).test`,
71
+ `RegExp(/${metadata_to_pattern({
72
+ top: true,
73
+ metadata: entry.key,
74
+ })}/).test`,
72
75
  ),
73
76
  undefined,
74
77
  [key],