Support "Import Reflection" proposal (#13771)

This commit is contained in:
fisker Cheung authored and GitHub committed 2022-11-07 09:49:35 +08:00
1 parent 04a8134098
commit 1de926ac79
39 files changed
+528 -4

No files matched your search

+9
View File
@@ -0,0 +1,9 @@
#### Add support for "Import Reflection" proposal (#13771 by @fisker)
The Stage 2 proposal ["Import Reflection"](https://github.com/tc39/proposal-import-reflection) is now supported via Babel 7.20.0. Also keep in mind our [policy on non-standardized syntax](https://prettier.io/docs/en/rationale.html#disclaimer-about-non-standard-syntax) before using this proposed syntax feature with Prettier.
<!-- prettier-ignore -->
```js
// Examples
import module x from "<specifier>";
```
+1
View File
@@ -40,6 +40,7 @@ const parseOptions = {
"regexpUnicodeSets",
"destructuringPrivate",
"decoratorAutoAccessors",
"importReflection",
],
tokens: true,
ranges: true,
+4
View File
@@ -38,6 +38,10 @@ function printImportDeclaration(path, options, print) {
parts.push("import");
if (node.module) {
parts.push(" module");
}
if (importKind && importKind !== "value") {
parts.push(" ", importKind);
}
+4 -4
View File
@@ -27,7 +27,7 @@ const categoryParsers = new Map([
{
parsers: ["flow", "babel-flow"],
verifyParsers: ["babel", "flow", "babel-flow", "typescript", "babel-ts"],
extensions: [".js"],
extensions: [".js", ".cjs", ".mjs"],
},
],
[
@@ -35,7 +35,7 @@ const categoryParsers = new Map([
{
parsers: ["flow", "babel-flow"],
verifyParsers: ["babel", "flow", "babel-flow", "typescript", "babel-ts"],
extensions: [".js"],
extensions: [".js", ".cjs", ".mjs"],
},
],
[
@@ -62,7 +62,7 @@ const categoryParsers = new Map([
"typescript",
"babel-ts",
],
extensions: [".js"],
extensions: [".js", ".cjs", ".mjs"],
},
],
[
@@ -112,7 +112,7 @@ const categoryParsers = new Map([
{
parsers: ["typescript", "babel-ts"],
verifyParsers: ["babel", "flow", "babel-flow", "typescript", "babel-ts"],
extensions: [".ts", ".tsx"],
extensions: [".ts", ".tsx", ".cts", ".mts"],
},
],
[
@@ -1185,6 +1185,41 @@ printWidth: 80
================================================================================
`;
exports[`import-reflection.js [acorn] format 1`] = `
"Unexpected token (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js [espree] format 1`] = `
"Unexpected token foo (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js [meriyah] format 1`] = `
"Import source must be string (1:17)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js format 1`] = `
====================================options=====================================
parsers: ["babel", "babel-ts", "babel-flow"]
printWidth: 80
| printWidth
=====================================input======================================
import module foo from "./module.wasm";
=====================================output=====================================
import module foo from "./module.wasm";
================================================================================
`;
exports[`jsx.js format 1`] = `
====================================options=====================================
parsers: ["babel", "babel-ts", "babel-flow"]
@@ -0,0 +1 @@
import module foo from "./module.wasm";
@@ -27,6 +27,7 @@ run_spec(import.meta, ["babel", "babel-ts", "babel-flow"], {
"async-do-expressions.js",
"regex-v-flag.js",
"decorator-auto-accessors.js",
"import-reflection.js",
],
espree: [
"decimal.js",
@@ -52,6 +53,7 @@ run_spec(import.meta, ["babel", "babel-ts", "babel-flow"], {
"async-do-expressions.js",
"regex-v-flag.js",
"decorator-auto-accessors.js",
"import-reflection.js",
],
meriyah: [
"decimal.js",
@@ -78,6 +80,7 @@ run_spec(import.meta, ["babel", "babel-ts", "babel-flow"], {
"module-blocks.js",
"async-do-expressions.js",
"regex-v-flag.js",
"import-reflection.js",
],
},
});
@@ -0,0 +1,267 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`comments.js [acorn] format 1`] = `
"Unexpected token (1:48)
> 1 | /* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
| ^
2 |"
`;
exports[`comments.js [espree] format 1`] = `
"Unexpected token from (1:48)
> 1 | /* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
| ^
2 |"
`;
exports[`comments.js [flow] format 1`] = `
"Unexpected identifier, expected a string (1:48)
> 1 | /* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
| ^^^^
2 |"
`;
exports[`comments.js [meriyah] format 1`] = `
"Import source must be string (1:51)
> 1 | /* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
| ^
2 |"
`;
exports[`comments.js [typescript] format 1`] = `
"';' expected. (1:60)
> 1 | /* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
| ^
2 |"
`;
exports[`comments.js format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
/* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
=====================================output=====================================
/* 0 */ import module /* 1 */ /* 2 */ from /* 3 */ from /* 4 */ "./module.wasm" /* 5 */;
================================================================================
`;
exports[`import-reflection.js [acorn] format 1`] = `
"Unexpected token (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js [espree] format 1`] = `
"Unexpected token foo (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js [flow] format 1`] = `
"Unexpected identifier, expected the keyword \`from\` (1:15)
> 1 | import module foo from "./module.wasm";
| ^^^
2 |"
`;
exports[`import-reflection.js [meriyah] format 1`] = `
"Import source must be string (1:17)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js [typescript] format 1`] = `
"'=' expected. (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 |"
`;
exports[`import-reflection.js format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
import module foo from "./module.wasm";
=====================================output=====================================
import module foo from "./module.wasm";
================================================================================
`;
exports[`valid-default-import.mjs [acorn] format 1`] = `
"Unexpected token (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-default-import.mjs [espree] format 1`] = `
"Unexpected token foo (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-default-import.mjs [flow] format 1`] = `
"Unexpected identifier, expected the keyword \`from\` (1:15)
> 1 | import module foo from "./module.wasm";
| ^^^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-default-import.mjs [meriyah] format 1`] = `
"Import source must be string (1:17)
> 1 | import module foo from "./module.wasm";
| ^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-default-import.mjs [typescript] format 1`] = `
"'=' expected. (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-default-import.mjs format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
import module foo from "./module.wasm";
import bar from "./module.wasm";
=====================================output=====================================
import module foo from "./module.wasm";
import bar from "./module.wasm";
================================================================================
`;
exports[`valid-from-as-default-module-binding.mjs [acorn] format 1`] = `
"Unexpected token (1:20)
> 1 | import module from from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding.mjs [espree] format 1`] = `
"Unexpected token from (1:20)
> 1 | import module from from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding.mjs [flow] format 1`] = `
"Unexpected identifier, expected a string (1:20)
> 1 | import module from from "./module.wasm";
| ^^^^
2 |"
`;
exports[`valid-from-as-default-module-binding.mjs [meriyah] format 1`] = `
"Import source must be string (1:23)
> 1 | import module from from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding.mjs [typescript] format 1`] = `
"';' expected. (1:25)
> 1 | import module from from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding.mjs format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
import module from from "./module.wasm";
=====================================output=====================================
import module from from "./module.wasm";
================================================================================
`;
exports[`valid-from-as-default-module-binding-escaped.mjs [acorn] format 1`] = `
"Unexpected token (1:15)
> 1 | import module \\u0066rom from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding-escaped.mjs [espree] format 1`] = `
"Unexpected token \\u0066rom (1:15)
> 1 | import module \\u0066rom from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding-escaped.mjs [flow] format 1`] = `
"Unexpected identifier, expected the keyword \`from\` (1:15)
> 1 | import module \\u0066rom from "./module.wasm";
| ^^^^^^^^^
2 |"
`;
exports[`valid-from-as-default-module-binding-escaped.mjs [meriyah] format 1`] = `
"Import source must be string (1:17)
> 1 | import module \\u0066rom from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding-escaped.mjs [typescript] format 1`] = `
"Keywords cannot contain escape characters. (1:15)
> 1 | import module \\u0066rom from "./module.wasm";
| ^
2 |"
`;
exports[`valid-from-as-default-module-binding-escaped.mjs format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
import module \\u0066rom from "./module.wasm";
=====================================output=====================================
import module from from "./module.wasm";
================================================================================
`;
exports[`valid-module-as-default-binding.mjs format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
import module from "./module.wasm";
=====================================output=====================================
import module from "./module.wasm";
================================================================================
`;
@@ -0,0 +1 @@
/* 0 */import /* 1 */module /* 2 */from /* 3 */from /* 4 */"./module.wasm"/* 5 */;
@@ -0,0 +1 @@
import module foo from "./module.wasm";
@@ -0,0 +1,39 @@
run_spec(import.meta, ["babel", "flow", "typescript"], {
errors: {
flow: [
"comments.js",
"import-reflection.js",
"valid-default-import.mjs",
"valid-from-as-default-module-binding-escaped.mjs",
"valid-from-as-default-module-binding.mjs",
],
typescript: [
"comments.js",
"import-reflection.js",
"valid-default-import.mjs",
"valid-from-as-default-module-binding-escaped.mjs",
"valid-from-as-default-module-binding.mjs",
],
acorn: [
"comments.js",
"import-reflection.js",
"valid-default-import.mjs",
"valid-from-as-default-module-binding-escaped.mjs",
"valid-from-as-default-module-binding.mjs",
],
espree: [
"comments.js",
"import-reflection.js",
"valid-default-import.mjs",
"valid-from-as-default-module-binding-escaped.mjs",
"valid-from-as-default-module-binding.mjs",
],
meriyah: [
"comments.js",
"import-reflection.js",
"valid-default-import.mjs",
"valid-from-as-default-module-binding-escaped.mjs",
"valid-from-as-default-module-binding.mjs",
],
},
});
@@ -0,0 +1,2 @@
import module foo from "./module.wasm";
import bar from "./module.wasm";
@@ -0,0 +1 @@
import module \u0066rom from "./module.wasm";
@@ -0,0 +1 @@
import module from from "./module.wasm";
@@ -0,0 +1 @@
import module from "./module.wasm";
@@ -0,0 +1,17 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`valid-flow-default-import.js [flow] format 1`] = `
"Unexpected identifier, expected the keyword \`from\` (1:15)
> 1 | import module foo from "./module.wasm";
| ^^^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-ts-default-import.js [flow] format 1`] = `
"Unexpected identifier, expected the keyword \`from\` (1:15)
> 1 | import module foo from "./module.wasm";
| ^^^
2 | import bar from "./module.wasm";
3 |"
`;
@@ -0,0 +1 @@
run_spec(import.meta, ["flow"]);
@@ -0,0 +1,2 @@
import module foo from "./module.wasm";
import bar from "./module.wasm";
@@ -0,0 +1,2 @@
import module foo from "./module.wasm";
import bar from "./module.wasm";
@@ -0,0 +1,99 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`invalid-assertions.mjs [babel] format 1`] = `
"\`import module x\` cannot have assertions. (1:15)
> 1 | import module foo from "./module.json" assert { type: "json" }
| ^
2 |"
`;
exports[`invalid-default-named-import.mjs [babel] format 1`] = `
"Only \`import module x from "./module"\` is valid. (1:15)
> 1 | import module foo, {bar} from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-export-from.mjs [babel] format 1`] = `
"Unexpected token, expected "{" (1:8)
> 1 | export module x from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-flow-type-import-1.mjs [babel] format 1`] = `
"Unexpected token, expected "from" (1:20)
> 1 | import type module foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-flow-type-import-2.mjs [babel] format 1`] = `
"An \`import module\` declaration can not use \`type\` or \`typeof\` keyword. (1:20)
> 1 | import module type foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-flow-typeof-import-1.mjs [babel] format 1`] = `
"Unexpected token, expected "from" (1:22)
> 1 | import typeof module foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-flow-typeof-import-2.mjs [babel] format 1`] = `
"An \`import module\` declaration can not use \`type\` or \`typeof\` keyword. (1:22)
> 1 | import module typeof foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-identifier-source.mjs [babel] format 1`] = `
"Unexpected token, expected "from" (1:20)
> 1 | import module from foo
| ^
2 |"
`;
exports[`invalid-module-escape.mjs [babel] format 1`] = `
"Unexpected token, expected "from" (1:20)
> 1 | import modul\\u0065 foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-module-source.mjs [babel] format 1`] = `
"Unexpected token, expected "{" (1:15)
> 1 | import module "foo";
| ^
2 |"
`;
exports[`invalid-named-import.mjs [babel] format 1`] = `
"Only \`import module x from "./module"\` is valid. (1:17)
> 1 | import module { foo } from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-namespace-import.mjs [babel] format 1`] = `
"Only \`import module x from "./module"\` is valid. (1:15)
> 1 | import module * as foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-ts-type-import-1.mts [babel] format 1`] = `
"Unexpected token, expected "from" (1:20)
> 1 | import type module foo from "./module.wasm";
| ^
2 |"
`;
exports[`invalid-ts-type-import-2.mts [babel] format 1`] = `
"An \`import module\` declaration can not use \`type\` or \`typeof\` keyword. (1:20)
> 1 | import module type foo from "./module.wasm";
| ^
2 |"
`;
@@ -0,0 +1 @@
import module foo from "./module.json" assert { type: "json" }
@@ -0,0 +1 @@
import module foo, {bar} from "./module.wasm";
@@ -0,0 +1 @@
export module x from "./module.wasm";
@@ -0,0 +1 @@
import type module foo from "./module.wasm";
@@ -0,0 +1 @@
import module type foo from "./module.wasm";
@@ -0,0 +1 @@
import typeof module foo from "./module.wasm";
@@ -0,0 +1 @@
import module typeof foo from "./module.wasm";
@@ -0,0 +1 @@
import module from foo
@@ -0,0 +1 @@
import modul\u0065 foo from "./module.wasm";
@@ -0,0 +1 @@
import module "foo";
@@ -0,0 +1 @@
import module { foo } from "./module.wasm";
@@ -0,0 +1 @@
import module * as foo from "./module.wasm";
@@ -0,0 +1 @@
import type module foo from "./module.wasm";
@@ -0,0 +1 @@
import module type foo from "./module.wasm";
@@ -0,0 +1 @@
run_spec(import.meta, ["babel"]);
@@ -0,0 +1,17 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`valid-flow-default-import.mts [typescript] format 1`] = `
"'=' expected. (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 | import bar from "./module.wasm";
3 |"
`;
exports[`valid-ts-default-import.mts [typescript] format 1`] = `
"'=' expected. (1:15)
> 1 | import module foo from "./module.wasm";
| ^
2 | import bar from "./module.wasm";
3 |"
`;
@@ -0,0 +1 @@
run_spec(import.meta, ["typescript"]);
@@ -0,0 +1,2 @@
import module foo from "./module.wasm";
import bar from "./module.wasm";
@@ -0,0 +1,2 @@
import module foo from "./module.wasm";
import bar from "./module.wasm";