@contractkit/plugin-typescript 0.25.4 → 0.27.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.
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">60.23% </span>
26
+ <span class="strong">70.05% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>203/337</span>
28
+ <span class='fraction'>241/344</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">47.91% </span>
33
+ <span class="strong">60.38% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>69/144</span>
35
+ <span class='fraction'>93/154</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">63.04% </span>
40
+ <span class="strong">75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>29/46</span>
42
+ <span class='fraction'>36/48</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">65.37% </span>
47
+ <span class="strong">74.74% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>185/283</span>
49
+ <span class='fraction'>216/289</span>
50
50
  </div>
51
51
 
52
52
 
@@ -918,7 +918,56 @@
918
918
  <a name='L853'></a><a href='#L853'>853</a>
919
919
  <a name='L854'></a><a href='#L854'>854</a>
920
920
  <a name='L855'></a><a href='#L855'>855</a>
921
- <a name='L856'></a><a href='#L856'>856</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-neutral">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
971
  <span class="cline-any cline-neutral">&nbsp;</span>
923
972
  <span class="cline-any cline-neutral">&nbsp;</span>
924
973
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1041,10 +1090,10 @@
1041
1090
  <span class="cline-any cline-neutral">&nbsp;</span>
1042
1091
  <span class="cline-any cline-neutral">&nbsp;</span>
1043
1092
  <span class="cline-any cline-neutral">&nbsp;</span>
1044
- <span class="cline-any cline-yes">17x</span>
1093
+ <span class="cline-any cline-yes">20x</span>
1045
1094
  <span class="cline-any cline-neutral">&nbsp;</span>
1046
1095
  <span class="cline-any cline-neutral">&nbsp;</span>
1047
- <span class="cline-any cline-yes">17x</span>
1096
+ <span class="cline-any cline-yes">20x</span>
1048
1097
  <span class="cline-any cline-neutral">&nbsp;</span>
1049
1098
  <span class="cline-any cline-neutral">&nbsp;</span>
1050
1099
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1063,18 +1112,18 @@
1063
1112
  <span class="cline-any cline-neutral">&nbsp;</span>
1064
1113
  <span class="cline-any cline-neutral">&nbsp;</span>
1065
1114
  <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-yes">18x</span>
1067
- <span class="cline-any cline-yes">18x</span>
1115
+ <span class="cline-any cline-yes">21x</span>
1116
+ <span class="cline-any cline-yes">21x</span>
1068
1117
  <span class="cline-any cline-neutral">&nbsp;</span>
1069
- <span class="cline-any cline-yes">18x</span>
1070
- <span class="cline-any cline-yes">18x</span>
1118
+ <span class="cline-any cline-yes">21x</span>
1119
+ <span class="cline-any cline-yes">21x</span>
1071
1120
  <span class="cline-any cline-neutral">&nbsp;</span>
1072
- <span class="cline-any cline-yes">18x</span>
1073
- <span class="cline-any cline-yes">18x</span>
1074
- <span class="cline-any cline-yes">18x</span>
1075
- <span class="cline-any cline-yes">18x</span>
1121
+ <span class="cline-any cline-yes">21x</span>
1122
+ <span class="cline-any cline-yes">21x</span>
1123
+ <span class="cline-any cline-yes">21x</span>
1124
+ <span class="cline-any cline-yes">21x</span>
1076
1125
  <span class="cline-any cline-neutral">&nbsp;</span>
1077
- <span class="cline-any cline-yes">18x</span>
1126
+ <span class="cline-any cline-yes">21x</span>
1078
1127
  <span class="cline-any cline-neutral">&nbsp;</span>
1079
1128
  <span class="cline-any cline-neutral">&nbsp;</span>
1080
1129
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1083,59 +1132,59 @@
1083
1132
  <span class="cline-any cline-neutral">&nbsp;</span>
1084
1133
  <span class="cline-any cline-neutral">&nbsp;</span>
1085
1134
  <span class="cline-any cline-neutral">&nbsp;</span>
1086
- <span class="cline-any cline-yes">18x</span>
1135
+ <span class="cline-any cline-yes">21x</span>
1087
1136
  <span class="cline-any cline-neutral">&nbsp;</span>
1088
- <span class="cline-any cline-yes">18x</span>
1089
- <span class="cline-any cline-yes">34x</span>
1137
+ <span class="cline-any cline-yes">21x</span>
1138
+ <span class="cline-any cline-yes">56x</span>
1090
1139
  <span class="cline-any cline-neutral">&nbsp;</span>
1091
1140
  <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-yes">18x</span>
1141
+ <span class="cline-any cline-yes">21x</span>
1093
1142
  <span class="cline-any cline-neutral">&nbsp;</span>
1094
1143
  <span class="cline-any cline-neutral">&nbsp;</span>
1095
1144
  <span class="cline-any cline-neutral">&nbsp;</span>
1096
1145
  <span class="cline-any cline-neutral">&nbsp;</span>
1097
1146
  <span class="cline-any cline-neutral">&nbsp;</span>
1098
1147
  <span class="cline-any cline-neutral">&nbsp;</span>
1099
- <span class="cline-any cline-yes">18x</span>
1100
- <span class="cline-any cline-yes">18x</span>
1101
- <span class="cline-any cline-yes">3x</span>
1148
+ <span class="cline-any cline-yes">21x</span>
1149
+ <span class="cline-any cline-yes">21x</span>
1150
+ <span class="cline-any cline-yes">6x</span>
1102
1151
  <span class="cline-any cline-neutral">&nbsp;</span>
1103
- <span class="cline-any cline-yes">18x</span>
1152
+ <span class="cline-any cline-yes">21x</span>
1104
1153
  <span class="cline-any cline-neutral">&nbsp;</span>
1105
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
1106
1155
  <span class="cline-any cline-neutral">&nbsp;</span>
1107
1156
  <span class="cline-any cline-neutral">&nbsp;</span>
1108
- <span class="cline-any cline-yes">3x</span>
1109
- <span class="cline-any cline-yes">3x</span>
1110
- <span class="cline-any cline-yes">3x</span>
1111
- <span class="cline-any cline-yes">3x</span>
1112
- <span class="cline-any cline-yes">3x</span>
1157
+ <span class="cline-any cline-yes">6x</span>
1158
+ <span class="cline-any cline-yes">6x</span>
1159
+ <span class="cline-any cline-yes">6x</span>
1160
+ <span class="cline-any cline-yes">8x</span>
1161
+ <span class="cline-any cline-yes">6x</span>
1113
1162
  <span class="cline-any cline-no">&nbsp;</span>
1114
1163
  <span class="cline-any cline-neutral">&nbsp;</span>
1115
1164
  <span class="cline-any cline-neutral">&nbsp;</span>
1116
- <span class="cline-any cline-yes">3x</span>
1165
+ <span class="cline-any cline-yes">6x</span>
1117
1166
  <span class="cline-any cline-neutral">&nbsp;</span>
1118
1167
  <span class="cline-any cline-neutral">&nbsp;</span>
1119
1168
  <span class="cline-any cline-neutral">&nbsp;</span>
1120
1169
  <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-yes">18x</span>
1122
- <span class="cline-any cline-yes">18x</span>
1123
- <span class="cline-any cline-yes">18x</span>
1124
- <span class="cline-any cline-yes">18x</span>
1125
- <span class="cline-any cline-yes">18x</span>
1126
- <span class="cline-any cline-yes">18x</span>
1127
- <span class="cline-any cline-yes">18x</span>
1170
+ <span class="cline-any cline-yes">21x</span>
1171
+ <span class="cline-any cline-yes">21x</span>
1172
+ <span class="cline-any cline-yes">21x</span>
1173
+ <span class="cline-any cline-yes">21x</span>
1174
+ <span class="cline-any cline-yes">21x</span>
1175
+ <span class="cline-any cline-yes">21x</span>
1176
+ <span class="cline-any cline-yes">21x</span>
1128
1177
  <span class="cline-any cline-yes">1x</span>
1129
1178
  <span class="cline-any cline-neutral">&nbsp;</span>
1130
- <span class="cline-any cline-yes">18x</span>
1131
- <span class="cline-any cline-yes">6x</span>
1132
- <span class="cline-any cline-yes">6x</span>
1179
+ <span class="cline-any cline-yes">21x</span>
1180
+ <span class="cline-any cline-yes">9x</span>
1181
+ <span class="cline-any cline-yes">9x</span>
1133
1182
  <span class="cline-any cline-no">&nbsp;</span>
1134
1183
  <span class="cline-any cline-neutral">&nbsp;</span>
1135
1184
  <span class="cline-any cline-neutral">&nbsp;</span>
1136
1185
  <span class="cline-any cline-neutral">&nbsp;</span>
1137
1186
  <span class="cline-any cline-neutral">&nbsp;</span>
1138
- <span class="cline-any cline-yes">18x</span>
1187
+ <span class="cline-any cline-yes">21x</span>
1139
1188
  <span class="cline-any cline-neutral">&nbsp;</span>
1140
1189
  <span class="cline-any cline-neutral">&nbsp;</span>
1141
1190
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1152,29 +1201,29 @@
1152
1201
  <span class="cline-any cline-neutral">&nbsp;</span>
1153
1202
  <span class="cline-any cline-neutral">&nbsp;</span>
1154
1203
  <span class="cline-any cline-neutral">&nbsp;</span>
1155
- <span class="cline-any cline-yes">22x</span>
1156
- <span class="cline-any cline-yes">22x</span>
1157
- <span class="cline-any cline-yes">2x</span>
1158
- <span class="cline-any cline-yes">2x</span>
1159
- <span class="cline-any cline-yes">2x</span>
1204
+ <span class="cline-any cline-yes">28x</span>
1205
+ <span class="cline-any cline-yes">28x</span>
1206
+ <span class="cline-any cline-yes">5x</span>
1207
+ <span class="cline-any cline-yes">5x</span>
1208
+ <span class="cline-any cline-yes">5x</span>
1160
1209
  <span class="cline-any cline-no">&nbsp;</span>
1161
1210
  <span class="cline-any cline-no">&nbsp;</span>
1162
1211
  <span class="cline-any cline-neutral">&nbsp;</span>
1163
- <span class="cline-any cline-yes">2x</span>
1212
+ <span class="cline-any cline-yes">5x</span>
1164
1213
  <span class="cline-any cline-no">&nbsp;</span>
1165
1214
  <span class="cline-any cline-no">&nbsp;</span>
1166
1215
  <span class="cline-any cline-neutral">&nbsp;</span>
1167
1216
  <span class="cline-any cline-neutral">&nbsp;</span>
1168
- <span class="cline-any cline-yes">22x</span>
1217
+ <span class="cline-any cline-yes">28x</span>
1169
1218
  <span class="cline-any cline-neutral">&nbsp;</span>
1170
1219
  <span class="cline-any cline-neutral">&nbsp;</span>
1171
1220
  <span class="cline-any cline-neutral">&nbsp;</span>
1172
1221
  <span class="cline-any cline-neutral">&nbsp;</span>
1173
- <span class="cline-any cline-yes">44x</span>
1174
- <span class="cline-any cline-yes">44x</span>
1222
+ <span class="cline-any cline-yes">56x</span>
1223
+ <span class="cline-any cline-yes">56x</span>
1175
1224
  <span class="cline-any cline-no">&nbsp;</span>
1176
1225
  <span class="cline-any cline-neutral">&nbsp;</span>
1177
- <span class="cline-any cline-yes">44x</span>
1226
+ <span class="cline-any cline-yes">56x</span>
1178
1227
  <span class="cline-any cline-neutral">&nbsp;</span>
1179
1228
  <span class="cline-any cline-neutral">&nbsp;</span>
1180
1229
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1286,48 +1335,48 @@
1286
1335
  <span class="cline-any cline-neutral">&nbsp;</span>
1287
1336
  <span class="cline-any cline-neutral">&nbsp;</span>
1288
1337
  <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-yes">4x</span>
1290
- <span class="cline-any cline-yes">4x</span>
1291
- <span class="cline-any cline-yes">4x</span>
1292
- <span class="cline-any cline-yes">4x</span>
1338
+ <span class="cline-any cline-yes">7x</span>
1339
+ <span class="cline-any cline-yes">7x</span>
1340
+ <span class="cline-any cline-yes">7x</span>
1341
+ <span class="cline-any cline-yes">7x</span>
1293
1342
  <span class="cline-any cline-neutral">&nbsp;</span>
1294
1343
  <span class="cline-any cline-neutral">&nbsp;</span>
1295
- <span class="cline-any cline-yes">4x</span>
1296
- <span class="cline-any cline-yes">4x</span>
1344
+ <span class="cline-any cline-yes">7x</span>
1345
+ <span class="cline-any cline-yes">7x</span>
1297
1346
  <span class="cline-any cline-neutral">&nbsp;</span>
1298
- <span class="cline-any cline-yes">4x</span>
1299
- <span class="cline-any cline-yes">4x</span>
1300
- <span class="cline-any cline-yes">4x</span>
1301
- <span class="cline-any cline-yes">5x</span>
1302
- <span class="cline-any cline-yes">4x</span>
1347
+ <span class="cline-any cline-yes">7x</span>
1348
+ <span class="cline-any cline-yes">7x</span>
1349
+ <span class="cline-any cline-yes">7x</span>
1350
+ <span class="cline-any cline-yes">8x</span>
1351
+ <span class="cline-any cline-yes">7x</span>
1303
1352
  <span class="cline-any cline-neutral">&nbsp;</span>
1304
- <span class="cline-any cline-yes">4x</span>
1305
- <span class="cline-any cline-yes">4x</span>
1306
- <span class="cline-any cline-yes">4x</span>
1353
+ <span class="cline-any cline-yes">7x</span>
1354
+ <span class="cline-any cline-yes">7x</span>
1355
+ <span class="cline-any cline-yes">7x</span>
1307
1356
  <span class="cline-any cline-neutral">&nbsp;</span>
1308
1357
  <span class="cline-any cline-neutral">&nbsp;</span>
1309
- <span class="cline-any cline-yes">4x</span>
1310
- <span class="cline-any cline-yes">4x</span>
1311
- <span class="cline-any cline-no">&nbsp;</span>
1312
- <span class="cline-any cline-no">&nbsp;</span>
1313
- <span class="cline-any cline-no">&nbsp;</span>
1314
- <span class="cline-any cline-no">&nbsp;</span>
1315
- <span class="cline-any cline-no">&nbsp;</span>
1316
- <span class="cline-any cline-no">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1318
- <span class="cline-any cline-no">&nbsp;</span>
1319
- <span class="cline-any cline-no">&nbsp;</span>
1320
- <span class="cline-any cline-no">&nbsp;</span>
1321
- <span class="cline-any cline-no">&nbsp;</span>
1358
+ <span class="cline-any cline-yes">7x</span>
1359
+ <span class="cline-any cline-yes">7x</span>
1360
+ <span class="cline-any cline-yes">3x</span>
1361
+ <span class="cline-any cline-yes">3x</span>
1362
+ <span class="cline-any cline-yes">3x</span>
1363
+ <span class="cline-any cline-yes">3x</span>
1364
+ <span class="cline-any cline-yes">3x</span>
1365
+ <span class="cline-any cline-yes">3x</span>
1366
+ <span class="cline-any cline-yes">3x</span>
1367
+ <span class="cline-any cline-yes">3x</span>
1368
+ <span class="cline-any cline-yes">3x</span>
1369
+ <span class="cline-any cline-yes">3x</span>
1370
+ <span class="cline-any cline-yes">3x</span>
1322
1371
  <span class="cline-any cline-neutral">&nbsp;</span>
1323
1372
  <span class="cline-any cline-neutral">&nbsp;</span>
1324
1373
  <span class="cline-any cline-neutral">&nbsp;</span>
1325
1374
  <span class="cline-any cline-neutral">&nbsp;</span>
1326
1375
  <span class="cline-any cline-neutral">&nbsp;</span>
1327
- <span class="cline-any cline-yes">4x</span>
1328
- <span class="cline-any cline-no">&nbsp;</span>
1329
- <span class="cline-any cline-no">&nbsp;</span>
1330
- <span class="cline-any cline-no">&nbsp;</span>
1376
+ <span class="cline-any cline-yes">7x</span>
1377
+ <span class="cline-any cline-yes">3x</span>
1378
+ <span class="cline-any cline-yes">3x</span>
1379
+ <span class="cline-any cline-yes">3x</span>
1331
1380
  <span class="cline-any cline-neutral">&nbsp;</span>
1332
1381
  <span class="cline-any cline-neutral">&nbsp;</span>
1333
1382
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1338,22 +1387,22 @@
1338
1387
  <span class="cline-any cline-neutral">&nbsp;</span>
1339
1388
  <span class="cline-any cline-neutral">&nbsp;</span>
1340
1389
  <span class="cline-any cline-neutral">&nbsp;</span>
1341
- <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-yes">3x</span>
1342
1391
  <span class="cline-any cline-neutral">&nbsp;</span>
1343
1392
  <span class="cline-any cline-neutral">&nbsp;</span>
1344
1393
  <span class="cline-any cline-neutral">&nbsp;</span>
1345
1394
  <span class="cline-any cline-neutral">&nbsp;</span>
1346
- <span class="cline-any cline-no">&nbsp;</span>
1347
- <span class="cline-any cline-no">&nbsp;</span>
1395
+ <span class="cline-any cline-yes">3x</span>
1396
+ <span class="cline-any cline-yes">1x</span>
1348
1397
  <span class="cline-any cline-neutral">&nbsp;</span>
1349
1398
  <span class="cline-any cline-neutral">&nbsp;</span>
1350
1399
  <span class="cline-any cline-neutral">&nbsp;</span>
1351
1400
  <span class="cline-any cline-neutral">&nbsp;</span>
1352
1401
  <span class="cline-any cline-neutral">&nbsp;</span>
1353
1402
  <span class="cline-any cline-neutral">&nbsp;</span>
1354
- <span class="cline-any cline-no">&nbsp;</span>
1355
- <span class="cline-any cline-no">&nbsp;</span>
1356
- <span class="cline-any cline-no">&nbsp;</span>
1403
+ <span class="cline-any cline-yes">2x</span>
1404
+ <span class="cline-any cline-yes">2x</span>
1405
+ <span class="cline-any cline-yes">2x</span>
1357
1406
  <span class="cline-any cline-neutral">&nbsp;</span>
1358
1407
  <span class="cline-any cline-neutral">&nbsp;</span>
1359
1408
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1361,7 +1410,7 @@
1361
1410
  <span class="cline-any cline-neutral">&nbsp;</span>
1362
1411
  <span class="cline-any cline-neutral">&nbsp;</span>
1363
1412
  <span class="cline-any cline-neutral">&nbsp;</span>
1364
- <span class="cline-any cline-no">&nbsp;</span>
1413
+ <span class="cline-any cline-yes">3x</span>
1365
1414
  <span class="cline-any cline-neutral">&nbsp;</span>
1366
1415
  <span class="cline-any cline-neutral">&nbsp;</span>
1367
1416
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1371,29 +1420,29 @@
1371
1420
  <span class="cline-any cline-neutral">&nbsp;</span>
1372
1421
  <span class="cline-any cline-neutral">&nbsp;</span>
1373
1422
  <span class="cline-any cline-neutral">&nbsp;</span>
1374
- <span class="cline-any cline-yes">4x</span>
1375
- <span class="cline-any cline-yes">4x</span>
1423
+ <span class="cline-any cline-yes">7x</span>
1424
+ <span class="cline-any cline-yes">7x</span>
1376
1425
  <span class="cline-any cline-neutral">&nbsp;</span>
1377
- <span class="cline-any cline-yes">4x</span>
1378
- <span class="cline-any cline-yes">4x</span>
1379
- <span class="cline-any cline-yes">5x</span>
1380
- <span class="cline-any cline-yes">5x</span>
1381
- <span class="cline-any cline-yes">5x</span>
1382
- <span class="cline-any cline-yes">5x</span>
1426
+ <span class="cline-any cline-yes">7x</span>
1427
+ <span class="cline-any cline-yes">7x</span>
1428
+ <span class="cline-any cline-yes">8x</span>
1429
+ <span class="cline-any cline-yes">8x</span>
1430
+ <span class="cline-any cline-yes">8x</span>
1431
+ <span class="cline-any cline-yes">8x</span>
1383
1432
  <span class="cline-any cline-yes">2x</span>
1384
1433
  <span class="cline-any cline-yes">2x</span>
1385
1434
  <span class="cline-any cline-yes">2x</span>
1386
- <span class="cline-any cline-yes">3x</span>
1435
+ <span class="cline-any cline-yes">6x</span>
1387
1436
  <span class="cline-any cline-yes">2x</span>
1388
1437
  <span class="cline-any cline-yes">2x</span>
1389
1438
  <span class="cline-any cline-yes">2x</span>
1390
1439
  <span class="cline-any cline-neutral">&nbsp;</span>
1391
- <span class="cline-any cline-yes">1x</span>
1440
+ <span class="cline-any cline-yes">4x</span>
1392
1441
  <span class="cline-any cline-neutral">&nbsp;</span>
1393
1442
  <span class="cline-any cline-neutral">&nbsp;</span>
1394
1443
  <span class="cline-any cline-neutral">&nbsp;</span>
1395
1444
  <span class="cline-any cline-neutral">&nbsp;</span>
1396
- <span class="cline-any cline-yes">4x</span>
1445
+ <span class="cline-any cline-yes">7x</span>
1397
1446
  <span class="cline-any cline-yes">3x</span>
1398
1447
  <span class="cline-any cline-yes">2x</span>
1399
1448
  <span class="cline-any cline-yes">2x</span>
@@ -1434,11 +1483,11 @@
1434
1483
  <span class="cline-any cline-neutral">&nbsp;</span>
1435
1484
  <span class="cline-any cline-neutral">&nbsp;</span>
1436
1485
  <span class="cline-any cline-neutral">&nbsp;</span>
1486
+ <span class="cline-any cline-yes">7x</span>
1487
+ <span class="cline-any cline-yes">4x</span>
1488
+ <span class="cline-any cline-yes">4x</span>
1489
+ <span class="cline-any cline-yes">4x</span>
1437
1490
  <span class="cline-any cline-yes">4x</span>
1438
- <span class="cline-any cline-yes">1x</span>
1439
- <span class="cline-any cline-yes">1x</span>
1440
- <span class="cline-any cline-yes">1x</span>
1441
- <span class="cline-any cline-yes">1x</span>
1442
1491
  <span class="cline-any cline-neutral">&nbsp;</span>
1443
1492
  <span class="cline-any cline-neutral">&nbsp;</span>
1444
1493
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1450,10 +1499,10 @@
1450
1499
  <span class="cline-any cline-neutral">&nbsp;</span>
1451
1500
  <span class="cline-any cline-neutral">&nbsp;</span>
1452
1501
  <span class="cline-any cline-neutral">&nbsp;</span>
1453
- <span class="cline-any cline-yes">1x</span>
1502
+ <span class="cline-any cline-yes">4x</span>
1454
1503
  <span class="cline-any cline-neutral">&nbsp;</span>
1455
1504
  <span class="cline-any cline-neutral">&nbsp;</span>
1456
- <span class="cline-any cline-yes">1x</span>
1505
+ <span class="cline-any cline-yes">4x</span>
1457
1506
  <span class="cline-any cline-neutral">&nbsp;</span>
1458
1507
  <span class="cline-any cline-neutral">&nbsp;</span>
1459
1508
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1475,29 +1524,29 @@
1475
1524
  <span class="cline-any cline-neutral">&nbsp;</span>
1476
1525
  <span class="cline-any cline-neutral">&nbsp;</span>
1477
1526
  <span class="cline-any cline-neutral">&nbsp;</span>
1478
- <span class="cline-any cline-yes">4x</span>
1527
+ <span class="cline-any cline-yes">7x</span>
1479
1528
  <span class="cline-any cline-neutral">&nbsp;</span>
1480
- <span class="cline-any cline-yes">4x</span>
1481
- <span class="cline-any cline-yes">4x</span>
1482
- <span class="cline-any cline-yes">4x</span>
1483
- <span class="cline-any cline-yes">4x</span>
1484
- <span class="cline-any cline-yes">4x</span>
1485
- <span class="cline-any cline-yes">4x</span>
1486
- <span class="cline-any cline-yes">4x</span>
1529
+ <span class="cline-any cline-yes">7x</span>
1530
+ <span class="cline-any cline-yes">7x</span>
1531
+ <span class="cline-any cline-yes">7x</span>
1532
+ <span class="cline-any cline-yes">7x</span>
1533
+ <span class="cline-any cline-yes">7x</span>
1534
+ <span class="cline-any cline-yes">7x</span>
1535
+ <span class="cline-any cline-yes">7x</span>
1487
1536
  <span class="cline-any cline-neutral">&nbsp;</span>
1488
1537
  <span class="cline-any cline-neutral">&nbsp;</span>
1489
- <span class="cline-any cline-no">&nbsp;</span>
1538
+ <span class="cline-any cline-yes">2x</span>
1490
1539
  <span class="cline-any cline-neutral">&nbsp;</span>
1491
1540
  <span class="cline-any cline-neutral">&nbsp;</span>
1492
1541
  <span class="cline-any cline-neutral">&nbsp;</span>
1493
- <span class="cline-any cline-yes">4x</span>
1494
- <span class="cline-any cline-yes">6x</span>
1495
- <span class="cline-any cline-yes">6x</span>
1496
- <span class="cline-any cline-yes">6x</span>
1542
+ <span class="cline-any cline-yes">7x</span>
1543
+ <span class="cline-any cline-yes">9x</span>
1544
+ <span class="cline-any cline-yes">9x</span>
1545
+ <span class="cline-any cline-yes">9x</span>
1497
1546
  <span class="cline-any cline-neutral">&nbsp;</span>
1498
1547
  <span class="cline-any cline-neutral">&nbsp;</span>
1548
+ <span class="cline-any cline-yes">7x</span>
1499
1549
  <span class="cline-any cline-yes">4x</span>
1500
- <span class="cline-any cline-yes">1x</span>
1501
1550
  <span class="cline-any cline-neutral">&nbsp;</span>
1502
1551
  <span class="cline-any cline-neutral">&nbsp;</span>
1503
1552
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1505,9 +1554,9 @@
1505
1554
  <span class="cline-any cline-neutral">&nbsp;</span>
1506
1555
  <span class="cline-any cline-neutral">&nbsp;</span>
1507
1556
  <span class="cline-any cline-neutral">&nbsp;</span>
1508
- <span class="cline-any cline-yes">4x</span>
1509
- <span class="cline-any cline-yes">4x</span>
1510
- <span class="cline-any cline-yes">4x</span>
1557
+ <span class="cline-any cline-yes">7x</span>
1558
+ <span class="cline-any cline-yes">7x</span>
1559
+ <span class="cline-any cline-yes">7x</span>
1511
1560
  <span class="cline-any cline-yes">3x</span>
1512
1561
  <span class="cline-any cline-yes">3x</span>
1513
1562
  <span class="cline-any cline-yes">3x</span>
@@ -1585,29 +1634,54 @@
1585
1634
  <span class="cline-any cline-neutral">&nbsp;</span>
1586
1635
  <span class="cline-any cline-neutral">&nbsp;</span>
1587
1636
  <span class="cline-any cline-neutral">&nbsp;</span>
1588
- <span class="cline-any cline-yes">4x</span>
1637
+ <span class="cline-any cline-yes">7x</span>
1589
1638
  <span class="cline-any cline-neutral">&nbsp;</span>
1590
1639
  <span class="cline-any cline-neutral">&nbsp;</span>
1591
1640
  <span class="cline-any cline-neutral">&nbsp;</span>
1592
1641
  <span class="cline-any cline-neutral">&nbsp;</span>
1593
1642
  <span class="cline-any cline-neutral">&nbsp;</span>
1594
- <span class="cline-any cline-yes">4x</span>
1595
- <span class="cline-any cline-yes">4x</span>
1596
- <span class="cline-any cline-yes">4x</span>
1643
+ <span class="cline-any cline-yes">7x</span>
1644
+ <span class="cline-any cline-yes">7x</span>
1645
+ <span class="cline-any cline-yes">7x</span>
1597
1646
  <span class="cline-any cline-neutral">&nbsp;</span>
1598
- <span class="cline-any cline-yes">4x</span>
1599
- <span class="cline-any cline-yes">4x</span>
1600
- <span class="cline-any cline-yes">4x</span>
1601
- <span class="cline-any cline-yes">6x</span>
1602
- <span class="cline-any cline-yes">6x</span>
1603
- <span class="cline-any cline-yes">6x</span>
1647
+ <span class="cline-any cline-yes">7x</span>
1648
+ <span class="cline-any cline-yes">7x</span>
1649
+ <span class="cline-any cline-yes">7x</span>
1650
+ <span class="cline-any cline-yes">9x</span>
1651
+ <span class="cline-any cline-yes">9x</span>
1652
+ <span class="cline-any cline-yes">9x</span>
1653
+ <span class="cline-any cline-neutral">&nbsp;</span>
1654
+ <span class="cline-any cline-yes">7x</span>
1655
+ <span class="cline-any cline-yes">3x</span>
1656
+ <span class="cline-any cline-yes">3x</span>
1657
+ <span class="cline-any cline-yes">3x</span>
1658
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
+ <span class="cline-any cline-yes">7x</span>
1660
+ <span class="cline-any cline-neutral">&nbsp;</span>
1661
+ <span class="cline-any cline-neutral">&nbsp;</span>
1662
+ <span class="cline-any cline-neutral">&nbsp;</span>
1663
+ <span class="cline-any cline-neutral">&nbsp;</span>
1664
+ <span class="cline-any cline-neutral">&nbsp;</span>
1665
+ <span class="cline-any cline-neutral">&nbsp;</span>
1666
+ <span class="cline-any cline-neutral">&nbsp;</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-neutral">&nbsp;</span>
1669
+ <span class="cline-any cline-yes">7x</span>
1670
+ <span class="cline-any cline-yes">2x</span>
1671
+ <span class="cline-any cline-yes">2x</span>
1672
+ <span class="cline-any cline-neutral">&nbsp;</span>
1673
+ <span class="cline-any cline-neutral">&nbsp;</span>
1674
+ <span class="cline-any cline-yes">2x</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-neutral">&nbsp;</span>
1677
+ <span class="cline-any cline-yes">2x</span>
1678
+ <span class="cline-any cline-neutral">&nbsp;</span>
1679
+ <span class="cline-any cline-neutral">&nbsp;</span>
1680
+ <span class="cline-any cline-neutral">&nbsp;</span>
1681
+ <span class="cline-any cline-neutral">&nbsp;</span>
1682
+ <span class="cline-any cline-yes">2x</span>
1604
1683
  <span class="cline-any cline-neutral">&nbsp;</span>
1605
- <span class="cline-any cline-yes">4x</span>
1606
- <span class="cline-any cline-no">&nbsp;</span>
1607
- <span class="cline-any cline-no">&nbsp;</span>
1608
- <span class="cline-any cline-no">&nbsp;</span>
1609
1684
  <span class="cline-any cline-neutral">&nbsp;</span>
1610
- <span class="cline-any cline-yes">4x</span>
1611
1685
  <span class="cline-any cline-neutral">&nbsp;</span>
1612
1686
  <span class="cline-any cline-neutral">&nbsp;</span>
1613
1687
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1724,7 +1798,7 @@
1724
1798
  <span class="cline-any cline-neutral">&nbsp;</span>
1725
1799
  <span class="cline-any cline-neutral">&nbsp;</span>
1726
1800
  <span class="cline-any cline-neutral">&nbsp;</span>
1727
- <span class="cline-any cline-yes">18x</span>
1801
+ <span class="cline-any cline-yes">21x</span>
1728
1802
  <span class="cline-any cline-no">&nbsp;</span>
1729
1803
  <span class="cline-any cline-no">&nbsp;</span>
1730
1804
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1734,16 +1808,16 @@
1734
1808
  <span class="cline-any cline-neutral">&nbsp;</span>
1735
1809
  <span class="cline-any cline-neutral">&nbsp;</span>
1736
1810
  <span class="cline-any cline-neutral">&nbsp;</span>
1737
- <span class="cline-any cline-yes">18x</span>
1738
- <span class="cline-any cline-yes">18x</span>
1739
- <span class="cline-any cline-yes">18x</span>
1811
+ <span class="cline-any cline-yes">21x</span>
1812
+ <span class="cline-any cline-yes">21x</span>
1813
+ <span class="cline-any cline-yes">21x</span>
1740
1814
  <span class="cline-any cline-neutral">&nbsp;</span>
1741
1815
  <span class="cline-any cline-neutral">&nbsp;</span>
1742
1816
  <span class="cline-any cline-neutral">&nbsp;</span>
1743
1817
  <span class="cline-any cline-neutral">&nbsp;</span>
1744
1818
  <span class="cline-any cline-neutral">&nbsp;</span>
1745
1819
  <span class="cline-any cline-neutral">&nbsp;</span>
1746
- <span class="cline-any cline-yes">18x</span>
1820
+ <span class="cline-any cline-yes">21x</span>
1747
1821
  <span class="cline-any cline-no">&nbsp;</span>
1748
1822
  <span class="cline-any cline-no">&nbsp;</span>
1749
1823
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1771,11 +1845,11 @@
1771
1845
  <span class="cline-any cline-neutral">&nbsp;</span>
1772
1846
  <span class="cline-any cline-neutral">&nbsp;</span>
1773
1847
  <span class="cline-any cline-neutral">&nbsp;</span>
1774
- <span class="cline-any cline-yes">18x</span>
1848
+ <span class="cline-any cline-yes">21x</span>
1775
1849
  <span class="cline-any cline-neutral">&nbsp;</span>
1776
1850
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { resolve, join, relative, dirname, basename } from 'node:path';
1777
1851
  import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync, rmdirSync } from 'node:fs';
1778
- import { generateContract } from './codegen-contract.js';
1852
+ import { generateContract, rootNeedsScalar } from './codegen-contract.js';
1779
1853
  import { generateOp } from './codegen-operation.js';
1780
1854
  import type {
1781
1855
  ContractKitPlugin,
@@ -1809,8 +1883,11 @@ import {
1809
1883
  deriveSubareaPropertyName,
1810
1884
  getAreaSubarea,
1811
1885
  hasPublicOperations,
1886
+ generateSdkPackageJson,
1887
+ generateSdkTsconfig,
1812
1888
  type SdkClientInfo,
1813
1889
  type SdkAreaInfo,
1890
+ type SdkScaffoldDeps,
1814
1891
  } from './codegen-sdk.js';
1815
1892
  import { generatePlainTypes } from './codegen-plain-types.js';
1816
1893
  import {
@@ -1855,6 +1932,15 @@ export interface SdkConfig {
1855
1932
  clients?: string;
1856
1933
  };
1857
1934
  includeInternal?: boolean;
1935
+ /**
1936
+ * Emit a starter `package.json` and `tsconfig.json` at the SDK `baseDir` so the
1937
+ * generated output is a buildable, publishable package on its own. Opt-in and
1938
+ * write-once: the files are created only when absent and are never overwritten or
1939
+ * cleaned up on later builds, so any edits you make to them are preserved.
1940
+ * Dependency ranges are derived from the contracts (always `zod` when `zod: true`;
1941
+ * `luxon` when any covered model uses a date/time/datetime/interval scalar).
1942
+ */
1943
+ scaffold?: boolean;
1858
1944
  }
1859
1945
  &nbsp;
1860
1946
  export interface ZodConfig {
@@ -1940,8 +2026,8 @@ async function runTypescriptCodegen(
1940
2026
  &nbsp;
1941
2027
  deleteStalePaths(result.deletedPaths);
1942
2028
  &nbsp;
1943
- for (const { relativePath, content } of result.filesToWrite) {
1944
- ctx.emitFile(relativePath, content);
2029
+ for (const { relativePath, content, ifAbsent } of result.filesToWrite) {
2030
+ ctx.emitFile(relativePath, content, ifAbsent ? { ifAbsent: true } : undefined);
1945
2031
  }
1946
2032
  &nbsp;
1947
2033
  writeManifest(manifestPath, result.manifest);
@@ -2010,7 +2096,7 @@ function sliceOutPathMap(refs: Set&lt;string&gt;, modelOutPaths: Map&lt;string,
2010
2096
  const slice: Record&lt;string, string&gt; = {};
2011
2097
  for (const ref of [...refs].sort()) {
2012
2098
  const p = modelOutPaths.get(ref);
2013
- <span class="missing-if-branch" title="if path not taken" >I</span>if (p) <span class="cstat-no" title="statement not covered" >slice[ref] = p;</span>
2099
+ if (p) slice[ref] = p;
2014
2100
  <span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithInput.has(ref)) {
2015
2101
  const ip = <span class="cstat-no" title="statement not covered" >modelOutPaths.get(`${ref}Input`);</span>
2016
2102
  <span class="cstat-no" title="statement not covered" > if (ip) <span class="cstat-no" title="statement not covered" >slice[`${ref}Input`] = ip;</span></span>
@@ -2141,7 +2227,7 @@ function collectSdkOutput(
2141
2227
  units: IncrementalUnit[],
2142
2228
  globalFiles: IncrementalOutputFile[],
2143
2229
  ): void {
2144
- const sdkBase = config.baseDir<span class="branch-0 cbranch-no" title="branch not covered" > ? resolve(rootDir, config.baseDir) : r</span>ootDir;
2230
+ const sdkBase = config.baseDir ? resolve(rootDir, config.baseDir) : rootDir;
2145
2231
  const sdkName = config.name;
2146
2232
  const sdkOutput = config.output?.sdk;
2147
2233
  const sdkEntryPath = sdkOutput
@@ -2153,7 +2239,7 @@ function collectSdkOutput(
2153
2239
  const modelsWithInput = inputs.modelsWithInput as Set&lt;string&gt;;
2154
2240
  const modelsWithOutput = inputs.modelsWithOutput as Set&lt;string&gt;;
2155
2241
  const modelMap = buildModelMap(inputs.contractRoots);
2156
- const allFiles = [...inputs.contractRoots.map(<span class="fstat-no" title="function not covered" >r =&gt; <span class="cstat-no" title="statement not covered" >r</span>.file)</span>, ...inputs.opRoots.map(r =&gt; r.file)];
2242
+ const allFiles = [...inputs.contractRoots.map(r =&gt; r.file), ...inputs.opRoots.map(r =&gt; r.file)];
2157
2243
  const ckCommonRoot = commonDir(allFiles, rootDir);
2158
2244
  &nbsp;
2159
2245
  const sdkModelOutPaths = new Map&lt;string, string&gt;();
@@ -2162,27 +2248,27 @@ function collectSdkOutput(
2162
2248
  &nbsp;
2163
2249
  // ── Pre-pass: SDK type files ──
2164
2250
  const sdkContractEntries: { ast: ContractRootNode; typeOutPath: string }[] = [];
2165
- <span class="missing-if-branch" title="if path not taken" >I</span>if (config.output?.types) {
2166
- const <span class="cstat-no" title="statement not covered" >publicTypes = computePubliclyReachableTypes(inputs.opRoots, inputs.contractRoots, modelsWithInput, modelsWithOutput);</span>
2167
- <span class="cstat-no" title="statement not covered" > for (const ast of inputs.contractRoots) {</span>
2168
- const <span class="cstat-no" title="statement not covered" >typeOutPath = computeSdkTypeOutPath(ast.file, sdkBase, config.output.types, ckCommonRoot, ast.meta);</span>
2169
- <span class="cstat-no" title="statement not covered" > if (!typeOutPath) <span class="cstat-no" title="statement not covered" >continue;</span></span>
2170
- <span class="cstat-no" title="statement not covered" > if (publicTypes !== null &amp;&amp; !ast.models.some(<span class="fstat-no" title="function not covered" >m =&gt; <span class="cstat-no" title="statement not covered" >p</span>ublicTypes.has(m.name))) <span class="cstat-no" title="statement not covered" >c</span>ontinue;</span></span>
2171
- <span class="cstat-no" title="statement not covered" > sdkTypePaths.push(typeOutPath);</span>
2172
- <span class="cstat-no" title="statement not covered" > sdkContractEntries.push({ ast, typeOutPath });</span>
2173
- <span class="cstat-no" title="statement not covered" > for (const model of ast.models) {</span>
2174
- <span class="cstat-no" title="statement not covered" > sdkModelOutPaths.set(model.name, typeOutPath);</span>
2175
- <span class="cstat-no" title="statement not covered" > if (modelsWithInput.has(model.name)) <span class="cstat-no" title="statement not covered" >sdkModelOutPaths.set(`${model.name}Input`, typeOutPath);</span></span>
2176
- <span class="cstat-no" title="statement not covered" > if (modelsWithOutput.has(model.name)) <span class="cstat-no" title="statement not covered" >sdkModelOutPaths.set(`${model.name}Output`, typeOutPath);</span></span>
2251
+ if (config.output?.types) {
2252
+ const publicTypes = computePubliclyReachableTypes(inputs.opRoots, inputs.contractRoots, modelsWithInput, modelsWithOutput);
2253
+ for (const ast of inputs.contractRoots) {
2254
+ const typeOutPath = computeSdkTypeOutPath(ast.file, sdkBase, config.output.types, ckCommonRoot, ast.meta);
2255
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!typeOutPath) <span class="cstat-no" title="statement not covered" >continue;</span>
2256
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (publicTypes !== null &amp;&amp; !ast.models.some(m =&gt; publicTypes.has(m.name))) <span class="cstat-no" title="statement not covered" >continue;</span>
2257
+ sdkTypePaths.push(typeOutPath);
2258
+ sdkContractEntries.push({ ast, typeOutPath });
2259
+ for (const model of ast.models) {
2260
+ sdkModelOutPaths.set(model.name, typeOutPath);
2261
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithInput.has(model.name)) <span class="cstat-no" title="statement not covered" >sdkModelOutPaths.set(`${model.name}Input`, typeOutPath);</span>
2262
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (modelsWithOutput.has(model.name)) <span class="cstat-no" title="statement not covered" >sdkModelOutPaths.set(`${model.name}Output`, typeOutPath);</span>
2177
2263
  }
2178
2264
  }
2179
2265
  }
2180
2266
  &nbsp;
2181
2267
  // ── SDK type units ──
2182
2268
  for (const { ast, typeOutPath } of sdkContractEntries) {
2183
- const refs = <span class="cstat-no" title="statement not covered" >collectContractRootRefs(ast, modelMap);</span>
2184
- const ownNames = <span class="cstat-no" title="statement not covered" >new Set(ast.models.map(<span class="fstat-no" title="function not covered" >m =&gt; <span class="cstat-no" title="statement not covered" >m</span>.name)</span>);</span>
2185
- const <span class="cstat-no" title="statement not covered" >fingerprint = hashFingerprint({</span>
2269
+ const refs = collectContractRootRefs(ast, modelMap);
2270
+ const ownNames = new Set(ast.models.map(m =&gt; m.name));
2271
+ const fingerprint = hashFingerprint({
2186
2272
  kind: 'sdk-types',
2187
2273
  v: TYPESCRIPT_CODEGEN_VERSION,
2188
2274
  outPath: typeOutPath,
@@ -2193,22 +2279,22 @@ function collectSdkOutput(
2193
2279
  sdkOptionsPath,
2194
2280
  sub: subConfigKey,
2195
2281
  });
2196
- <span class="cstat-no" title="statement not covered" > units.push({</span>
2282
+ units.push({
2197
2283
  key: `sdk-types::${typeOutPath}`,
2198
2284
  fingerprint,
2199
- render: <span class="fstat-no" title="function not covered" >() =&gt; {</span>
2285
+ render: () =&gt; {
2200
2286
  let content: string;
2201
- <span class="cstat-no" title="statement not covered" > if (config.zod) {</span>
2202
- <span class="cstat-no" title="statement not covered" > content = generateContract(ast, {</span>
2287
+ if (config.zod) {
2288
+ content = generateContract(ast, {
2203
2289
  modelOutPaths: sdkModelOutPaths,
2204
2290
  currentOutPath: typeOutPath,
2205
2291
  modelsWithInput,
2206
2292
  modelsWithOutput,
2207
2293
  });
2208
2294
  } else {
2209
- let <span class="cstat-no" title="statement not covered" >rel = relative(dirname(typeOutPath), sdkOptionsPath).replace(/\.ts$/, '.js');</span>
2210
- <span class="cstat-no" title="statement not covered" > if (!rel.startsWith('.')) <span class="cstat-no" title="statement not covered" >rel = './' + rel;</span></span>
2211
- <span class="cstat-no" title="statement not covered" > content = generatePlainTypes(ast, {</span>
2295
+ let rel = relative(dirname(typeOutPath), sdkOptionsPath).replace(/\.ts$/, '.js');
2296
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!rel.startsWith('.')) <span class="cstat-no" title="statement not covered" >rel = './' + rel;</span>
2297
+ content = generatePlainTypes(ast, {
2212
2298
  modelOutPaths: sdkModelOutPaths,
2213
2299
  currentOutPath: typeOutPath,
2214
2300
  modelsWithInput,
@@ -2216,7 +2302,7 @@ function collectSdkOutput(
2216
2302
  jsonValueImportPath: rel,
2217
2303
  });
2218
2304
  }
2219
- <span class="cstat-no" title="statement not covered" > return [{ relativePath: typeOutPath, content }];</span>
2305
+ return [{ relativePath: typeOutPath, content }];
2220
2306
  },
2221
2307
  });
2222
2308
  }
@@ -2339,9 +2425,9 @@ function collectSdkOutput(
2339
2425
  const sdkOptionsRel = relative(sdkEntryDir, sdkOptionsPath).replace(/\.ts$/, '.js');
2340
2426
  const sdkOptionsImportPath = sdkOptionsRel.startsWith('.') ? <span class="branch-0 cbranch-no" title="branch not covered" >sdkOptionsRel : '</span>./' + sdkOptionsRel;
2341
2427
  const sdkClassName = sdkName
2342
- ? <span class="branch-0 cbranch-no" title="branch not covered" >sdkName</span>
2428
+ ? sdkName
2343
2429
  .split(/[-._\s]+/)
2344
- .map(<span class="fstat-no" title="function not covered" >s =&gt; <span class="cstat-no" title="statement not covered" >s</span>.charAt(0).toUpperCase() + s.slice(1))</span>
2430
+ .map(s =&gt; s.charAt(0).toUpperCase() + s.slice(1))
2345
2431
  .join('') + 'Sdk'
2346
2432
  : 'Sdk';
2347
2433
  &nbsp;
@@ -2448,7 +2534,7 @@ function collectSdkOutput(
2448
2534
  &nbsp;
2449
2535
  const sdkSrcDir = dirname(sdkEntryPath);
2450
2536
  const sdkTypeBarrels = generateBarrelFiles(sdkTypePaths);
2451
- for (const barrel of sdkTypeBarrels) <span class="cstat-no" title="statement not covered" >globalFiles.push({ relativePath: barrel.outPath, content: barrel.content });</span>
2537
+ for (const barrel of sdkTypeBarrels) globalFiles.push({ relativePath: barrel.outPath, content: barrel.content });
2452
2538
  &nbsp;
2453
2539
  const rootExports: string[] = [`export * from './${basename(sdkOptionsPath).replace(/\.ts$/, '.js')}';`];
2454
2540
  <span class="missing-if-branch" title="else path not taken" >E</span>if (hasAnything) rootExports.push(`export * from './${basename(sdkEntryPath).replace(/\.ts$/, '.js')}';`);
@@ -2458,14 +2544,39 @@ function collectSdkOutput(
2458
2544
  rootExports.push(`export * from '${rel}';`);
2459
2545
  }
2460
2546
  for (const barrel of sdkTypeBarrels) {
2461
- let <span class="cstat-no" title="statement not covered" >rel = relative(sdkSrcDir, barrel.outPath).replace(/\.ts$/, '.js');</span>
2462
- <span class="cstat-no" title="statement not covered" > if (!rel.startsWith('.')) <span class="cstat-no" title="statement not covered" >rel = './' + rel;</span></span>
2463
- <span class="cstat-no" title="statement not covered" > rootExports.push(`export * from '${rel}';`);</span>
2547
+ let rel = relative(sdkSrcDir, barrel.outPath).replace(/\.ts$/, '.js');
2548
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!rel.startsWith('.')) rel = './' + rel;
2549
+ rootExports.push(`export * from '${rel}';`);
2464
2550
  }
2465
2551
  globalFiles.push({
2466
2552
  relativePath: join(sdkSrcDir, 'index.ts'),
2467
2553
  content: `// Auto-generated barrel file\n${rootExports.sort().join('\n')}\n`,
2468
2554
  });
2555
+ &nbsp;
2556
+ // ── Scaffold files (opt-in, write-once) ──
2557
+ // Emitted at the SDK package root with `ifAbsent` so they're created once and
2558
+ // then owned by the user. Deps are derived from the contracts actually surfaced
2559
+ // into the SDK: zod when schema output is on, luxon when any covered model uses a
2560
+ // date/time/datetime/interval scalar.
2561
+ if (config.scaffold) {
2562
+ const coveredRoots = sdkContractEntries.map(e =&gt; e.ast);
2563
+ const deps: SdkScaffoldDeps = {
2564
+ zod: !!config.zod,
2565
+ luxon: coveredRoots.some(
2566
+ r =&gt; rootNeedsScalar(r, 'datetime') || rootNeedsScalar(r, 'date') || rootNeedsScalar(r, 'time') || rootNeedsScalar(r, 'interval'),
2567
+ ),
2568
+ };
2569
+ globalFiles.push({
2570
+ relativePath: join(sdkBase, 'package.json'),
2571
+ content: generateSdkPackageJson({ name: sdkName ?? 'sdk', deps }),
2572
+ ifAbsent: true,
2573
+ });
2574
+ globalFiles.push({
2575
+ relativePath: join(sdkBase, 'tsconfig.json'),
2576
+ content: generateSdkTsconfig(),
2577
+ ifAbsent: true,
2578
+ });
2579
+ }
2469
2580
  }
2470
2581
  &nbsp;
2471
2582
  // ─── Zod sub-generator ─────────────────────────────────────────────────────
@@ -2635,7 +2746,7 @@ function stableSubConfig(config: unknown): string {
2635
2746
  <div class='footer quiet pad2 space-top1 center small'>
2636
2747
  Code coverage generated by
2637
2748
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2638
- at 2026-06-03T13:07:33.231Z
2749
+ at 2026-06-16T15:55:46.002Z
2639
2750
  </div>
2640
2751
  <script src="../prettify.js"></script>
2641
2752
  <script>