diff --git a/lib/types.js b/lib/types.js index 5d333ae00d1c..be6adefb7128 100644 --- a/lib/types.js +++ b/lib/types.js @@ -592,6 +592,13 @@ declare class BabelNodeDeclareTypeAlias extends BabelNode { right: any; } +declare class BabelNodeDeclareOpaqueType extends BabelNode { + type: "DeclareOpaqueType"; + id: any; + typeParameters: any; + supertype: any; +} + declare class BabelNodeDeclareVariable extends BabelNode { type: "DeclareVariable"; id: any; @@ -710,6 +717,14 @@ declare class BabelNodeTypeAlias extends BabelNode { right: any; } +declare class BabelNodeOpaqueType extends BabelNode { + type: "OpaqueType"; + id: any; + typeParameters: any; + supertype: any; + impltype: any; +} + declare class BabelNodeTypeCastExpression extends BabelNode { type: "TypeCastExpression"; expression: any; @@ -1217,7 +1232,7 @@ type BabelNodeBinary = BabelNodeBinaryExpression | BabelNodeLogicalExpression; type BabelNodeScopable = BabelNodeBlockStatement | BabelNodeCatchClause | BabelNodeDoWhileStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeProgram | BabelNodeObjectMethod | BabelNodeSwitchStatement | BabelNodeWhileStatement | BabelNodeArrowFunctionExpression | BabelNodeClassDeclaration | BabelNodeClassExpression | BabelNodeForOfStatement | BabelNodeClassMethod; type BabelNodeBlockParent = BabelNodeBlockStatement | BabelNodeDoWhileStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeProgram | BabelNodeObjectMethod | BabelNodeSwitchStatement | BabelNodeWhileStatement | BabelNodeArrowFunctionExpression | BabelNodeForOfStatement | BabelNodeClassMethod; type BabelNodeBlock = BabelNodeBlockStatement | BabelNodeProgram; -type BabelNodeStatement = BabelNodeBlockStatement | BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeDebuggerStatement | BabelNodeDoWhileStatement | BabelNodeEmptyStatement | BabelNodeExpressionStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeIfStatement | BabelNodeLabeledStatement | BabelNodeReturnStatement | BabelNodeSwitchStatement | BabelNodeThrowStatement | BabelNodeTryStatement | BabelNodeVariableDeclaration | BabelNodeWhileStatement | BabelNodeWithStatement | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeForOfStatement | BabelNodeImportDeclaration | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeTypeAlias | BabelNodeTSDeclareFunction | BabelNodeTSInterfaceDeclaration | BabelNodeTSTypeAliasDeclaration | BabelNodeTSEnumDeclaration | BabelNodeTSModuleDeclaration | BabelNodeTSImportEqualsDeclaration | BabelNodeTSExportAssignment | BabelNodeTSNamespaceExportDeclaration; +type BabelNodeStatement = BabelNodeBlockStatement | BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeDebuggerStatement | BabelNodeDoWhileStatement | BabelNodeEmptyStatement | BabelNodeExpressionStatement | BabelNodeForInStatement | BabelNodeForStatement | BabelNodeFunctionDeclaration | BabelNodeIfStatement | BabelNodeLabeledStatement | BabelNodeReturnStatement | BabelNodeSwitchStatement | BabelNodeThrowStatement | BabelNodeTryStatement | BabelNodeVariableDeclaration | BabelNodeWhileStatement | BabelNodeWithStatement | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeForOfStatement | BabelNodeImportDeclaration | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeTypeAlias | BabelNodeOpaqueType | BabelNodeTSDeclareFunction | BabelNodeTSInterfaceDeclaration | BabelNodeTSTypeAliasDeclaration | BabelNodeTSEnumDeclaration | BabelNodeTSModuleDeclaration | BabelNodeTSImportEqualsDeclaration | BabelNodeTSExportAssignment | BabelNodeTSNamespaceExportDeclaration; type BabelNodeTerminatorless = BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeReturnStatement | BabelNodeThrowStatement | BabelNodeYieldExpression | BabelNodeAwaitExpression; type BabelNodeCompletionStatement = BabelNodeBreakStatement | BabelNodeContinueStatement | BabelNodeReturnStatement | BabelNodeThrowStatement; type BabelNodeConditional = BabelNodeConditionalExpression | BabelNodeIfStatement; @@ -1229,7 +1244,7 @@ type BabelNodeForXStatement = BabelNodeForInStatement | BabelNodeForOfStatement; type BabelNodeFunction = BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeObjectMethod | BabelNodeArrowFunctionExpression | BabelNodeClassMethod; type BabelNodeFunctionParent = BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeProgram | BabelNodeObjectMethod | BabelNodeArrowFunctionExpression | BabelNodeClassMethod; type BabelNodePureish = BabelNodeFunctionDeclaration | BabelNodeFunctionExpression | BabelNodeStringLiteral | BabelNodeNumericLiteral | BabelNodeNullLiteral | BabelNodeBooleanLiteral | BabelNodeArrowFunctionExpression | BabelNodeClassDeclaration | BabelNodeClassExpression; -type BabelNodeDeclaration = BabelNodeFunctionDeclaration | BabelNodeVariableDeclaration | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeImportDeclaration | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeTypeAlias | BabelNodeTSDeclareFunction | BabelNodeTSInterfaceDeclaration | BabelNodeTSTypeAliasDeclaration | BabelNodeTSEnumDeclaration | BabelNodeTSModuleDeclaration; +type BabelNodeDeclaration = BabelNodeFunctionDeclaration | BabelNodeVariableDeclaration | BabelNodeClassDeclaration | BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeImportDeclaration | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeTypeAlias | BabelNodeOpaqueType | BabelNodeTSDeclareFunction | BabelNodeTSInterfaceDeclaration | BabelNodeTSTypeAliasDeclaration | BabelNodeTSEnumDeclaration | BabelNodeTSModuleDeclaration; type BabelNodePatternLike = BabelNodeIdentifier | BabelNodeRestElement | BabelNodeAssignmentPattern | BabelNodeArrayPattern | BabelNodeObjectPattern; type BabelNodeLVal = BabelNodeIdentifier | BabelNodeMemberExpression | BabelNodeRestElement | BabelNodeAssignmentPattern | BabelNodeArrayPattern | BabelNodeObjectPattern | BabelNodeTSParameterProperty; type BabelNodeTSEntityName = BabelNodeIdentifier | BabelNodeTSQualifiedName; @@ -1245,9 +1260,9 @@ type BabelNodeClass = BabelNodeClassDeclaration | BabelNodeClassExpression; type BabelNodeModuleDeclaration = BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration | BabelNodeImportDeclaration; type BabelNodeExportDeclaration = BabelNodeExportAllDeclaration | BabelNodeExportDefaultDeclaration | BabelNodeExportNamedDeclaration; type BabelNodeModuleSpecifier = BabelNodeExportSpecifier | BabelNodeImportDefaultSpecifier | BabelNodeImportNamespaceSpecifier | BabelNodeImportSpecifier | BabelNodeExportDefaultSpecifier | BabelNodeExportNamespaceSpecifier; -type BabelNodeFlow = BabelNodeAnyTypeAnnotation | BabelNodeArrayTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeBooleanLiteralTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeClassImplements | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeDeclaredPredicate | BabelNodeExistsTypeAnnotation | BabelNodeFunctionTypeAnnotation | BabelNodeFunctionTypeParam | BabelNodeGenericTypeAnnotation | BabelNodeInferredPredicate | BabelNodeInterfaceExtends | BabelNodeInterfaceDeclaration | BabelNodeIntersectionTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNullableTypeAnnotation | BabelNodeNumberLiteralTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeStringLiteralTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeTupleTypeAnnotation | BabelNodeTypeofTypeAnnotation | BabelNodeTypeAlias | BabelNodeTypeCastExpression | BabelNodeObjectTypeAnnotation | BabelNodeObjectTypeCallProperty | BabelNodeObjectTypeIndexer | BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty | BabelNodeQualifiedTypeIdentifier | BabelNodeUnionTypeAnnotation | BabelNodeVoidTypeAnnotation | BabelNodeTypeAnnotation | BabelNodeTypeParameterInstantiation | BabelNodeTypeParameterDeclaration | BabelNodeTypeParameter; +type BabelNodeFlow = BabelNodeAnyTypeAnnotation | BabelNodeArrayTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeBooleanLiteralTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeClassImplements | BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeDeclaredPredicate | BabelNodeExistsTypeAnnotation | BabelNodeFunctionTypeAnnotation | BabelNodeFunctionTypeParam | BabelNodeGenericTypeAnnotation | BabelNodeInferredPredicate | BabelNodeInterfaceExtends | BabelNodeInterfaceDeclaration | BabelNodeIntersectionTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNullableTypeAnnotation | BabelNodeNumberLiteralTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeStringLiteralTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeTupleTypeAnnotation | BabelNodeTypeofTypeAnnotation | BabelNodeTypeAlias | BabelNodeOpaqueType | BabelNodeTypeCastExpression | BabelNodeObjectTypeAnnotation | BabelNodeObjectTypeCallProperty | BabelNodeObjectTypeIndexer | BabelNodeObjectTypeProperty | BabelNodeObjectTypeSpreadProperty | BabelNodeQualifiedTypeIdentifier | BabelNodeUnionTypeAnnotation | BabelNodeVoidTypeAnnotation | BabelNodeTypeAnnotation | BabelNodeTypeParameterInstantiation | BabelNodeTypeParameterDeclaration | BabelNodeTypeParameter; type BabelNodeFlowBaseAnnotation = BabelNodeAnyTypeAnnotation | BabelNodeBooleanTypeAnnotation | BabelNodeNullLiteralTypeAnnotation | BabelNodeMixedTypeAnnotation | BabelNodeEmptyTypeAnnotation | BabelNodeNumberTypeAnnotation | BabelNodeStringTypeAnnotation | BabelNodeThisTypeAnnotation | BabelNodeVoidTypeAnnotation; -type BabelNodeFlowDeclaration = BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeTypeAlias; +type BabelNodeFlowDeclaration = BabelNodeDeclareClass | BabelNodeDeclareFunction | BabelNodeDeclareInterface | BabelNodeDeclareModule | BabelNodeDeclareModuleExports | BabelNodeDeclareTypeAlias | BabelNodeDeclareOpaqueType | BabelNodeDeclareVariable | BabelNodeDeclareExportDeclaration | BabelNodeDeclareExportAllDeclaration | BabelNodeInterfaceDeclaration | BabelNodeTypeAlias | BabelNodeOpaqueType; type BabelNodeFlowPredicate = BabelNodeDeclaredPredicate | BabelNodeInferredPredicate; type BabelNodeJSX = BabelNodeJSXAttribute | BabelNodeJSXClosingElement | BabelNodeJSXElement | BabelNodeJSXEmptyExpression | BabelNodeJSXExpressionContainer | BabelNodeJSXSpreadChild | BabelNodeJSXIdentifier | BabelNodeJSXMemberExpression | BabelNodeJSXNamespacedName | BabelNodeJSXOpeningElement | BabelNodeJSXSpreadAttribute | BabelNodeJSXText; type BabelNodeTSTypeElement = BabelNodeTSCallSignatureDeclaration | BabelNodeTSConstructSignatureDeclaration | BabelNodeTSPropertySignature | BabelNodeTSMethodSignature | BabelNodeTSIndexSignature; @@ -1338,6 +1353,7 @@ declare module "babel-types" { declare function declareModule(id: any, body: any): BabelNodeDeclareModule; declare function declareModuleExports(typeAnnotation: any): BabelNodeDeclareModuleExports; declare function declareTypeAlias(id: any, typeParameters: any, right: any): BabelNodeDeclareTypeAlias; + declare function declareOpaqueType(id: any, typeParameters: any, supertype: any): BabelNodeDeclareOpaqueType; declare function declareVariable(id: any): BabelNodeDeclareVariable; declare function declareExportDeclaration(declaration: any, specifiers: any, source: any): BabelNodeDeclareExportDeclaration; declare function declareExportAllDeclaration(source: any): BabelNodeDeclareExportAllDeclaration; @@ -1361,6 +1377,7 @@ declare module "babel-types" { declare function tupleTypeAnnotation(types: any): BabelNodeTupleTypeAnnotation; declare function typeofTypeAnnotation(argument: any): BabelNodeTypeofTypeAnnotation; declare function typeAlias(id: any, typeParameters: any, right: any): BabelNodeTypeAlias; + declare function opaqueType(id: any, typeParameters: any, supertype: any, impltype: any): BabelNodeOpaqueType; declare function typeCastExpression(expression: any, typeAnnotation: any): BabelNodeTypeCastExpression; declare function objectTypeAnnotation(properties: any, indexers: any, callProperties: any): BabelNodeObjectTypeAnnotation; declare function objectTypeCallProperty(value: any): BabelNodeObjectTypeCallProperty; @@ -1530,6 +1547,7 @@ declare module "babel-types" { declare function isDeclareModule(node: Object, opts?: Object): boolean; declare function isDeclareModuleExports(node: Object, opts?: Object): boolean; declare function isDeclareTypeAlias(node: Object, opts?: Object): boolean; + declare function isDeclareOpaqueType(node: Object, opts?: Object): boolean; declare function isDeclareVariable(node: Object, opts?: Object): boolean; declare function isDeclareExportDeclaration(node: Object, opts?: Object): boolean; declare function isDeclareExportAllDeclaration(node: Object, opts?: Object): boolean; @@ -1553,6 +1571,7 @@ declare module "babel-types" { declare function isTupleTypeAnnotation(node: Object, opts?: Object): boolean; declare function isTypeofTypeAnnotation(node: Object, opts?: Object): boolean; declare function isTypeAlias(node: Object, opts?: Object): boolean; + declare function isOpaqueType(node: Object, opts?: Object): boolean; declare function isTypeCastExpression(node: Object, opts?: Object): boolean; declare function isObjectTypeAnnotation(node: Object, opts?: Object): boolean; declare function isObjectTypeCallProperty(node: Object, opts?: Object): boolean; diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index be78c2660f9d..172a9f49313b 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -95,6 +95,14 @@ export function DeclareTypeAlias(node: Object) { this.TypeAlias(node); } +export function DeclareOpaqueType(node: Object, parent: Object) { + if (!t.isDeclareExportDeclaration(parent)) { + this.word("declare"); + this.space(); + } + this.OpaqueType(node); +} + export function DeclareVariable(node: Object, parent: Object) { if (!t.isDeclareExportDeclaration(parent)) { this.word("declare"); @@ -303,6 +311,27 @@ export function TypeAlias(node: Object) { this.semicolon(); } +export function OpaqueType(node: Object) { + this.word("opaque"); + this.space(); + this.word("type"); + this.space(); + this.print(node.id, node); + this.print(node.typeParameters, node); + if (node.supertype) { + this.token(":"); + this.space(); + this.print(node.supertype, node); + } + if (node.impltype) { + this.space(); + this.token("="); + this.space(); + this.print(node.impltype, node); + } + this.semicolon(); +} + export function ObjectTypeAnnotation(node: Object) { if (node.exact) { this.token("{|"); diff --git a/packages/babel-generator/test/fixtures/flow/declare-exports/actual.js b/packages/babel-generator/test/fixtures/flow/declare-exports/actual.js index 222d7dc343ce..ea4a8c7cd463 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-exports/actual.js +++ b/packages/babel-generator/test/fixtures/flow/declare-exports/actual.js @@ -24,3 +24,9 @@ declare module B { } declare module "foo" { declare export type * from "bar"; } +declare export opaque type Foo; +declare export opaque type Bar; +declare export opaque type Baz: Foo; +declare export opaque type Foo: Bar; +declare export opaque type Foo: Bar; +declare export opaque type Foo: Bar; diff --git a/packages/babel-generator/test/fixtures/flow/declare-exports/expected.js b/packages/babel-generator/test/fixtures/flow/declare-exports/expected.js index cc5da01f9c91..4cf54c307b03 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-exports/expected.js +++ b/packages/babel-generator/test/fixtures/flow/declare-exports/expected.js @@ -32,4 +32,10 @@ declare module B { } declare module "foo" { declare export type * from "bar"; -} \ No newline at end of file +} +declare export opaque type Foo; +declare export opaque type Bar; +declare export opaque type Baz: Foo; +declare export opaque type Foo: Bar; +declare export opaque type Foo: Bar; +declare export opaque type Foo: Bar; diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js index d5744cfdcc2f..a0874c4d44a4 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/actual.js @@ -19,3 +19,7 @@ declare type B = { declare interface I { foo: string } declare interface I { foo: T } declare module.exports: { foo: string } +declare opaque type Foo: Bar; +declare opaque type ID; +declare opaque type num: number; +declare opaque type NumArray; diff --git a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js index 93dc88c440eb..d186a7ab19ee 100644 --- a/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js +++ b/packages/babel-generator/test/fixtures/flow/declare-statements/expected.js @@ -37,4 +37,8 @@ declare interface I { } declare module.exports: { foo: string -} \ No newline at end of file +} +declare opaque type Foo: Bar; +declare opaque type ID; +declare opaque type num: number; +declare opaque type NumArray; diff --git a/packages/babel-generator/test/fixtures/flow/opaque-type-alias/actual.js b/packages/babel-generator/test/fixtures/flow/opaque-type-alias/actual.js new file mode 100644 index 000000000000..1988fcaeed71 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/opaque-type-alias/actual.js @@ -0,0 +1,14 @@ +opaque type ID = string; +opaque type Foo = Bar; +opaque type Maybe = _Maybe; +export opaque type Foo = number; + +opaque type union = + | {type: "A"} + | {type: "B"} +; + +opaque type overloads = + & ((x: string) => number) + & ((x: number) => string) +; diff --git a/packages/babel-generator/test/fixtures/flow/opaque-type-alias/expected.js b/packages/babel-generator/test/fixtures/flow/opaque-type-alias/expected.js new file mode 100644 index 000000000000..191ed89f7010 --- /dev/null +++ b/packages/babel-generator/test/fixtures/flow/opaque-type-alias/expected.js @@ -0,0 +1,10 @@ +opaque type ID = string; +opaque type Foo = Bar; +opaque type Maybe = _Maybe; +export opaque type Foo = number; +opaque type union = { + type: "A" +} | { + type: "B" +}; +opaque type overloads = (x: string) => number & (x: number) => string; diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/opaque-type-alias/actual.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/opaque-type-alias/actual.js new file mode 100644 index 000000000000..50a01cdb53d2 --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/opaque-type-alias/actual.js @@ -0,0 +1,15 @@ +function a() {} +opaque type A = number; +opaque type B = { + name: string; +}; + +opaque type union = + | {type: "A"} + | {type: "B"} +; + +opaque type overloads = + & ((x: string) => number) + & ((x: number) => string) +; diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/opaque-type-alias/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/opaque-type-alias/expected.js new file mode 100644 index 000000000000..137f27222097 --- /dev/null +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/opaque-type-alias/expected.js @@ -0,0 +1,16 @@ +function a() {} +/*:: opaque type A = number;*/ + +/*:: opaque type B = { + name: string; +};*/ + +/*:: opaque type union = + | {type: "A"} + | {type: "B"} +;*/ + +/*:: opaque type overloads = + & ((x: string) => number) + & ((x: number) => string) +;*/ diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-opaque-type-alias/actual.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-opaque-type-alias/actual.js new file mode 100644 index 000000000000..53dfc2c87440 --- /dev/null +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/strip-types/strip-opaque-type-alias/actual.js @@ -0,0 +1,16 @@ +opaque type ID = string; +opaque type Foo = Bar +export opaque type Foo = number; + +opaque type union = + | {type: "A"} + | {type: "B"} +; + +opaque type overloads = + & ((x: string) => number) + & ((x: number) => string) +; + +declare opaque type Foo: Bar; +declare export opaque type Foo: Bar; diff --git a/packages/babel-types/README.md b/packages/babel-types/README.md index 39ade888924d..c6eefa79f04d 100644 --- a/packages/babel-types/README.md +++ b/packages/babel-types/README.md @@ -507,6 +507,21 @@ Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` --- +### declareOpaqueType +```javascript +t.declareOpaqueType(id, typeParameters, supertype) +``` + +See also `t.isDeclareOpaqueType(node, opts)` and `t.assertDeclareOpaqueType(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + - `typeParameters` (required) + - `supertype` (required) + +--- + ### declareTypeAlias ```javascript t.declareTypeAlias(id, typeParameters, right) @@ -1505,6 +1520,22 @@ Aliases: `Flow`, `UserWhitespacable` --- +### opaqueType +```javascript +t.opaqueType(id, typeParameters, supertype, impltype) +``` + +See also `t.isOpaqueType(node, opts)` and `t.assertOpaqueType(node, opts)`. + +Aliases: `Flow`, `FlowDeclaration`, `Statement`, `Declaration` + + - `id` (required) + - `typeParameters` (required) + - `supertype` (required) + - `impltype` (required) + +--- + ### parenthesizedExpression ```javascript t.parenthesizedExpression(expression) diff --git a/packages/babel-types/src/definitions/flow.js b/packages/babel-types/src/definitions/flow.js index dccf11d551e4..97f123fe6476 100644 --- a/packages/babel-types/src/definitions/flow.js +++ b/packages/babel-types/src/definitions/flow.js @@ -88,6 +88,14 @@ defineType("DeclareTypeAlias", { }, }); +defineType("DeclareOpaqueType", { + visitor: ["id", "typeParameters", "supertype"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + }, +}); + defineType("DeclareVariable", { visitor: ["id"], aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], @@ -252,6 +260,14 @@ defineType("TypeAlias", { }, }); +defineType("OpaqueType", { + visitor: ["id", "typeParameters", "supertype", "impltype"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: { + // todo + }, +}); + defineType("TypeCastExpression", { visitor: ["expression", "typeAnnotation"], aliases: ["Flow", "ExpressionWrapper", "Expression"], diff --git a/packages/babel-types/src/retrievers.js b/packages/babel-types/src/retrievers.js index e8469fafa432..8deb4053bfe9 100644 --- a/packages/babel-types/src/retrievers.js +++ b/packages/babel-types/src/retrievers.js @@ -70,6 +70,7 @@ getBindingIdentifiers.keys = { DeclareVariable: ["id"], InterfaceDeclaration: ["id"], TypeAlias: ["id"], + OpaqueType: ["id"], CatchClause: ["param"], LabeledStatement: ["label"],