@gi-tcg/gts-transpiler 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -1198,11 +1198,20 @@ function applyReplacements(state, code, mappings) {
|
|
|
1198
1198
|
let ${payload.typingId} = ${typingIdLhs}.as();
|
|
1199
1199
|
type ${payload.typingId} = typeof ${payload.typingId};
|
|
1200
1200
|
`;
|
|
1201
|
-
} else if (payload.type === "exitAttr")
|
|
1201
|
+
} else if (payload.type === "exitAttr") {
|
|
1202
|
+
const rewrittenMeta = `${payload.oldMetaType}_rewritten`;
|
|
1203
|
+
const mergeFn = `${payload.oldMetaType}_mergeFn`;
|
|
1204
|
+
const mergeFnRet = `${payload.oldMetaType}_mergeFnRet`;
|
|
1205
|
+
replacement = dedent`
|
|
1202
1206
|
type ${payload.returnType} = typeof ${payload.returnType};
|
|
1203
|
-
type ${
|
|
1207
|
+
type ${rewrittenMeta} = ${payload.returnType} extends { rewriteMeta: infer NewMeta extends {} } ? NewMeta : ${payload.oldMetaType};
|
|
1208
|
+
let ${mergeFn}!: ${payload.defType} extends {
|
|
1209
|
+
[${payload.attrName}]: { mergeMeta: infer M }
|
|
1210
|
+
} ? M : null;
|
|
1211
|
+
let ${mergeFnRet} = ${mergeFn}?.(null! as ${rewrittenMeta}, null! as ${payload.innerMetaType});
|
|
1212
|
+
type ${payload.newMetaType} = [typeof ${mergeFn}] extends [null] ? ${rewrittenMeta} : typeof ${mergeFnRet};
|
|
1204
1213
|
`;
|
|
1205
|
-
else replacement = "";
|
|
1214
|
+
} else replacement = "";
|
|
1206
1215
|
matchInfos.push({
|
|
1207
1216
|
sourceEnd: offset + match.length,
|
|
1208
1217
|
lengthOffset: replacement.length - match.length
|
|
@@ -1282,6 +1291,7 @@ const exitVM = (state, errorRange) => {
|
|
|
1282
1291
|
collectedAttrs: collectedAttrNames,
|
|
1283
1292
|
errorRange
|
|
1284
1293
|
}));
|
|
1294
|
+
return { finalMetaId };
|
|
1285
1295
|
};
|
|
1286
1296
|
const enterAttr = (state, attrName) => {
|
|
1287
1297
|
const defTypeId = state.vmDefTypeIdStack.at(-1);
|
|
@@ -1317,7 +1327,7 @@ const genBindingTyping = (state, info) => {
|
|
|
1317
1327
|
typingId: info.typingId.name
|
|
1318
1328
|
}));
|
|
1319
1329
|
};
|
|
1320
|
-
const exitAttr = (state, returningId) => {
|
|
1330
|
+
const exitAttr = (state, attrName, innerVMFinalMetaId, returningId) => {
|
|
1321
1331
|
const currentDefId = state.vmDefTypeIdStack.at(-1);
|
|
1322
1332
|
if (!currentDefId) return;
|
|
1323
1333
|
const newMetaTypeId = {
|
|
@@ -1328,6 +1338,8 @@ const exitAttr = (state, returningId) => {
|
|
|
1328
1338
|
state.typingPendingStatements.push(createReplacementHolder(state, {
|
|
1329
1339
|
type: "exitAttr",
|
|
1330
1340
|
defType: currentDefId.name,
|
|
1341
|
+
attrName,
|
|
1342
|
+
innerMetaType: innerVMFinalMetaId.name,
|
|
1331
1343
|
oldMetaType: oldMetaTypeId.name,
|
|
1332
1344
|
newMetaType: newMetaTypeId.name,
|
|
1333
1345
|
returnType: returningId.name
|
|
@@ -1508,10 +1520,11 @@ const gtsToTypingsWalker = {
|
|
|
1508
1520
|
}]
|
|
1509
1521
|
});
|
|
1510
1522
|
enterVMFromAttr(state, returnValue);
|
|
1523
|
+
let exitVMResult;
|
|
1511
1524
|
if (body.namedAttributes) {
|
|
1512
1525
|
visit(body.namedAttributes);
|
|
1513
|
-
exitVM(state, body.namedAttributes.range);
|
|
1514
|
-
} else exitVM(state, name.range);
|
|
1526
|
+
exitVMResult = exitVM(state, body.namedAttributes.range);
|
|
1527
|
+
} else exitVMResult = exitVM(state, name.range);
|
|
1515
1528
|
if (bindingName) {
|
|
1516
1529
|
const export_ = node.bindingAccessModifier !== "private";
|
|
1517
1530
|
const typingId = {
|
|
@@ -1538,7 +1551,7 @@ const gtsToTypingsWalker = {
|
|
|
1538
1551
|
leadingComments: state.defineLeadingComments
|
|
1539
1552
|
});
|
|
1540
1553
|
}
|
|
1541
|
-
exitAttr(state, returnValue);
|
|
1554
|
+
exitAttr(state, attrName, exitVMResult.finalMetaId, returnValue);
|
|
1542
1555
|
return EMPTY;
|
|
1543
1556
|
},
|
|
1544
1557
|
GTSNamedAttributeBlock(node, { state, visit }) {
|
package/package.json
CHANGED
|
@@ -51,6 +51,8 @@ type ReplacementPayload =
|
|
|
51
51
|
type: "exitAttr";
|
|
52
52
|
returnType: string;
|
|
53
53
|
defType: string;
|
|
54
|
+
attrName: string;
|
|
55
|
+
innerMetaType: string;
|
|
54
56
|
oldMetaType: string;
|
|
55
57
|
newMetaType: string;
|
|
56
58
|
};
|
|
@@ -194,9 +196,17 @@ export function applyReplacements(
|
|
|
194
196
|
type ${payload.typingId} = typeof ${payload.typingId};
|
|
195
197
|
`;
|
|
196
198
|
} else if (payload.type === "exitAttr") {
|
|
199
|
+
const rewrittenMeta = `${payload.oldMetaType}_rewritten`;
|
|
200
|
+
const mergeFn = `${payload.oldMetaType}_mergeFn`;
|
|
201
|
+
const mergeFnRet = `${payload.oldMetaType}_mergeFnRet`;
|
|
197
202
|
replacement = dedent`
|
|
198
203
|
type ${payload.returnType} = typeof ${payload.returnType};
|
|
199
|
-
type ${
|
|
204
|
+
type ${rewrittenMeta} = ${payload.returnType} extends { rewriteMeta: infer NewMeta extends {} } ? NewMeta : ${payload.oldMetaType};
|
|
205
|
+
let ${mergeFn}!: ${payload.defType} extends {
|
|
206
|
+
[${payload.attrName}]: { mergeMeta: infer M }
|
|
207
|
+
} ? M : null;
|
|
208
|
+
let ${mergeFnRet} = ${mergeFn}?.(null! as ${rewrittenMeta}, null! as ${payload.innerMetaType});
|
|
209
|
+
type ${payload.newMetaType} = [typeof ${mergeFn}] extends [null] ? ${rewrittenMeta} : typeof ${mergeFnRet};
|
|
200
210
|
`;
|
|
201
211
|
} else {
|
|
202
212
|
replacement = "";
|
|
@@ -168,7 +168,14 @@ const enterVMFromAttr = (
|
|
|
168
168
|
state.attrsOfCurrentVm.push([]);
|
|
169
169
|
};
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
interface ExitVMResult {
|
|
172
|
+
finalMetaId: Identifier;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const exitVM = (
|
|
176
|
+
state: TypingTranspileState,
|
|
177
|
+
errorRange?: [number, number],
|
|
178
|
+
): ExitVMResult => {
|
|
172
179
|
const currentDefTypeId = state.vmDefTypeIdStack.pop()!;
|
|
173
180
|
const currentMetaId = state.metaTypeIdStack.pop()!;
|
|
174
181
|
const finalMetaId = state.finalMetaTypeIdStack.pop()!;
|
|
@@ -183,17 +190,24 @@ const exitVM = (state: TypingTranspileState, errorRange?: [number, number]) => {
|
|
|
183
190
|
errorRange,
|
|
184
191
|
}),
|
|
185
192
|
);
|
|
193
|
+
return { finalMetaId };
|
|
186
194
|
};
|
|
187
195
|
|
|
196
|
+
interface EnterAttrResult {
|
|
197
|
+
lhsId: Identifier;
|
|
198
|
+
}
|
|
199
|
+
|
|
188
200
|
const enterAttr = (
|
|
189
201
|
state: TypingTranspileState,
|
|
190
202
|
attrName: string,
|
|
191
|
-
):
|
|
203
|
+
): EnterAttrResult => {
|
|
192
204
|
const defTypeId = state.vmDefTypeIdStack.at(-1);
|
|
193
205
|
const metaTypeId = state.metaTypeIdStack.at(-1);
|
|
194
206
|
if (!defTypeId || !metaTypeId) {
|
|
195
207
|
// FIXME error handling?
|
|
196
|
-
return {
|
|
208
|
+
return {
|
|
209
|
+
lhsId: { type: "Identifier", name: "__gts_invalid_attr_obj" },
|
|
210
|
+
};
|
|
197
211
|
}
|
|
198
212
|
state.attrsOfCurrentVm.at(-1)!.push(attrName);
|
|
199
213
|
const lhsId: Identifier = {
|
|
@@ -210,7 +224,7 @@ const enterAttr = (
|
|
|
210
224
|
hintOnly: attrName === ATTR_HINT_ATTR_NAME,
|
|
211
225
|
}),
|
|
212
226
|
);
|
|
213
|
-
return { lhsId
|
|
227
|
+
return { lhsId };
|
|
214
228
|
};
|
|
215
229
|
|
|
216
230
|
const genBindingTyping = (
|
|
@@ -236,7 +250,12 @@ const genBindingTyping = (
|
|
|
236
250
|
);
|
|
237
251
|
};
|
|
238
252
|
|
|
239
|
-
const exitAttr = (
|
|
253
|
+
const exitAttr = (
|
|
254
|
+
state: TypingTranspileState,
|
|
255
|
+
attrName: string,
|
|
256
|
+
innerVMFinalMetaId: Identifier,
|
|
257
|
+
returningId: Identifier,
|
|
258
|
+
) => {
|
|
240
259
|
const currentDefId = state.vmDefTypeIdStack.at(-1);
|
|
241
260
|
if (!currentDefId) {
|
|
242
261
|
return;
|
|
@@ -250,6 +269,8 @@ const exitAttr = (state: TypingTranspileState, returningId: Identifier) => {
|
|
|
250
269
|
createReplacementHolder(state, {
|
|
251
270
|
type: "exitAttr",
|
|
252
271
|
defType: currentDefId.name,
|
|
272
|
+
attrName,
|
|
273
|
+
innerMetaType: innerVMFinalMetaId.name,
|
|
253
274
|
oldMetaType: oldMetaTypeId.name,
|
|
254
275
|
newMetaType: newMetaTypeId.name,
|
|
255
276
|
returnType: returningId.name,
|
|
@@ -473,11 +494,12 @@ export const gtsToTypingsWalker: Visitors<Node, TypingTranspileState> = {
|
|
|
473
494
|
],
|
|
474
495
|
});
|
|
475
496
|
enterVMFromAttr(state, returnValue);
|
|
497
|
+
let exitVMResult: ExitVMResult;
|
|
476
498
|
if (body.namedAttributes) {
|
|
477
499
|
visit(body.namedAttributes);
|
|
478
|
-
exitVM(state, body.namedAttributes.range);
|
|
500
|
+
exitVMResult = exitVM(state, body.namedAttributes.range);
|
|
479
501
|
} else {
|
|
480
|
-
exitVM(state, name.range);
|
|
502
|
+
exitVMResult = exitVM(state, name.range);
|
|
481
503
|
}
|
|
482
504
|
if (bindingName) {
|
|
483
505
|
const export_ = node.bindingAccessModifier !== "private";
|
|
@@ -505,7 +527,7 @@ export const gtsToTypingsWalker: Visitors<Node, TypingTranspileState> = {
|
|
|
505
527
|
leadingComments: state.defineLeadingComments,
|
|
506
528
|
});
|
|
507
529
|
}
|
|
508
|
-
exitAttr(state, returnValue);
|
|
530
|
+
exitAttr(state, attrName, exitVMResult.finalMetaId, returnValue);
|
|
509
531
|
return EMPTY;
|
|
510
532
|
},
|
|
511
533
|
GTSNamedAttributeBlock(node, { state, visit }) {
|