typescript-to-lua 1.21.0 → 1.23.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/LuaAST.d.ts CHANGED
@@ -33,25 +33,25 @@ export declare enum SyntaxKind {
33
33
  Identifier = 29,
34
34
  TableIndexExpression = 30,
35
35
  ParenthesizedExpression = 31,
36
- AdditionOperator = 32,
36
+ AdditionOperator = 32,// Maybe use abbreviations for those add, sub, mul ...
37
37
  SubtractionOperator = 33,
38
38
  MultiplicationOperator = 34,
39
39
  DivisionOperator = 35,
40
40
  FloorDivisionOperator = 36,
41
41
  ModuloOperator = 37,
42
42
  PowerOperator = 38,
43
- NegationOperator = 39,
43
+ NegationOperator = 39,// Unary minus
44
44
  ConcatOperator = 40,
45
- LengthOperator = 41,
45
+ LengthOperator = 41,// Unary
46
46
  EqualityOperator = 42,
47
47
  InequalityOperator = 43,
48
48
  LessThanOperator = 44,
49
49
  LessEqualOperator = 45,
50
50
  GreaterThanOperator = 46,
51
- GreaterEqualOperator = 47,
51
+ GreaterEqualOperator = 47,// Syntax Sugar `x >= y` <=> `not (y < x)`
52
52
  AndOperator = 48,
53
53
  OrOperator = 49,
54
- NotOperator = 50,
54
+ NotOperator = 50,// Unary
55
55
  BitwiseAndOperator = 51,
56
56
  BitwiseOrOperator = 52,
57
57
  BitwiseExclusiveOrOperator = 53,
@@ -69,8 +69,8 @@ export type SymbolId = number & {
69
69
  };
70
70
  export declare enum NodeFlags {
71
71
  None = 0,
72
- Inline = 1,
73
- Declaration = 2,
72
+ Inline = 1,// Keep function body on same line
73
+ Declaration = 2,// Prefer declaration syntax `function foo()` over assignment syntax `foo = function()`
74
74
  TableUnpackCall = 4
75
75
  }
76
76
  export interface TextRange {
package/dist/LuaLib.d.ts CHANGED
@@ -60,6 +60,7 @@ export declare enum LuaLibFeature {
60
60
  New = "New",
61
61
  Number = "Number",
62
62
  NumberIsFinite = "NumberIsFinite",
63
+ NumberIsInteger = "NumberIsInteger",
63
64
  NumberIsNaN = "NumberIsNaN",
64
65
  NumberParseInt = "ParseInt",
65
66
  NumberParseFloat = "ParseFloat",
package/dist/LuaLib.js CHANGED
@@ -65,6 +65,7 @@ var LuaLibFeature;
65
65
  LuaLibFeature["New"] = "New";
66
66
  LuaLibFeature["Number"] = "Number";
67
67
  LuaLibFeature["NumberIsFinite"] = "NumberIsFinite";
68
+ LuaLibFeature["NumberIsInteger"] = "NumberIsInteger";
68
69
  LuaLibFeature["NumberIsNaN"] = "NumberIsNaN";
69
70
  LuaLibFeature["NumberParseInt"] = "ParseInt";
70
71
  LuaLibFeature["NumberParseFloat"] = "ParseFloat";
@@ -0,0 +1,3 @@
1
+ local function __TS__NumberIsInteger(value)
2
+ return __TS__NumberIsFinite(value) and math.floor(value) == value
3
+ end
@@ -1,6 +1,6 @@
1
1
  local function __TS__Unpack(list, i, j)
2
2
  if i == 1 and j == nil then
3
- return unpack(nil, list)
3
+ return unpack(list)
4
4
  else
5
5
  if j == nil then
6
6
  j = table.getn(list)
@@ -1241,7 +1241,7 @@ end
1241
1241
 
1242
1242
  local function __TS__Unpack(list, i, j)
1243
1243
  if i == 1 and j == nil then
1244
- return unpack(nil, list)
1244
+ return unpack(list)
1245
1245
  else
1246
1246
  if j == nil then
1247
1247
  j = table.getn(list)
@@ -1526,6 +1526,10 @@ local function __TS__NumberIsFinite(value)
1526
1526
  return type(value) == "number" and value == value and value ~= 1 / 0 and value ~= -(1 / 0)
1527
1527
  end
1528
1528
 
1529
+ local function __TS__NumberIsInteger(value)
1530
+ return __TS__NumberIsFinite(value) and math.floor(value) == value
1531
+ end
1532
+
1529
1533
  local function __TS__NumberIsNaN(value)
1530
1534
  return value ~= value
1531
1535
  end
@@ -2627,6 +2631,7 @@ return {
2627
2631
  __TS__New = __TS__New,
2628
2632
  __TS__Number = __TS__Number,
2629
2633
  __TS__NumberIsFinite = __TS__NumberIsFinite,
2634
+ __TS__NumberIsInteger = __TS__NumberIsInteger,
2630
2635
  __TS__NumberIsNaN = __TS__NumberIsNaN,
2631
2636
  __TS__ParseInt = __TS__ParseInt,
2632
2637
  __TS__ParseFloat = __TS__ParseFloat,
@@ -381,6 +381,14 @@
381
381
  "__TS__NumberIsFinite"
382
382
  ]
383
383
  },
384
+ "NumberIsInteger": {
385
+ "exports": [
386
+ "__TS__NumberIsInteger"
387
+ ],
388
+ "dependencies": [
389
+ "NumberIsFinite"
390
+ ]
391
+ },
384
392
  "NumberIsNaN": {
385
393
  "exports": [
386
394
  "__TS__NumberIsNaN"
@@ -0,0 +1,3 @@
1
+ local function __TS__NumberIsInteger(value)
2
+ return __TS__NumberIsFinite(value) and math.floor(value) == value
3
+ end
@@ -1466,6 +1466,10 @@ local function __TS__NumberIsFinite(value)
1466
1466
  return type(value) == "number" and value == value and value ~= math.huge and value ~= -math.huge
1467
1467
  end
1468
1468
 
1469
+ local function __TS__NumberIsInteger(value)
1470
+ return __TS__NumberIsFinite(value) and math.floor(value) == value
1471
+ end
1472
+
1469
1473
  local function __TS__NumberIsNaN(value)
1470
1474
  return value ~= value
1471
1475
  end
@@ -2567,6 +2571,7 @@ return {
2567
2571
  __TS__New = __TS__New,
2568
2572
  __TS__Number = __TS__Number,
2569
2573
  __TS__NumberIsFinite = __TS__NumberIsFinite,
2574
+ __TS__NumberIsInteger = __TS__NumberIsInteger,
2570
2575
  __TS__NumberIsNaN = __TS__NumberIsNaN,
2571
2576
  __TS__ParseInt = __TS__ParseInt,
2572
2577
  __TS__ParseFloat = __TS__ParseFloat,
@@ -387,6 +387,14 @@
387
387
  "__TS__NumberIsFinite"
388
388
  ]
389
389
  },
390
+ "NumberIsInteger": {
391
+ "exports": [
392
+ "__TS__NumberIsInteger"
393
+ ],
394
+ "dependencies": [
395
+ "NumberIsFinite"
396
+ ]
397
+ },
390
398
  "NumberIsNaN": {
391
399
  "exports": [
392
400
  "__TS__NumberIsNaN"
@@ -74,6 +74,8 @@ function transformNumberConstructorCall(context, node, calledMethod) {
74
74
  const parameters = (0, call_1.transformArguments)(context, node.arguments);
75
75
  const methodName = calledMethod.name.text;
76
76
  switch (methodName) {
77
+ case "isInteger":
78
+ return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.NumberIsInteger, node, ...parameters);
77
79
  case "isNaN":
78
80
  return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.NumberIsNaN, node, ...parameters);
79
81
  case "isFinite":
@@ -6,5 +6,5 @@ export declare enum ContextType {
6
6
  NonVoid = 2,
7
7
  Mixed = 3
8
8
  }
9
- export declare function getDeclarationContextType(context: TransformationContext, signatureDeclaration: ts.SignatureDeclaration): ContextType;
9
+ export declare function getCallContextType(context: TransformationContext, callExpression: ts.CallLikeExpression): ContextType;
10
10
  export declare function getFunctionContextType(context: TransformationContext, type: ts.Type): ContextType;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getFunctionContextType = exports.getDeclarationContextType = exports.ContextType = void 0;
3
+ exports.getFunctionContextType = exports.getCallContextType = exports.ContextType = void 0;
4
4
  const ts = require("typescript");
5
5
  const annotations_1 = require("./annotations");
6
6
  const typescript_1 = require("./typescript");
@@ -32,8 +32,33 @@ function getExplicitThisParameter(signatureDeclaration) {
32
32
  return param;
33
33
  }
34
34
  }
35
+ const callContextTypes = new WeakMap();
36
+ function getCallContextType(context, callExpression) {
37
+ const known = callContextTypes.get(callExpression);
38
+ if (known !== undefined)
39
+ return known;
40
+ const signature = context.checker.getResolvedSignature(callExpression);
41
+ const signatureDeclaration = signature === null || signature === void 0 ? void 0 : signature.getDeclaration();
42
+ let contextType = ContextType.None;
43
+ if (signatureDeclaration) {
44
+ contextType = computeDeclarationContextType(context, signatureDeclaration);
45
+ }
46
+ else {
47
+ // No signature declaration could be resolved, so instead try to see if the declaration is in a
48
+ // noSelfInFile file
49
+ const declarations = findRootDeclarations(context, callExpression);
50
+ contextType = declarations.some(d => (0, annotations_1.getFileAnnotations)(d.getSourceFile()).has(annotations_1.AnnotationKind.NoSelfInFile))
51
+ ? ContextType.Void
52
+ : context.options.noImplicitSelf
53
+ ? ContextType.Void
54
+ : ContextType.NonVoid;
55
+ }
56
+ callContextTypes.set(callExpression, contextType);
57
+ return contextType;
58
+ }
59
+ exports.getCallContextType = getCallContextType;
35
60
  const signatureDeclarationContextTypes = new WeakMap();
36
- function getDeclarationContextType(context, signatureDeclaration) {
61
+ function getSignatureContextType(context, signatureDeclaration) {
37
62
  const known = signatureDeclarationContextTypes.get(signatureDeclaration);
38
63
  if (known !== undefined)
39
64
  return known;
@@ -41,7 +66,33 @@ function getDeclarationContextType(context, signatureDeclaration) {
41
66
  signatureDeclarationContextTypes.set(signatureDeclaration, contextType);
42
67
  return contextType;
43
68
  }
44
- exports.getDeclarationContextType = getDeclarationContextType;
69
+ function findRootDeclarations(context, callExpression) {
70
+ var _a, _b;
71
+ const calledExpression = ts.isTaggedTemplateExpression(callExpression)
72
+ ? callExpression.tag
73
+ : ts.isJsxSelfClosingElement(callExpression)
74
+ ? callExpression.tagName
75
+ : ts.isJsxOpeningElement(callExpression)
76
+ ? callExpression.tagName
77
+ : ts.isCallExpression(callExpression)
78
+ ? callExpression.expression
79
+ : undefined;
80
+ if (!calledExpression)
81
+ return [];
82
+ const calledSymbol = context.checker.getSymbolAtLocation(calledExpression);
83
+ if (calledSymbol === undefined)
84
+ return [];
85
+ return ((_b = (_a = calledSymbol.getDeclarations()) === null || _a === void 0 ? void 0 : _a.flatMap(d => {
86
+ var _a;
87
+ if (ts.isImportSpecifier(d)) {
88
+ const aliasSymbol = context.checker.getAliasedSymbol(calledSymbol);
89
+ return (_a = aliasSymbol.getDeclarations()) !== null && _a !== void 0 ? _a : [];
90
+ }
91
+ else {
92
+ return [d];
93
+ }
94
+ })) !== null && _b !== void 0 ? _b : []);
95
+ }
45
96
  function computeDeclarationContextType(context, signatureDeclaration) {
46
97
  const thisParameter = getExplicitThisParameter(signatureDeclaration);
47
98
  if (thisParameter) {
@@ -140,6 +191,6 @@ function computeFunctionContextType(context, type) {
140
191
  if (signatures.length === 0) {
141
192
  return ContextType.None;
142
193
  }
143
- return reduceContextTypes(signatures.flatMap(s => getSignatureDeclarations(context, s)).map(s => getDeclarationContextType(context, s)));
194
+ return reduceContextTypes(signatures.flatMap(s => getSignatureDeclarations(context, s)).map(s => getSignatureContextType(context, s)));
144
195
  }
145
196
  //# sourceMappingURL=function-context.js.map
@@ -4,6 +4,6 @@ import { FunctionVisitor, TransformationContext } from "../context";
4
4
  export declare function validateArguments(context: TransformationContext, params: readonly ts.Expression[], signature?: ts.Signature): void;
5
5
  export declare function transformArguments(context: TransformationContext, params: readonly ts.Expression[], signature?: ts.Signature, callContext?: ts.Expression): lua.Expression[];
6
6
  export declare function transformCallAndArguments(context: TransformationContext, callExpression: ts.Expression, params: readonly ts.Expression[], signature?: ts.Signature, callContext?: ts.Expression): [lua.Expression, lua.Expression[]];
7
- export declare function transformContextualCallExpression(context: TransformationContext, node: ts.CallExpression | ts.TaggedTemplateExpression, args: ts.Expression[] | ts.NodeArray<ts.Expression>, signature?: ts.Signature): lua.Expression;
7
+ export declare function transformContextualCallExpression(context: TransformationContext, node: ts.CallExpression | ts.TaggedTemplateExpression, args: ts.Expression[] | ts.NodeArray<ts.Expression>): lua.Expression;
8
8
  export declare const transformCallExpression: FunctionVisitor<ts.CallExpression>;
9
9
  export declare function getCalledExpression(node: ts.CallExpression): ts.Expression;
@@ -78,12 +78,12 @@ function transformElementAccessCall(context, left, transformedArguments, argPrec
78
78
  }
79
79
  return lua.createCallExpression(index, [selfIdentifier, ...transformedArguments]);
80
80
  }
81
- function transformContextualCallExpression(context, node, args, signature) {
81
+ function transformContextualCallExpression(context, node, args) {
82
82
  if (ts.isOptionalChain(node)) {
83
83
  return (0, optional_chaining_1.transformOptionalChain)(context, node);
84
84
  }
85
85
  const left = ts.isCallExpression(node) ? getCalledExpression(node) : node.tag;
86
- let { precedingStatements: argPrecedingStatements, result: transformedArguments } = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => transformArguments(context, args, signature));
86
+ let { precedingStatements: argPrecedingStatements, result: transformedArguments } = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => transformArguments(context, args));
87
87
  if (ts.isPropertyAccessExpression(left) &&
88
88
  ts.isIdentifier(left.name) &&
89
89
  (0, safe_names_1.isValidLuaIdentifier)(left.name.text, context.options) &&
@@ -126,10 +126,9 @@ function transformPropertyCall(context, node, calledMethod) {
126
126
  const parameters = transformArguments(context, node.arguments, signature, ts.factory.createThis());
127
127
  return lua.createCallExpression(context.transformExpression(node.expression), parameters, node);
128
128
  }
129
- const signatureDeclaration = signature === null || signature === void 0 ? void 0 : signature.getDeclaration();
130
- if (!signatureDeclaration || (0, function_context_1.getDeclarationContextType)(context, signatureDeclaration) !== function_context_1.ContextType.Void) {
129
+ if ((0, function_context_1.getCallContextType)(context, node) !== function_context_1.ContextType.Void) {
131
130
  // table:name()
132
- return transformContextualCallExpression(context, node, node.arguments, signature);
131
+ return transformContextualCallExpression(context, node, node.arguments);
133
132
  }
134
133
  else {
135
134
  // table.name()
@@ -138,15 +137,13 @@ function transformPropertyCall(context, node, calledMethod) {
138
137
  }
139
138
  }
140
139
  function transformElementCall(context, node) {
141
- const signature = context.checker.getResolvedSignature(node);
142
- const signatureDeclaration = signature === null || signature === void 0 ? void 0 : signature.getDeclaration();
143
- if (!signatureDeclaration || (0, function_context_1.getDeclarationContextType)(context, signatureDeclaration) !== function_context_1.ContextType.Void) {
140
+ if ((0, function_context_1.getCallContextType)(context, node) !== function_context_1.ContextType.Void) {
144
141
  // A contextual parameter must be given to this call expression
145
- return transformContextualCallExpression(context, node, node.arguments, signature);
142
+ return transformContextualCallExpression(context, node, node.arguments);
146
143
  }
147
144
  else {
148
145
  // No context
149
- const [expression, parameters] = transformCallAndArguments(context, node.expression, node.arguments, signature);
146
+ const [expression, parameters] = transformCallAndArguments(context, node.expression, node.arguments);
150
147
  return lua.createCallExpression(expression, parameters, node);
151
148
  }
152
149
  }
@@ -186,7 +183,7 @@ const transformCallExpression = (node, context) => {
186
183
  }
187
184
  let callPath;
188
185
  let parameters;
189
- const isContextualCall = isContextualCallExpression(context, signature);
186
+ const isContextualCall = (0, function_context_1.getCallContextType)(context, node) !== function_context_1.ContextType.Void;
190
187
  if (!isContextualCall) {
191
188
  [callPath, parameters] = transformCallAndArguments(context, calledExpression, node.arguments, signature);
192
189
  }
@@ -203,13 +200,6 @@ const transformCallExpression = (node, context) => {
203
200
  return wrapResultInTable ? (0, lua_ast_1.wrapInTable)(callExpression) : callExpression;
204
201
  };
205
202
  exports.transformCallExpression = transformCallExpression;
206
- function isContextualCallExpression(context, signature) {
207
- const declaration = signature === null || signature === void 0 ? void 0 : signature.getDeclaration();
208
- if (!declaration) {
209
- return !context.options.noImplicitSelf;
210
- }
211
- return (0, function_context_1.getDeclarationContextType)(context, declaration) !== function_context_1.ContextType.Void;
212
- }
213
203
  function getCalledExpression(node) {
214
204
  return ts.skipOuterExpressions(node.expression);
215
205
  }
@@ -66,14 +66,12 @@ const transformTaggedTemplateExpression = (expression, context) => {
66
66
  ]);
67
67
  expressions.unshift(stringObject);
68
68
  // Evaluate if there is a self parameter to be used.
69
- const signature = context.checker.getResolvedSignature(expression);
70
- const signatureDeclaration = signature === null || signature === void 0 ? void 0 : signature.getDeclaration();
71
- const useSelfParameter = signatureDeclaration && (0, function_context_1.getDeclarationContextType)(context, signatureDeclaration) !== function_context_1.ContextType.Void;
69
+ const useSelfParameter = (0, function_context_1.getCallContextType)(context, expression) !== function_context_1.ContextType.Void;
72
70
  if (useSelfParameter) {
73
- return (0, call_1.transformContextualCallExpression)(context, expression, expressions, signature);
71
+ return (0, call_1.transformContextualCallExpression)(context, expression, expressions);
74
72
  }
75
73
  // Argument evaluation.
76
- const callArguments = (0, call_1.transformArguments)(context, expressions, signature);
74
+ const callArguments = (0, call_1.transformArguments)(context, expressions);
77
75
  const leftHandSideExpression = context.transformExpression(expression.tag);
78
76
  return lua.createCallExpression(leftHandSideExpression, callArguments);
79
77
  };
@@ -29,6 +29,14 @@ export interface Plugin {
29
29
  * This function is called after translating the input program to Lua, after resolving dependencies and after bundling.
30
30
  */
31
31
  beforeEmit?: (program: ts.Program, options: CompilerOptions, emitHost: EmitHost, result: EmitFile[]) => ts.Diagnostic[] | void;
32
+ /**
33
+ * This function is called after translating the input program to Lua, after resolving dependencies, after bundling and writing files to disk.
34
+ */
35
+ afterEmit?: (program: ts.Program, options: CompilerOptions, emitHost: EmitHost, result: EmitFile[]) => ts.Diagnostic[] | void;
36
+ /**
37
+ * This function is called when trying to resolve the .lua file corresponding to a Lua require statement. Allows you to provide
38
+ * your own module resolution logic. If return value is undefined, regular module resolution is done.
39
+ */
32
40
  moduleResolution?: (moduleIdentifier: string, requiringFile: string, options: CompilerOptions, emitHost: EmitHost) => string | undefined;
33
41
  }
34
42
  export declare function getPlugins(program: ts.Program): {
@@ -13,7 +13,7 @@ const find_lua_requires_1 = require("./find-lua-requires");
13
13
  const picomatch = require("picomatch");
14
14
  const resolver = resolve.ResolverFactory.createResolver({
15
15
  extensions: [".lua"],
16
- enforceExtension: true,
16
+ enforceExtension: true, // Resolved file must be a lua file
17
17
  fileSystem: { ...new resolve.CachedInputFileSystem(fs, 0) },
18
18
  useSyncFileSystemCalls: true,
19
19
  conditionNames: ["require", "node", "tstl", "default"],
@@ -220,10 +220,10 @@ class ResolutionContext {
220
220
  }
221
221
  searchForFileFromPath(resolvedPath) {
222
222
  const possibleProjectFiles = [
223
- resolvedPath,
224
- resolvedPath + ".ts",
225
- path.join(resolvedPath, "index.ts"),
226
- resolvedPath + ".tsx",
223
+ resolvedPath, // JSON files need their extension as part of the import path, caught by this branch,
224
+ resolvedPath + ".ts", // Regular ts file
225
+ path.join(resolvedPath, "index.ts"), // Index ts file,
226
+ resolvedPath + ".tsx", // tsx file
227
227
  path.join(resolvedPath, "index.tsx"), // tsx index
228
228
  ];
229
229
  for (const possibleFile of possibleProjectFiles) {
@@ -233,8 +233,8 @@ class ResolutionContext {
233
233
  }
234
234
  // Check if this is a lua file in the project sources
235
235
  const possibleLuaProjectFiles = [
236
- resolvedPath + ".lua",
237
- path.join(resolvedPath, "index.lua"),
236
+ resolvedPath + ".lua", // lua file in sources
237
+ path.join(resolvedPath, "index.lua"), // lua index file in sources
238
238
  path.join(resolvedPath, "init.lua"), // lua looks for <require>/init.lua if it cannot find <require>.lua
239
239
  ];
240
240
  for (const possibleFile of possibleLuaProjectFiles) {
@@ -31,7 +31,7 @@ class Transpiler {
31
31
  };
32
32
  }
33
33
  emitFiles(program, plugins, emitPlan, writeFile) {
34
- var _a, _b;
34
+ var _a, _b, _c;
35
35
  performance.startSection("emit");
36
36
  const options = program.getCompilerOptions();
37
37
  if (options.tstlVerbose) {
@@ -54,6 +54,12 @@ class Transpiler {
54
54
  writeFile(outputPath + ".map", sourceMap, emitBOM, undefined, sourceFiles);
55
55
  }
56
56
  }
57
+ for (const plugin of plugins) {
58
+ if (plugin.afterEmit) {
59
+ const afterEmitPluginDiagnostics = (_c = plugin.afterEmit(program, options, this.emitHost, emitPlan)) !== null && _c !== void 0 ? _c : [];
60
+ diagnostics.push(...afterEmitPluginDiagnostics);
61
+ }
62
+ }
57
63
  if (options.tstlVerbose) {
58
64
  console.log("Emit finished!");
59
65
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typescript-to-lua",
3
- "version": "1.21.0",
3
+ "version": "1.23.0",
4
4
  "description": "A generic TypeScript to Lua transpiler. Write your code in TypeScript and publish Lua!",
5
5
  "repository": "https://github.com/TypeScriptToLua/TypeScriptToLua",
6
6
  "homepage": "https://typescripttolua.github.io/",
@@ -42,7 +42,7 @@
42
42
  "node": ">=16.10.0"
43
43
  },
44
44
  "peerDependencies": {
45
- "typescript": "5.2.2"
45
+ "typescript": "5.3.3"
46
46
  },
47
47
  "dependencies": {
48
48
  "@typescript-to-lua/language-extensions": "1.19.0",
@@ -72,6 +72,6 @@
72
72
  "prettier": "^2.8.4",
73
73
  "ts-jest": "^29.1.0",
74
74
  "ts-node": "^10.9.1",
75
- "typescript": "^5.2.2"
75
+ "typescript": "^5.3.3"
76
76
  }
77
77
  }