@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") replacement = dedent`
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 ${payload.newMetaType} = ${payload.returnType} extends { rewriteMeta: infer NewMeta extends {} } ? NewMeta : ${payload.oldMetaType}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gi-tcg/gts-transpiler",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/piovium/gts.git"
@@ -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 ${payload.newMetaType} = ${payload.returnType} extends { rewriteMeta: infer NewMeta extends {} } ? NewMeta : ${payload.oldMetaType}
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
- const exitVM = (state: TypingTranspileState, errorRange?: [number, number]) => {
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
- ): { lhsId: Identifier } => {
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 { lhsId: { type: "Identifier", name: "__gts_invalid_attr_obj" } };
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: 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 = (state: TypingTranspileState, returningId: Identifier) => {
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 }) {