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.
Files changed (235) hide show
  1. package/lib/executable/FileSystemIdentity.d.ts +23 -0
  2. package/lib/executable/FileSystemIdentity.js +30 -0
  3. package/lib/executable/FileSystemIdentity.js.map +1 -1
  4. package/lib/executable/FileSystemIdentity.mjs +4 -0
  5. package/lib/executable/FileSystemIdentity.mjs.map +1 -1
  6. package/lib/executable/TypiaGenerateWizard.js +15 -9
  7. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  8. package/lib/executable/TypiaGenerateWizard.mjs +11 -7
  9. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  10. package/lib/http.d.ts +3 -3
  11. package/lib/http.js.map +1 -1
  12. package/lib/http.mjs.map +1 -1
  13. package/lib/internal/_ProtobufReader.d.ts +18 -3
  14. package/lib/internal/_ProtobufReader.js +39 -11
  15. package/lib/internal/_ProtobufReader.js.map +1 -1
  16. package/lib/internal/_ProtobufReader.mjs +37 -10
  17. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  18. package/lib/internal/_assertGuard.js +13 -3
  19. package/lib/internal/_assertGuard.js.map +1 -1
  20. package/lib/internal/_assertGuard.mjs +4 -2
  21. package/lib/internal/_assertGuard.mjs.map +1 -1
  22. package/lib/internal/_isFormatIdnHostname.js +5 -1
  23. package/lib/internal/_isFormatIdnHostname.js.map +1 -1
  24. package/lib/internal/_isFormatIdnHostname.mjs +1 -1
  25. package/lib/internal/_isFormatIdnHostname.mjs.map +1 -1
  26. package/lib/internal/_isFormatTime.js +19 -2
  27. package/lib/internal/_isFormatTime.js.map +1 -1
  28. package/lib/internal/_isFormatTime.mjs +9 -2
  29. package/lib/internal/_isFormatTime.mjs.map +1 -1
  30. package/lib/internal/_jsonStringifyArray.d.ts +1 -0
  31. package/lib/internal/_jsonStringifyArray.js +48 -0
  32. package/lib/internal/_jsonStringifyArray.js.map +1 -0
  33. package/lib/internal/_jsonStringifyArray.mjs +40 -0
  34. package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
  35. package/lib/internal/_jsonStringifyElement.d.ts +1 -0
  36. package/lib/internal/_jsonStringifyElement.js +23 -0
  37. package/lib/internal/_jsonStringifyElement.js.map +1 -0
  38. package/lib/internal/_jsonStringifyElement.mjs +23 -0
  39. package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
  40. package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
  41. package/lib/internal/_jsonStringifyProperty.js +31 -0
  42. package/lib/internal/_jsonStringifyProperty.js.map +1 -0
  43. package/lib/internal/_jsonStringifyProperty.mjs +31 -0
  44. package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
  45. package/lib/internal/_llmApplicationFinalize.js +1 -1
  46. package/lib/internal/_llmApplicationFinalize.js.map +1 -1
  47. package/lib/internal/_llmApplicationFinalize.mjs +1 -1
  48. package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
  49. package/lib/internal/_randomArray.js +37 -4
  50. package/lib/internal/_randomArray.js.map +1 -1
  51. package/lib/internal/_randomArray.mjs +16 -3
  52. package/lib/internal/_randomArray.mjs.map +1 -1
  53. package/lib/internal/_randomFormatByte.js +28 -2
  54. package/lib/internal/_randomFormatByte.js.map +1 -1
  55. package/lib/internal/_randomFormatByte.mjs +22 -3
  56. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  57. package/lib/internal/_randomFormatDate.d.ts +3 -6
  58. package/lib/internal/_randomFormatDate.js +2 -10
  59. package/lib/internal/_randomFormatDate.js.map +1 -1
  60. package/lib/internal/_randomFormatDate.mjs +2 -6
  61. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  62. package/lib/internal/_randomFormatDatetime.d.ts +3 -6
  63. package/lib/internal/_randomFormatDatetime.js +25 -8
  64. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  65. package/lib/internal/_randomFormatDatetime.mjs +17 -7
  66. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  67. package/lib/internal/_randomFormatDuration.js +23 -15
  68. package/lib/internal/_randomFormatDuration.js.map +1 -1
  69. package/lib/internal/_randomFormatDuration.mjs +23 -15
  70. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  71. package/lib/internal/_randomFormatHostname.d.ts +2 -2
  72. package/lib/internal/_randomFormatHostname.js +2 -2
  73. package/lib/internal/_randomFormatHostname.mjs +2 -2
  74. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  75. package/lib/internal/_randomFormatIdnHostname.js +9 -10
  76. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  77. package/lib/internal/_randomFormatIdnHostname.mjs +3 -4
  78. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  79. package/lib/internal/_randomFormatIpv4.js +31 -1
  80. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  81. package/lib/internal/_randomFormatIpv4.mjs +23 -2
  82. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  83. package/lib/internal/_randomFormatIpv6.js +57 -1
  84. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  85. package/lib/internal/_randomFormatIpv6.mjs +45 -2
  86. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  87. package/lib/internal/_randomFormatJsonPointer.js +14 -2
  88. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  89. package/lib/internal/_randomFormatJsonPointer.mjs +13 -3
  90. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  91. package/lib/internal/_randomFormatRegex.js +15 -2
  92. package/lib/internal/_randomFormatRegex.js.map +1 -1
  93. package/lib/internal/_randomFormatRegex.mjs +14 -3
  94. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  95. package/lib/internal/_randomFormatRelativeJsonPointer.js +19 -5
  96. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  97. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -6
  98. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  99. package/lib/internal/_randomFormatTime.js +38 -7
  100. package/lib/internal/_randomFormatTime.js.map +1 -1
  101. package/lib/internal/_randomFormatTime.mjs +40 -5
  102. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  103. package/lib/internal/_randomPattern.js.map +1 -1
  104. package/lib/internal/_randomPattern.mjs.map +1 -1
  105. package/lib/internal/_randomStringLength.d.ts +41 -10
  106. package/lib/internal/_randomStringLength.js +49 -13
  107. package/lib/internal/_randomStringLength.js.map +1 -1
  108. package/lib/internal/_randomStringLength.mjs +48 -13
  109. package/lib/internal/_randomStringLength.mjs.map +1 -1
  110. package/lib/internal/private/__notationRename.js.map +1 -1
  111. package/lib/internal/private/__notationRename.mjs.map +1 -1
  112. package/lib/internal/private/__randomComposition.d.ts +31 -0
  113. package/lib/internal/private/__randomComposition.js +68 -0
  114. package/lib/internal/private/__randomComposition.js.map +1 -0
  115. package/lib/internal/private/__randomComposition.mjs +71 -0
  116. package/lib/internal/private/__randomComposition.mjs.map +1 -0
  117. package/lib/internal/private/__randomEpoch.d.ts +19 -0
  118. package/lib/internal/private/__randomEpoch.js +31 -0
  119. package/lib/internal/private/__randomEpoch.js.map +1 -0
  120. package/lib/internal/private/__randomEpoch.mjs +28 -0
  121. package/lib/internal/private/__randomEpoch.mjs.map +1 -0
  122. package/lib/json.d.ts +2 -2
  123. package/lib/json.js.map +1 -1
  124. package/lib/json.mjs.map +1 -1
  125. package/lib/module.d.ts +28 -13
  126. package/lib/module.js.map +1 -1
  127. package/lib/module.mjs.map +1 -1
  128. package/lib/notations.d.ts +4 -4
  129. package/lib/notations.js.map +1 -1
  130. package/lib/notations.mjs.map +1 -1
  131. package/lib/plain.d.ts +3 -3
  132. package/lib/plain.js.map +1 -1
  133. package/lib/plain.mjs.map +1 -1
  134. package/lib/protobuf.d.ts +2 -2
  135. package/lib/protobuf.js.map +1 -1
  136. package/lib/protobuf.mjs.map +1 -1
  137. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +17 -4
  138. package/native/cmd/ttsc-typia/build.go +3 -0
  139. package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
  140. package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
  141. package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
  142. package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
  143. package/native/cmd/ttsc-typia/create_assert_error_factory_arity_test.go +309 -0
  144. package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
  145. package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
  146. package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
  147. package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
  148. package/native/cmd/ttsc-typia/local_function_named_like_typia_operation_transform_test.go +185 -0
  149. package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
  150. package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
  151. package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
  152. package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
  153. package/native/cmd/ttsc-typia/recursive_conditional_alias_name_transform_test.go +307 -0
  154. package/native/cmd/ttsc-typia/shadowed_typia_module_declaration_diagnostic_test.go +152 -0
  155. package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
  156. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +1 -3
  157. package/native/cmd/ttsc-typia/transform.go +23 -0
  158. package/native/cmd/ttsc-typia/transform_helpers_test.go +166 -25
  159. package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
  160. package/native/core/factories/FormatCheatSheet.go +2 -2
  161. package/native/core/factories/MetadataCommentTagFactory.go +26 -11
  162. package/native/core/factories/ProtobufFactory.go +6 -1
  163. package/native/core/factories/factory_utility_coverage_test.go +896 -907
  164. package/native/core/factories/internal/metadata/MetadataHelper.go +190 -58
  165. package/native/core/factories/internal/metadata/emplace_metadata_object.go +25 -0
  166. package/native/core/factories/internal/metadata/iterate_metadata_function.go +1 -1
  167. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +103 -23
  168. package/native/core/factories/internal/metadata/iterate_metadata_map.go +3 -7
  169. package/native/core/factories/internal/metadata/iterate_metadata_native.go +32 -14
  170. package/native/core/factories/internal/metadata/iterate_metadata_set.go +3 -7
  171. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +2 -2
  172. package/native/core/programmers/RandomProgrammer.go +5 -2
  173. package/native/core/programmers/compare/CompareEqualProgrammer.go +27 -13
  174. package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
  175. package/native/core/programmers/helpers/StringifyJoinder.go +129 -50
  176. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -120
  177. package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
  178. package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
  179. package/native/core/programmers/iterate/json_schema_object.go +49 -7
  180. package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
  181. package/native/core/programmers/iterate/openapi_v3_downgrader.go +34 -1
  182. package/native/core/programmers/iterate/template_runtime_pattern.go +11 -0
  183. package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
  184. package/native/core/programmers/llm/LlmApplicationProgrammer.go +9 -1
  185. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +1 -1
  186. package/native/core/schemas/metadata/MetadataCollection.go +47 -14
  187. package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
  188. package/native/core/schemas/metadata/MetadataObjectType.go +7 -18
  189. package/native/go.mod +4 -4
  190. package/native/transform/CallExpressionTransformer.go +167 -0
  191. package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
  192. package/package.json +3 -7
  193. package/src/executable/FileSystemIdentity.ts +33 -0
  194. package/src/executable/TypiaGenerateWizard.ts +18 -12
  195. package/src/http.ts +18 -4
  196. package/src/internal/_ProtobufReader.ts +40 -11
  197. package/src/internal/_assertGuard.ts +13 -2
  198. package/src/internal/_isFormatIdnHostname.ts +5 -1
  199. package/src/internal/_isFormatTime.ts +19 -2
  200. package/src/internal/_jsonStringifyArray.ts +50 -0
  201. package/src/internal/_jsonStringifyElement.ts +19 -0
  202. package/src/internal/_jsonStringifyProperty.ts +30 -0
  203. package/src/internal/_llmApplicationFinalize.ts +6 -1
  204. package/src/internal/_randomArray.ts +42 -6
  205. package/src/internal/_randomFormatByte.ts +36 -4
  206. package/src/internal/_randomFormatDate.ts +4 -20
  207. package/src/internal/_randomFormatDatetime.ts +34 -20
  208. package/src/internal/_randomFormatDuration.ts +19 -4
  209. package/src/internal/_randomFormatHostname.ts +2 -2
  210. package/src/internal/_randomFormatIdnHostname.ts +8 -9
  211. package/src/internal/_randomFormatIpv4.ts +43 -3
  212. package/src/internal/_randomFormatIpv6.ts +67 -3
  213. package/src/internal/_randomFormatJsonPointer.ts +23 -3
  214. package/src/internal/_randomFormatRegex.ts +22 -6
  215. package/src/internal/_randomFormatRelativeJsonPointer.ts +23 -10
  216. package/src/internal/_randomFormatTime.ts +50 -12
  217. package/src/internal/_randomPattern.ts +4 -1
  218. package/src/internal/_randomStringLength.ts +61 -17
  219. package/src/internal/private/__notationRename.ts +1 -4
  220. package/src/internal/private/__randomComposition.ts +74 -0
  221. package/src/internal/private/__randomEpoch.ts +34 -0
  222. package/src/json.ts +16 -4
  223. package/src/module.ts +56 -22
  224. package/src/notations.ts +16 -4
  225. package/src/plain.ts +12 -3
  226. package/src/protobuf.ts +16 -4
  227. package/native/adapter/visit.go +0 -173
  228. package/native/adapter/visit_property_chain_edges_test.go +0 -129
  229. package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
  230. package/native/core/programmers/iterate/check_union_array_like.go +0 -422
  231. package/native/core/programmers/iterate/prune_object_properties.go +0 -105
  232. package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
  233. package/native/core/programmers/iterate/stringify_native.go +0 -14
  234. package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
  235. 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
- ): (input: string) => Primitive<T>;
434
+ ): (
435
+ input: string,
436
+ errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
437
+ ) => Primitive<T>;
435
438
 
436
439
  /** @internal */
437
- export function createAssertParse<T>(): (input: string) => Primitive<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
- ): (input: unknown) => string;
510
+ ): (
511
+ input: unknown,
512
+ errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
513
+ ) => string;
505
514
 
506
515
  /** @internal */
507
- export function createAssertStringify(): (input: unknown) => string {
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
- ): (input: unknown) => T;
596
+ ): (
597
+ input: unknown,
598
+ errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
599
+ ) => T;
601
600
 
602
601
  /** @internal */
603
- export function createAssert<T>(): (input: unknown) => 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
- ): AssertionGuard<T>;
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>(): AssertionGuard<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) => T`
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) => T`
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
- ): (input: unknown) => T;
787
+ ): (
788
+ input: unknown,
789
+ errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
790
+ ) => T;
771
791
 
772
792
  /** @internal */
773
- export function createAssertEquals<T>(): (input: unknown) => 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
- ): AssertionGuard<T>;
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>(): AssertionGuard<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
- ): (input: T) => CamelCase<T>;
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
- ): (input: T) => PascalCase<T>;
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
- ): (input: T) => SnakeCase<T>;
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
- ): (input: T) => KebabCase<T>;
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
- ): (input: unknown) => Resolved<T>;
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
- ): (input: unknown) => T;
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
- ): (input: unknown) => ClassifyResult<T>;
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
- ): (input: Uint8Array) => Resolved<T>;
380
+ ): (
381
+ input: Uint8Array,
382
+ errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
383
+ ) => Resolved<T>;
381
384
 
382
385
  /** @internal */
383
- export function createAssertDecode<T>(): (input: Uint8Array) => Resolved<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
- ): (input: T) => Uint8Array;
476
+ ): (
477
+ input: T,
478
+ errorFactory?: undefined | ((props: TypeGuardError.IProps) => Error),
479
+ ) => Uint8Array;
471
480
 
472
481
  /** @internal */
473
- export function createAssertEncode<T>(): (input: T) => Uint8Array {
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
 
@@ -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
- }
@@ -1,10 +0,0 @@
1
- package helpers
2
-
3
- func Disable_function_programmer_declare(functor *FunctionProgrammer) *FunctionProgrammer {
4
- if functor == nil {
5
- return nil
6
- }
7
- disabled := *functor
8
- disabled.disableDeclare = true
9
- return &disabled
10
- }