From 0cf669664c8824a9e5a67dae74771758df4568fb Mon Sep 17 00:00:00 2001 From: GlassBricks <24237065+GlassBricks@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:17:29 -0800 Subject: [PATCH 1/6] Update typescript dependency --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index c81232199..e1293fd62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,13 +37,13 @@ "prettier": "^2.3.2", "ts-jest": "^28.0.8", "ts-node": "^10.9.1", - "typescript": "~4.8.2" + "typescript": "~4.9.3" }, "engines": { "node": ">=16.10.0" }, "peerDependencies": { - "typescript": "~4.8.2" + "typescript": "~4.9.3" } }, "node_modules/@ampproject/remapping": { @@ -7302,9 +7302,9 @@ } }, "node_modules/typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -13033,9 +13033,9 @@ "dev": true }, "typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "dev": true }, "unbox-primitive": { diff --git a/package.json b/package.json index 439686e58..fbe619c37 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "node": ">=16.10.0" }, "peerDependencies": { - "typescript": "~4.8.2" + "typescript": "~4.9.3" }, "dependencies": { "@typescript-to-lua/language-extensions": "1.0.0", @@ -70,6 +70,6 @@ "prettier": "^2.3.2", "ts-jest": "^28.0.8", "ts-node": "^10.9.1", - "typescript": "~4.8.2" + "typescript": "~4.9.3" } } From d9156826fb15591cde7744836d011ae56a992adb Mon Sep 17 00:00:00 2001 From: GlassBricks <24237065+GlassBricks@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:20:02 -0800 Subject: [PATCH 2/6] Remove test cases which are now TS errors --- test/unit/builtins/numbers.spec.ts | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/test/unit/builtins/numbers.spec.ts b/test/unit/builtins/numbers.spec.ts index ab7e332a9..0846cc541 100644 --- a/test/unit/builtins/numbers.spec.ts +++ b/test/unit/builtins/numbers.spec.ts @@ -1,8 +1,6 @@ import * as util from "../../util"; test.each([ - "NaN === NaN", - "NaN !== NaN", "NaN + NaN", "NaN - NaN", "NaN * NaN", @@ -119,12 +117,12 @@ test.each(["Infinity", "-Infinity", " -Infinity"])("parseFloat handles Infinit }); test.each([ - { numberString: "36", base: 8 }, - { numberString: "-36", base: 8 }, - { numberString: "100010101101", base: 2 }, - { numberString: "-100010101101", base: 2 }, - { numberString: "3F", base: 16 }, -])("parseInt with base (%p)", ({ numberString, base }) => { + {numberString: "36", base: 8}, + {numberString: "-36", base: 8}, + {numberString: "100010101101", base: 2}, + {numberString: "-100010101101", base: 2}, + {numberString: "3F", base: 16}, +])("parseInt with base (%p)", ({numberString, base}) => { util.testExpression`parseInt("${numberString}", ${base})`.expectToMatchJsResult(); }); @@ -137,10 +135,10 @@ test.each([1, 37, -100])("parseInt with invalid base (%p)", base => { }); test.each([ - { numberString: "36px", base: 8 }, - { numberString: "10001010110231", base: 2 }, - { numberString: "3Fcolor", base: 16 }, -])("parseInt with base and trailing text (%p)", ({ numberString, base }) => { + {numberString: "36px", base: 8}, + {numberString: "10001010110231", base: 2}, + {numberString: "3Fcolor", base: 16}, +])("parseInt with base and trailing text (%p)", ({numberString, base}) => { util.testExpression`parseInt("${numberString}", ${base})`.expectToMatchJsResult(); }); @@ -152,6 +150,6 @@ test.each(["42", "undefined"])("prototype call on nullable number (%p)", value = } return toString(${value}); ` - .setOptions({ strictNullChecks: true }) + .setOptions({strictNullChecks: true}) .expectToMatchJsResult(); }); From 57aac52c8b99d971e7bff8e42fc9194b55530554 Mon Sep 17 00:00:00 2001 From: GlassBricks <24237065+GlassBricks@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:38:44 -0800 Subject: [PATCH 3/6] Remove deprecated API usages --- src/LuaAST.ts | 15 ++++++++------- src/cli/parse.ts | 2 +- src/lualib/ParseInt.ts | 6 +++--- src/transformation/context/context.ts | 2 +- src/transformation/utils/export.ts | 16 ++++++++-------- .../visitors/binary-expression/compound.ts | 6 +++--- src/transformation/visitors/class/index.ts | 2 +- src/transformation/visitors/class/utils.ts | 8 ++++---- 8 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/LuaAST.ts b/src/LuaAST.ts index 698534d9e..a2f7b15bd 100644 --- a/src/LuaAST.ts +++ b/src/LuaAST.ts @@ -145,19 +145,19 @@ export interface Node extends TextRange { export function createNode(kind: SyntaxKind, tsOriginal?: ts.Node): Node { if (tsOriginal === undefined) { - return { kind, flags: NodeFlags.None }; + return {kind, flags: NodeFlags.None}; } const sourcePosition = getSourcePosition(tsOriginal); if (sourcePosition) { - return { kind, line: sourcePosition.line, column: sourcePosition.column, flags: NodeFlags.None }; + return {kind, line: sourcePosition.line, column: sourcePosition.column, flags: NodeFlags.None}; } else { - return { kind, flags: NodeFlags.None }; + return {kind, flags: NodeFlags.None}; } } export function cloneNode(node: T): T { - return { ...node }; + return {...node}; } export function setNodePosition(node: T, position: TextRange): T { @@ -186,17 +186,17 @@ function getSourcePosition(sourceNode: ts.Node): TextRange | undefined { const parseTreeNode = ts.getParseTreeNode(sourceNode) ?? sourceNode; const sourceFile = parseTreeNode.getSourceFile(); if (sourceFile !== undefined && parseTreeNode.pos >= 0) { - const { line, character } = ts.getLineAndCharacterOfPosition( + const {line, character} = ts.getLineAndCharacterOfPosition( sourceFile, parseTreeNode.pos + parseTreeNode.getLeadingTriviaWidth() ); - return { line, column: character }; + return {line, column: character}; } } export function getOriginalPos(node: Node): TextRange { - return { line: node.line, column: node.column }; + return {line: node.line, column: node.column}; } export function setNodeFlags(node: T, flags: NodeFlags): T { @@ -816,6 +816,7 @@ export function createTableIndexExpression( } export type AssignmentLeftHandSideExpression = Identifier | TableIndexExpression; + export function isAssignmentLeftHandSideExpression(node: Node): node is AssignmentLeftHandSideExpression { return isIdentifier(node) || isTableIndexExpression(node); } diff --git a/src/cli/parse.ts b/src/cli/parse.ts index a49510780..ca4f039ad 100644 --- a/src/cli/parse.ts +++ b/src/cli/parse.ts @@ -147,7 +147,7 @@ function updateParsedCommandLine(parsedCommandLine: ts.ParsedCommandLine, args: if (!args[i].startsWith("-")) continue; const isShorthand = !args[i].startsWith("--"); - const argumentName = args[i].substr(isShorthand ? 1 : 2); + const argumentName = args[i].substring(isShorthand ? 1 : 2); const option = optionDeclarations.find(option => { if (option.name.toLowerCase() === argumentName.toLowerCase()) return true; if (isShorthand && option.aliases) { diff --git a/src/lualib/ParseInt.ts b/src/lualib/ParseInt.ts index 2e1081a86..f6129f1df 100644 --- a/src/lualib/ParseInt.ts +++ b/src/lualib/ParseInt.ts @@ -10,8 +10,8 @@ export function __TS__ParseInt(this: void, numberString: string, base?: number): if (hexMatch) { base = 16; numberString = __TS__Match(hexMatch, "-")[0] - ? "-" + numberString.substr(hexMatch.length) - : numberString.substr(hexMatch.length); + ? "-" + numberString.substring(hexMatch.length) + : numberString.substring(hexMatch.length); } } @@ -22,7 +22,7 @@ export function __TS__ParseInt(this: void, numberString: string, base?: number): // Calculate string match pattern to use const allowedDigits = - base <= 10 ? parseIntBasePattern.substring(0, base) : parseIntBasePattern.substr(0, 10 + 2 * (base - 10)); + base <= 10 ? parseIntBasePattern.substring(0, base) : parseIntBasePattern.substring(0, 10 + 2 * (base - 10)); const pattern = `^%s*(-?[${allowedDigits}]*)`; // Try to parse with Lua tonumber diff --git a/src/transformation/context/context.ts b/src/transformation/context/context.ts index 8fda0bc23..09e3c6f1a 100644 --- a/src/transformation/context/context.ts +++ b/src/transformation/context/context.ts @@ -65,7 +65,7 @@ export class TransformationContext { /** @internal */ public transformNodeRaw(node: ts.Node, isExpression?: boolean) { // TODO: Move to visitors? - if (node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DeclareKeyword)) { + if (ts.canHaveModifiers(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DeclareKeyword)) { return []; } diff --git a/src/transformation/utils/export.ts b/src/transformation/utils/export.ts index fafc26d86..9b7f01cae 100644 --- a/src/transformation/utils/export.ts +++ b/src/transformation/utils/export.ts @@ -1,17 +1,17 @@ import * as ts from "typescript"; import * as lua from "../../LuaAST"; -import { TransformationContext } from "../context"; -import { createModuleLocalNameIdentifier } from "../visitors/namespace"; -import { createExportsIdentifier } from "./lua-ast"; -import { getSymbolInfo } from "./symbols"; -import { findFirstNodeAbove } from "./typescript"; +import {TransformationContext} from "../context"; +import {createModuleLocalNameIdentifier} from "../visitors/namespace"; +import {createExportsIdentifier} from "./lua-ast"; +import {getSymbolInfo} from "./symbols"; +import {findFirstNodeAbove} from "./typescript"; export function hasDefaultExportModifier(node: ts.Node): boolean { - return (node.modifiers ?? []).some(modifier => modifier.kind === ts.SyntaxKind.DefaultKeyword); + return ts.canHaveModifiers(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DefaultKeyword) === true; } export function hasExportModifier(node: ts.Node): boolean { - return (node.modifiers ?? []).some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword); + return ts.canHaveModifiers(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword) === true; } export const createDefaultExportStringLiteral = (original?: ts.Node): lua.StringLiteral => @@ -90,7 +90,7 @@ export function getExportedSymbolsFromScope( } // ts.Iterator is not a ES6-compatible iterator, because TypeScript targets ES5 - const it: Iterable = { [Symbol.iterator]: () => scopeSymbol.exports!.values() }; + const it: Iterable = {[Symbol.iterator]: () => scopeSymbol.exports!.values()}; return [...it]; } diff --git a/src/transformation/visitors/binary-expression/compound.ts b/src/transformation/visitors/binary-expression/compound.ts index 44c492505..76fb4bad4 100644 --- a/src/transformation/visitors/binary-expression/compound.ts +++ b/src/transformation/visitors/binary-expression/compound.ts @@ -158,7 +158,7 @@ export function transformCompoundAssignment( operatorExpression, rightPrecedingStatements ); - return { statements: [tmpDeclaration, ...precedingStatements, ...assignStatements], result: tmpIdentifier }; + return {statements: [tmpDeclaration, ...precedingStatements, ...assignStatements], result: tmpIdentifier}; } else { if (rightPrecedingStatements.length > 0 && isSetterSkippingCompoundAssignmentOperator(operator)) { return { @@ -183,7 +183,7 @@ export function transformCompoundAssignment( operatorExpression, precedingStatements ); - return { statements, result: left }; + return {statements, result: left}; } } @@ -196,7 +196,7 @@ export function transformCompoundAssignmentExpression( operator: CompoundAssignmentToken, isPostfix: boolean ): lua.Expression { - const { statements, result } = transformCompoundAssignment(context, expression, lhs, rhs, operator, isPostfix); + const {statements, result} = transformCompoundAssignment(context, expression, lhs, rhs, operator, isPostfix); context.addPrecedingStatements(statements); return result; } diff --git a/src/transformation/visitors/class/index.ts b/src/transformation/visitors/class/index.ts index 68adcab39..5955d6e1f 100644 --- a/src/transformation/visitors/class/index.ts +++ b/src/transformation/visitors/class/index.ts @@ -116,7 +116,7 @@ function transformClassLikeDeclaration( // Generate a constructor if none was defined in a base class const constructorResult = transformConstructorDeclaration( context, - ts.factory.createConstructorDeclaration([], [], [], ts.factory.createBlock([], true)), + ts.factory.createConstructorDeclaration([], [], ts.factory.createBlock([], true)), localClassName, instanceFields, classDeclaration diff --git a/src/transformation/visitors/class/utils.ts b/src/transformation/visitors/class/utils.ts index 8708a54fb..35bd11684 100644 --- a/src/transformation/visitors/class/utils.ts +++ b/src/transformation/visitors/class/utils.ts @@ -1,12 +1,12 @@ import * as ts from "typescript"; -import { TransformationContext } from "../../context"; +import {TransformationContext} from "../../context"; -export function isStaticNode(node: ts.Node): boolean { - return (node.modifiers ?? []).some(m => m.kind === ts.SyntaxKind.StaticKeyword); +export function isStaticNode(node: ts.HasModifiers): boolean { + return node.modifiers?.some(m => m.kind === ts.SyntaxKind.StaticKeyword) === true; } export function getExtendsClause(node: ts.ClassLikeDeclarationBase): ts.HeritageClause | undefined { - return (node.heritageClauses ?? []).find(clause => clause.token === ts.SyntaxKind.ExtendsKeyword); + return node.heritageClauses?.find(clause => clause.token === ts.SyntaxKind.ExtendsKeyword); } export function getExtendedNode(node: ts.ClassLikeDeclarationBase): ts.ExpressionWithTypeArguments | undefined { From a06937ca128c8f44eedbffc7a1052bf5200239ad Mon Sep 17 00:00:00 2001 From: GlassBricks <24237065+GlassBricks@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:38:57 -0800 Subject: [PATCH 4/6] Add support for satisfies expressions --- src/transformation/context/visitors.ts | 14 ++++++++------ src/transformation/visitors/typescript.ts | 5 +++-- test/unit/expressions.spec.ts | 7 +++++++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/transformation/context/visitors.ts b/src/transformation/context/visitors.ts index fff7441e5..7e624dd24 100644 --- a/src/transformation/context/visitors.ts +++ b/src/transformation/context/visitors.ts @@ -1,7 +1,7 @@ import * as ts from "typescript"; import * as lua from "../../LuaAST"; -import { OneToManyVisitorResult } from "../utils/lua-ast"; -import { TransformationContext } from "./context"; +import {OneToManyVisitorResult} from "../utils/lua-ast"; +import {TransformationContext} from "./context"; interface NodesBySyntaxKind { // Copied from is* type guards, with JSDoc and TypeNodes removed @@ -61,6 +61,7 @@ interface NodesBySyntaxKind { [ts.SyntaxKind.AsExpression]: ts.AsExpression; [ts.SyntaxKind.NonNullExpression]: ts.NonNullExpression; [ts.SyntaxKind.MetaProperty]: ts.MetaProperty; + [ts.SyntaxKind.SatisfiesExpression]: ts.SatisfiesExpression; [ts.SyntaxKind.TemplateSpan]: ts.TemplateSpan; [ts.SyntaxKind.SemicolonClassElement]: ts.SemicolonClassElement; [ts.SyntaxKind.Block]: ts.Block; @@ -141,13 +142,14 @@ export type StatementLikeNode = ts.Statement; export type VisitorResult = T extends ExpressionLikeNode ? lua.Expression : T extends StatementLikeNode - ? OneToManyVisitorResult - : T extends ts.SourceFile - ? lua.File - : OneToManyVisitorResult; + ? OneToManyVisitorResult + : T extends ts.SourceFile + ? lua.File + : OneToManyVisitorResult; export type Visitor = FunctionVisitor | ObjectVisitor; export type FunctionVisitor = (node: T, context: TransformationContext) => VisitorResult; + export interface ObjectVisitor { transform: FunctionVisitor; diff --git a/src/transformation/visitors/typescript.ts b/src/transformation/visitors/typescript.ts index ddd319381..7a69e776a 100644 --- a/src/transformation/visitors/typescript.ts +++ b/src/transformation/visitors/typescript.ts @@ -1,6 +1,6 @@ import * as ts from "typescript"; -import { FunctionVisitor, Visitors } from "../context"; -import { validateAssignment } from "../utils/assignment-validation"; +import {FunctionVisitor, Visitors} from "../context"; +import {validateAssignment} from "../utils/assignment-validation"; const transformAssertionExpression: FunctionVisitor = (expression, context) => { if (!ts.isConstTypeReference(expression.type)) { @@ -21,6 +21,7 @@ export const typescriptVisitors: Visitors = { [ts.SyntaxKind.NonNullExpression]: (node, context) => context.transformExpression(node.expression), [ts.SyntaxKind.ExpressionWithTypeArguments]: (node, context) => context.transformExpression(node.expression), + [ts.SyntaxKind.SatisfiesExpression]: (node, context) => context.transformExpression(node.expression), [ts.SyntaxKind.AsExpression]: transformAssertionExpression, [ts.SyntaxKind.TypeAssertionExpression]: transformAssertionExpression, [ts.SyntaxKind.NotEmittedStatement]: () => undefined, diff --git a/test/unit/expressions.spec.ts b/test/unit/expressions.spec.ts index 2aec6a6f2..249c930f7 100644 --- a/test/unit/expressions.spec.ts +++ b/test/unit/expressions.spec.ts @@ -173,6 +173,13 @@ test("Typescript 4.7 instantiation expression", () => { `.expectToMatchJsResult(); }); +test("Typescript 4.9 satisfies expression", () => { + util.testFunction` + const foo = { a: 1 } satisfies { a: number }; + return foo.a; + `.expectToMatchJsResult(); +}) + test.each([ '"foobar"', "17", From 9bcd5d60822645b209aeff5126c4c855bb2d779e Mon Sep 17 00:00:00 2001 From: GlassBricks <24237065+GlassBricks@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:51:15 -0800 Subject: [PATCH 5/6] Cleanup issues found by code analysis --- src/LuaAST.ts | 2 +- src/LuaPrinter.ts | 26 +++++++++---------- src/lualib/SetDescriptor.ts | 5 ++-- src/transformation/utils/diagnostics.ts | 19 +++----------- .../visitors/binary-expression/bit.ts | 11 +++++--- .../visitors/binary-expression/compound.ts | 2 +- src/transformation/visitors/template.ts | 2 +- src/transpilation/utils.ts | 2 +- src/typescript-internal.d.ts | 2 -- 9 files changed, 29 insertions(+), 42 deletions(-) diff --git a/src/LuaAST.ts b/src/LuaAST.ts index a2f7b15bd..dafaf3e5a 100644 --- a/src/LuaAST.ts +++ b/src/LuaAST.ts @@ -5,7 +5,7 @@ // because we don't create the AST from text import * as ts from "typescript"; -import { LuaLibFeature } from "./transformation/utils/lualib"; +import { LuaLibFeature } from "./LuaLib"; import { castArray } from "./utils"; export enum SyntaxKind { diff --git a/src/LuaPrinter.ts b/src/LuaPrinter.ts index ab2d373da..cd53d5166 100644 --- a/src/LuaPrinter.ts +++ b/src/LuaPrinter.ts @@ -1,12 +1,12 @@ import * as path from "path"; -import { Mapping, SourceMapGenerator, SourceNode } from "source-map"; +import {Mapping, SourceMapGenerator, SourceNode} from "source-map"; import * as ts from "typescript"; -import { CompilerOptions, isBundleEnabled, LuaLibImportKind, LuaTarget } from "./CompilerOptions"; +import {CompilerOptions, isBundleEnabled, LuaLibImportKind, LuaTarget} from "./CompilerOptions"; import * as lua from "./LuaAST"; -import { loadInlineLualibFeatures, LuaLibFeature, loadImportedLualibFeatures } from "./LuaLib"; -import { isValidLuaIdentifier, shouldAllowUnicode } from "./transformation/utils/safe-names"; -import { EmitHost, getEmitPath } from "./transpilation"; -import { intersperse, normalizeSlashes } from "./utils"; +import {loadImportedLualibFeatures, loadInlineLualibFeatures, LuaLibFeature} from "./LuaLib"; +import {isValidLuaIdentifier, shouldAllowUnicode} from "./transformation/utils/safe-names"; +import {EmitHost, getEmitPath} from "./transpilation"; +import {intersperse, normalizeSlashes} from "./utils"; // https://www.lua.org/pil/2.4.html // https://www.ecma-international.org/ecma-262/10.0/index.html#table-34 @@ -179,7 +179,7 @@ export class LuaPrinter { const sourceRoot = this.options.sourceRoot ? // According to spec, sourceRoot is simply prepended to the source name, so the slash should be included - `${this.options.sourceRoot.replace(/[\\/]+$/, "")}/` + `${this.options.sourceRoot.replace(/[\\/]+$/, "")}/` : ""; const rootSourceNode = this.printFile(file); const sourceMap = this.buildSourceMap(sourceRoot, rootSourceNode); @@ -195,7 +195,7 @@ export class LuaPrinter { code = code.replace(LuaPrinter.sourceMapTracebackPlaceholder, stackTraceOverride); } - return { code, sourceMap: sourceMap.toString(), sourceMapNode: rootSourceNode }; + return {code, sourceMap: sourceMap.toString(), sourceMapNode: rootSourceNode}; } private printInlineSourceMap(sourceMap: SourceMapGenerator): string { @@ -272,7 +272,7 @@ export class LuaPrinter { } protected createSourceNode(node: lua.Node, chunks: SourceChunk | SourceChunk[], name?: string): SourceNode { - const { line, column } = lua.getOriginalPos(node); + const {line, column} = lua.getOriginalPos(node); return line !== undefined && column !== undefined ? new SourceNode(line + 1, column, this.relativeSourcePath, chunks, name) @@ -892,16 +892,16 @@ export class LuaPrinter { if (isNewMapping(sourceNode)) { currentMapping = { source: sourceNode.source, - original: { line: sourceNode.line, column: sourceNode.column }, - generated: { line: generatedLine, column: generatedColumn }, + original: {line: sourceNode.line, column: sourceNode.column}, + generated: {line: generatedLine, column: generatedColumn}, name: sourceNode.name, }; map.addMapping(currentMapping); } - for (const chunk of sourceNode.children) { + for (const chunk of sourceNode.children as SourceChunk[]) { if (typeof chunk === "string") { - const lines = (chunk as string).split("\n"); + const lines = chunk.split("\n"); if (lines.length > 1) { generatedLine += lines.length - 1; generatedColumn = 0; diff --git a/src/lualib/SetDescriptor.ts b/src/lualib/SetDescriptor.ts index 11c435162..54f8f463d 100644 --- a/src/lualib/SetDescriptor.ts +++ b/src/lualib/SetDescriptor.ts @@ -1,4 +1,4 @@ -import { __TS__CloneDescriptor } from "./CloneDescriptor"; +import {__TS__CloneDescriptor} from "./CloneDescriptor"; function descriptorIndex(this: any, key: string): void { const value = rawget(this, key); @@ -73,8 +73,7 @@ export function __TS__SetDescriptor( if (value !== undefined) rawset(target, key, undefined); if (!rawget(metatable, "_descriptors")) metatable._descriptors = {}; - const descriptor = __TS__CloneDescriptor(desc); - metatable._descriptors[key] = descriptor; + metatable._descriptors[key] = __TS__CloneDescriptor(desc); metatable.__index = descriptorIndex; metatable.__newindex = descriptorNewIndex; } diff --git a/src/transformation/utils/diagnostics.ts b/src/transformation/utils/diagnostics.ts index 8216ab186..1d223a142 100644 --- a/src/transformation/utils/diagnostics.ts +++ b/src/transformation/utils/diagnostics.ts @@ -1,7 +1,7 @@ import * as ts from "typescript"; -import { LuaTarget, TypeScriptToLuaOptions } from "../../CompilerOptions"; -import { createSerialDiagnosticFactory } from "../../utils"; -import { AnnotationKind } from "./annotations"; +import {LuaTarget, TypeScriptToLuaOptions} from "../../CompilerOptions"; +import {createSerialDiagnosticFactory} from "../../utils"; +import {AnnotationKind} from "./annotations"; type MessageProvider = string | ((...args: TArgs) => string); @@ -119,12 +119,6 @@ export const invalidMultiFunctionReturnType = createErrorDiagnosticFactory( "The $multi function cannot be cast to a non-LuaMultiReturn type." ); -export const invalidMultiTypeToNonArrayLiteral = createErrorDiagnosticFactory("Expected an array literal."); - -export const invalidMultiTypeToEmptyPatternOrArrayLiteral = createErrorDiagnosticFactory( - "There must be one or more elements specified here." -); - export const invalidMultiReturnAccess = createErrorDiagnosticFactory( "The LuaMultiReturn type can only be accessed via an element access expression of a numeric type." ); @@ -132,13 +126,6 @@ export const invalidMultiReturnAccess = createErrorDiagnosticFactory( export const invalidCallExtensionUse = createErrorDiagnosticFactory( "This function must be called directly and cannot be referred to." ); - -export const annotationRemoved = createErrorDiagnosticFactory( - (kind: AnnotationKind) => - `'@${kind}' has been removed and will no longer have any effect.` + - `See https://typescripttolua.github.io/docs/advanced/compiler-annotations#${kind.toLowerCase()} for more information.` -); - export const annotationDeprecated = createWarningDiagnosticFactory( (kind: AnnotationKind) => `'@${kind}' is deprecated and will be removed in a future update. Please update your code before upgrading to the next release, otherwise your project will no longer compile. ` + diff --git a/src/transformation/visitors/binary-expression/bit.ts b/src/transformation/visitors/binary-expression/bit.ts index 14ce4bdef..888dccf55 100644 --- a/src/transformation/visitors/binary-expression/bit.ts +++ b/src/transformation/visitors/binary-expression/bit.ts @@ -1,9 +1,9 @@ import * as ts from "typescript"; -import { LuaTarget } from "../../../CompilerOptions"; +import {LuaTarget} from "../../../CompilerOptions"; import * as lua from "../../../LuaAST"; -import { assertNever } from "../../../utils"; -import { TransformationContext } from "../../context"; -import { unsupportedForTarget, unsupportedRightShiftOperator } from "../../utils/diagnostics"; +import {assertNever} from "../../../utils"; +import {TransformationContext} from "../../context"; +import {unsupportedForTarget, unsupportedRightShiftOperator} from "../../utils/diagnostics"; export type BitOperator = ts.ShiftOperator | ts.BitwiseOperator; export const isBitOperator = (operator: ts.BinaryOperator): operator is BitOperator => @@ -49,6 +49,7 @@ function transformBitOperatorToLuaOperator( return lua.SyntaxKind.BitwiseLeftShiftOperator; case ts.SyntaxKind.GreaterThanGreaterThanToken: context.diagnostics.push(unsupportedRightShiftOperator(node)); + return lua.SyntaxKind.BitwiseRightShiftOperator; case ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken: return lua.SyntaxKind.BitwiseRightShiftOperator; } @@ -66,6 +67,7 @@ export function transformBinaryBitOperation( case LuaTarget.Lua50: case LuaTarget.Lua51: context.diagnostics.push(unsupportedForTarget(node, "Bitwise operations", context.luaTarget)); + return transformBinaryBitLibOperation(node, left, right, operator, "bit"); case LuaTarget.LuaJIT: return transformBinaryBitLibOperation(node, left, right, operator, "bit"); @@ -111,6 +113,7 @@ export function transformUnaryBitOperation( case LuaTarget.Lua50: case LuaTarget.Lua51: context.diagnostics.push(unsupportedForTarget(node, "Bitwise operations", context.luaTarget)); + return transformUnaryBitLibOperation(node, expression, operator, "bit"); case LuaTarget.LuaJIT: return transformUnaryBitLibOperation(node, expression, operator, "bit"); diff --git a/src/transformation/visitors/binary-expression/compound.ts b/src/transformation/visitors/binary-expression/compound.ts index 76fb4bad4..3d0b9cbfe 100644 --- a/src/transformation/visitors/binary-expression/compound.ts +++ b/src/transformation/visitors/binary-expression/compound.ts @@ -3,7 +3,7 @@ import * as lua from "../../../LuaAST"; import { cast, assertNever } from "../../../utils"; import { TransformationContext } from "../../context"; import { transformInPrecedingStatementScope } from "../../utils/preceding-statements"; -import { transformBinaryOperation } from "../binary-expression"; +import { transformBinaryOperation } from "./index"; import { transformAssignmentWithRightPrecedingStatements } from "./assignments"; function isLuaExpressionWithSideEffect(expression: lua.Expression) { diff --git a/src/transformation/visitors/template.ts b/src/transformation/visitors/template.ts index 5f949adb1..bfad88057 100644 --- a/src/transformation/visitors/template.ts +++ b/src/transformation/visitors/template.ts @@ -3,7 +3,7 @@ import * as lua from "../../LuaAST"; import { FunctionVisitor } from "../context"; import { ContextType, getDeclarationContextType } from "../utils/function-context"; import { wrapInToStringForConcat } from "../utils/lua-ast"; -import { isStringType } from "../utils/typescript/types"; +import { isStringType } from "../utils/typescript"; import { transformArguments, transformContextualCallExpression } from "./call"; import { transformOrderedExpressions } from "./expression-list"; diff --git a/src/transpilation/utils.ts b/src/transpilation/utils.ts index cef3af310..ce03fd854 100644 --- a/src/transpilation/utils.ts +++ b/src/transpilation/utils.ts @@ -40,7 +40,7 @@ export function resolvePlugin( kind: string, optionName: string, basedir: string, - query: string, + query: unknown, importName = "default" ): { error?: ts.Diagnostic; result?: unknown } { if (typeof query !== "string") { diff --git a/src/typescript-internal.d.ts b/src/typescript-internal.d.ts index 8d85b9374..afcf45685 100644 --- a/src/typescript-internal.d.ts +++ b/src/typescript-internal.d.ts @@ -35,8 +35,6 @@ declare module "typescript" { parent?: Symbol; } - function getObjectFlags(type: Type): ObjectFlags; - function transformJsx(context: TransformationContext): (x: SourceFile) => SourceFile; export type OuterExpression = From 31c010d0eaa89bac993825e074e06640656ed9e8 Mon Sep 17 00:00:00 2001 From: GlassBricks <24237065+GlassBricks@users.noreply.github.com> Date: Wed, 16 Nov 2022 20:18:22 -0800 Subject: [PATCH 6/6] Fix prettier --- src/LuaAST.ts | 14 ++++++------ src/LuaPrinter.ts | 22 +++++++++---------- src/lualib/SetDescriptor.ts | 2 +- src/transformation/context/context.ts | 5 ++++- src/transformation/context/visitors.ts | 12 +++++----- src/transformation/utils/diagnostics.ts | 6 ++--- src/transformation/utils/export.ts | 22 ++++++++++++------- .../visitors/binary-expression/bit.ts | 8 +++---- .../visitors/binary-expression/compound.ts | 6 ++--- src/transformation/visitors/class/utils.ts | 2 +- src/transformation/visitors/typescript.ts | 4 ++-- test/unit/builtins/numbers.spec.ts | 22 +++++++++---------- test/unit/expressions.spec.ts | 2 +- 13 files changed, 68 insertions(+), 59 deletions(-) diff --git a/src/LuaAST.ts b/src/LuaAST.ts index dafaf3e5a..2bfa16c18 100644 --- a/src/LuaAST.ts +++ b/src/LuaAST.ts @@ -145,19 +145,19 @@ export interface Node extends TextRange { export function createNode(kind: SyntaxKind, tsOriginal?: ts.Node): Node { if (tsOriginal === undefined) { - return {kind, flags: NodeFlags.None}; + return { kind, flags: NodeFlags.None }; } const sourcePosition = getSourcePosition(tsOriginal); if (sourcePosition) { - return {kind, line: sourcePosition.line, column: sourcePosition.column, flags: NodeFlags.None}; + return { kind, line: sourcePosition.line, column: sourcePosition.column, flags: NodeFlags.None }; } else { - return {kind, flags: NodeFlags.None}; + return { kind, flags: NodeFlags.None }; } } export function cloneNode(node: T): T { - return {...node}; + return { ...node }; } export function setNodePosition(node: T, position: TextRange): T { @@ -186,17 +186,17 @@ function getSourcePosition(sourceNode: ts.Node): TextRange | undefined { const parseTreeNode = ts.getParseTreeNode(sourceNode) ?? sourceNode; const sourceFile = parseTreeNode.getSourceFile(); if (sourceFile !== undefined && parseTreeNode.pos >= 0) { - const {line, character} = ts.getLineAndCharacterOfPosition( + const { line, character } = ts.getLineAndCharacterOfPosition( sourceFile, parseTreeNode.pos + parseTreeNode.getLeadingTriviaWidth() ); - return {line, column: character}; + return { line, column: character }; } } export function getOriginalPos(node: Node): TextRange { - return {line: node.line, column: node.column}; + return { line: node.line, column: node.column }; } export function setNodeFlags(node: T, flags: NodeFlags): T { diff --git a/src/LuaPrinter.ts b/src/LuaPrinter.ts index cd53d5166..757cb23de 100644 --- a/src/LuaPrinter.ts +++ b/src/LuaPrinter.ts @@ -1,12 +1,12 @@ import * as path from "path"; -import {Mapping, SourceMapGenerator, SourceNode} from "source-map"; +import { Mapping, SourceMapGenerator, SourceNode } from "source-map"; import * as ts from "typescript"; -import {CompilerOptions, isBundleEnabled, LuaLibImportKind, LuaTarget} from "./CompilerOptions"; +import { CompilerOptions, isBundleEnabled, LuaLibImportKind, LuaTarget } from "./CompilerOptions"; import * as lua from "./LuaAST"; -import {loadImportedLualibFeatures, loadInlineLualibFeatures, LuaLibFeature} from "./LuaLib"; -import {isValidLuaIdentifier, shouldAllowUnicode} from "./transformation/utils/safe-names"; -import {EmitHost, getEmitPath} from "./transpilation"; -import {intersperse, normalizeSlashes} from "./utils"; +import { loadImportedLualibFeatures, loadInlineLualibFeatures, LuaLibFeature } from "./LuaLib"; +import { isValidLuaIdentifier, shouldAllowUnicode } from "./transformation/utils/safe-names"; +import { EmitHost, getEmitPath } from "./transpilation"; +import { intersperse, normalizeSlashes } from "./utils"; // https://www.lua.org/pil/2.4.html // https://www.ecma-international.org/ecma-262/10.0/index.html#table-34 @@ -179,7 +179,7 @@ export class LuaPrinter { const sourceRoot = this.options.sourceRoot ? // According to spec, sourceRoot is simply prepended to the source name, so the slash should be included - `${this.options.sourceRoot.replace(/[\\/]+$/, "")}/` + `${this.options.sourceRoot.replace(/[\\/]+$/, "")}/` : ""; const rootSourceNode = this.printFile(file); const sourceMap = this.buildSourceMap(sourceRoot, rootSourceNode); @@ -195,7 +195,7 @@ export class LuaPrinter { code = code.replace(LuaPrinter.sourceMapTracebackPlaceholder, stackTraceOverride); } - return {code, sourceMap: sourceMap.toString(), sourceMapNode: rootSourceNode}; + return { code, sourceMap: sourceMap.toString(), sourceMapNode: rootSourceNode }; } private printInlineSourceMap(sourceMap: SourceMapGenerator): string { @@ -272,7 +272,7 @@ export class LuaPrinter { } protected createSourceNode(node: lua.Node, chunks: SourceChunk | SourceChunk[], name?: string): SourceNode { - const {line, column} = lua.getOriginalPos(node); + const { line, column } = lua.getOriginalPos(node); return line !== undefined && column !== undefined ? new SourceNode(line + 1, column, this.relativeSourcePath, chunks, name) @@ -892,8 +892,8 @@ export class LuaPrinter { if (isNewMapping(sourceNode)) { currentMapping = { source: sourceNode.source, - original: {line: sourceNode.line, column: sourceNode.column}, - generated: {line: generatedLine, column: generatedColumn}, + original: { line: sourceNode.line, column: sourceNode.column }, + generated: { line: generatedLine, column: generatedColumn }, name: sourceNode.name, }; map.addMapping(currentMapping); diff --git a/src/lualib/SetDescriptor.ts b/src/lualib/SetDescriptor.ts index 54f8f463d..1646ca7bd 100644 --- a/src/lualib/SetDescriptor.ts +++ b/src/lualib/SetDescriptor.ts @@ -1,4 +1,4 @@ -import {__TS__CloneDescriptor} from "./CloneDescriptor"; +import { __TS__CloneDescriptor } from "./CloneDescriptor"; function descriptorIndex(this: any, key: string): void { const value = rawget(this, key); diff --git a/src/transformation/context/context.ts b/src/transformation/context/context.ts index 09e3c6f1a..4ee8c04a5 100644 --- a/src/transformation/context/context.ts +++ b/src/transformation/context/context.ts @@ -65,7 +65,10 @@ export class TransformationContext { /** @internal */ public transformNodeRaw(node: ts.Node, isExpression?: boolean) { // TODO: Move to visitors? - if (ts.canHaveModifiers(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DeclareKeyword)) { + if ( + ts.canHaveModifiers(node) && + node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DeclareKeyword) + ) { return []; } diff --git a/src/transformation/context/visitors.ts b/src/transformation/context/visitors.ts index 7e624dd24..429cce1b4 100644 --- a/src/transformation/context/visitors.ts +++ b/src/transformation/context/visitors.ts @@ -1,7 +1,7 @@ import * as ts from "typescript"; import * as lua from "../../LuaAST"; -import {OneToManyVisitorResult} from "../utils/lua-ast"; -import {TransformationContext} from "./context"; +import { OneToManyVisitorResult } from "../utils/lua-ast"; +import { TransformationContext } from "./context"; interface NodesBySyntaxKind { // Copied from is* type guards, with JSDoc and TypeNodes removed @@ -142,10 +142,10 @@ export type StatementLikeNode = ts.Statement; export type VisitorResult = T extends ExpressionLikeNode ? lua.Expression : T extends StatementLikeNode - ? OneToManyVisitorResult - : T extends ts.SourceFile - ? lua.File - : OneToManyVisitorResult; + ? OneToManyVisitorResult + : T extends ts.SourceFile + ? lua.File + : OneToManyVisitorResult; export type Visitor = FunctionVisitor | ObjectVisitor; export type FunctionVisitor = (node: T, context: TransformationContext) => VisitorResult; diff --git a/src/transformation/utils/diagnostics.ts b/src/transformation/utils/diagnostics.ts index 1d223a142..94f7781de 100644 --- a/src/transformation/utils/diagnostics.ts +++ b/src/transformation/utils/diagnostics.ts @@ -1,7 +1,7 @@ import * as ts from "typescript"; -import {LuaTarget, TypeScriptToLuaOptions} from "../../CompilerOptions"; -import {createSerialDiagnosticFactory} from "../../utils"; -import {AnnotationKind} from "./annotations"; +import { LuaTarget, TypeScriptToLuaOptions } from "../../CompilerOptions"; +import { createSerialDiagnosticFactory } from "../../utils"; +import { AnnotationKind } from "./annotations"; type MessageProvider = string | ((...args: TArgs) => string); diff --git a/src/transformation/utils/export.ts b/src/transformation/utils/export.ts index 9b7f01cae..a7e9db909 100644 --- a/src/transformation/utils/export.ts +++ b/src/transformation/utils/export.ts @@ -1,17 +1,23 @@ import * as ts from "typescript"; import * as lua from "../../LuaAST"; -import {TransformationContext} from "../context"; -import {createModuleLocalNameIdentifier} from "../visitors/namespace"; -import {createExportsIdentifier} from "./lua-ast"; -import {getSymbolInfo} from "./symbols"; -import {findFirstNodeAbove} from "./typescript"; +import { TransformationContext } from "../context"; +import { createModuleLocalNameIdentifier } from "../visitors/namespace"; +import { createExportsIdentifier } from "./lua-ast"; +import { getSymbolInfo } from "./symbols"; +import { findFirstNodeAbove } from "./typescript"; export function hasDefaultExportModifier(node: ts.Node): boolean { - return ts.canHaveModifiers(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DefaultKeyword) === true; + return ( + ts.canHaveModifiers(node) && + node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.DefaultKeyword) === true + ); } export function hasExportModifier(node: ts.Node): boolean { - return ts.canHaveModifiers(node) && node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword) === true; + return ( + ts.canHaveModifiers(node) && + node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword) === true + ); } export const createDefaultExportStringLiteral = (original?: ts.Node): lua.StringLiteral => @@ -90,7 +96,7 @@ export function getExportedSymbolsFromScope( } // ts.Iterator is not a ES6-compatible iterator, because TypeScript targets ES5 - const it: Iterable = {[Symbol.iterator]: () => scopeSymbol.exports!.values()}; + const it: Iterable = { [Symbol.iterator]: () => scopeSymbol.exports!.values() }; return [...it]; } diff --git a/src/transformation/visitors/binary-expression/bit.ts b/src/transformation/visitors/binary-expression/bit.ts index 888dccf55..79e9c1f3c 100644 --- a/src/transformation/visitors/binary-expression/bit.ts +++ b/src/transformation/visitors/binary-expression/bit.ts @@ -1,9 +1,9 @@ import * as ts from "typescript"; -import {LuaTarget} from "../../../CompilerOptions"; +import { LuaTarget } from "../../../CompilerOptions"; import * as lua from "../../../LuaAST"; -import {assertNever} from "../../../utils"; -import {TransformationContext} from "../../context"; -import {unsupportedForTarget, unsupportedRightShiftOperator} from "../../utils/diagnostics"; +import { assertNever } from "../../../utils"; +import { TransformationContext } from "../../context"; +import { unsupportedForTarget, unsupportedRightShiftOperator } from "../../utils/diagnostics"; export type BitOperator = ts.ShiftOperator | ts.BitwiseOperator; export const isBitOperator = (operator: ts.BinaryOperator): operator is BitOperator => diff --git a/src/transformation/visitors/binary-expression/compound.ts b/src/transformation/visitors/binary-expression/compound.ts index 3d0b9cbfe..a8180e78b 100644 --- a/src/transformation/visitors/binary-expression/compound.ts +++ b/src/transformation/visitors/binary-expression/compound.ts @@ -158,7 +158,7 @@ export function transformCompoundAssignment( operatorExpression, rightPrecedingStatements ); - return {statements: [tmpDeclaration, ...precedingStatements, ...assignStatements], result: tmpIdentifier}; + return { statements: [tmpDeclaration, ...precedingStatements, ...assignStatements], result: tmpIdentifier }; } else { if (rightPrecedingStatements.length > 0 && isSetterSkippingCompoundAssignmentOperator(operator)) { return { @@ -183,7 +183,7 @@ export function transformCompoundAssignment( operatorExpression, precedingStatements ); - return {statements, result: left}; + return { statements, result: left }; } } @@ -196,7 +196,7 @@ export function transformCompoundAssignmentExpression( operator: CompoundAssignmentToken, isPostfix: boolean ): lua.Expression { - const {statements, result} = transformCompoundAssignment(context, expression, lhs, rhs, operator, isPostfix); + const { statements, result } = transformCompoundAssignment(context, expression, lhs, rhs, operator, isPostfix); context.addPrecedingStatements(statements); return result; } diff --git a/src/transformation/visitors/class/utils.ts b/src/transformation/visitors/class/utils.ts index 35bd11684..d5b960662 100644 --- a/src/transformation/visitors/class/utils.ts +++ b/src/transformation/visitors/class/utils.ts @@ -1,5 +1,5 @@ import * as ts from "typescript"; -import {TransformationContext} from "../../context"; +import { TransformationContext } from "../../context"; export function isStaticNode(node: ts.HasModifiers): boolean { return node.modifiers?.some(m => m.kind === ts.SyntaxKind.StaticKeyword) === true; diff --git a/src/transformation/visitors/typescript.ts b/src/transformation/visitors/typescript.ts index 7a69e776a..0d9f8a8c1 100644 --- a/src/transformation/visitors/typescript.ts +++ b/src/transformation/visitors/typescript.ts @@ -1,6 +1,6 @@ import * as ts from "typescript"; -import {FunctionVisitor, Visitors} from "../context"; -import {validateAssignment} from "../utils/assignment-validation"; +import { FunctionVisitor, Visitors } from "../context"; +import { validateAssignment } from "../utils/assignment-validation"; const transformAssertionExpression: FunctionVisitor = (expression, context) => { if (!ts.isConstTypeReference(expression.type)) { diff --git a/test/unit/builtins/numbers.spec.ts b/test/unit/builtins/numbers.spec.ts index 0846cc541..f3f0bb9b9 100644 --- a/test/unit/builtins/numbers.spec.ts +++ b/test/unit/builtins/numbers.spec.ts @@ -117,12 +117,12 @@ test.each(["Infinity", "-Infinity", " -Infinity"])("parseFloat handles Infinit }); test.each([ - {numberString: "36", base: 8}, - {numberString: "-36", base: 8}, - {numberString: "100010101101", base: 2}, - {numberString: "-100010101101", base: 2}, - {numberString: "3F", base: 16}, -])("parseInt with base (%p)", ({numberString, base}) => { + { numberString: "36", base: 8 }, + { numberString: "-36", base: 8 }, + { numberString: "100010101101", base: 2 }, + { numberString: "-100010101101", base: 2 }, + { numberString: "3F", base: 16 }, +])("parseInt with base (%p)", ({ numberString, base }) => { util.testExpression`parseInt("${numberString}", ${base})`.expectToMatchJsResult(); }); @@ -135,10 +135,10 @@ test.each([1, 37, -100])("parseInt with invalid base (%p)", base => { }); test.each([ - {numberString: "36px", base: 8}, - {numberString: "10001010110231", base: 2}, - {numberString: "3Fcolor", base: 16}, -])("parseInt with base and trailing text (%p)", ({numberString, base}) => { + { numberString: "36px", base: 8 }, + { numberString: "10001010110231", base: 2 }, + { numberString: "3Fcolor", base: 16 }, +])("parseInt with base and trailing text (%p)", ({ numberString, base }) => { util.testExpression`parseInt("${numberString}", ${base})`.expectToMatchJsResult(); }); @@ -150,6 +150,6 @@ test.each(["42", "undefined"])("prototype call on nullable number (%p)", value = } return toString(${value}); ` - .setOptions({strictNullChecks: true}) + .setOptions({ strictNullChecks: true }) .expectToMatchJsResult(); }); diff --git a/test/unit/expressions.spec.ts b/test/unit/expressions.spec.ts index 249c930f7..46ca2f7bd 100644 --- a/test/unit/expressions.spec.ts +++ b/test/unit/expressions.spec.ts @@ -178,7 +178,7 @@ test("Typescript 4.9 satisfies expression", () => { const foo = { a: 1 } satisfies { a: number }; return foo.a; `.expectToMatchJsResult(); -}) +}); test.each([ '"foobar"',