typia 3.4.18 → 3.4.19

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 (36) hide show
  1. package/lib/metadata/Metadata.js +32 -29
  2. package/lib/metadata/Metadata.js.map +1 -1
  3. package/lib/programmers/AssertProgrammer.js +1 -1
  4. package/lib/programmers/AssertProgrammer.js.map +1 -1
  5. package/lib/programmers/CheckerProgrammer.d.ts +1 -0
  6. package/lib/programmers/CheckerProgrammer.js +147 -138
  7. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  8. package/lib/programmers/ValidateProgrammer.js +1 -1
  9. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  10. package/lib/programmers/helpers/UnionExplorer.d.ts +23 -29
  11. package/lib/programmers/helpers/UnionExplorer.js +29 -41
  12. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  13. package/lib/programmers/internal/check_array.js +4 -32
  14. package/lib/programmers/internal/check_array.js.map +1 -1
  15. package/lib/programmers/internal/check_array_length.d.ts +1 -0
  16. package/lib/programmers/internal/check_array_length.js +47 -0
  17. package/lib/programmers/internal/check_array_length.js.map +1 -0
  18. package/lib/programmers/internal/check_union_array_like.d.ts +21 -0
  19. package/lib/programmers/internal/check_union_array_like.js +83 -0
  20. package/lib/programmers/internal/check_union_array_like.js.map +1 -0
  21. package/lib/programmers/internal/check_union_tuple.d.ts +1 -0
  22. package/lib/programmers/internal/check_union_tuple.js +11 -0
  23. package/lib/programmers/internal/check_union_tuple.js.map +1 -0
  24. package/package.json +1 -1
  25. package/src/executable/typia.ts +48 -48
  26. package/src/functional/$guard.ts +35 -35
  27. package/src/metadata/Metadata.ts +10 -7
  28. package/src/programmers/AssertProgrammer.ts +1 -1
  29. package/src/programmers/CheckerProgrammer.ts +252 -200
  30. package/src/programmers/FeatureProgrammer.ts +327 -327
  31. package/src/programmers/ValidateProgrammer.ts +1 -1
  32. package/src/programmers/helpers/UnionExplorer.ts +75 -238
  33. package/src/programmers/internal/check_array.ts +3 -25
  34. package/src/programmers/internal/check_array_length.ts +45 -0
  35. package/src/programmers/internal/check_union_array_like.ts +242 -0
  36. package/src/programmers/internal/check_union_tuple.ts +33 -0
@@ -1,327 +1,327 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { MetadataCollection } from "../factories/MetadataCollection";
5
- import { StatementFactory } from "../factories/StatementFactory";
6
- import { ValueFactory } from "../factories/ValueFactory";
7
-
8
- import { IMetadataTag } from "../metadata/IMetadataTag";
9
- import { Metadata } from "../metadata/Metadata";
10
- import { MetadataObject } from "../metadata/MetadataObject";
11
-
12
- import { IProject } from "../transformers/IProject";
13
-
14
- import { CheckerProgrammer } from "./CheckerProgrammer";
15
- import { FunctionImporter } from "./helpers/FunctionImporeter";
16
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
17
- import { UnionExplorer } from "./helpers/UnionExplorer";
18
- import { feature_object_entries } from "./internal/feature_object_entries";
19
-
20
- export namespace FeatureProgrammer {
21
- /* -----------------------------------------------------------
22
- PARAMETERS
23
- ----------------------------------------------------------- */
24
- export interface IConfig {
25
- functors: string;
26
- unioners: string;
27
- path: boolean;
28
- trace: boolean;
29
- initializer: Initializer;
30
- decoder: Decoder<Metadata>;
31
- objector: IConfig.IObjector;
32
- generator?: Partial<IConfig.IGenerator>;
33
- }
34
- export namespace IConfig {
35
- export interface IObjector {
36
- checker: Decoder<Metadata>;
37
- decoder: Decoder<MetadataObject>;
38
- joiner: ObjectJoiner;
39
- unionizer: Decoder<MetadataObject[]>;
40
- failure: (
41
- value: ts.Expression,
42
- expected: string,
43
- explore?: IExplore,
44
- ) => ts.Statement;
45
- is?: (exp: ts.Expression) => ts.Expression;
46
- required?: (exp: ts.Expression) => ts.Expression;
47
- full?: (
48
- condition: ts.Expression,
49
- ) => (
50
- input: ts.Expression,
51
- expected: string,
52
- explore: IExplore,
53
- ) => ts.Expression;
54
- }
55
- export interface IGenerator {
56
- functors(col: MetadataCollection): ts.VariableStatement[];
57
- unioners(col: MetadataCollection): ts.VariableStatement[];
58
- }
59
- }
60
- export interface IExplore {
61
- tracable: boolean;
62
- source: "top" | "object";
63
- from: "top" | "array" | "object";
64
- postfix: string;
65
- start?: number;
66
- }
67
-
68
- export interface Initializer {
69
- (project: IProject, type: ts.Type): [MetadataCollection, Metadata];
70
- }
71
- export interface Decoder<T> {
72
- (
73
- input: ts.Expression,
74
- target: T,
75
- explore: IExplore,
76
- tags: IMetadataTag[],
77
- ): ts.Expression;
78
- }
79
- export interface ObjectJoiner {
80
- (entries: IExpressionEntry[], parent: MetadataObject): ts.ConciseBody;
81
- }
82
-
83
- /* -----------------------------------------------------------
84
- GENERATORS
85
- ----------------------------------------------------------- */
86
- export const generate =
87
- (
88
- project: IProject,
89
- config: IConfig,
90
- importer: FunctionImporter,
91
- addition: (
92
- collection: MetadataCollection,
93
- ) => ts.Statement[] | undefined,
94
- ) =>
95
- (type: ts.Type) => {
96
- const [collection, meta] = config.initializer(project, type);
97
-
98
- // ITERATE OVER ALL METADATA
99
- const output: ts.Expression = config.decoder(
100
- ValueFactory.INPUT(),
101
- meta,
102
- {
103
- tracable: config.path || config.trace,
104
- source: "top",
105
- from: "top",
106
- postfix: '""',
107
- },
108
- [],
109
- );
110
-
111
- // RETURNS THE OPTIMAL ARROW FUNCTION
112
- const functors: ts.VariableStatement[] =
113
- config.generator?.functors !== undefined
114
- ? config.generator.functors(collection)
115
- : generate_functors(config, importer)(collection);
116
- const unioners: ts.VariableStatement[] =
117
- config.generator?.unioners !== undefined
118
- ? config.generator.unioners(collection)
119
- : generate_unioners(config)(collection);
120
- const added: ts.Statement[] | undefined = addition(collection);
121
-
122
- return ts.factory.createArrowFunction(
123
- undefined,
124
- undefined,
125
- PARAMETERS(config)(ValueFactory.INPUT()),
126
- undefined,
127
- undefined,
128
- ts.factory.createBlock(
129
- [
130
- ...(added || []),
131
- ...functors,
132
- ...unioners,
133
- ts.factory.createReturnStatement(output),
134
- ],
135
- true,
136
- ),
137
- );
138
- };
139
-
140
- export const generate_functors =
141
- (config: IConfig, importer: FunctionImporter) =>
142
- (collection: MetadataCollection) =>
143
- collection
144
- .objects()
145
- .map((obj, i) =>
146
- StatementFactory.constant(
147
- `${config.functors}${i}`,
148
- generate_object(config, importer)(obj),
149
- ),
150
- );
151
-
152
- export const generate_unioners =
153
- (config: IConfig) => (collection: MetadataCollection) =>
154
- collection
155
- .unions()
156
- .map((union, i) =>
157
- StatementFactory.constant(
158
- `${config.unioners}${i}`,
159
- generate_union(config)(union),
160
- ),
161
- );
162
-
163
- function generate_object(config: IConfig, importer: FunctionImporter) {
164
- if (config.path === true) importer.use("join");
165
- return (obj: MetadataObject) =>
166
- ts.factory.createArrowFunction(
167
- undefined,
168
- undefined,
169
- PARAMETERS(config)(ValueFactory.INPUT()),
170
- undefined,
171
- undefined,
172
- config.objector.joiner(
173
- feature_object_entries(config)(obj)(
174
- ts.factory.createIdentifier("input"),
175
- ),
176
- obj,
177
- ),
178
- );
179
- }
180
-
181
- function generate_union(config: IConfig) {
182
- const explorer = UnionExplorer.object(config);
183
- const input = ValueFactory.INPUT();
184
-
185
- return (meta: MetadataObject[]) =>
186
- ts.factory.createArrowFunction(
187
- undefined,
188
- undefined,
189
- PARAMETERS(config)(ValueFactory.INPUT()),
190
- undefined,
191
- undefined,
192
- explorer(
193
- input,
194
- meta,
195
- {
196
- tracable: config.path || config.trace,
197
- source: "object",
198
- from: "object",
199
- postfix: "",
200
- },
201
- [],
202
- ),
203
- );
204
- }
205
-
206
- /* -----------------------------------------------------------
207
- DECODERS
208
- ----------------------------------------------------------- */
209
- export function decode_array(
210
- config: Pick<IConfig, "trace" | "path" | "decoder">,
211
- importer: FunctionImporter,
212
- combiner: (
213
- input: ts.Expression,
214
- arrow: ts.ArrowFunction,
215
- tags: IMetadataTag[],
216
- ) => ts.Expression,
217
- ) {
218
- const rand: string = importer.increment().toString();
219
- const tail =
220
- config.path || config.trace
221
- ? [IdentifierFactory.parameter("index" + rand)]
222
- : [];
223
-
224
- return (
225
- input: ts.Expression,
226
- meta: Metadata,
227
- explore: IExplore,
228
- tags: IMetadataTag[],
229
- ) => {
230
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
231
- undefined,
232
- undefined,
233
- [IdentifierFactory.parameter("elem"), ...tail],
234
- undefined,
235
- undefined,
236
- config.decoder(
237
- ValueFactory.INPUT("elem"),
238
- meta,
239
- {
240
- tracable: explore.tracable,
241
- source: explore.source,
242
- from: "array",
243
- postfix: INDEX_SYMBOL(explore.start ?? null)(
244
- explore.postfix,
245
- )(rand),
246
- },
247
- tags,
248
- ),
249
- );
250
- return combiner(input, arrow, tags);
251
- };
252
- }
253
-
254
- export const decode_object =
255
- (config: Pick<IConfig, "trace" | "path" | "functors">) =>
256
- (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
257
- ts.factory.createCallExpression(
258
- ts.factory.createIdentifier(`${config.functors}${obj.index}`),
259
- undefined,
260
- get_object_arguments(config)(explore)(input),
261
- );
262
-
263
- export const get_object_arguments =
264
- (config: Pick<IConfig, "path" | "trace">) =>
265
- (explore: FeatureProgrammer.IExplore) => {
266
- const tail: ts.Expression[] =
267
- config.path === false && config.trace === false
268
- ? []
269
- : config.path === true && config.trace === true
270
- ? [
271
- ts.factory.createIdentifier(
272
- explore.postfix
273
- ? `path + ${explore.postfix}`
274
- : "path",
275
- ),
276
- explore.source === "object"
277
- ? ts.factory.createIdentifier(
278
- `${explore.tracable} && exceptionable`,
279
- )
280
- : explore.tracable
281
- ? ts.factory.createTrue()
282
- : ts.factory.createFalse(),
283
- ]
284
- : config.path === true
285
- ? [
286
- ts.factory.createIdentifier(
287
- explore.postfix
288
- ? `path + ${explore.postfix}`
289
- : "path",
290
- ),
291
- ]
292
- : [
293
- explore.source === "object"
294
- ? ts.factory.createIdentifier(
295
- `${explore.tracable} && exceptionable`,
296
- )
297
- : explore.tracable
298
- ? ts.factory.createTrue()
299
- : ts.factory.createFalse(),
300
- ];
301
- return (input: ts.Expression) => [input, ...tail];
302
- };
303
- }
304
-
305
- const INDEX_SYMBOL =
306
- (start: number | null) => (prev: string) => (rand: string) => {
307
- const tail: string =
308
- start !== null
309
- ? `"[" + (${start} + index${rand}) + "]"`
310
- : `"[" + index${rand} + "]"`;
311
- if (prev === "") return tail;
312
- else if (prev[prev.length - 1] === `"`)
313
- return prev.substring(0, prev.length - 1) + tail.substring(1);
314
- return prev + ` + ${tail}`;
315
- };
316
- const PARAMETERS = (
317
- props: Pick<CheckerProgrammer.IConfig, "path" | "trace">,
318
- ) => {
319
- const tail: ts.ParameterDeclaration[] = [];
320
- if (props.path) tail.push(IdentifierFactory.parameter("path"));
321
- if (props.trace) tail.push(IdentifierFactory.parameter("exceptionable"));
322
-
323
- return (input: ts.Identifier) => [
324
- IdentifierFactory.parameter(input),
325
- ...tail,
326
- ];
327
- };
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { MetadataCollection } from "../factories/MetadataCollection";
5
+ import { StatementFactory } from "../factories/StatementFactory";
6
+ import { ValueFactory } from "../factories/ValueFactory";
7
+
8
+ import { IMetadataTag } from "../metadata/IMetadataTag";
9
+ import { Metadata } from "../metadata/Metadata";
10
+ import { MetadataObject } from "../metadata/MetadataObject";
11
+
12
+ import { IProject } from "../transformers/IProject";
13
+
14
+ import { CheckerProgrammer } from "./CheckerProgrammer";
15
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
16
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
17
+ import { UnionExplorer } from "./helpers/UnionExplorer";
18
+ import { feature_object_entries } from "./internal/feature_object_entries";
19
+
20
+ export namespace FeatureProgrammer {
21
+ /* -----------------------------------------------------------
22
+ PARAMETERS
23
+ ----------------------------------------------------------- */
24
+ export interface IConfig {
25
+ functors: string;
26
+ unioners: string;
27
+ path: boolean;
28
+ trace: boolean;
29
+ initializer: Initializer;
30
+ decoder: Decoder<Metadata>;
31
+ objector: IConfig.IObjector;
32
+ generator?: Partial<IConfig.IGenerator>;
33
+ }
34
+ export namespace IConfig {
35
+ export interface IObjector {
36
+ checker: Decoder<Metadata>;
37
+ decoder: Decoder<MetadataObject>;
38
+ joiner: ObjectJoiner;
39
+ unionizer: Decoder<MetadataObject[]>;
40
+ failure: (
41
+ value: ts.Expression,
42
+ expected: string,
43
+ explore?: IExplore,
44
+ ) => ts.Statement;
45
+ is?: (exp: ts.Expression) => ts.Expression;
46
+ required?: (exp: ts.Expression) => ts.Expression;
47
+ full?: (
48
+ condition: ts.Expression,
49
+ ) => (
50
+ input: ts.Expression,
51
+ expected: string,
52
+ explore: IExplore,
53
+ ) => ts.Expression;
54
+ }
55
+ export interface IGenerator {
56
+ functors(col: MetadataCollection): ts.VariableStatement[];
57
+ unioners(col: MetadataCollection): ts.VariableStatement[];
58
+ }
59
+ }
60
+ export interface IExplore {
61
+ tracable: boolean;
62
+ source: "top" | "object";
63
+ from: "top" | "array" | "object";
64
+ postfix: string;
65
+ start?: number;
66
+ }
67
+
68
+ export interface Initializer {
69
+ (project: IProject, type: ts.Type): [MetadataCollection, Metadata];
70
+ }
71
+ export interface Decoder<T> {
72
+ (
73
+ input: ts.Expression,
74
+ target: T,
75
+ explore: IExplore,
76
+ tags: IMetadataTag[],
77
+ ): ts.Expression;
78
+ }
79
+ export interface ObjectJoiner {
80
+ (entries: IExpressionEntry[], parent: MetadataObject): ts.ConciseBody;
81
+ }
82
+
83
+ /* -----------------------------------------------------------
84
+ GENERATORS
85
+ ----------------------------------------------------------- */
86
+ export const generate =
87
+ (
88
+ project: IProject,
89
+ config: IConfig,
90
+ importer: FunctionImporter,
91
+ addition: (
92
+ collection: MetadataCollection,
93
+ ) => ts.Statement[] | undefined,
94
+ ) =>
95
+ (type: ts.Type) => {
96
+ const [collection, meta] = config.initializer(project, type);
97
+
98
+ // ITERATE OVER ALL METADATA
99
+ const output: ts.Expression = config.decoder(
100
+ ValueFactory.INPUT(),
101
+ meta,
102
+ {
103
+ tracable: config.path || config.trace,
104
+ source: "top",
105
+ from: "top",
106
+ postfix: '""',
107
+ },
108
+ [],
109
+ );
110
+
111
+ // RETURNS THE OPTIMAL ARROW FUNCTION
112
+ const functors: ts.VariableStatement[] =
113
+ config.generator?.functors !== undefined
114
+ ? config.generator.functors(collection)
115
+ : generate_functors(config, importer)(collection);
116
+ const unioners: ts.VariableStatement[] =
117
+ config.generator?.unioners !== undefined
118
+ ? config.generator.unioners(collection)
119
+ : generate_unioners(config)(collection);
120
+ const added: ts.Statement[] | undefined = addition(collection);
121
+
122
+ return ts.factory.createArrowFunction(
123
+ undefined,
124
+ undefined,
125
+ PARAMETERS(config)(ValueFactory.INPUT()),
126
+ undefined,
127
+ undefined,
128
+ ts.factory.createBlock(
129
+ [
130
+ ...(added || []),
131
+ ...functors,
132
+ ...unioners,
133
+ ts.factory.createReturnStatement(output),
134
+ ],
135
+ true,
136
+ ),
137
+ );
138
+ };
139
+
140
+ export const generate_functors =
141
+ (config: IConfig, importer: FunctionImporter) =>
142
+ (collection: MetadataCollection) =>
143
+ collection
144
+ .objects()
145
+ .map((obj, i) =>
146
+ StatementFactory.constant(
147
+ `${config.functors}${i}`,
148
+ generate_object(config, importer)(obj),
149
+ ),
150
+ );
151
+
152
+ export const generate_unioners =
153
+ (config: IConfig) => (collection: MetadataCollection) =>
154
+ collection
155
+ .unions()
156
+ .map((union, i) =>
157
+ StatementFactory.constant(
158
+ `${config.unioners}${i}`,
159
+ generate_union(config)(union),
160
+ ),
161
+ );
162
+
163
+ function generate_object(config: IConfig, importer: FunctionImporter) {
164
+ if (config.path === true) importer.use("join");
165
+ return (obj: MetadataObject) =>
166
+ ts.factory.createArrowFunction(
167
+ undefined,
168
+ undefined,
169
+ PARAMETERS(config)(ValueFactory.INPUT()),
170
+ undefined,
171
+ undefined,
172
+ config.objector.joiner(
173
+ feature_object_entries(config)(obj)(
174
+ ts.factory.createIdentifier("input"),
175
+ ),
176
+ obj,
177
+ ),
178
+ );
179
+ }
180
+
181
+ function generate_union(config: IConfig) {
182
+ const explorer = UnionExplorer.object(config);
183
+ const input = ValueFactory.INPUT();
184
+
185
+ return (meta: MetadataObject[]) =>
186
+ ts.factory.createArrowFunction(
187
+ undefined,
188
+ undefined,
189
+ PARAMETERS(config)(ValueFactory.INPUT()),
190
+ undefined,
191
+ undefined,
192
+ explorer(
193
+ input,
194
+ meta,
195
+ {
196
+ tracable: config.path || config.trace,
197
+ source: "object",
198
+ from: "object",
199
+ postfix: "",
200
+ },
201
+ [],
202
+ ),
203
+ );
204
+ }
205
+
206
+ /* -----------------------------------------------------------
207
+ DECODERS
208
+ ----------------------------------------------------------- */
209
+ export function decode_array(
210
+ config: Pick<IConfig, "trace" | "path" | "decoder">,
211
+ importer: FunctionImporter,
212
+ combiner: (
213
+ input: ts.Expression,
214
+ arrow: ts.ArrowFunction,
215
+ tags: IMetadataTag[],
216
+ ) => ts.Expression,
217
+ ) {
218
+ const rand: string = importer.increment().toString();
219
+ const tail =
220
+ config.path || config.trace
221
+ ? [IdentifierFactory.parameter("index" + rand)]
222
+ : [];
223
+
224
+ return (
225
+ input: ts.Expression,
226
+ meta: Metadata,
227
+ explore: IExplore,
228
+ tags: IMetadataTag[],
229
+ ) => {
230
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
231
+ undefined,
232
+ undefined,
233
+ [IdentifierFactory.parameter("elem"), ...tail],
234
+ undefined,
235
+ undefined,
236
+ config.decoder(
237
+ ValueFactory.INPUT("elem"),
238
+ meta,
239
+ {
240
+ tracable: explore.tracable,
241
+ source: explore.source,
242
+ from: "array",
243
+ postfix: INDEX_SYMBOL(explore.start ?? null)(
244
+ explore.postfix,
245
+ )(rand),
246
+ },
247
+ tags,
248
+ ),
249
+ );
250
+ return combiner(input, arrow, tags);
251
+ };
252
+ }
253
+
254
+ export const decode_object =
255
+ (config: Pick<IConfig, "trace" | "path" | "functors">) =>
256
+ (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
257
+ ts.factory.createCallExpression(
258
+ ts.factory.createIdentifier(`${config.functors}${obj.index}`),
259
+ undefined,
260
+ get_object_arguments(config)(explore)(input),
261
+ );
262
+
263
+ export const get_object_arguments =
264
+ (config: Pick<IConfig, "path" | "trace">) =>
265
+ (explore: FeatureProgrammer.IExplore) => {
266
+ const tail: ts.Expression[] =
267
+ config.path === false && config.trace === false
268
+ ? []
269
+ : config.path === true && config.trace === true
270
+ ? [
271
+ ts.factory.createIdentifier(
272
+ explore.postfix
273
+ ? `path + ${explore.postfix}`
274
+ : "path",
275
+ ),
276
+ explore.source === "object"
277
+ ? ts.factory.createIdentifier(
278
+ `${explore.tracable} && exceptionable`,
279
+ )
280
+ : explore.tracable
281
+ ? ts.factory.createTrue()
282
+ : ts.factory.createFalse(),
283
+ ]
284
+ : config.path === true
285
+ ? [
286
+ ts.factory.createIdentifier(
287
+ explore.postfix
288
+ ? `path + ${explore.postfix}`
289
+ : "path",
290
+ ),
291
+ ]
292
+ : [
293
+ explore.source === "object"
294
+ ? ts.factory.createIdentifier(
295
+ `${explore.tracable} && exceptionable`,
296
+ )
297
+ : explore.tracable
298
+ ? ts.factory.createTrue()
299
+ : ts.factory.createFalse(),
300
+ ];
301
+ return (input: ts.Expression) => [input, ...tail];
302
+ };
303
+ }
304
+
305
+ const INDEX_SYMBOL =
306
+ (start: number | null) => (prev: string) => (rand: string) => {
307
+ const tail: string =
308
+ start !== null
309
+ ? `"[" + (${start} + index${rand}) + "]"`
310
+ : `"[" + index${rand} + "]"`;
311
+ if (prev === "") return tail;
312
+ else if (prev[prev.length - 1] === `"`)
313
+ return prev.substring(0, prev.length - 1) + tail.substring(1);
314
+ return prev + ` + ${tail}`;
315
+ };
316
+ const PARAMETERS = (
317
+ props: Pick<CheckerProgrammer.IConfig, "path" | "trace">,
318
+ ) => {
319
+ const tail: ts.ParameterDeclaration[] = [];
320
+ if (props.path) tail.push(IdentifierFactory.parameter("path"));
321
+ if (props.trace) tail.push(IdentifierFactory.parameter("exceptionable"));
322
+
323
+ return (input: ts.Identifier) => [
324
+ IdentifierFactory.parameter(input),
325
+ ...tail,
326
+ ];
327
+ };
@@ -88,7 +88,7 @@ const combine =
88
88
  (equals: boolean) =>
89
89
  (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner =>
90
90
  (explore: CheckerProgrammer.IExplore) => {
91
- if (explore.tracable === false && explore.from !== "top")
91
+ if (explore.tracable === false)
92
92
  return IsProgrammer.CONFIG({
93
93
  object: validate_object(equals)(importer),
94
94
  numeric: true,