@grey-ts/transpiler 0.3.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/LICENSE +1 -1
  2. package/dist/index.js +171 -100
  3. package/package.json +2 -2
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2025 Oskari Hirsikangas
1
+ Copyright 2026 Oskari Hirsikangas
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
4
 
package/dist/index.js CHANGED
@@ -234,6 +234,8 @@ var propertyAccessReplacements = {
234
234
  "Math.round": "round",
235
235
  "Math.random": "rnd",
236
236
  "Math.log": "log",
237
+ "console.log": "print",
238
+ "console.clear": "clear_screen",
237
239
  "String.prototype": "string",
238
240
  "Number.prototype": "number",
239
241
  "Boolean.prototype": "number",
@@ -432,8 +434,34 @@ ${name}.${NodeHandler.handle(member)}`;
432
434
  NodeHandler.register(ts5.SyntaxKind.Constructor, (node) => {
433
435
  if (!node.body)
434
436
  return "";
435
- const params = node.parameters.map((param) => NodeHandler.handle(param)).join(", ");
436
- const body = NodeHandler.handle(node.body);
437
+ const declaredProperties = [];
438
+ const params = node.parameters.map((param) => {
439
+ const res = NodeHandler.handle(param);
440
+ if (param.modifiers) {
441
+ const paramName = NodeHandler.handle(param.name);
442
+ const declaration = ` self.${paramName} = ${paramName}`;
443
+ declaredProperties.push(declaration);
444
+ }
445
+ return res;
446
+ }).join(", ");
447
+ let body = NodeHandler.handle(node.body);
448
+ if (declaredProperties.length) {
449
+ const propertiesStr = declaredProperties.join(`
450
+ `);
451
+ const lines = body.split(`
452
+ `);
453
+ const superIndex = lines.findIndex((line) => line.includes("super.constructor"));
454
+ if (superIndex !== -1) {
455
+ body = `${lines.slice(0, superIndex + 1).join(`
456
+ `)}
457
+ ${propertiesStr}
458
+ ${lines.slice(superIndex + 1).join(`
459
+ `)}`;
460
+ } else {
461
+ body = `${propertiesStr}
462
+ ${body}`;
463
+ }
464
+ }
437
465
  return `constructor = function(${params})
438
466
  ${body}
439
467
  return self
@@ -460,7 +488,7 @@ end function`;
460
488
  // src/visitors/expressions.ts
461
489
  import ts7 from "typescript";
462
490
 
463
- // src/callTransformer.ts
491
+ // src/call_transformers/callTransformer.ts
464
492
  import path2 from "node:path";
465
493
  import ts6 from "typescript";
466
494
  class CallTransformer {
@@ -477,60 +505,6 @@ class CallTransformer {
477
505
  return handler(functionName, callArgs, node, ctx);
478
506
  }
479
507
  }
480
- CallTransformer.register("Array.concat", (name, args) => {
481
- const dotI = name.lastIndexOf(".");
482
- const arrayName = name.slice(0, dotI);
483
- return callUtilFunction("array_concat", arrayName, args.join(","));
484
- });
485
- CallTransformer.register("Array.map", (name, args) => {
486
- if (!args.length)
487
- throw "Invalid argument count";
488
- return callUtilFunction("array_map", name.slice(0, name.lastIndexOf(".")), args[0]);
489
- });
490
- CallTransformer.register("Array.filter", (name, args) => {
491
- if (!args.length)
492
- throw "Invalid argument count";
493
- return callUtilFunction("array_filter", name.slice(0, name.lastIndexOf(".")), args[0]);
494
- });
495
- CallTransformer.register("Array.find", (name, args) => {
496
- if (!args.length)
497
- throw "Invalid argument count";
498
- return callUtilFunction("array_find", name.slice(0, name.lastIndexOf(".")), args[0]);
499
- });
500
- CallTransformer.register("Array.some", (name, args) => {
501
- if (!args.length)
502
- throw "Invalid argument count";
503
- return callUtilFunction("array_some", name.slice(0, name.lastIndexOf(".")), args[0]);
504
- });
505
- CallTransformer.register("Array.every", (name, args) => {
506
- if (!args.length)
507
- throw "Invalid argument count";
508
- return callUtilFunction("array_every", name.slice(0, name.lastIndexOf(".")), args[0]);
509
- });
510
- CallTransformer.register("Array.slice", (name, args) => {
511
- return name.slice(0, name.lastIndexOf(".")) + `[${args[0] ?? ""}:${args[1] ?? ""}]`;
512
- });
513
- CallTransformer.register("Array.push", (name, args) => {
514
- if (!args.length)
515
- throw "Invalid argument count";
516
- return callUtilFunction("array_push", name.slice(0, name.lastIndexOf(".")), args[0]);
517
- });
518
- CallTransformer.register("Array.unshift", (name, args) => {
519
- if (!args.length)
520
- throw "Invalid argument count";
521
- return callUtilFunction("array_unshift", name.slice(0, name.lastIndexOf(".")), args[0]);
522
- });
523
- CallTransformer.register("Array.toString", (name) => {
524
- const arrayName = name.slice(0, name.lastIndexOf("."));
525
- return `str(${arrayName})`;
526
- });
527
- CallTransformer.register("Array.reverse", (name) => {
528
- return callUtilFunction("array_reverse", name.slice(0, name.lastIndexOf(".")));
529
- });
530
- CallTransformer.register("Object.toString", (name) => {
531
- const objectName = name.slice(0, name.lastIndexOf("."));
532
- return `str(${objectName})`;
533
- });
534
508
  CallTransformer.register("Number.toString", (name) => {
535
509
  const number = name.slice(0, name.lastIndexOf("."));
536
510
  return `str(${number})`;
@@ -539,49 +513,12 @@ CallTransformer.register("Function.toString", (name) => {
539
513
  const func = name.slice(0, name.lastIndexOf("."));
540
514
  return `str(@${func})`;
541
515
  });
542
- CallTransformer.register("String.startsWith", (name, args) => {
543
- if (!args.length)
544
- throw "Invalid argument count";
545
- return callUtilFunction("str_starts_with", name.slice(0, name.lastIndexOf(".")), ...args);
546
- });
547
- CallTransformer.register("String.endsWith", (name, args) => {
548
- if (!args.length)
549
- throw "Invalid argument count";
550
- return callUtilFunction("str_ends_with", name.slice(0, name.lastIndexOf(".")), ...args);
551
- });
552
- CallTransformer.register("String.repeat", (name, args) => {
553
- if (!args.length)
554
- throw "Invalid argument count";
555
- return callUtilFunction("str_repeat", name.slice(0, name.lastIndexOf(".")), ...args);
556
- });
557
- CallTransformer.register("String.slice", (name, args) => {
558
- return name.slice(0, name.lastIndexOf(".")) + `[${args[0] ?? ""}:${args[1] ?? ""}]`;
559
- });
560
- CallTransformer.register("String.toString", (name) => {
561
- return name.slice(0, name.lastIndexOf("."));
562
- });
563
516
  CallTransformer.register("Math.min", (name, args) => {
564
517
  return callUtilFunction("math_min", `${args.join(",")}`);
565
518
  });
566
519
  CallTransformer.register("Math.max", (name, args) => {
567
520
  return callUtilFunction("math_max", `${args.join(",")}`);
568
521
  });
569
- CallTransformer.register("ObjectConstructor.hasOwn", (name, args) => {
570
- if (args.length < 2)
571
- throw "Invalid argument count";
572
- return `${args[0]}.hasIndex(${args[1]})`;
573
- });
574
- CallTransformer.register("ObjectConstructor.assign", (name, args) => {
575
- if (args.length < 2)
576
- throw "Invalid argument count";
577
- return callUtilFunction("assign_objects", args.join(","));
578
- });
579
- CallTransformer.register("ObjectConstructor.keys", (name, args) => {
580
- return `${args[0]}.indexes`;
581
- });
582
- CallTransformer.register("ObjectConstructor.values", (name, args) => {
583
- return `${args[0]}.values`;
584
- });
585
522
  CallTransformer.register("GreyHack.include", (name, args, node, ctx) => {
586
523
  if (!node.arguments.length)
587
524
  return "";
@@ -692,6 +629,8 @@ function handleCallArgs(callNode, ctx) {
692
629
  if (restArrays.length) {
693
630
  result.push(restArrays.join(" + "));
694
631
  }
632
+ if (hasRestParameter && result.length === params.length - 1)
633
+ result.push("[]");
695
634
  return result;
696
635
  }
697
636
  NodeHandler.register(ts7.SyntaxKind.CallExpression, (node, ctx) => {
@@ -968,17 +907,30 @@ NodeHandler.register(ts9.SyntaxKind.Parameter, (node) => {
968
907
  const name = NodeHandler.handle(node.name);
969
908
  if (!node.initializer)
970
909
  return name;
971
- return `${name} = ${NodeHandler.handle(node.initializer)}`;
910
+ const initializer = NodeHandler.handle(node.initializer);
911
+ const initializerType = checker.getTypeAtLocation(node.initializer);
912
+ if (initializerType.flags === ts9.TypeFlags.Object) {
913
+ throw `You can't initialize parameter '${name}' with an Array or an Object as that won't work in GreyScript and it would be null`;
914
+ }
915
+ return `${name} = ${initializer}`;
972
916
  });
973
917
  NodeHandler.register(ts9.SyntaxKind.NumericLiteral, (node) => node.text);
974
918
  NodeHandler.register(ts9.SyntaxKind.StringLiteral, (node) => `"${transformString(node.text)}"`);
975
- NodeHandler.register(ts9.SyntaxKind.ThisKeyword, () => "self");
976
919
  NodeHandler.register(ts9.SyntaxKind.NullKeyword, () => "null");
977
920
  NodeHandler.register(ts9.SyntaxKind.UndefinedKeyword, () => "null");
978
921
  NodeHandler.register(ts9.SyntaxKind.FalseKeyword, () => "0");
979
922
  NodeHandler.register(ts9.SyntaxKind.TrueKeyword, () => "1");
923
+ NodeHandler.register(ts9.SyntaxKind.ThisKeyword, (node) => {
924
+ const propDeclarationAncestor = ts9.findAncestor(node.parent, (n) => ts9.isPropertyDeclaration(n));
925
+ if (propDeclarationAncestor) {
926
+ if (!propDeclarationAncestor.parent.name)
927
+ throw `Can't handle this 'this' keyword becuase the class doesn't have a name and it's needed for this case`;
928
+ return propDeclarationAncestor.parent.name.text;
929
+ }
930
+ return "self";
931
+ });
980
932
  NodeHandler.register(ts9.SyntaxKind.SuperKeyword, (node) => {
981
- if (ts9.isPropertyAccessExpression(node.parent))
933
+ if (ts9.isPropertyAccessExpression(node.parent) || ts9.isElementAccessExpression(node.parent))
982
934
  return "super";
983
935
  return "super.constructor";
984
936
  });
@@ -1307,7 +1259,7 @@ import ts13 from "typescript";
1307
1259
  function handleVariableDeclaration(node, ctx) {
1308
1260
  const left = NodeHandler.handle(node.name);
1309
1261
  const initializerType = node.initializer ? checker.getTypeAtLocation(node.initializer) : undefined;
1310
- if (ts13.isPropertyDeclaration(node) && initializerType?.flags === ts13.TypeFlags.Object) {
1262
+ if (ts13.isPropertyDeclaration(node) && initializerType?.flags === ts13.TypeFlags.Object && !node.modifiers?.some((mod) => mod.kind === ts13.SyntaxKind.StaticKeyword)) {
1311
1263
  console.warn(`You shouldn't initialize '${left}' with an Array or an Object because in GreyScript, every instantiation refers to the same '${left}' variable.
1312
1264
  Initialize them in the constructor instead`);
1313
1265
  }
@@ -1343,6 +1295,124 @@ NodeHandler.register(ts13.SyntaxKind.EnumDeclaration, (node) => {
1343
1295
  return `${node.name.text} = { ${members.join(", ")} }`;
1344
1296
  });
1345
1297
 
1298
+ // src/call_transformers/array.ts
1299
+ CallTransformer.register("Array.concat", (name, args) => {
1300
+ const dotI = name.lastIndexOf(".");
1301
+ const arrayName = name.slice(0, dotI);
1302
+ return callUtilFunction("array_concat", arrayName, args.join(","));
1303
+ });
1304
+ CallTransformer.register("Array.map", (name, args) => {
1305
+ if (!args.length)
1306
+ throw "Invalid argument count";
1307
+ return callUtilFunction("array_map", name.slice(0, name.lastIndexOf(".")), args[0]);
1308
+ });
1309
+ CallTransformer.register("Array.filter", (name, args) => {
1310
+ if (!args.length)
1311
+ throw "Invalid argument count";
1312
+ return callUtilFunction("array_filter", name.slice(0, name.lastIndexOf(".")), args[0]);
1313
+ });
1314
+ CallTransformer.register("Array.find", (name, args) => {
1315
+ if (!args.length)
1316
+ throw "Invalid argument count";
1317
+ return callUtilFunction("array_find", name.slice(0, name.lastIndexOf(".")), args[0]);
1318
+ });
1319
+ CallTransformer.register("Array.some", (name, args) => {
1320
+ if (!args.length)
1321
+ throw "Invalid argument count";
1322
+ return callUtilFunction("array_some", name.slice(0, name.lastIndexOf(".")), args[0]);
1323
+ });
1324
+ CallTransformer.register("Array.every", (name, args) => {
1325
+ if (!args.length)
1326
+ throw "Invalid argument count";
1327
+ return callUtilFunction("array_every", name.slice(0, name.lastIndexOf(".")), args[0]);
1328
+ });
1329
+ CallTransformer.register("Array.slice", (name, args) => {
1330
+ return name.slice(0, name.lastIndexOf(".")) + `[${args[0] ?? ""}:${args[1] ?? ""}]`;
1331
+ });
1332
+ CallTransformer.register("Array.push", (name, args) => {
1333
+ if (!args.length)
1334
+ throw "Invalid argument count";
1335
+ return callUtilFunction("array_push", name.slice(0, name.lastIndexOf(".")), args[0]);
1336
+ });
1337
+ CallTransformer.register("Array.unshift", (name, args) => {
1338
+ if (!args.length)
1339
+ throw "Invalid argument count";
1340
+ return callUtilFunction("array_unshift", name.slice(0, name.lastIndexOf(".")), args[0]);
1341
+ });
1342
+ CallTransformer.register("Array.toString", (name) => {
1343
+ const arrayName = name.slice(0, name.lastIndexOf("."));
1344
+ return `str(${arrayName})`;
1345
+ });
1346
+ CallTransformer.register("Array.reverse", (name) => {
1347
+ return callUtilFunction("array_reverse", name.slice(0, name.lastIndexOf(".")));
1348
+ });
1349
+
1350
+ // src/call_transformers/object.ts
1351
+ CallTransformer.register("ObjectConstructor.hasOwn", (name, args) => {
1352
+ if (args.length < 2)
1353
+ throw "Invalid argument count";
1354
+ return `${args[0]}.hasIndex(${args[1]})`;
1355
+ });
1356
+ CallTransformer.register("ObjectConstructor.assign", (name, args) => {
1357
+ if (args.length < 2)
1358
+ throw "Invalid argument count";
1359
+ return callUtilFunction("assign_objects", args.join(","));
1360
+ });
1361
+ CallTransformer.register("ObjectConstructor.keys", (name, args) => {
1362
+ return `${args[0]}.indexes`;
1363
+ });
1364
+ CallTransformer.register("ObjectConstructor.values", (name, args) => {
1365
+ return `${args[0]}.values`;
1366
+ });
1367
+ CallTransformer.register("ObjectConstructor.sum", (name, args) => {
1368
+ return `${args[0]}.sum`;
1369
+ });
1370
+ CallTransformer.register("ObjectConstructor.shuffle", (name, args) => {
1371
+ return `${args[0]}.shuffle`;
1372
+ });
1373
+ CallTransformer.register("ObjectConstructor.replace", (name, args) => {
1374
+ return `${args[0]}.replace(${args.slice(1).join(",")})`;
1375
+ });
1376
+ CallTransformer.register("ObjectConstructor.remove", (name, args) => {
1377
+ return `${args[0]}.remove(${args[1]})`;
1378
+ });
1379
+ CallTransformer.register("ObjectConstructor.shift", (name, args) => {
1380
+ return `${args[0]}.pull`;
1381
+ });
1382
+ CallTransformer.register("ObjectConstructor.size", (name, args) => {
1383
+ return `${args[0]}.len`;
1384
+ });
1385
+ CallTransformer.register("ObjectConstructor.indexOf", (name, args) => {
1386
+ return `${args[0]}.indexOf(${args[1]})`;
1387
+ });
1388
+ CallTransformer.register("Object.toString", (name) => {
1389
+ const objectName = name.slice(0, name.lastIndexOf("."));
1390
+ return `str(${objectName})`;
1391
+ });
1392
+
1393
+ // src/call_transformers/string.ts
1394
+ CallTransformer.register("String.startsWith", (name, args) => {
1395
+ if (!args.length)
1396
+ throw "Invalid argument count";
1397
+ return callUtilFunction("str_starts_with", name.slice(0, name.lastIndexOf(".")), ...args);
1398
+ });
1399
+ CallTransformer.register("String.endsWith", (name, args) => {
1400
+ if (!args.length)
1401
+ throw "Invalid argument count";
1402
+ return callUtilFunction("str_ends_with", name.slice(0, name.lastIndexOf(".")), ...args);
1403
+ });
1404
+ CallTransformer.register("String.repeat", (name, args) => {
1405
+ if (!args.length)
1406
+ throw "Invalid argument count";
1407
+ return callUtilFunction("str_repeat", name.slice(0, name.lastIndexOf(".")), ...args);
1408
+ });
1409
+ CallTransformer.register("String.slice", (name, args) => {
1410
+ return name.slice(0, name.lastIndexOf(".")) + `[${args[0] ?? ""}:${args[1] ?? ""}]`;
1411
+ });
1412
+ CallTransformer.register("String.toString", (name) => {
1413
+ return name.slice(0, name.lastIndexOf("."));
1414
+ });
1415
+
1346
1416
  // src/transpiler.ts
1347
1417
  var program;
1348
1418
  var checker;
@@ -1357,8 +1427,9 @@ var utilFunctions2 = {
1357
1427
  '\twhile isaobj.hasIndex("__isa")',
1358
1428
  '\t\tisaobj = obj["__isa"]',
1359
1429
  "\t\tif isaobj.hasIndex(key) then",
1360
- "\t\t\tval = obj[key]",
1361
- "\t\t\treturn val",
1430
+ "\t\t\tres = obj[key]",
1431
+ '\t\t\tif typeof(@res) == "function" and str(@res)[8:][1:-1].indexOf("self") == 0 then return res(obj)',
1432
+ "\t\t\treturn obj[key]",
1362
1433
  "\t\tend if",
1363
1434
  "\tend while",
1364
1435
  "\treturn null",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grey-ts/transpiler",
3
- "version": "0.3.2",
3
+ "version": "1.1.0",
4
4
  "description": "Transpiles TypeScript into GreyScript",
5
5
  "author": "Okka",
6
6
  "module": "src/index.ts",
@@ -40,6 +40,6 @@
40
40
  "typescript": "^5"
41
41
  },
42
42
  "dependencies": {
43
- "@grey-ts/types": "^1.5.0"
43
+ "@grey-ts/types": "^2.0.0"
44
44
  }
45
45
  }