typia 13.1.19 → 13.3.0
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.
- package/lib/executable/FileSystemIdentity.d.ts +23 -0
- package/lib/executable/FileSystemIdentity.js +30 -0
- package/lib/executable/FileSystemIdentity.js.map +1 -1
- package/lib/executable/FileSystemIdentity.mjs +4 -0
- package/lib/executable/FileSystemIdentity.mjs.map +1 -1
- package/lib/executable/TypiaGenerateWizard.js +15 -9
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaGenerateWizard.mjs +11 -7
- package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
- package/lib/http.d.ts +3 -3
- package/lib/http.js.map +1 -1
- package/lib/http.mjs.map +1 -1
- package/lib/internal/_ProtobufReader.d.ts +18 -3
- package/lib/internal/_ProtobufReader.js +39 -11
- package/lib/internal/_ProtobufReader.js.map +1 -1
- package/lib/internal/_ProtobufReader.mjs +37 -10
- package/lib/internal/_ProtobufReader.mjs.map +1 -1
- package/lib/internal/_assertGuard.js +13 -3
- package/lib/internal/_assertGuard.js.map +1 -1
- package/lib/internal/_assertGuard.mjs +4 -2
- package/lib/internal/_assertGuard.mjs.map +1 -1
- package/lib/internal/_isFormatIdnHostname.js +5 -1
- package/lib/internal/_isFormatIdnHostname.js.map +1 -1
- package/lib/internal/_isFormatIdnHostname.mjs +1 -1
- package/lib/internal/_isFormatIdnHostname.mjs.map +1 -1
- package/lib/internal/_isFormatTime.js +19 -2
- package/lib/internal/_isFormatTime.js.map +1 -1
- package/lib/internal/_isFormatTime.mjs +9 -2
- package/lib/internal/_isFormatTime.mjs.map +1 -1
- package/lib/internal/_jsonStringifyArray.d.ts +1 -0
- package/lib/internal/_jsonStringifyArray.js +48 -0
- package/lib/internal/_jsonStringifyArray.js.map +1 -0
- package/lib/internal/_jsonStringifyArray.mjs +40 -0
- package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
- package/lib/internal/_jsonStringifyElement.d.ts +1 -0
- package/lib/internal/_jsonStringifyElement.js +23 -0
- package/lib/internal/_jsonStringifyElement.js.map +1 -0
- package/lib/internal/_jsonStringifyElement.mjs +23 -0
- package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
- package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
- package/lib/internal/_jsonStringifyProperty.js +31 -0
- package/lib/internal/_jsonStringifyProperty.js.map +1 -0
- package/lib/internal/_jsonStringifyProperty.mjs +31 -0
- package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
- package/lib/internal/_llmApplicationFinalize.js +1 -1
- package/lib/internal/_llmApplicationFinalize.js.map +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
- package/lib/internal/_randomArray.js +37 -4
- package/lib/internal/_randomArray.js.map +1 -1
- package/lib/internal/_randomArray.mjs +16 -3
- package/lib/internal/_randomArray.mjs.map +1 -1
- package/lib/internal/_randomFormatByte.js +28 -2
- package/lib/internal/_randomFormatByte.js.map +1 -1
- package/lib/internal/_randomFormatByte.mjs +22 -3
- package/lib/internal/_randomFormatByte.mjs.map +1 -1
- package/lib/internal/_randomFormatDate.d.ts +3 -6
- package/lib/internal/_randomFormatDate.js +2 -10
- package/lib/internal/_randomFormatDate.js.map +1 -1
- package/lib/internal/_randomFormatDate.mjs +2 -6
- package/lib/internal/_randomFormatDate.mjs.map +1 -1
- package/lib/internal/_randomFormatDatetime.d.ts +3 -6
- package/lib/internal/_randomFormatDatetime.js +25 -8
- package/lib/internal/_randomFormatDatetime.js.map +1 -1
- package/lib/internal/_randomFormatDatetime.mjs +17 -7
- package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
- package/lib/internal/_randomFormatDuration.js +23 -15
- package/lib/internal/_randomFormatDuration.js.map +1 -1
- package/lib/internal/_randomFormatDuration.mjs +23 -15
- package/lib/internal/_randomFormatDuration.mjs.map +1 -1
- package/lib/internal/_randomFormatHostname.d.ts +2 -2
- package/lib/internal/_randomFormatHostname.js +2 -2
- package/lib/internal/_randomFormatHostname.mjs +2 -2
- package/lib/internal/_randomFormatHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.js +9 -10
- package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.mjs +3 -4
- package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv4.js +31 -1
- package/lib/internal/_randomFormatIpv4.js.map +1 -1
- package/lib/internal/_randomFormatIpv4.mjs +23 -2
- package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv6.js +57 -1
- package/lib/internal/_randomFormatIpv6.js.map +1 -1
- package/lib/internal/_randomFormatIpv6.mjs +45 -2
- package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.js +14 -2
- package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.mjs +13 -3
- package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatRegex.js +15 -2
- package/lib/internal/_randomFormatRegex.js.map +1 -1
- package/lib/internal/_randomFormatRegex.mjs +14 -3
- package/lib/internal/_randomFormatRegex.mjs.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.js +19 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -6
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatTime.js +38 -7
- package/lib/internal/_randomFormatTime.js.map +1 -1
- package/lib/internal/_randomFormatTime.mjs +40 -5
- package/lib/internal/_randomFormatTime.mjs.map +1 -1
- package/lib/internal/_randomPattern.js.map +1 -1
- package/lib/internal/_randomPattern.mjs.map +1 -1
- package/lib/internal/_randomStringLength.d.ts +41 -10
- package/lib/internal/_randomStringLength.js +49 -13
- package/lib/internal/_randomStringLength.js.map +1 -1
- package/lib/internal/_randomStringLength.mjs +48 -13
- package/lib/internal/_randomStringLength.mjs.map +1 -1
- package/lib/internal/private/__notationRename.js.map +1 -1
- package/lib/internal/private/__notationRename.mjs.map +1 -1
- package/lib/internal/private/__randomComposition.d.ts +31 -0
- package/lib/internal/private/__randomComposition.js +68 -0
- package/lib/internal/private/__randomComposition.js.map +1 -0
- package/lib/internal/private/__randomComposition.mjs +71 -0
- package/lib/internal/private/__randomComposition.mjs.map +1 -0
- package/lib/internal/private/__randomEpoch.d.ts +19 -0
- package/lib/internal/private/__randomEpoch.js +31 -0
- package/lib/internal/private/__randomEpoch.js.map +1 -0
- package/lib/internal/private/__randomEpoch.mjs +28 -0
- package/lib/internal/private/__randomEpoch.mjs.map +1 -0
- package/lib/json.d.ts +2 -2
- package/lib/json.js.map +1 -1
- package/lib/json.mjs.map +1 -1
- package/lib/module.d.ts +28 -13
- package/lib/module.js.map +1 -1
- package/lib/module.mjs.map +1 -1
- package/lib/notations.d.ts +4 -4
- package/lib/notations.js.map +1 -1
- package/lib/notations.mjs.map +1 -1
- package/lib/plain.d.ts +3 -3
- package/lib/plain.js.map +1 -1
- package/lib/plain.mjs.map +1 -1
- package/lib/protobuf.d.ts +2 -2
- package/lib/protobuf.js.map +1 -1
- package/lib/protobuf.mjs.map +1 -1
- package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +17 -4
- package/native/cmd/ttsc-typia/build.go +3 -0
- package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
- package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
- package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
- package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
- package/native/cmd/ttsc-typia/create_assert_error_factory_arity_test.go +309 -0
- package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
- package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
- package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
- package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
- package/native/cmd/ttsc-typia/local_function_named_like_typia_operation_transform_test.go +185 -0
- package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
- package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
- package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
- package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
- package/native/cmd/ttsc-typia/recursive_conditional_alias_name_transform_test.go +307 -0
- package/native/cmd/ttsc-typia/shadowed_typia_module_declaration_diagnostic_test.go +152 -0
- package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
- package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +1 -3
- package/native/cmd/ttsc-typia/transform.go +23 -0
- package/native/cmd/ttsc-typia/transform_helpers_test.go +166 -25
- package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
- package/native/core/factories/FormatCheatSheet.go +2 -2
- package/native/core/factories/MetadataCommentTagFactory.go +26 -11
- package/native/core/factories/ProtobufFactory.go +6 -1
- package/native/core/factories/factory_utility_coverage_test.go +896 -907
- package/native/core/factories/internal/metadata/MetadataHelper.go +190 -58
- package/native/core/factories/internal/metadata/emplace_metadata_object.go +25 -0
- package/native/core/factories/internal/metadata/iterate_metadata_function.go +1 -1
- package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +103 -23
- package/native/core/factories/internal/metadata/iterate_metadata_map.go +3 -7
- package/native/core/factories/internal/metadata/iterate_metadata_native.go +32 -14
- package/native/core/factories/internal/metadata/iterate_metadata_set.go +3 -7
- package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +2 -2
- package/native/core/programmers/RandomProgrammer.go +5 -2
- package/native/core/programmers/compare/CompareEqualProgrammer.go +27 -13
- package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
- package/native/core/programmers/helpers/StringifyJoinder.go +129 -50
- package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -120
- package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
- package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
- package/native/core/programmers/iterate/json_schema_object.go +49 -7
- package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader.go +34 -1
- package/native/core/programmers/iterate/template_runtime_pattern.go +11 -0
- package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
- package/native/core/programmers/llm/LlmApplicationProgrammer.go +9 -1
- package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +1 -1
- package/native/core/schemas/metadata/MetadataCollection.go +47 -14
- package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
- package/native/core/schemas/metadata/MetadataObjectType.go +7 -18
- package/native/go.mod +4 -4
- package/native/transform/CallExpressionTransformer.go +167 -0
- package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
- package/package.json +3 -7
- package/src/executable/FileSystemIdentity.ts +33 -0
- package/src/executable/TypiaGenerateWizard.ts +18 -12
- package/src/http.ts +18 -4
- package/src/internal/_ProtobufReader.ts +40 -11
- package/src/internal/_assertGuard.ts +13 -2
- package/src/internal/_isFormatIdnHostname.ts +5 -1
- package/src/internal/_isFormatTime.ts +19 -2
- package/src/internal/_jsonStringifyArray.ts +50 -0
- package/src/internal/_jsonStringifyElement.ts +19 -0
- package/src/internal/_jsonStringifyProperty.ts +30 -0
- package/src/internal/_llmApplicationFinalize.ts +6 -1
- package/src/internal/_randomArray.ts +42 -6
- package/src/internal/_randomFormatByte.ts +36 -4
- package/src/internal/_randomFormatDate.ts +4 -20
- package/src/internal/_randomFormatDatetime.ts +34 -20
- package/src/internal/_randomFormatDuration.ts +19 -4
- package/src/internal/_randomFormatHostname.ts +2 -2
- package/src/internal/_randomFormatIdnHostname.ts +8 -9
- package/src/internal/_randomFormatIpv4.ts +43 -3
- package/src/internal/_randomFormatIpv6.ts +67 -3
- package/src/internal/_randomFormatJsonPointer.ts +23 -3
- package/src/internal/_randomFormatRegex.ts +22 -6
- package/src/internal/_randomFormatRelativeJsonPointer.ts +23 -10
- package/src/internal/_randomFormatTime.ts +50 -12
- package/src/internal/_randomPattern.ts +4 -1
- package/src/internal/_randomStringLength.ts +61 -17
- package/src/internal/private/__notationRename.ts +1 -4
- package/src/internal/private/__randomComposition.ts +74 -0
- package/src/internal/private/__randomEpoch.ts +34 -0
- package/src/json.ts +16 -4
- package/src/module.ts +56 -22
- package/src/notations.ts +16 -4
- package/src/plain.ts +12 -3
- package/src/protobuf.ts +16 -4
- package/native/adapter/visit.go +0 -173
- package/native/adapter/visit_property_chain_edges_test.go +0 -129
- package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
- package/native/core/programmers/iterate/check_union_array_like.go +0 -422
- package/native/core/programmers/iterate/prune_object_properties.go +0 -105
- package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
- package/native/core/programmers/iterate/stringify_native.go +0 -14
- package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
- package/native/core/schemas/metadata/MetadataApplication.go +0 -41
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { _randomInteger } from "../_randomInteger";
|
|
2
|
+
|
|
3
|
+
export interface __IEpochProps {
|
|
4
|
+
minimum?: number;
|
|
5
|
+
maximum?: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Draws an epoch millisecond inside the requested bounds.
|
|
10
|
+
*
|
|
11
|
+
* Shared by the `date` and `date-time` generators, which had the same bound
|
|
12
|
+
* expression written twice: `props?.maximum ?? props?.minimum === undefined`
|
|
13
|
+
* parses as `props?.maximum ?? (props?.minimum === undefined)` because `??`
|
|
14
|
+
* binds looser than `===`, so any supplied `maximum` made the condition truthy
|
|
15
|
+
* and was replaced by `Date.now()`, while `maximum: 0` fell through to
|
|
16
|
+
* `undefined + one year` and produced `NaN` (issue #2287). Keeping the
|
|
17
|
+
* resolution in one place is what stops the two copies from drifting again.
|
|
18
|
+
*
|
|
19
|
+
* With no bound at all the window ends at the present instant; with only a
|
|
20
|
+
* lower bound it spans one year from there.
|
|
21
|
+
*/
|
|
22
|
+
export const __randomEpoch = (props?: __IEpochProps): number => {
|
|
23
|
+
const minimum: number = props?.minimum ?? 0;
|
|
24
|
+
const maximum: number =
|
|
25
|
+
props?.maximum ??
|
|
26
|
+
(props?.minimum === undefined ? Date.now() : props.minimum + YEAR);
|
|
27
|
+
return _randomInteger({
|
|
28
|
+
type: "integer",
|
|
29
|
+
minimum,
|
|
30
|
+
maximum,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const YEAR = 365 * 24 * 60 * 60 * 1_000;
|
package/src/json.ts
CHANGED
|
@@ -431,10 +431,16 @@ export function createAssertParse(
|
|
|
431
431
|
*/
|
|
432
432
|
export function createAssertParse<T>(
|
|
433
433
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
434
|
-
): (
|
|
434
|
+
): (
|
|
435
|
+
input: string,
|
|
436
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
437
|
+
) => Primitive<T>;
|
|
435
438
|
|
|
436
439
|
/** @internal */
|
|
437
|
-
export function createAssertParse<T>(): (
|
|
440
|
+
export function createAssertParse<T>(): (
|
|
441
|
+
input: string,
|
|
442
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
443
|
+
) => Primitive<T> {
|
|
438
444
|
NoTransformConfigurationError("json.createAssertParse");
|
|
439
445
|
}
|
|
440
446
|
|
|
@@ -501,10 +507,16 @@ export function createAssertStringify(
|
|
|
501
507
|
*/
|
|
502
508
|
export function createAssertStringify<T>(
|
|
503
509
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
504
|
-
): (
|
|
510
|
+
): (
|
|
511
|
+
input: unknown,
|
|
512
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
513
|
+
) => string;
|
|
505
514
|
|
|
506
515
|
/** @internal */
|
|
507
|
-
export function createAssertStringify(): (
|
|
516
|
+
export function createAssertStringify(): (
|
|
517
|
+
input: unknown,
|
|
518
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
519
|
+
) => string {
|
|
508
520
|
NoTransformConfigurationError("json.createAssertStringify");
|
|
509
521
|
}
|
|
510
522
|
|
package/src/module.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
-
import {
|
|
3
|
-
AssertionGuard,
|
|
4
|
-
IRandomGenerator,
|
|
5
|
-
IValidation,
|
|
6
|
-
Resolved,
|
|
7
|
-
} from "@typia/interface";
|
|
2
|
+
import { IRandomGenerator, IValidation, Resolved } from "@typia/interface";
|
|
8
3
|
|
|
9
4
|
import { TypeGuardError } from "./TypeGuardError";
|
|
10
5
|
import { NoTransformConfigurationError } from "./transformers/NoTransformConfigurationError";
|
|
@@ -577,7 +572,7 @@ export function random(): never {
|
|
|
577
572
|
* @template T Target type to validate against
|
|
578
573
|
* @param errorFactory Custom error factory receiving
|
|
579
574
|
* {@link TypeGuardError.IProps}
|
|
580
|
-
* @returns Reusable assert function `(input: unknown) => T`
|
|
575
|
+
* @returns Reusable assert function `(input: unknown, errorFactory?) => T`
|
|
581
576
|
* @danger You must configure the generic argument `T`
|
|
582
577
|
*/
|
|
583
578
|
export function createAssert(
|
|
@@ -593,14 +588,21 @@ export function createAssert(
|
|
|
593
588
|
* @template T Target type to validate against
|
|
594
589
|
* @param errorFactory Custom error factory receiving
|
|
595
590
|
* {@link TypeGuardError.IProps}
|
|
596
|
-
* @returns Reusable assert function `(input: unknown) => T
|
|
591
|
+
* @returns Reusable assert function `(input: unknown, errorFactory?) => T`,
|
|
592
|
+
* whose own `errorFactory` overrides this one for that single call
|
|
597
593
|
*/
|
|
598
594
|
export function createAssert<T>(
|
|
599
595
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
600
|
-
): (
|
|
596
|
+
): (
|
|
597
|
+
input: unknown,
|
|
598
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
599
|
+
) => T;
|
|
601
600
|
|
|
602
601
|
/** @internal */
|
|
603
|
-
export function createAssert<T>(): (
|
|
602
|
+
export function createAssert<T>(): (
|
|
603
|
+
input: unknown,
|
|
604
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
605
|
+
) => T {
|
|
604
606
|
NoTransformConfigurationError("createAssert");
|
|
605
607
|
}
|
|
606
608
|
|
|
@@ -611,6 +613,9 @@ export function createAssert<T>(): (input: unknown) => T {
|
|
|
611
613
|
*
|
|
612
614
|
* TypeScript requirement: You must declare the variable type explicitly. `const
|
|
613
615
|
* fn: AssertionGuard<T> = createAssertGuard<T>()` — otherwise compile error.
|
|
616
|
+
* That annotation is one parameter wide, so it also hides the call-time
|
|
617
|
+
* `errorFactory`; annotate with `(input: unknown, errorFactory?: (props:
|
|
618
|
+
* TypeGuardError.IProps) => Error) => asserts input is T` when you need it.
|
|
614
619
|
*
|
|
615
620
|
* @template T Target type to validate against
|
|
616
621
|
* @param errorFactory Custom error factory receiving
|
|
@@ -629,18 +634,28 @@ export function createAssertGuard(
|
|
|
629
634
|
*
|
|
630
635
|
* TypeScript requirement: You must declare the variable type explicitly. `const
|
|
631
636
|
* fn: AssertionGuard<T> = createAssertGuard<T>()` — otherwise compile error.
|
|
637
|
+
* That annotation is one parameter wide, so it also hides the call-time
|
|
638
|
+
* `errorFactory`; annotate with `(input: unknown, errorFactory?: (props:
|
|
639
|
+
* TypeGuardError.IProps) => Error) => asserts input is T` when you need it.
|
|
632
640
|
*
|
|
633
641
|
* @template T Target type to validate against
|
|
634
642
|
* @param errorFactory Custom error factory receiving
|
|
635
643
|
* {@link TypeGuardError.IProps}
|
|
636
|
-
* @returns Reusable assertion guard function
|
|
644
|
+
* @returns Reusable assertion guard function, whose own `errorFactory`
|
|
645
|
+
* overrides this one for that single call
|
|
637
646
|
*/
|
|
638
647
|
export function createAssertGuard<T>(
|
|
639
648
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
640
|
-
):
|
|
649
|
+
): (
|
|
650
|
+
input: unknown,
|
|
651
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
652
|
+
) => asserts input is T;
|
|
641
653
|
|
|
642
654
|
/** @internal */
|
|
643
|
-
export function createAssertGuard<T>():
|
|
655
|
+
export function createAssertGuard<T>(): (
|
|
656
|
+
input: unknown,
|
|
657
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
658
|
+
) => asserts input is T {
|
|
644
659
|
NoTransformConfigurationError("createAssertGuard");
|
|
645
660
|
}
|
|
646
661
|
|
|
@@ -747,7 +762,8 @@ export function createValidate(): ((input: unknown) => IValidation) &
|
|
|
747
762
|
* @template T Target type for exact match
|
|
748
763
|
* @param errorFactory Custom error factory receiving
|
|
749
764
|
* {@link TypeGuardError.IProps}
|
|
750
|
-
* @returns Reusable assertEquals function `(input: unknown) =>
|
|
765
|
+
* @returns Reusable assertEquals function `(input: unknown, errorFactory?) =>
|
|
766
|
+
* T`
|
|
751
767
|
* @danger You must configure the generic argument `T`
|
|
752
768
|
*/
|
|
753
769
|
export function createAssertEquals(
|
|
@@ -763,14 +779,21 @@ export function createAssertEquals(
|
|
|
763
779
|
* @template T Target type for exact match
|
|
764
780
|
* @param errorFactory Custom error factory receiving
|
|
765
781
|
* {@link TypeGuardError.IProps}
|
|
766
|
-
* @returns Reusable assertEquals function `(input: unknown) =>
|
|
782
|
+
* @returns Reusable assertEquals function `(input: unknown, errorFactory?) =>
|
|
783
|
+
* T`, whose own `errorFactory` overrides this one for that single call
|
|
767
784
|
*/
|
|
768
785
|
export function createAssertEquals<T>(
|
|
769
786
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
770
|
-
): (
|
|
787
|
+
): (
|
|
788
|
+
input: unknown,
|
|
789
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
790
|
+
) => T;
|
|
771
791
|
|
|
772
792
|
/** @internal */
|
|
773
|
-
export function createAssertEquals<T>(): (
|
|
793
|
+
export function createAssertEquals<T>(): (
|
|
794
|
+
input: unknown,
|
|
795
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
796
|
+
) => T {
|
|
774
797
|
NoTransformConfigurationError("createAssertEquals");
|
|
775
798
|
}
|
|
776
799
|
|
|
@@ -781,7 +804,9 @@ export function createAssertEquals<T>(): (input: unknown) => T {
|
|
|
781
804
|
*
|
|
782
805
|
* TypeScript requirement: You must declare the variable type explicitly. `const
|
|
783
806
|
* fn: AssertionGuard<T> = createAssertGuardEquals<T>()` — otherwise compile
|
|
784
|
-
* error.
|
|
807
|
+
* error. That annotation is one parameter wide, so it also hides the call-time
|
|
808
|
+
* `errorFactory`; annotate with `(input: unknown, errorFactory?: (props:
|
|
809
|
+
* TypeGuardError.IProps) => Error) => asserts input is T` when you need it.
|
|
785
810
|
*
|
|
786
811
|
* @template T Target type for exact match
|
|
787
812
|
* @param errorFactory Custom error factory receiving
|
|
@@ -800,19 +825,28 @@ export function createAssertGuardEquals(
|
|
|
800
825
|
*
|
|
801
826
|
* TypeScript requirement: You must declare the variable type explicitly. `const
|
|
802
827
|
* fn: AssertionGuard<T> = createAssertGuardEquals<T>()` — otherwise compile
|
|
803
|
-
* error.
|
|
828
|
+
* error. That annotation is one parameter wide, so it also hides the call-time
|
|
829
|
+
* `errorFactory`; annotate with `(input: unknown, errorFactory?: (props:
|
|
830
|
+
* TypeGuardError.IProps) => Error) => asserts input is T` when you need it.
|
|
804
831
|
*
|
|
805
832
|
* @template T Target type for exact match
|
|
806
833
|
* @param errorFactory Custom error factory receiving
|
|
807
834
|
* {@link TypeGuardError.IProps}
|
|
808
|
-
* @returns Reusable assertion guard function
|
|
835
|
+
* @returns Reusable assertion guard function, whose own `errorFactory`
|
|
836
|
+
* overrides this one for that single call
|
|
809
837
|
*/
|
|
810
838
|
export function createAssertGuardEquals<T>(
|
|
811
839
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
812
|
-
):
|
|
840
|
+
): (
|
|
841
|
+
input: unknown,
|
|
842
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
843
|
+
) => asserts input is T;
|
|
813
844
|
|
|
814
845
|
/** @internal */
|
|
815
|
-
export function createAssertGuardEquals<T>():
|
|
846
|
+
export function createAssertGuardEquals<T>(): (
|
|
847
|
+
input: unknown,
|
|
848
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
849
|
+
) => asserts input is T {
|
|
816
850
|
NoTransformConfigurationError("createAssertGuardEquals");
|
|
817
851
|
}
|
|
818
852
|
|
package/src/notations.ts
CHANGED
|
@@ -530,7 +530,10 @@ export function createAssertCamel(
|
|
|
530
530
|
*/
|
|
531
531
|
export function createAssertCamel<T>(
|
|
532
532
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
533
|
-
): (
|
|
533
|
+
): (
|
|
534
|
+
input: T,
|
|
535
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
536
|
+
) => CamelCase<T>;
|
|
534
537
|
|
|
535
538
|
/** @internal */
|
|
536
539
|
export function createAssertCamel(): never {
|
|
@@ -618,7 +621,10 @@ export function createAssertPascal(
|
|
|
618
621
|
*/
|
|
619
622
|
export function createAssertPascal<T>(
|
|
620
623
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
621
|
-
): (
|
|
624
|
+
): (
|
|
625
|
+
input: T,
|
|
626
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
627
|
+
) => PascalCase<T>;
|
|
622
628
|
|
|
623
629
|
/** @internal */
|
|
624
630
|
export function createAssertPascal(): never {
|
|
@@ -706,7 +712,10 @@ export function createAssertSnake(
|
|
|
706
712
|
*/
|
|
707
713
|
export function createAssertSnake<T>(
|
|
708
714
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
709
|
-
): (
|
|
715
|
+
): (
|
|
716
|
+
input: T,
|
|
717
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
718
|
+
) => SnakeCase<T>;
|
|
710
719
|
|
|
711
720
|
/** @internal */
|
|
712
721
|
export function createAssertSnake(): never {
|
|
@@ -794,7 +803,10 @@ export function createAssertKebab(
|
|
|
794
803
|
*/
|
|
795
804
|
export function createAssertKebab<T>(
|
|
796
805
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
797
|
-
): (
|
|
806
|
+
): (
|
|
807
|
+
input: T,
|
|
808
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
809
|
+
) => KebabCase<T>;
|
|
798
810
|
|
|
799
811
|
/** @internal */
|
|
800
812
|
export function createAssertKebab(): never {
|
package/src/plain.ts
CHANGED
|
@@ -383,7 +383,10 @@ export function createAssertClone(
|
|
|
383
383
|
*/
|
|
384
384
|
export function createAssertClone<T>(
|
|
385
385
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
386
|
-
): (
|
|
386
|
+
): (
|
|
387
|
+
input: unknown,
|
|
388
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
389
|
+
) => Resolved<T>;
|
|
387
390
|
|
|
388
391
|
/** @internal */
|
|
389
392
|
export function createAssertClone(): never {
|
|
@@ -471,7 +474,10 @@ export function createAssertPrune(
|
|
|
471
474
|
*/
|
|
472
475
|
export function createAssertPrune<T extends object>(
|
|
473
476
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
474
|
-
): (
|
|
477
|
+
): (
|
|
478
|
+
input: unknown,
|
|
479
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
480
|
+
) => T;
|
|
475
481
|
|
|
476
482
|
/** @internal */
|
|
477
483
|
export function createAssertPrune(): never {
|
|
@@ -563,7 +569,10 @@ export function createAssertClassify(
|
|
|
563
569
|
*/
|
|
564
570
|
export function createAssertClassify<T>(
|
|
565
571
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
566
|
-
): (
|
|
572
|
+
): (
|
|
573
|
+
input: unknown,
|
|
574
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
575
|
+
) => ClassifyResult<T>;
|
|
567
576
|
|
|
568
577
|
/** @internal */
|
|
569
578
|
export function createAssertClassify(): never {
|
package/src/protobuf.ts
CHANGED
|
@@ -377,10 +377,16 @@ export function createAssertDecode(
|
|
|
377
377
|
*/
|
|
378
378
|
export function createAssertDecode<T>(
|
|
379
379
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
380
|
-
): (
|
|
380
|
+
): (
|
|
381
|
+
input: Uint8Array,
|
|
382
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
383
|
+
) => Resolved<T>;
|
|
381
384
|
|
|
382
385
|
/** @internal */
|
|
383
|
-
export function createAssertDecode<T>(): (
|
|
386
|
+
export function createAssertDecode<T>(): (
|
|
387
|
+
input: Uint8Array,
|
|
388
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
389
|
+
) => Resolved<T> {
|
|
384
390
|
NoTransformConfigurationError("protobuf.createAssertDecode");
|
|
385
391
|
}
|
|
386
392
|
|
|
@@ -467,10 +473,16 @@ export function createAssertEncode(
|
|
|
467
473
|
*/
|
|
468
474
|
export function createAssertEncode<T>(
|
|
469
475
|
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
470
|
-
): (
|
|
476
|
+
): (
|
|
477
|
+
input: T,
|
|
478
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
479
|
+
) => Uint8Array;
|
|
471
480
|
|
|
472
481
|
/** @internal */
|
|
473
|
-
export function createAssertEncode<T>(): (
|
|
482
|
+
export function createAssertEncode<T>(): (
|
|
483
|
+
input: T,
|
|
484
|
+
errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
|
|
485
|
+
) => Uint8Array {
|
|
474
486
|
NoTransformConfigurationError("protobuf.createAssertEncode");
|
|
475
487
|
}
|
|
476
488
|
|
package/native/adapter/visit.go
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
package adapter
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"path/filepath"
|
|
5
|
-
"strings"
|
|
6
|
-
|
|
7
|
-
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
8
|
-
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
type CallSite struct {
|
|
12
|
-
File *shimast.SourceFile
|
|
13
|
-
FilePath string
|
|
14
|
-
Module string
|
|
15
|
-
Method string
|
|
16
|
-
Call *shimast.CallExpression
|
|
17
|
-
RootName string
|
|
18
|
-
Namespaces []string
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
func CollectCallSites(files []*shimast.SourceFile, checker *shimchecker.Checker) []CallSite {
|
|
22
|
-
sites := []CallSite{}
|
|
23
|
-
for _, file := range files {
|
|
24
|
-
if file == nil || file.IsDeclarationFile {
|
|
25
|
-
continue
|
|
26
|
-
}
|
|
27
|
-
file.ForEachChild(func(node *shimast.Node) bool {
|
|
28
|
-
visitCallSite(file, checker, node, &sites)
|
|
29
|
-
return false
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
return sites
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
func visitCallSite(file *shimast.SourceFile, checker *shimchecker.Checker, node *shimast.Node, sites *[]CallSite) {
|
|
36
|
-
if node == nil {
|
|
37
|
-
return
|
|
38
|
-
}
|
|
39
|
-
if node.Kind == shimast.KindCallExpression {
|
|
40
|
-
if site, ok := tryCallSite(file, checker, node); ok {
|
|
41
|
-
*sites = append(*sites, site)
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
node.ForEachChild(func(child *shimast.Node) bool {
|
|
45
|
-
visitCallSite(file, checker, child, sites)
|
|
46
|
-
return false
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
func tryCallSite(file *shimast.SourceFile, checker *shimchecker.Checker, node *shimast.Node) (CallSite, bool) {
|
|
51
|
-
if checker == nil {
|
|
52
|
-
return CallSite{}, false
|
|
53
|
-
}
|
|
54
|
-
if node.Kind != shimast.KindCallExpression {
|
|
55
|
-
return CallSite{}, false
|
|
56
|
-
}
|
|
57
|
-
call := node.AsCallExpression()
|
|
58
|
-
if call == nil {
|
|
59
|
-
return CallSite{}, false
|
|
60
|
-
}
|
|
61
|
-
signature := checker.GetResolvedSignature(node)
|
|
62
|
-
if signature == nil {
|
|
63
|
-
return CallSite{}, false
|
|
64
|
-
}
|
|
65
|
-
declaration := signature.Declaration()
|
|
66
|
-
if declaration == nil {
|
|
67
|
-
return CallSite{}, false
|
|
68
|
-
}
|
|
69
|
-
sourceFile := shimast.GetSourceFileOfNode(declaration)
|
|
70
|
-
if sourceFile == nil {
|
|
71
|
-
return CallSite{}, false
|
|
72
|
-
}
|
|
73
|
-
module, ok := matchTypiaModule(sourceFile.FileName())
|
|
74
|
-
if !ok {
|
|
75
|
-
return CallSite{}, false
|
|
76
|
-
}
|
|
77
|
-
method := callSiteMethodName(checker, declaration, call)
|
|
78
|
-
if method == "" {
|
|
79
|
-
return CallSite{}, false
|
|
80
|
-
}
|
|
81
|
-
root, namespaces, ok := extractRootAndNamespaces(call, method)
|
|
82
|
-
if !ok {
|
|
83
|
-
return CallSite{}, false
|
|
84
|
-
}
|
|
85
|
-
return CallSite{
|
|
86
|
-
File: file,
|
|
87
|
-
FilePath: file.FileName(),
|
|
88
|
-
Module: module,
|
|
89
|
-
Method: method,
|
|
90
|
-
Call: call,
|
|
91
|
-
RootName: root,
|
|
92
|
-
Namespaces: namespaces,
|
|
93
|
-
}, true
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
func matchTypiaModule(location string) (string, bool) {
|
|
97
|
-
location = filepath.ToSlash(location)
|
|
98
|
-
for _, suffix := range []string{".d.ts", ".ts"} {
|
|
99
|
-
for _, middle := range []string{"typia/lib/", "typia/src/", "packages/typia/src/"} {
|
|
100
|
-
index := strings.LastIndex(location, middle)
|
|
101
|
-
if index < 0 {
|
|
102
|
-
continue
|
|
103
|
-
}
|
|
104
|
-
name := location[index+len(middle):]
|
|
105
|
-
if !strings.HasSuffix(name, suffix) {
|
|
106
|
-
continue
|
|
107
|
-
}
|
|
108
|
-
name = strings.TrimSuffix(name, suffix)
|
|
109
|
-
if strings.Contains(name, "/") {
|
|
110
|
-
continue
|
|
111
|
-
}
|
|
112
|
-
return name, true
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return "", false
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
func callSiteMethodName(checker *shimchecker.Checker, declaration *shimast.Node, call *shimast.CallExpression) string {
|
|
119
|
-
if name := declaration.Name(); name != nil {
|
|
120
|
-
if checker != nil {
|
|
121
|
-
if symbol := checker.GetSymbolAtLocation(name); symbol != nil && symbol.Name != "" {
|
|
122
|
-
return symbol.Name
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
if name.Kind == shimast.KindIdentifier {
|
|
126
|
-
if id := name.AsIdentifier(); id != nil {
|
|
127
|
-
return id.Text
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if call.Expression != nil && call.Expression.Kind == shimast.KindPropertyAccessExpression {
|
|
132
|
-
if property := call.Expression.AsPropertyAccessExpression(); property != nil {
|
|
133
|
-
if name := property.Name(); name != nil && name.Kind == shimast.KindIdentifier {
|
|
134
|
-
if id := name.AsIdentifier(); id != nil {
|
|
135
|
-
return id.Text
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return ""
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
func extractRootAndNamespaces(call *shimast.CallExpression, method string) (string, []string, bool) {
|
|
144
|
-
expression := call.Expression
|
|
145
|
-
segments := []string{}
|
|
146
|
-
for expression != nil && expression.Kind == shimast.KindPropertyAccessExpression {
|
|
147
|
-
property := expression.AsPropertyAccessExpression()
|
|
148
|
-
if property == nil {
|
|
149
|
-
break
|
|
150
|
-
}
|
|
151
|
-
name := property.Name()
|
|
152
|
-
if name == nil || name.Kind != shimast.KindIdentifier {
|
|
153
|
-
return "", nil, false
|
|
154
|
-
}
|
|
155
|
-
id := name.AsIdentifier()
|
|
156
|
-
if id == nil || id.Text == "" {
|
|
157
|
-
return "", nil, false
|
|
158
|
-
}
|
|
159
|
-
segments = append([]string{id.Text}, segments...)
|
|
160
|
-
expression = property.Expression
|
|
161
|
-
}
|
|
162
|
-
if expression == nil || expression.Kind != shimast.KindIdentifier {
|
|
163
|
-
return "", nil, false
|
|
164
|
-
}
|
|
165
|
-
root := expression.AsIdentifier()
|
|
166
|
-
if root == nil || root.Text == "" || len(segments) == 0 {
|
|
167
|
-
return "", nil, false
|
|
168
|
-
}
|
|
169
|
-
if segments[len(segments)-1] != method {
|
|
170
|
-
return "", nil, false
|
|
171
|
-
}
|
|
172
|
-
return root.Text, segments[:len(segments)-1], true
|
|
173
|
-
}
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
//go:build typia_native_internal
|
|
2
|
-
// +build typia_native_internal
|
|
3
|
-
|
|
4
|
-
package adapter
|
|
5
|
-
|
|
6
|
-
import (
|
|
7
|
-
"path/filepath"
|
|
8
|
-
"testing"
|
|
9
|
-
|
|
10
|
-
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
11
|
-
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
12
|
-
shimcore "github.com/microsoft/typescript-go/shim/core"
|
|
13
|
-
shimparser "github.com/microsoft/typescript-go/shim/parser"
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
// TestVisitPropertyChainEdges verifies call-site property-chain parsing.
|
|
17
|
-
//
|
|
18
|
-
// Call-site discovery peels a TypeScript expression like
|
|
19
|
-
// `typia.json.stringify()` into a root import name, namespace chain, and method.
|
|
20
|
-
// Malformed or mismatched chains must be rejected without producing a site.
|
|
21
|
-
//
|
|
22
|
-
// 1. Build a nested property-access call expression.
|
|
23
|
-
// 2. Extract the root name, namespace, and terminal method.
|
|
24
|
-
// 3. Reject a method mismatch, a non-property call, and an empty member name.
|
|
25
|
-
// 4. Verify nil nodes do not append call sites.
|
|
26
|
-
func TestVisitPropertyChainEdges(t *testing.T) {
|
|
27
|
-
factory := shimast.NewNodeFactory(shimast.NodeFactoryHooks{})
|
|
28
|
-
namespace := factory.NewPropertyAccessExpression(
|
|
29
|
-
factory.NewIdentifier("typia"),
|
|
30
|
-
nil,
|
|
31
|
-
factory.NewIdentifier("json"),
|
|
32
|
-
shimast.NodeFlagsNone,
|
|
33
|
-
)
|
|
34
|
-
method := factory.NewPropertyAccessExpression(
|
|
35
|
-
namespace,
|
|
36
|
-
nil,
|
|
37
|
-
factory.NewIdentifier("stringify"),
|
|
38
|
-
shimast.NodeFlagsNone,
|
|
39
|
-
)
|
|
40
|
-
call := factory.NewCallExpression(method, nil, nil, factory.NewNodeList(nil), shimast.NodeFlagsNone).AsCallExpression()
|
|
41
|
-
|
|
42
|
-
root, namespaces, ok := extractRootAndNamespaces(call, "stringify")
|
|
43
|
-
if !ok || root != "typia" || len(namespaces) != 1 || namespaces[0] != "json" {
|
|
44
|
-
t.Fatalf("unexpected property-chain extraction: root=%q namespaces=%#v ok=%v", root, namespaces, ok)
|
|
45
|
-
}
|
|
46
|
-
if _, _, ok := extractRootAndNamespaces(call, "is"); ok {
|
|
47
|
-
t.Fatal("method mismatch should reject the call chain")
|
|
48
|
-
}
|
|
49
|
-
statement := factory.NewExpressionStatement(factory.NewIdentifier("noop"))
|
|
50
|
-
if method := callSiteMethodName(nil, statement, call); method != "stringify" {
|
|
51
|
-
t.Fatalf("property-access method fallback mismatch: %q", method)
|
|
52
|
-
}
|
|
53
|
-
declaration := factory.NewFunctionDeclaration(
|
|
54
|
-
nil,
|
|
55
|
-
nil,
|
|
56
|
-
factory.NewIdentifier("declared"),
|
|
57
|
-
nil,
|
|
58
|
-
nil,
|
|
59
|
-
nil,
|
|
60
|
-
nil,
|
|
61
|
-
nil,
|
|
62
|
-
)
|
|
63
|
-
if method := callSiteMethodName(nil, declaration, call); method != "declared" {
|
|
64
|
-
t.Fatalf("declaration-name fallback mismatch: %q", method)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
plain := factory.NewCallExpression(
|
|
68
|
-
factory.NewIdentifier("plain"),
|
|
69
|
-
nil,
|
|
70
|
-
nil,
|
|
71
|
-
factory.NewNodeList(nil),
|
|
72
|
-
shimast.NodeFlagsNone,
|
|
73
|
-
).AsCallExpression()
|
|
74
|
-
if _, _, ok := extractRootAndNamespaces(plain, "plain"); ok {
|
|
75
|
-
t.Fatal("plain calls without a property chain should be rejected")
|
|
76
|
-
}
|
|
77
|
-
literal := factory.NewCallExpression(
|
|
78
|
-
factory.NewStringLiteral("call", shimast.TokenFlagsNone),
|
|
79
|
-
nil,
|
|
80
|
-
nil,
|
|
81
|
-
factory.NewNodeList(nil),
|
|
82
|
-
shimast.NodeFlagsNone,
|
|
83
|
-
).AsCallExpression()
|
|
84
|
-
if _, _, ok := extractRootAndNamespaces(literal, "call"); ok {
|
|
85
|
-
t.Fatal("non-identifier root expressions should be rejected")
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
emptyMember := factory.NewPropertyAccessExpression(
|
|
89
|
-
factory.NewIdentifier("typia"),
|
|
90
|
-
nil,
|
|
91
|
-
factory.NewIdentifier(""),
|
|
92
|
-
shimast.NodeFlagsNone,
|
|
93
|
-
)
|
|
94
|
-
emptyCall := factory.NewCallExpression(emptyMember, nil, nil, factory.NewNodeList(nil), shimast.NodeFlagsNone).AsCallExpression()
|
|
95
|
-
if _, _, ok := extractRootAndNamespaces(emptyCall, ""); ok {
|
|
96
|
-
t.Fatal("empty property name should be rejected")
|
|
97
|
-
}
|
|
98
|
-
stringMember := factory.NewPropertyAccessExpression(
|
|
99
|
-
factory.NewIdentifier("typia"),
|
|
100
|
-
nil,
|
|
101
|
-
factory.NewStringLiteral("is", shimast.TokenFlagsNone),
|
|
102
|
-
shimast.NodeFlagsNone,
|
|
103
|
-
)
|
|
104
|
-
stringMemberCall := factory.NewCallExpression(stringMember, nil, nil, factory.NewNodeList(nil), shimast.NodeFlagsNone).AsCallExpression()
|
|
105
|
-
if _, _, ok := extractRootAndNamespaces(stringMemberCall, "is"); ok {
|
|
106
|
-
t.Fatal("non-identifier property names should be rejected")
|
|
107
|
-
}
|
|
108
|
-
sites := []CallSite{}
|
|
109
|
-
visitCallSite(nil, nil, nil, &sites)
|
|
110
|
-
if len(sites) != 0 {
|
|
111
|
-
t.Fatalf("nil node should not append call sites: %#v", sites)
|
|
112
|
-
}
|
|
113
|
-
file := shimparser.ParseSourceFile(
|
|
114
|
-
shimast.SourceFileParseOptions{FileName: filepath.ToSlash(filepath.Join(t.TempDir(), "visit.ts"))},
|
|
115
|
-
`typia.is(input);`,
|
|
116
|
-
shimcore.ScriptKindTS,
|
|
117
|
-
)
|
|
118
|
-
declFile := *file
|
|
119
|
-
declFile.IsDeclarationFile = true
|
|
120
|
-
if sites := CollectCallSites([]*shimast.SourceFile{nil, &declFile}, nil); len(sites) != 0 {
|
|
121
|
-
t.Fatalf("nil and declaration files should not produce call sites: %#v", sites)
|
|
122
|
-
}
|
|
123
|
-
if _, ok := tryCallSite(file, nil, call.AsNode()); ok {
|
|
124
|
-
t.Fatal("nil checker should reject call-site probing")
|
|
125
|
-
}
|
|
126
|
-
if _, ok := tryCallSite(file, &shimchecker.Checker{}, statement); ok {
|
|
127
|
-
t.Fatal("non-call nodes should reject call-site probing")
|
|
128
|
-
}
|
|
129
|
-
}
|