@tsonic/frontend 0.0.11 → 0.0.13

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 (125) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ir/converters/expressions/access.d.ts.map +1 -1
  3. package/dist/ir/converters/expressions/access.js +61 -1
  4. package/dist/ir/converters/expressions/access.js.map +1 -1
  5. package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
  6. package/dist/ir/converters/expressions/calls.js +293 -24
  7. package/dist/ir/converters/expressions/calls.js.map +1 -1
  8. package/dist/ir/converters/expressions/helpers.js +4 -4
  9. package/dist/ir/converters/expressions/helpers.js.map +1 -1
  10. package/dist/ir/converters/expressions/literals.d.ts +14 -0
  11. package/dist/ir/converters/expressions/literals.d.ts.map +1 -1
  12. package/dist/ir/converters/expressions/literals.js +22 -2
  13. package/dist/ir/converters/expressions/literals.js.map +1 -1
  14. package/dist/ir/converters/expressions/numeric-recovery.test.js +3 -2
  15. package/dist/ir/converters/expressions/numeric-recovery.test.js.map +1 -1
  16. package/dist/ir/converters/statements/helpers.d.ts.map +1 -1
  17. package/dist/ir/converters/statements/helpers.js +10 -4
  18. package/dist/ir/converters/statements/helpers.js.map +1 -1
  19. package/dist/ir/expression-converter.d.ts.map +1 -1
  20. package/dist/ir/expression-converter.js +38 -5
  21. package/dist/ir/expression-converter.js.map +1 -1
  22. package/dist/ir/index.d.ts +1 -1
  23. package/dist/ir/index.d.ts.map +1 -1
  24. package/dist/ir/index.js +1 -1
  25. package/dist/ir/index.js.map +1 -1
  26. package/dist/ir/statement-converter.d.ts.map +1 -1
  27. package/dist/ir/statement-converter.js +12 -0
  28. package/dist/ir/statement-converter.js.map +1 -1
  29. package/dist/ir/type-converter/inference.d.ts.map +1 -1
  30. package/dist/ir/type-converter/inference.js +50 -7
  31. package/dist/ir/type-converter/inference.js.map +1 -1
  32. package/dist/ir/type-converter/primitives.d.ts +26 -4
  33. package/dist/ir/type-converter/primitives.d.ts.map +1 -1
  34. package/dist/ir/type-converter/primitives.js +36 -2
  35. package/dist/ir/type-converter/primitives.js.map +1 -1
  36. package/dist/ir/type-converter/references.d.ts.map +1 -1
  37. package/dist/ir/type-converter/references.js +324 -11
  38. package/dist/ir/type-converter/references.js.map +1 -1
  39. package/dist/ir/type-converter/utility-types.d.ts +93 -0
  40. package/dist/ir/type-converter/utility-types.d.ts.map +1 -0
  41. package/dist/ir/type-converter/utility-types.js +528 -0
  42. package/dist/ir/type-converter/utility-types.js.map +1 -0
  43. package/dist/ir/type-converter/utility-types.test.d.ts +10 -0
  44. package/dist/ir/type-converter/utility-types.test.d.ts.map +1 -0
  45. package/dist/ir/type-converter/utility-types.test.js +1030 -0
  46. package/dist/ir/type-converter/utility-types.test.js.map +1 -0
  47. package/dist/ir/types/expressions.d.ts +40 -2
  48. package/dist/ir/types/expressions.d.ts.map +1 -1
  49. package/dist/ir/types/helpers.d.ts +3 -1
  50. package/dist/ir/types/helpers.d.ts.map +1 -1
  51. package/dist/ir/types/index.d.ts +2 -1
  52. package/dist/ir/types/index.d.ts.map +1 -1
  53. package/dist/ir/types/index.js +2 -0
  54. package/dist/ir/types/index.js.map +1 -1
  55. package/dist/ir/types/ir-types.d.ts +69 -11
  56. package/dist/ir/types/ir-types.d.ts.map +1 -1
  57. package/dist/ir/types/numeric-helpers.d.ts +46 -0
  58. package/dist/ir/types/numeric-helpers.d.ts.map +1 -0
  59. package/dist/ir/types/numeric-helpers.js +105 -0
  60. package/dist/ir/types/numeric-helpers.js.map +1 -0
  61. package/dist/ir/types/statements.d.ts +11 -1
  62. package/dist/ir/types/statements.d.ts.map +1 -1
  63. package/dist/ir/types.d.ts +2 -2
  64. package/dist/ir/types.d.ts.map +1 -1
  65. package/dist/ir/types.js +3 -1
  66. package/dist/ir/types.js.map +1 -1
  67. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts +32 -0
  68. package/dist/ir/validation/anonymous-type-lowering-pass.d.ts.map +1 -0
  69. package/dist/ir/validation/anonymous-type-lowering-pass.js +854 -0
  70. package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -0
  71. package/dist/ir/validation/attribute-collection-pass.d.ts +37 -0
  72. package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -0
  73. package/dist/ir/validation/attribute-collection-pass.js +282 -0
  74. package/dist/ir/validation/attribute-collection-pass.js.map +1 -0
  75. package/dist/ir/validation/attribute-collection-pass.test.d.ts +5 -0
  76. package/dist/ir/validation/attribute-collection-pass.test.d.ts.map +1 -0
  77. package/dist/ir/validation/attribute-collection-pass.test.js +215 -0
  78. package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -0
  79. package/dist/ir/validation/index.d.ts +3 -0
  80. package/dist/ir/validation/index.d.ts.map +1 -1
  81. package/dist/ir/validation/index.js +3 -0
  82. package/dist/ir/validation/index.js.map +1 -1
  83. package/dist/ir/validation/numeric-coercion-pass.d.ts +77 -0
  84. package/dist/ir/validation/numeric-coercion-pass.d.ts.map +1 -0
  85. package/dist/ir/validation/numeric-coercion-pass.js +686 -0
  86. package/dist/ir/validation/numeric-coercion-pass.js.map +1 -0
  87. package/dist/ir/validation/numeric-invariants.test.js +130 -14
  88. package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
  89. package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
  90. package/dist/ir/validation/numeric-proof-pass.js +68 -108
  91. package/dist/ir/validation/numeric-proof-pass.js.map +1 -1
  92. package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
  93. package/dist/ir/validation/soundness-gate.js +23 -12
  94. package/dist/ir/validation/soundness-gate.js.map +1 -1
  95. package/dist/ir/validation/yield-lowering-pass.test.js +21 -12
  96. package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
  97. package/dist/program/bindings.d.ts +20 -9
  98. package/dist/program/bindings.d.ts.map +1 -1
  99. package/dist/program/bindings.js +98 -36
  100. package/dist/program/bindings.js.map +1 -1
  101. package/dist/program/bindings.test.js +3 -3
  102. package/dist/program/dependency-graph.d.ts.map +1 -1
  103. package/dist/program/dependency-graph.js +31 -5
  104. package/dist/program/dependency-graph.js.map +1 -1
  105. package/dist/resolver/import-resolution.d.ts +4 -0
  106. package/dist/resolver/import-resolution.d.ts.map +1 -1
  107. package/dist/resolver/import-resolution.js +18 -7
  108. package/dist/resolver/import-resolution.js.map +1 -1
  109. package/dist/resolver.test.js +2 -2
  110. package/dist/resolver.test.js.map +1 -1
  111. package/dist/types/diagnostic.d.ts +1 -1
  112. package/dist/types/diagnostic.d.ts.map +1 -1
  113. package/dist/types/diagnostic.js.map +1 -1
  114. package/dist/validation/generics.d.ts.map +1 -1
  115. package/dist/validation/generics.js +133 -1
  116. package/dist/validation/generics.js.map +1 -1
  117. package/dist/validation/static-safety.js +13 -0
  118. package/dist/validation/static-safety.js.map +1 -1
  119. package/dist/validation/unsupported-utility-types.d.ts +10 -8
  120. package/dist/validation/unsupported-utility-types.d.ts.map +1 -1
  121. package/dist/validation/unsupported-utility-types.js +12 -19
  122. package/dist/validation/unsupported-utility-types.js.map +1 -1
  123. package/dist/validator.test.js +133 -28
  124. package/dist/validator.test.js.map +1 -1
  125. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  * Diagnostic types for Tsonic compiler
3
3
  */
4
4
  export type DiagnosticSeverity = "error" | "warning" | "info";
5
- export type DiagnosticCode = "TSN1001" | "TSN1002" | "TSN1003" | "TSN1004" | "TSN1005" | "TSN1006" | "TSN2001" | "TSN2002" | "TSN2003" | "TSN3001" | "TSN3002" | "TSN3011" | "TSN4001" | "TSN4002" | "TSN5001" | "TSN5002" | "TSN6001" | "TSN7101" | "TSN7102" | "TSN7103" | "TSN7104" | "TSN7105" | "TSN7201" | "TSN7202" | "TSN7203" | "TSN7204" | "TSN7301" | "TSN7401" | "TSN7403" | "TSN7405" | "TSN7406" | "TSN7407" | "TSN7408" | "TSN7409" | "TSN7410" | "TSN7413" | "TSN7414" | "TSN7420" | "TSN9001" | "TSN9002" | "TSN9003" | "TSN9004" | "TSN9005" | "TSN9006" | "TSN9007" | "TSN9008" | "TSN9009" | "TSN9010" | "TSN9011" | "TSN9012" | "TSN9013" | "TSN9014" | "TSN9015" | "TSN9016" | "TSN9017" | "TSN9018" | "TSN9101" | "TSN9102" | "TSN9103" | "TSN9104" | "TSN9105" | "TSN9106" | "TSN9107" | "TSN9108" | "TSN9109" | "TSN9110" | "TSN9111" | "TSN9112" | "TSN9113" | "TSN9114" | "TSN5101" | "TSN5102" | "TSN5103" | "TSN5104" | "TSN5105" | "TSN5106" | "TSN5107" | "TSN5108" | "TSN5109" | "TSN6101";
5
+ export type DiagnosticCode = "TSN1001" | "TSN1002" | "TSN1003" | "TSN1004" | "TSN1005" | "TSN1006" | "TSN2001" | "TSN2002" | "TSN2003" | "TSN3001" | "TSN3002" | "TSN3011" | "TSN4001" | "TSN4002" | "TSN5001" | "TSN5002" | "TSN6001" | "TSN7101" | "TSN7102" | "TSN7103" | "TSN7104" | "TSN7105" | "TSN7201" | "TSN7202" | "TSN7203" | "TSN7204" | "TSN7301" | "TSN7401" | "TSN7403" | "TSN7405" | "TSN7406" | "TSN7407" | "TSN7408" | "TSN7409" | "TSN7410" | "TSN7413" | "TSN7414" | "TSN7415" | "TSN7420" | "TSN7421" | "TSN9001" | "TSN9002" | "TSN9003" | "TSN9004" | "TSN9005" | "TSN9006" | "TSN9007" | "TSN9008" | "TSN9009" | "TSN9010" | "TSN9011" | "TSN9012" | "TSN9013" | "TSN9014" | "TSN9015" | "TSN9016" | "TSN9017" | "TSN9018" | "TSN9101" | "TSN9102" | "TSN9103" | "TSN9104" | "TSN9105" | "TSN9106" | "TSN9107" | "TSN9108" | "TSN9109" | "TSN9110" | "TSN9111" | "TSN9112" | "TSN9113" | "TSN9114" | "TSN5101" | "TSN5102" | "TSN5103" | "TSN5104" | "TSN5105" | "TSN5106" | "TSN5107" | "TSN5108" | "TSN5109" | "TSN5110" | "TSN6101";
6
6
  export type SourceLocation = {
7
7
  readonly file: string;
8
8
  readonly line: number;
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/types/diagnostic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,CAAC;AAEd,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,cAAc,EACpB,UAAU,kBAAkB,EAC5B,SAAS,MAAM,EACf,WAAW,cAAc,EACzB,OAAO,MAAM,EACb,mBAAmB,SAAS,cAAc,EAAE,KAC3C,UAOD,CAAC;AAEH,eAAO,MAAM,OAAO,GAAI,YAAY,UAAU,KAAG,OAChB,CAAC;AAElC,eAAO,MAAM,gBAAgB,GAAI,YAAY,UAAU,KAAG,MAiBzD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,oBAG5C,CAAC;AAEH,eAAO,MAAM,aAAa,GACxB,WAAW,oBAAoB,EAC/B,YAAY,UAAU,KACrB,oBAGD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,oBAAoB,EAChC,YAAY,oBAAoB,KAC/B,oBAGD,CAAC"}
1
+ {"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/types/diagnostic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GAET,SAAS,CAAC;AAEd,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,cAAc,EACpB,UAAU,kBAAkB,EAC5B,SAAS,MAAM,EACf,WAAW,cAAc,EACzB,OAAO,MAAM,EACb,mBAAmB,SAAS,cAAc,EAAE,KAC3C,UAOD,CAAC;AAEH,eAAO,MAAM,OAAO,GAAI,YAAY,UAAU,KAAG,OAChB,CAAC;AAElC,eAAO,MAAM,gBAAgB,GAAI,YAAY,UAAU,KAAG,MAiBzD,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,0BAA0B,QAAO,oBAG5C,CAAC;AAEH,eAAO,MAAM,aAAa,GACxB,WAAW,oBAAoB,EAC/B,YAAY,UAAU,KACrB,oBAGD,CAAC;AAEH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,oBAAoB,EAChC,YAAY,oBAAoB,KAC/B,oBAGD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/types/diagnostic.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2GH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAoB,EACpB,QAA4B,EAC5B,OAAe,EACf,QAAyB,EACzB,IAAa,EACb,gBAA4C,EAChC,EAAE,CAAC,CAAC;IAChB,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,IAAI;IACJ,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAAsB,EAAW,EAAE,CACzD,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAsB,EAAU,EAAE;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE/B,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAyB,EAAE,CAAC,CAAC;IACrE,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,KAAK;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,SAA+B,EAC/B,UAAsB,EACA,EAAE,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IACnD,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAgC,EAChC,UAAgC,EACV,EAAE,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC;IACnE,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS;CACxD,CAAC,CAAC"}
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/types/diagnostic.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8GH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAoB,EACpB,QAA4B,EAC5B,OAAe,EACf,QAAyB,EACzB,IAAa,EACb,gBAA4C,EAChC,EAAE,CAAC,CAAC;IAChB,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,IAAI;IACJ,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAAsB,EAAW,EAAE,CACzD,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC;AAElC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAsB,EAAU,EAAE;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE/B,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAyB,EAAE,CAAC,CAAC;IACrE,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,KAAK;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,SAA+B,EAC/B,UAAsB,EACA,EAAE,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IACnD,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAgC,EAChC,UAAgC,EACV,EAAE,CAAC,CAAC;IAC1B,WAAW,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC;IACnE,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS;CACxD,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generics.d.ts","sourceRoot":"","sources":["../../src/validation/generics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAiB,MAAM,wBAAwB,CAAC;AAG7E;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,EAAE,CAAC,UAAU,EACzB,UAAU,aAAa,EACvB,WAAW,oBAAoB,KAC9B,oBAuBF,CAAC"}
1
+ {"version":3,"file":"generics.d.ts","sourceRoot":"","sources":["../../src/validation/generics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,oBAAoB,EAGrB,MAAM,wBAAwB,CAAC;AA2JhC;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,EAAE,CAAC,UAAU,EACzB,UAAU,aAAa,EACvB,WAAW,oBAAoB,KAC9B,oBAqCF,CAAC"}
@@ -2,12 +2,136 @@
2
2
  * Generic type validation
3
3
  */
4
4
  import * as ts from "typescript";
5
- import { addDiagnostic } from "../types/diagnostic.js";
5
+ import { addDiagnostic, createDiagnostic, } from "../types/diagnostic.js";
6
6
  import { checkForSymbolIndexSignature } from "../ir/generic-validator.js";
7
+ /**
8
+ * Check if a type node is a null or undefined literal type
9
+ */
10
+ const isNullishType = (typeNode) => typeNode.kind === ts.SyntaxKind.NullKeyword ||
11
+ typeNode.kind === ts.SyntaxKind.UndefinedKeyword ||
12
+ (ts.isLiteralTypeNode(typeNode) &&
13
+ (typeNode.literal.kind === ts.SyntaxKind.NullKeyword ||
14
+ typeNode.literal.kind === ts.SyntaxKind.UndefinedKeyword));
15
+ /**
16
+ * Check if a type node references a type parameter.
17
+ * Returns the type parameter name if it does, undefined otherwise.
18
+ */
19
+ const getTypeParameterReference = (typeNode) => {
20
+ if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {
21
+ return typeNode.typeName.text;
22
+ }
23
+ return undefined;
24
+ };
25
+ /**
26
+ * Check if a type parameter has a constraint that allows nullable representation.
27
+ * - `extends struct` → C# `where T : struct` allows T? as Nullable<T>
28
+ * - `extends object` → C# `where T : class` allows T? as nullable reference
29
+ * - `extends SomeClass` or `extends SomeInterface` → reference type, allows T?
30
+ */
31
+ const hasNullableConstraint = (tp) => {
32
+ if (!tp.constraint) {
33
+ return false;
34
+ }
35
+ // `object` keyword type - T extends object
36
+ // This is a TypeKeyword, not a TypeReference
37
+ if (tp.constraint.kind === ts.SyntaxKind.ObjectKeyword) {
38
+ return true;
39
+ }
40
+ // Any type reference constraint (struct, SomeClass, SomeInterface, generic type)
41
+ // implies the type is constrained and allows proper nullable handling
42
+ if (ts.isTypeReferenceNode(tp.constraint)) {
43
+ // This covers:
44
+ // - T extends struct → value type (struct is a custom type in tsonic)
45
+ // - T extends SomeClass → reference type
46
+ // - T extends SomeInterface → reference type
47
+ // - T extends Comparable<T> → reference type (generic constraint)
48
+ return true;
49
+ }
50
+ // Intersection type: T extends A & B
51
+ // Any intersection constraint means T is constrained
52
+ if (ts.isIntersectionTypeNode(tp.constraint)) {
53
+ return true;
54
+ }
55
+ return false;
56
+ };
57
+ /**
58
+ * Get the set of UNCONSTRAINED type parameter names in scope for a node.
59
+ * Walks up the tree to find enclosing generic declarations.
60
+ * Only returns type parameters that don't have nullable-compatible constraints.
61
+ */
62
+ const getUnconstrainedTypeParametersInScope = (node) => {
63
+ const params = new Set();
64
+ let current = node;
65
+ while (current) {
66
+ // Check for type parameters on various declaration types
67
+ if ((ts.isInterfaceDeclaration(current) ||
68
+ ts.isClassDeclaration(current) ||
69
+ ts.isTypeAliasDeclaration(current) ||
70
+ ts.isFunctionDeclaration(current) ||
71
+ ts.isMethodDeclaration(current) ||
72
+ ts.isArrowFunction(current) ||
73
+ ts.isFunctionExpression(current)) &&
74
+ current.typeParameters) {
75
+ for (const tp of current.typeParameters) {
76
+ // Only add if it's truly unconstrained (no nullable-compatible constraint)
77
+ if (!hasNullableConstraint(tp)) {
78
+ params.add(tp.name.text);
79
+ }
80
+ }
81
+ }
82
+ current = current.parent;
83
+ }
84
+ return params;
85
+ };
86
+ /**
87
+ * Check for nullable unions with unconstrained generic type parameters.
88
+ * Pattern: T | null where T is an unconstrained type parameter.
89
+ *
90
+ * This is unsupported because C# cannot represent nullable unconstrained generics:
91
+ * - For value types, T? requires `where T : struct` to become Nullable<T>
92
+ * - Without constraints, T? for a value type is just T (non-nullable)
93
+ *
94
+ * Returns a diagnostic if the pattern is detected, undefined otherwise.
95
+ */
96
+ const checkNullableGenericUnion = (typeNode, sourceFile) => {
97
+ if (!ts.isUnionTypeNode(typeNode)) {
98
+ return undefined;
99
+ }
100
+ // Check if union contains null or undefined
101
+ const hasNullish = typeNode.types.some(isNullishType);
102
+ if (!hasNullish) {
103
+ return undefined;
104
+ }
105
+ // Check if any non-nullish type is an UNCONSTRAINED type parameter reference
106
+ const unconstrainedTypeParams = getUnconstrainedTypeParametersInScope(typeNode);
107
+ const nonNullishTypes = typeNode.types.filter((t) => !isNullishType(t));
108
+ for (const memberType of nonNullishTypes) {
109
+ const typeParamName = getTypeParameterReference(memberType);
110
+ if (typeParamName && unconstrainedTypeParams.has(typeParamName)) {
111
+ // Found a nullable union with a type parameter
112
+ const start = typeNode.getStart(sourceFile);
113
+ const end = typeNode.getEnd();
114
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(start);
115
+ return createDiagnostic("TSN7415", "error", `Nullable union '${typeNode.getText(sourceFile)}' with unconstrained generic type parameter '${typeParamName}' cannot be represented in C#. ` +
116
+ `Use 'object | null' for nullable generic values, or constrain the type parameter.`, {
117
+ file: sourceFile.fileName,
118
+ line: line + 1,
119
+ column: character,
120
+ length: end - start,
121
+ }, `In C#, T? for an unconstrained type parameter T does not provide nullability for value types. ` +
122
+ `Either use 'object | null' to box the value, or if T is always a reference type, this is a limitation.`);
123
+ }
124
+ }
125
+ return undefined;
126
+ };
7
127
  /**
8
128
  * Validate generic types and constraints
9
129
  */
10
130
  export const validateGenerics = (sourceFile, _program, collector) => {
131
+ // Debug: log when validation runs
132
+ if (process.env.DEBUG_GENERICS) {
133
+ console.log(`[validateGenerics] Checking: ${sourceFile.fileName}`);
134
+ }
11
135
  const visitor = (node) => {
12
136
  // Only check for truly unsupported features (no static C# mapping)
13
137
  // Symbol index signatures - TSN7203
@@ -17,6 +141,14 @@ export const validateGenerics = (sourceFile, _program, collector) => {
17
141
  collector = addDiagnostic(collector, symbolDiag);
18
142
  }
19
143
  }
144
+ // Check for nullable unions with unconstrained generic type parameters - TSN7415
145
+ // This covers property signatures, variable declarations, function parameters, etc.
146
+ if (ts.isTypeNode(node)) {
147
+ const nullableGenericDiag = checkNullableGenericUnion(node, sourceFile);
148
+ if (nullableGenericDiag) {
149
+ collector = addDiagnostic(collector, nullableGenericDiag);
150
+ }
151
+ }
20
152
  // Explicitly visit interface and type literal members
21
153
  if (ts.isInterfaceDeclaration(node) || ts.isTypeLiteralNode(node)) {
22
154
  for (const member of node.members) {
@@ -1 +1 @@
1
- {"version":3,"file":"generics.js","sourceRoot":"","sources":["../../src/validation/generics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAwB,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAE1E;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAyB,EACzB,QAAuB,EACvB,SAA+B,EACT,EAAE;IACxB,MAAM,OAAO,GAAG,CAAC,IAAa,EAAQ,EAAE;QACtC,mEAAmE;QACnE,oCAAoC;QACpC,IAAI,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAClE,IAAI,UAAU,EAAE,CAAC;gBACf,SAAS,GAAG,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,OAAO,CAAC,UAAU,CAAC,CAAC;IACpB,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
1
+ {"version":3,"file":"generics.js","sourceRoot":"","sources":["../../src/validation/generics.ts"],"names":[],"mappings":"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"}
@@ -258,6 +258,19 @@ const isAllowedKeyType = (typeNode) => {
258
258
  typeNode.kind === ts.SyntaxKind.NumberKeyword) {
259
259
  return true;
260
260
  }
261
+ // String literal types (e.g., "a", "b")
262
+ if (ts.isLiteralTypeNode(typeNode)) {
263
+ const literal = typeNode.literal;
264
+ if (ts.isStringLiteral(literal) ||
265
+ ts.isNumericLiteral(literal) ||
266
+ literal.kind === ts.SyntaxKind.NumericLiteral) {
267
+ return true;
268
+ }
269
+ }
270
+ // Union types - all constituents must be allowed key types
271
+ if (ts.isUnionTypeNode(typeNode)) {
272
+ return typeNode.types.every((t) => isAllowedKeyType(t));
273
+ }
261
274
  // Type reference to allowed types
262
275
  if (ts.isTypeReferenceNode(typeNode)) {
263
276
  const typeName = typeNode.typeName;
@@ -1 +1 @@
1
- {"version":3,"file":"static-safety.js","sourceRoot":"","sources":["../../src/validation/static-safety.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static-safety.js","sourceRoot":"","sources":["../../src/validation/static-safety.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  /**
11
11
  * Mapped-type utility types (TSN7406)
12
12
  *
13
- * These expand to mapped types internally:
13
+ * SUPPORTED (expanded at compile time for concrete types):
14
14
  * - Partial<T> → { [P in keyof T]?: T[P] }
15
15
  * - Required<T> → { [P in keyof T]-?: T[P] }
16
16
  * - Readonly<T> → { readonly [P in keyof T]: T[P] }
@@ -24,15 +24,17 @@ export declare const UNSUPPORTED_MAPPED_UTILITY_TYPES: Set<string>;
24
24
  /**
25
25
  * Conditional-type utility types (TSN7407)
26
26
  *
27
- * These expand to conditional types internally:
28
- * - Extract<T, U> → T extends U ? T : never
29
- * - Exclude<T, U> → T extends U ? never : T
30
- * - NonNullable<T> → T & {} (or T extends null | undefined ? never : T)
31
- * - ReturnType<T> → T extends (...args: any) => infer R ? R : any
32
- * - Parameters<T> → T extends (...args: infer P) => any ? P : never
27
+ * SUPPORTED (expanded at compile time for concrete types):
28
+ * - Extract<T, U> → T extends U ? T : never
29
+ * - Exclude<T, U> → T extends U ? never : T
30
+ * - NonNullable<T> → T & {} (filters null/undefined from unions)
31
+ * - ReturnType<T> → T extends (...args: any) => infer R ? R : any
32
+ * - Parameters<T> → T extends (...args: infer P) => any ? P : never
33
+ * - Awaited<T> → T extends PromiseLike<infer U> ? Awaited<U> : T
34
+ *
35
+ * UNSUPPORTED (require constructor introspection):
33
36
  * - ConstructorParameters → ConstructorType extends abstract new (...args: infer P) => any ? P : never
34
37
  * - InstanceType<T> → T extends abstract new (...args: any) => infer R ? R : any
35
- * - Awaited<T> → T extends PromiseLike<infer U> ? Awaited<U> : T
36
38
  */
37
39
  export declare const UNSUPPORTED_CONDITIONAL_UTILITY_TYPES: Set<string>;
38
40
  //# sourceMappingURL=unsupported-utility-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unsupported-utility-types.d.ts","sourceRoot":"","sources":["../../src/validation/unsupported-utility-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gCAAgC,aAM3C,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qCAAqC,aAShD,CAAC"}
1
+ {"version":3,"file":"unsupported-utility-types.d.ts","sourceRoot":"","sources":["../../src/validation/unsupported-utility-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gCAAgC,aAG3C,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qCAAqC,aAGhD,CAAC"}
@@ -10,7 +10,7 @@
10
10
  /**
11
11
  * Mapped-type utility types (TSN7406)
12
12
  *
13
- * These expand to mapped types internally:
13
+ * SUPPORTED (expanded at compile time for concrete types):
14
14
  * - Partial<T> → { [P in keyof T]?: T[P] }
15
15
  * - Required<T> → { [P in keyof T]-?: T[P] }
16
16
  * - Readonly<T> → { readonly [P in keyof T]: T[P] }
@@ -21,33 +21,26 @@
21
21
  * Note: ReadonlyArray<T> is NOT a mapped type - it maps to IReadOnlyList<T> and is supported
22
22
  */
23
23
  export const UNSUPPORTED_MAPPED_UTILITY_TYPES = new Set([
24
- "Partial",
25
- "Required",
26
- "Readonly",
27
- "Pick",
28
- "Omit",
24
+ // Partial, Required, Readonly, Pick, Omit are now supported
25
+ // They are expanded to IrObjectType in type-converter/utility-types.ts
29
26
  ]);
30
27
  /**
31
28
  * Conditional-type utility types (TSN7407)
32
29
  *
33
- * These expand to conditional types internally:
34
- * - Extract<T, U> → T extends U ? T : never
35
- * - Exclude<T, U> → T extends U ? never : T
36
- * - NonNullable<T> → T & {} (or T extends null | undefined ? never : T)
37
- * - ReturnType<T> → T extends (...args: any) => infer R ? R : any
38
- * - Parameters<T> → T extends (...args: infer P) => any ? P : never
30
+ * SUPPORTED (expanded at compile time for concrete types):
31
+ * - Extract<T, U> → T extends U ? T : never
32
+ * - Exclude<T, U> → T extends U ? never : T
33
+ * - NonNullable<T> → T & {} (filters null/undefined from unions)
34
+ * - ReturnType<T> → T extends (...args: any) => infer R ? R : any
35
+ * - Parameters<T> → T extends (...args: infer P) => any ? P : never
36
+ * - Awaited<T> → T extends PromiseLike<infer U> ? Awaited<U> : T
37
+ *
38
+ * UNSUPPORTED (require constructor introspection):
39
39
  * - ConstructorParameters → ConstructorType extends abstract new (...args: infer P) => any ? P : never
40
40
  * - InstanceType<T> → T extends abstract new (...args: any) => infer R ? R : any
41
- * - Awaited<T> → T extends PromiseLike<infer U> ? Awaited<U> : T
42
41
  */
43
42
  export const UNSUPPORTED_CONDITIONAL_UTILITY_TYPES = new Set([
44
- "Extract",
45
- "Exclude",
46
- "NonNullable",
47
- "ReturnType",
48
- "Parameters",
49
43
  "ConstructorParameters",
50
44
  "InstanceType",
51
- "Awaited",
52
45
  ]);
53
46
  //# sourceMappingURL=unsupported-utility-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unsupported-utility-types.js","sourceRoot":"","sources":["../../src/validation/unsupported-utility-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAC;IACtD,SAAS;IACT,UAAU;IACV,UAAU;IACV,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,IAAI,GAAG,CAAC;IAC3D,SAAS;IACT,SAAS;IACT,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,uBAAuB;IACvB,cAAc;IACd,SAAS;CACV,CAAC,CAAC"}
1
+ {"version":3,"file":"unsupported-utility-types.js","sourceRoot":"","sources":["../../src/validation/unsupported-utility-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAS;AAC9D,4DAA4D;AAC5D,uEAAuE;CACxE,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,IAAI,GAAG,CAAC;IAC3D,uBAAuB;IACvB,cAAc;CACf,CAAC,CAAC"}
@@ -480,8 +480,8 @@ describe("Static Safety Validation", () => {
480
480
  expect(intDiag).not.to.equal(undefined);
481
481
  });
482
482
  });
483
- describe("TSN7406 - Mapped utility types not supported", () => {
484
- it("should reject Partial<T>", () => {
483
+ describe("Mapped utility types now supported", () => {
484
+ it("should accept Partial<T>", () => {
485
485
  const source = `
486
486
  interface Person { name: string; age: number; }
487
487
  type PartialPerson = Partial<Person>;
@@ -489,10 +489,9 @@ describe("Static Safety Validation", () => {
489
489
  const program = createTestProgram(source);
490
490
  const diagnostics = validateProgram(program);
491
491
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
492
- expect(diag).not.to.equal(undefined);
493
- expect(diag?.message).to.include("Partial");
492
+ expect(diag).to.equal(undefined);
494
493
  });
495
- it("should reject Required<T>", () => {
494
+ it("should accept Required<T>", () => {
496
495
  const source = `
497
496
  interface Person { name?: string; }
498
497
  type RequiredPerson = Required<Person>;
@@ -500,10 +499,19 @@ describe("Static Safety Validation", () => {
500
499
  const program = createTestProgram(source);
501
500
  const diagnostics = validateProgram(program);
502
501
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
503
- expect(diag).not.to.equal(undefined);
504
- expect(diag?.message).to.include("Required");
502
+ expect(diag).to.equal(undefined);
503
+ });
504
+ it("should accept Readonly<T>", () => {
505
+ const source = `
506
+ interface Person { name: string; age: number; }
507
+ type ReadonlyPerson = Readonly<Person>;
508
+ `;
509
+ const program = createTestProgram(source);
510
+ const diagnostics = validateProgram(program);
511
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
512
+ expect(diag).to.equal(undefined);
505
513
  });
506
- it("should reject Pick<T, K>", () => {
514
+ it("should accept Pick<T, K>", () => {
507
515
  const source = `
508
516
  interface Person { name: string; age: number; email: string; }
509
517
  type NameOnly = Pick<Person, "name">;
@@ -511,10 +519,9 @@ describe("Static Safety Validation", () => {
511
519
  const program = createTestProgram(source);
512
520
  const diagnostics = validateProgram(program);
513
521
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
514
- expect(diag).not.to.equal(undefined);
515
- expect(diag?.message).to.include("Pick");
522
+ expect(diag).to.equal(undefined);
516
523
  });
517
- it("should reject Omit<T, K>", () => {
524
+ it("should accept Omit<T, K>", () => {
518
525
  const source = `
519
526
  interface Person { name: string; age: number; }
520
527
  type NoAge = Omit<Person, "age">;
@@ -522,12 +529,106 @@ describe("Static Safety Validation", () => {
522
529
  const program = createTestProgram(source);
523
530
  const diagnostics = validateProgram(program);
524
531
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
525
- expect(diag).not.to.equal(undefined);
526
- expect(diag?.message).to.include("Omit");
532
+ expect(diag).to.equal(undefined);
533
+ });
534
+ it("should accept nested utility types (Partial<Readonly<T>>)", () => {
535
+ const source = `
536
+ interface Person { name: string; age: number; }
537
+ type PartialReadonlyPerson = Partial<Readonly<Person>>;
538
+ `;
539
+ const program = createTestProgram(source);
540
+ const diagnostics = validateProgram(program);
541
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
542
+ expect(diag).to.equal(undefined);
543
+ });
544
+ it("should accept Pick with multiple keys", () => {
545
+ const source = `
546
+ interface Person { name: string; age: number; email: string; phone: string; }
547
+ type ContactInfo = Pick<Person, "name" | "email" | "phone">;
548
+ `;
549
+ const program = createTestProgram(source);
550
+ const diagnostics = validateProgram(program);
551
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
552
+ expect(diag).to.equal(undefined);
553
+ });
554
+ it("should accept Omit with multiple keys", () => {
555
+ const source = `
556
+ interface Person { name: string; age: number; email: string; phone: string; }
557
+ type MinimalPerson = Omit<Person, "email" | "phone">;
558
+ `;
559
+ const program = createTestProgram(source);
560
+ const diagnostics = validateProgram(program);
561
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
562
+ expect(diag).to.equal(undefined);
563
+ });
564
+ it("should accept Required on type with mixed optional properties", () => {
565
+ const source = `
566
+ interface MixedPerson { name: string; age?: number; email?: string; }
567
+ type FullPerson = Required<MixedPerson>;
568
+ `;
569
+ const program = createTestProgram(source);
570
+ const diagnostics = validateProgram(program);
571
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
572
+ expect(diag).to.equal(undefined);
573
+ });
574
+ it("should accept Partial on type with already optional properties", () => {
575
+ const source = `
576
+ interface OptionalPerson { name?: string; age?: number; }
577
+ type StillOptional = Partial<OptionalPerson>;
578
+ `;
579
+ const program = createTestProgram(source);
580
+ const diagnostics = validateProgram(program);
581
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
582
+ expect(diag).to.equal(undefined);
583
+ });
584
+ it("should accept Readonly on type with readonly properties", () => {
585
+ const source = `
586
+ interface PartiallyReadonly { readonly id: string; name: string; }
587
+ type FullyReadonly = Readonly<PartiallyReadonly>;
588
+ `;
589
+ const program = createTestProgram(source);
590
+ const diagnostics = validateProgram(program);
591
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
592
+ expect(diag).to.equal(undefined);
593
+ });
594
+ it("should accept utility types in variable declarations", () => {
595
+ const source = `
596
+ interface Person { name: string; age: number; }
597
+ const update: Partial<Person> = { name: "Alice" };
598
+ `;
599
+ const program = createTestProgram(source);
600
+ const diagnostics = validateProgram(program);
601
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
602
+ expect(diag).to.equal(undefined);
603
+ });
604
+ it("should accept utility types in function parameters", () => {
605
+ const source = `
606
+ interface Person { name: string; age: number; }
607
+ function updatePerson(person: Person, updates: Partial<Person>): Person {
608
+ return { ...person, ...updates };
609
+ }
610
+ `;
611
+ const program = createTestProgram(source);
612
+ const diagnostics = validateProgram(program);
613
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
614
+ expect(diag).to.equal(undefined);
615
+ });
616
+ it("should accept utility types in function return type", () => {
617
+ const source = `
618
+ interface Person { name: string; age: number; }
619
+ function getPartialPerson(): Partial<Person> {
620
+ return { name: "Bob" };
621
+ }
622
+ `;
623
+ const program = createTestProgram(source);
624
+ const diagnostics = validateProgram(program);
625
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7406");
626
+ expect(diag).to.equal(undefined);
527
627
  });
528
628
  });
529
629
  describe("TSN7407 - Conditional utility types not supported", () => {
530
- it("should reject Extract<T, U>", () => {
630
+ // Extract, Exclude, NonNullable are now supported and expanded at compile time
631
+ it("should accept Extract<T, U>", () => {
531
632
  const source = `
532
633
  type StringOrNumber = string | number;
533
634
  type OnlyStrings = Extract<StringOrNumber, string>;
@@ -535,10 +636,9 @@ describe("Static Safety Validation", () => {
535
636
  const program = createTestProgram(source);
536
637
  const diagnostics = validateProgram(program);
537
638
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7407");
538
- expect(diag).not.to.equal(undefined);
539
- expect(diag?.message).to.include("Extract");
639
+ expect(diag).to.equal(undefined);
540
640
  });
541
- it("should reject Exclude<T, U>", () => {
641
+ it("should accept Exclude<T, U>", () => {
542
642
  const source = `
543
643
  type StringOrNumber = string | number;
544
644
  type NoStrings = Exclude<StringOrNumber, string>;
@@ -546,10 +646,9 @@ describe("Static Safety Validation", () => {
546
646
  const program = createTestProgram(source);
547
647
  const diagnostics = validateProgram(program);
548
648
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7407");
549
- expect(diag).not.to.equal(undefined);
550
- expect(diag?.message).to.include("Exclude");
649
+ expect(diag).to.equal(undefined);
551
650
  });
552
- it("should reject NonNullable<T>", () => {
651
+ it("should accept NonNullable<T>", () => {
553
652
  const source = `
554
653
  type MaybeString = string | null | undefined;
555
654
  type DefinitelyString = NonNullable<MaybeString>;
@@ -557,10 +656,9 @@ describe("Static Safety Validation", () => {
557
656
  const program = createTestProgram(source);
558
657
  const diagnostics = validateProgram(program);
559
658
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7407");
560
- expect(diag).not.to.equal(undefined);
561
- expect(diag?.message).to.include("NonNullable");
659
+ expect(diag).to.equal(undefined);
562
660
  });
563
- it("should reject ReturnType<T>", () => {
661
+ it("should accept ReturnType<T> (now supported)", () => {
564
662
  const source = `
565
663
  function greet(name: string): string { return name; }
566
664
  type GreetReturn = ReturnType<typeof greet>;
@@ -568,10 +666,9 @@ describe("Static Safety Validation", () => {
568
666
  const program = createTestProgram(source);
569
667
  const diagnostics = validateProgram(program);
570
668
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7407");
571
- expect(diag).not.to.equal(undefined);
572
- expect(diag?.message).to.include("ReturnType");
669
+ expect(diag).to.equal(undefined);
573
670
  });
574
- it("should reject Parameters<T>", () => {
671
+ it("should accept Parameters<T> (now supported)", () => {
575
672
  const source = `
576
673
  function add(a: number, b: number): number { return a + b; }
577
674
  type AddParams = Parameters<typeof add>;
@@ -579,8 +676,16 @@ describe("Static Safety Validation", () => {
579
676
  const program = createTestProgram(source);
580
677
  const diagnostics = validateProgram(program);
581
678
  const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7407");
582
- expect(diag).not.to.equal(undefined);
583
- expect(diag?.message).to.include("Parameters");
679
+ expect(diag).to.equal(undefined);
680
+ });
681
+ it("should accept Awaited<T> (now supported)", () => {
682
+ const source = `
683
+ type Result = Awaited<Promise<string>>;
684
+ `;
685
+ const program = createTestProgram(source);
686
+ const diagnostics = validateProgram(program);
687
+ const diag = diagnostics.diagnostics.find((d) => d.code === "TSN7407");
688
+ expect(diag).to.equal(undefined);
584
689
  });
585
690
  });
586
691
  describe("No false positives for utility-like names", () => {