Skip to content

Commit

Permalink
Add TSSatisfiesExpression to types and generator
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolo-ribaudo committed Aug 31, 2022
1 parent 816b009 commit 3d69eaa
Show file tree
Hide file tree
Showing 13 changed files with 249 additions and 9 deletions.
14 changes: 11 additions & 3 deletions packages/babel-generator/src/generators/typescript.ts
Expand Up @@ -521,15 +521,23 @@ export function TSTypeAliasDeclaration(
this.token(";");
}

export function TSAsExpression(this: Printer, node: t.TSAsExpression) {
const { expression, typeAnnotation } = node;
function TSTypeExpression(
this: Printer,
node: t.TSAsExpression | t.TSSatisfiesExpression,
) {
const { type, expression, typeAnnotation } = node;
this.print(expression, node);
this.space();
this.word("as");
this.word(type === "TSAsExpression" ? "as" : "satisfies");
this.space();
this.print(typeAnnotation, node);
}

export {
TSTypeExpression as TSAsExpression,
TSTypeExpression as TSSatisfiesExpression,
};

export function TSTypeAssertion(this: Printer, node: t.TSTypeAssertion) {
const { typeAnnotation, expression } = node;
this.token("<");
Expand Down
11 changes: 7 additions & 4 deletions packages/babel-generator/src/node/parentheses.ts
Expand Up @@ -49,6 +49,7 @@ import {
isVariableDeclarator,
isWhileStatement,
isYieldExpression,
isTSSatisfiesExpression,
} from "@babel/types";
import type * as t from "@babel/types";
const PRECEDENCE = {
Expand Down Expand Up @@ -225,9 +226,10 @@ export function TSAsExpression() {
return true;
}

export function TSTypeAssertion() {
return true;
}
export {
TSAsExpression as TSSatisfiesExpression,
TSAsExpression as TSTypeAssertion,
};

export function TSUnionType(node: t.TSUnionType, parent: t.Node): boolean {
return (
Expand Down Expand Up @@ -368,7 +370,8 @@ export function ConditionalExpression(
isConditionalExpression(parent, { test: node }) ||
isAwaitExpression(parent) ||
isTSTypeAssertion(parent) ||
isTSAsExpression(parent)
isTSAsExpression(parent) ||
isTSSatisfiesExpression(parent)
) {
return true;
}
Expand Down
@@ -0,0 +1,4 @@
x satisfies T;
x < y satisfies boolean; // (x < y) satisfies boolean;
x === 1 satisfies number; // x === (1 satisfies number);
x satisfies any satisfies T;
@@ -0,0 +1,6 @@
(x satisfies T);
(x < y satisfies boolean); // (x < y) satisfies boolean;

x === (1 satisfies number); // x === (1 satisfies number);

((x satisfies any) satisfies T);
3 changes: 3 additions & 0 deletions packages/babel-traverse/src/path/generated/asserts.ts
Expand Up @@ -577,6 +577,9 @@ export interface NodePathAssetions {
opts?: object,
): asserts this is NodePath<t.TSQualifiedName>;
assertTSRestType(opts?: object): asserts this is NodePath<t.TSRestType>;
assertTSSatisfiesExpression(
opts?: object,
): asserts this is NodePath<t.TSSatisfiesExpression>;
assertTSStringKeyword(
opts?: object,
): asserts this is NodePath<t.TSStringKeyword>;
Expand Down
4 changes: 4 additions & 0 deletions packages/babel-traverse/src/path/generated/validators.ts
Expand Up @@ -995,6 +995,10 @@ interface BaseNodePathValidators {
this: NodePath<T>,
opts?: object,
): this is NodePath<T & t.TSRestType>;
isTSSatisfiesExpression<T extends t.Node>(
this: NodePath<T>,
opts?: object,
): this is NodePath<T & t.TSSatisfiesExpression>;
isTSStringKeyword<T extends t.Node>(
this: NodePath<T>,
opts?: object,
Expand Down
6 changes: 6 additions & 0 deletions packages/babel-types/src/asserts/generated/index.ts
Expand Up @@ -1412,6 +1412,12 @@ export function assertTSAsExpression(
): asserts node is t.TSAsExpression {
assert("TSAsExpression", node, opts);
}
export function assertTSSatisfiesExpression(
node: object | null | undefined,
opts?: object | null,
): asserts node is t.TSSatisfiesExpression {
assert("TSSatisfiesExpression", node, opts);
}
export function assertTSTypeAssertion(
node: object | null | undefined,
opts?: object | null,
Expand Down

0 comments on commit 3d69eaa

Please sign in to comment.