From 8306878bd935e0f2be50afda32da06d4071f45e1 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Thu, 28 May 2020 21:51:31 -0500 Subject: [PATCH] Add support for printing ImportAttribute --- .../babel-generator/src/generators/modules.js | 15 +++++++++++++++ .../test/fixtures/types/Import2/input.js | 1 + .../test/fixtures/types/Import2/options.json | 11 +++++++++++ .../test/fixtures/types/Import2/output.js | 5 +++++ .../test/fixtures/types/ImportAttribute/input.js | 1 + .../fixtures/types/ImportAttribute/options.json | 11 +++++++++++ .../test/fixtures/types/ImportAttribute/output.js | 1 + .../babel-types/src/asserts/generated/index.js | 3 +++ .../babel-types/src/builders/generated/index.js | 4 ++++ .../babel-types/src/definitions/experimental.js | 4 ++++ .../babel-types/src/validators/generated/index.js | 14 ++++++++++++++ 11 files changed, 70 insertions(+) create mode 100644 packages/babel-generator/test/fixtures/types/Import2/input.js create mode 100644 packages/babel-generator/test/fixtures/types/Import2/options.json create mode 100644 packages/babel-generator/test/fixtures/types/Import2/output.js create mode 100644 packages/babel-generator/test/fixtures/types/ImportAttribute/input.js create mode 100644 packages/babel-generator/test/fixtures/types/ImportAttribute/options.json create mode 100644 packages/babel-generator/test/fixtures/types/ImportAttribute/output.js diff --git a/packages/babel-generator/src/generators/modules.js b/packages/babel-generator/src/generators/modules.js index 9edce3a33f15..0d398f801c53 100644 --- a/packages/babel-generator/src/generators/modules.js +++ b/packages/babel-generator/src/generators/modules.js @@ -179,9 +179,24 @@ export function ImportDeclaration(node: Object) { } this.print(node.source, node); + + if (node.attributes?.length) { + this.space(); + this.word("with"); + this.space(); + this.printList(node.attributes, node); + } + this.semicolon(); } +export function ImportAttribute(node: Object) { + this.print(node.key); + this.token(":"); + this.space(); + this.print(node.value); +} + export function ImportNamespaceSpecifier(node: Object) { this.token("*"); this.space(); diff --git a/packages/babel-generator/test/fixtures/types/Import2/input.js b/packages/babel-generator/test/fixtures/types/Import2/input.js new file mode 100644 index 000000000000..f01b3a7ec608 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Import2/input.js @@ -0,0 +1 @@ +import("foo.json", { with: { type: "json" } },); diff --git a/packages/babel-generator/test/fixtures/types/Import2/options.json b/packages/babel-generator/test/fixtures/types/Import2/options.json new file mode 100644 index 000000000000..14244aa04de3 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Import2/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "moduleAttributes", + { + "version": "may-2020" + } + ] + ], + "sourceType": "module" +} diff --git a/packages/babel-generator/test/fixtures/types/Import2/output.js b/packages/babel-generator/test/fixtures/types/Import2/output.js new file mode 100644 index 000000000000..bee81287dbea --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/Import2/output.js @@ -0,0 +1,5 @@ +import("foo.json", { + with: { + type: "json" + } +}); diff --git a/packages/babel-generator/test/fixtures/types/ImportAttribute/input.js b/packages/babel-generator/test/fixtures/types/ImportAttribute/input.js new file mode 100644 index 000000000000..fb31508a0860 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ImportAttribute/input.js @@ -0,0 +1 @@ +import foo from "foo.json" with type: "json"; diff --git a/packages/babel-generator/test/fixtures/types/ImportAttribute/options.json b/packages/babel-generator/test/fixtures/types/ImportAttribute/options.json new file mode 100644 index 000000000000..14244aa04de3 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ImportAttribute/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "moduleAttributes", + { + "version": "may-2020" + } + ] + ], + "sourceType": "module" +} diff --git a/packages/babel-generator/test/fixtures/types/ImportAttribute/output.js b/packages/babel-generator/test/fixtures/types/ImportAttribute/output.js new file mode 100644 index 000000000000..fb31508a0860 --- /dev/null +++ b/packages/babel-generator/test/fixtures/types/ImportAttribute/output.js @@ -0,0 +1 @@ +import foo from "foo.json" with type: "json"; diff --git a/packages/babel-types/src/asserts/generated/index.js b/packages/babel-types/src/asserts/generated/index.js index a99c58081d41..457103a16b71 100644 --- a/packages/babel-types/src/asserts/generated/index.js +++ b/packages/babel-types/src/asserts/generated/index.js @@ -767,6 +767,9 @@ export function assertClassPrivateMethod( export function assertImport(node: Object, opts?: Object = {}): void { assert("Import", node, opts); } +export function assertImportAttribute(node: Object, opts?: Object = {}): void { + assert("ImportAttribute", node, opts); +} export function assertDecorator(node: Object, opts?: Object = {}): void { assert("Decorator", node, opts); } diff --git a/packages/babel-types/src/builders/generated/index.js b/packages/babel-types/src/builders/generated/index.js index fc319d6ad114..676ff2c0d4dc 100644 --- a/packages/babel-types/src/builders/generated/index.js +++ b/packages/babel-types/src/builders/generated/index.js @@ -692,6 +692,10 @@ export function Import(...args: Array): Object { return builder("Import", ...args); } export { Import as import }; +export function ImportAttribute(...args: Array): Object { + return builder("ImportAttribute", ...args); +} +export { ImportAttribute as importAttribute }; export function Decorator(...args: Array): Object { return builder("Decorator", ...args); } diff --git a/packages/babel-types/src/definitions/experimental.js b/packages/babel-types/src/definitions/experimental.js index 062f96660707..5abd6cc486a7 100644 --- a/packages/babel-types/src/definitions/experimental.js +++ b/packages/babel-types/src/definitions/experimental.js @@ -224,6 +224,10 @@ defineType("Import", { aliases: ["Expression"], }); +defineType("ImportAttribute", { + visitor: ["key", "value"], +}); + defineType("Decorator", { visitor: ["expression"], fields: { diff --git a/packages/babel-types/src/validators/generated/index.js b/packages/babel-types/src/validators/generated/index.js index 4fc045c201a9..746034390aaf 100644 --- a/packages/babel-types/src/validators/generated/index.js +++ b/packages/babel-types/src/validators/generated/index.js @@ -2441,6 +2441,20 @@ export function isImport(node: ?Object, opts?: Object): boolean { return false; } +export function isImportAttribute(node: ?Object, opts?: Object): boolean { + if (!node) return false; + + const nodeType = node.type; + if (nodeType === "ImportAttribute") { + if (typeof opts === "undefined") { + return true; + } else { + return shallowEqual(node, opts); + } + } + + return false; +} export function isDecorator(node: ?Object, opts?: Object): boolean { if (!node) return false;