diff --git a/.prettierignore b/.prettierignore index 8c4dce359d7..93e27c9f84d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -19,9 +19,3 @@ CHANGELOG.md packages/website/.docusaurus packages/website/build packages/website/src/vendor - -# TODO - remove this once prettier supports TS4.1 -packages/scope-manager/tests/fixtures/type-declaration/literal-type1.ts -packages/scope-manager/tests/fixtures/type-declaration/literal-type2.ts -packages/scope-manager/tests/fixtures/type-declaration/literal-type3.ts -packages/scope-manager/tests/fixtures/type-declaration/mapped-named.ts diff --git a/package.json b/package.json index fe8d5e25da3..7c532099e9b 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@types/marked": "^3.0.2", "@types/ncp": "^2.0.5", "@types/node": "^16.11.4", - "@types/prettier": "^2.3.2", + "@types/prettier": "^2.4.2", "@types/rimraf": "^3.0.2", "@types/semver": "^7.3.9", "@types/tmp": "^0.2.2", @@ -102,7 +102,7 @@ "markdownlint-cli": "^0.29.0", "ncp": "^2.0.0", "node-fetch": "^3.0.0", - "prettier": "2.4.1", + "prettier": "^2.5.0", "pretty-format": "^27.3.1", "rimraf": "^3.0.2", "tmp": "^0.2.1", diff --git a/packages/eslint-plugin/tests/rules/naming-convention.test.ts b/packages/eslint-plugin/tests/rules/naming-convention.test.ts index d35afe5ed30..b8ad03a53a6 100644 --- a/packages/eslint-plugin/tests/rules/naming-convention.test.ts +++ b/packages/eslint-plugin/tests/rules/naming-convention.test.ts @@ -1222,7 +1222,7 @@ ruleTester.run('naming-convention', rule, { { code: ` class Ignored { - private static abstract readonly some_name = 1; + private static abstract readonly some_name; IgnoredDueToModifiers = 1; } `, @@ -2060,7 +2060,7 @@ ruleTester.run('naming-convention', rule, { { code: ` class Ignored { - private static abstract readonly some_name = 1; + private static abstract readonly some_name; IgnoredDueToModifiers = 1; } `, diff --git a/packages/scope-manager/src/referencer/ExportVisitor.ts b/packages/scope-manager/src/referencer/ExportVisitor.ts index bae523ae6b2..60dc45bdbff 100644 --- a/packages/scope-manager/src/referencer/ExportVisitor.ts +++ b/packages/scope-manager/src/referencer/ExportVisitor.ts @@ -24,6 +24,7 @@ class ExportVisitor extends Visitor { protected Identifier(node: TSESTree.Identifier): void { if (this.#exportNode.exportKind === 'type') { + // export type { T }; // type exports can only reference types this.#referencer.currentScope().referenceType(node); } else { @@ -65,7 +66,16 @@ class ExportVisitor extends Visitor { } protected ExportSpecifier(node: TSESTree.ExportSpecifier): void { - this.visit(node.local); + if (node.exportKind === 'type') { + // export { type T }; + // type exports can only reference types + // + // we can't let this fall through to the Identifier selector because the exportKind is on this node + // and we don't have access to the `.parent` during scope analysis + this.#referencer.currentScope().referenceType(node.local); + } else { + this.visit(node.local); + } } } diff --git a/packages/scope-manager/tests/fixtures/export/default-type.ts b/packages/scope-manager/tests/fixtures/export/default-type.ts index d62a0213891..c49d502e470 100644 --- a/packages/scope-manager/tests/fixtures/export/default-type.ts +++ b/packages/scope-manager/tests/fixtures/export/default-type.ts @@ -1,4 +1,5 @@ //// @sourceType = module +const T = 1; // unreferenced type T = 1; export default T; diff --git a/packages/scope-manager/tests/fixtures/export/default-type.ts.shot b/packages/scope-manager/tests/fixtures/export/default-type.ts.shot index cd8ffb38873..a03744ca6fa 100644 --- a/packages/scope-manager/tests/fixtures/export/default-type.ts.shot +++ b/packages/scope-manager/tests/fixtures/export/default-type.ts.shot @@ -6,14 +6,28 @@ ScopeManager { ImplicitGlobalConstTypeVariable, Variable$2 { defs: Array [ - TypeDefinition$1 { + VariableDefinition$1 { name: Identifier<"T">, - node: TSTypeAliasDeclaration$1, + node: VariableDeclarator$1, + }, + TypeDefinition$2 { + name: Identifier<"T">, + node: TSTypeAliasDeclaration$2, }, ], name: "T", references: Array [ Reference$1 { + identifier: Identifier<"T">, + init: true, + isRead: false, + isTypeReference: false, + isValueReference: true, + isWrite: true, + resolved: Variable$2, + writeExpr: Literal$3, + }, + Reference$2 { identifier: Identifier<"T">, isRead: true, isTypeReference: true, @@ -22,13 +36,13 @@ ScopeManager { resolved: Variable$2, }, ], - isValueVariable: false, + isValueVariable: true, isTypeVariable: true, }, ], scopes: Array [ GlobalScope$1 { - block: Program$2, + block: Program$4, isStrict: false, references: Array [], set: Map { @@ -41,10 +55,11 @@ ScopeManager { ], }, ModuleScope$2 { - block: Program$2, + block: Program$4, isStrict: true, references: Array [ Reference$1, + Reference$2, ], set: Map { "T" => Variable$2, diff --git a/packages/scope-manager/tests/fixtures/export/type-inline.ts b/packages/scope-manager/tests/fixtures/export/type-inline.ts new file mode 100644 index 00000000000..54016449936 --- /dev/null +++ b/packages/scope-manager/tests/fixtures/export/type-inline.ts @@ -0,0 +1,5 @@ +//// @sourceType = module + +const T = 1; // unreferenced +type T = 1; +export { type T }; diff --git a/packages/scope-manager/tests/fixtures/export/type-inline.ts.shot b/packages/scope-manager/tests/fixtures/export/type-inline.ts.shot new file mode 100644 index 00000000000..0463684b963 --- /dev/null +++ b/packages/scope-manager/tests/fixtures/export/type-inline.ts.shot @@ -0,0 +1,75 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`export type-inline 1`] = ` +ScopeManager { + variables: Array [ + ImplicitGlobalConstTypeVariable, + Variable$2 { + defs: Array [ + VariableDefinition$1 { + name: Identifier<"T">, + node: VariableDeclarator$1, + }, + TypeDefinition$2 { + name: Identifier<"T">, + node: TSTypeAliasDeclaration$2, + }, + ], + name: "T", + references: Array [ + Reference$1 { + identifier: Identifier<"T">, + init: true, + isRead: false, + isTypeReference: false, + isValueReference: true, + isWrite: true, + resolved: Variable$2, + writeExpr: Literal$3, + }, + Reference$2 { + identifier: Identifier<"T">, + isRead: true, + isTypeReference: true, + isValueReference: false, + isWrite: false, + resolved: Variable$2, + }, + ], + isValueVariable: true, + isTypeVariable: true, + }, + ], + scopes: Array [ + GlobalScope$1 { + block: Program$4, + isStrict: false, + references: Array [], + set: Map { + "const" => ImplicitGlobalConstTypeVariable, + }, + type: "global", + upper: null, + variables: Array [ + ImplicitGlobalConstTypeVariable, + ], + }, + ModuleScope$2 { + block: Program$4, + isStrict: true, + references: Array [ + Reference$1, + Reference$2, + ], + set: Map { + "T" => Variable$2, + }, + type: "module", + upper: GlobalScope$1, + variables: Array [ + Variable$2, + ], + }, + ], +} +`; diff --git a/packages/scope-manager/tests/fixtures/import/type-inline-value.ts b/packages/scope-manager/tests/fixtures/import/type-inline-value.ts new file mode 100644 index 00000000000..1675f71cad5 --- /dev/null +++ b/packages/scope-manager/tests/fixtures/import/type-inline-value.ts @@ -0,0 +1,5 @@ +//// @sourceType = module + +import { type foo } from 'foo'; + +type T = typeof foo; diff --git a/packages/scope-manager/tests/fixtures/import/type-inline-value.ts.shot b/packages/scope-manager/tests/fixtures/import/type-inline-value.ts.shot new file mode 100644 index 00000000000..037a97b96fc --- /dev/null +++ b/packages/scope-manager/tests/fixtures/import/type-inline-value.ts.shot @@ -0,0 +1,74 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`import type-inline-value 1`] = ` +ScopeManager { + variables: Array [ + ImplicitGlobalConstTypeVariable, + Variable$2 { + defs: Array [ + ImportBindingDefinition$1 { + name: Identifier<"foo">, + node: ImportSpecifier$1, + }, + ], + name: "foo", + references: Array [ + Reference$1 { + identifier: Identifier<"foo">, + isRead: true, + isTypeReference: false, + isValueReference: true, + isWrite: false, + resolved: Variable$2, + }, + ], + isValueVariable: true, + isTypeVariable: true, + }, + Variable$3 { + defs: Array [ + TypeDefinition$2 { + name: Identifier<"T">, + node: TSTypeAliasDeclaration$2, + }, + ], + name: "T", + references: Array [], + isValueVariable: false, + isTypeVariable: true, + }, + ], + scopes: Array [ + GlobalScope$1 { + block: Program$3, + isStrict: false, + references: Array [], + set: Map { + "const" => ImplicitGlobalConstTypeVariable, + }, + type: "global", + upper: null, + variables: Array [ + ImplicitGlobalConstTypeVariable, + ], + }, + ModuleScope$2 { + block: Program$3, + isStrict: true, + references: Array [ + Reference$1, + ], + set: Map { + "foo" => Variable$2, + "T" => Variable$3, + }, + type: "module", + upper: GlobalScope$1, + variables: Array [ + Variable$2, + Variable$3, + ], + }, + ], +} +`; diff --git a/packages/scope-manager/tests/fixtures/import/type-inline.ts b/packages/scope-manager/tests/fixtures/import/type-inline.ts new file mode 100644 index 00000000000..f6eba4fd0df --- /dev/null +++ b/packages/scope-manager/tests/fixtures/import/type-inline.ts @@ -0,0 +1,6 @@ +//// @sourceType = module + +import { type T } from 'foo'; + +type Ref = T; +const unresolved = T; diff --git a/packages/scope-manager/tests/fixtures/import/type-inline.ts.shot b/packages/scope-manager/tests/fixtures/import/type-inline.ts.shot new file mode 100644 index 00000000000..4e5205e91d2 --- /dev/null +++ b/packages/scope-manager/tests/fixtures/import/type-inline.ts.shot @@ -0,0 +1,109 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`import type-inline 1`] = ` +ScopeManager { + variables: Array [ + ImplicitGlobalConstTypeVariable, + Variable$2 { + defs: Array [ + ImportBindingDefinition$1 { + name: Identifier<"T">, + node: ImportSpecifier$1, + }, + ], + name: "T", + references: Array [ + Reference$1 { + identifier: Identifier<"T">, + isRead: true, + isTypeReference: true, + isValueReference: false, + isWrite: false, + resolved: Variable$2, + }, + Reference$3 { + identifier: Identifier<"T">, + isRead: true, + isTypeReference: false, + isValueReference: true, + isWrite: false, + resolved: Variable$2, + }, + ], + isValueVariable: true, + isTypeVariable: true, + }, + Variable$3 { + defs: Array [ + TypeDefinition$2 { + name: Identifier<"Ref">, + node: TSTypeAliasDeclaration$2, + }, + ], + name: "Ref", + references: Array [], + isValueVariable: false, + isTypeVariable: true, + }, + Variable$4 { + defs: Array [ + VariableDefinition$3 { + name: Identifier<"unresolved">, + node: VariableDeclarator$3, + }, + ], + name: "unresolved", + references: Array [ + Reference$2 { + identifier: Identifier<"unresolved">, + init: true, + isRead: false, + isTypeReference: false, + isValueReference: true, + isWrite: true, + resolved: Variable$4, + writeExpr: Identifier<"T">, + }, + ], + isValueVariable: true, + isTypeVariable: false, + }, + ], + scopes: Array [ + GlobalScope$1 { + block: Program$4, + isStrict: false, + references: Array [], + set: Map { + "const" => ImplicitGlobalConstTypeVariable, + }, + type: "global", + upper: null, + variables: Array [ + ImplicitGlobalConstTypeVariable, + ], + }, + ModuleScope$2 { + block: Program$4, + isStrict: true, + references: Array [ + Reference$1, + Reference$2, + Reference$3, + ], + set: Map { + "T" => Variable$2, + "Ref" => Variable$3, + "unresolved" => Variable$4, + }, + type: "module", + upper: GlobalScope$1, + variables: Array [ + Variable$2, + Variable$3, + Variable$4, + ], + }, + ], +} +`; diff --git a/packages/scope-manager/tests/fixtures/import/type-named.ts b/packages/scope-manager/tests/fixtures/import/type-named.ts index 1b73102379a..f2d4b03083d 100644 --- a/packages/scope-manager/tests/fixtures/import/type-named.ts +++ b/packages/scope-manager/tests/fixtures/import/type-named.ts @@ -3,4 +3,4 @@ import type { T } from 'foo'; type Ref = T; -const unresovled = T; +const unresolved = T; diff --git a/packages/scope-manager/tests/fixtures/import/type-named.ts.shot b/packages/scope-manager/tests/fixtures/import/type-named.ts.shot index ddf3bf95f63..75b2214ff06 100644 --- a/packages/scope-manager/tests/fixtures/import/type-named.ts.shot +++ b/packages/scope-manager/tests/fixtures/import/type-named.ts.shot @@ -48,14 +48,14 @@ ScopeManager { Variable$4 { defs: Array [ VariableDefinition$3 { - name: Identifier<"unresovled">, + name: Identifier<"unresolved">, node: VariableDeclarator$3, }, ], - name: "unresovled", + name: "unresolved", references: Array [ Reference$2 { - identifier: Identifier<"unresovled">, + identifier: Identifier<"unresolved">, init: true, isRead: false, isTypeReference: false, @@ -94,7 +94,7 @@ ScopeManager { set: Map { "T" => Variable$2, "Ref" => Variable$3, - "unresovled" => Variable$4, + "unresolved" => Variable$4, }, type: "module", upper: GlobalScope$1, diff --git a/packages/scope-manager/tests/fixtures/type-declaration/literal-type1.ts b/packages/scope-manager/tests/fixtures/type-declaration/literal-type1.ts index 62d52177631..3fe358428f7 100644 --- a/packages/scope-manager/tests/fixtures/type-declaration/literal-type1.ts +++ b/packages/scope-manager/tests/fixtures/type-declaration/literal-type1.ts @@ -1,3 +1,3 @@ -type Color = "red" | "blue"; -type Quantity = "one" | "two"; +type Color = 'red' | 'blue'; +type Quantity = 'one' | 'two'; type SeussFish = `${Quantity | Color} fish`; diff --git a/packages/scope-manager/tests/fixtures/type-declaration/literal-type2.ts b/packages/scope-manager/tests/fixtures/type-declaration/literal-type2.ts index b08b1843885..264558bea38 100644 --- a/packages/scope-manager/tests/fixtures/type-declaration/literal-type2.ts +++ b/packages/scope-manager/tests/fixtures/type-declaration/literal-type2.ts @@ -1,2 +1,3 @@ -type EnthusiasticGreeting = `${Uppercase} - ${Lowercase} - ${Capitalize} - ${Uncapitalize}`; -type HELLO = EnthusiasticGreeting<"heLLo">; +type EnthusiasticGreeting = + `${Uppercase} - ${Lowercase} - ${Capitalize} - ${Uncapitalize}`; +type HELLO = EnthusiasticGreeting<'heLLo'>; diff --git a/packages/scope-manager/tests/fixtures/type-declaration/literal-type3.ts b/packages/scope-manager/tests/fixtures/type-declaration/literal-type3.ts index 126a004bf3e..408889902ee 100644 --- a/packages/scope-manager/tests/fixtures/type-declaration/literal-type3.ts +++ b/packages/scope-manager/tests/fixtures/type-declaration/literal-type3.ts @@ -1,8 +1,10 @@ -type VerticalAlignment = "top" | "middle" | "bottom"; -type HorizontalAlignment = "left" | "center" | "right"; +type VerticalAlignment = 'top' | 'middle' | 'bottom'; +type HorizontalAlignment = 'left' | 'center' | 'right'; // Takes // | "top-left" | "top-center" | "top-right" // | "middle-left" | "middle-center" | "middle-right" // | "bottom-left" | "bottom-center" | "bottom-right" -declare function setAlignment(value: `${VerticalAlignment}-${HorizontalAlignment}`): void; +declare function setAlignment( + value: `${VerticalAlignment}-${HorizontalAlignment}`, +): void; diff --git a/packages/website/src/components/ast/ASTViewer.module.css b/packages/website/src/components/ast/ASTViewer.module.css index ebb4b3470dc..1739f872ecb 100644 --- a/packages/website/src/components/ast/ASTViewer.module.css +++ b/packages/website/src/components/ast/ASTViewer.module.css @@ -5,10 +5,10 @@ margin: 0; list-style: none; padding-left: 1.5rem; - font-family: Consolas, "Courier New", monospace; + font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 13px; - font-feature-settings: "liga" 0, "calt" 0; + font-feature-settings: 'liga' 0, 'calt' 0; line-height: 18px; letter-spacing: 0px; } diff --git a/packages/website/src/components/config/ConfigEditor.module.css b/packages/website/src/components/config/ConfigEditor.module.css index 2ca4bb4c1cc..1329e5af9a7 100644 --- a/packages/website/src/components/config/ConfigEditor.module.css +++ b/packages/website/src/components/config/ConfigEditor.module.css @@ -15,7 +15,8 @@ border-radius: 0.2rem; } -.searchResult, .searchResultGroup { +.searchResult, +.searchResultGroup { align-items: center; display: flex; flex: 0 0 1.5rem; @@ -38,7 +39,8 @@ margin: 0.2rem 0; } -.searchResult:nth-child(even), .searchResultGroup:nth-child(even) { +.searchResult:nth-child(even), +.searchResultGroup:nth-child(even) { background: var(--ifm-color-emphasis-100); } diff --git a/packages/website/src/components/inputs/Tooltip.module.css b/packages/website/src/components/inputs/Tooltip.module.css index 50f499aa86f..95895ffc609 100644 --- a/packages/website/src/components/inputs/Tooltip.module.css +++ b/packages/website/src/components/inputs/Tooltip.module.css @@ -18,14 +18,15 @@ } .tooltipText::after { - content: ""; + content: ''; position: absolute; top: 50%; left: 100%; margin-top: -5px; border-width: 5px; border-style: solid; - border-color: transparent transparent transparent var(--ifm-color-emphasis-200); + border-color: transparent transparent transparent + var(--ifm-color-emphasis-200); } .tooltip.tooltipActive .tooltipText { diff --git a/packages/website/src/components/layout/Expander.module.css b/packages/website/src/components/layout/Expander.module.css index e38abfa4a9a..96b5eb34d24 100644 --- a/packages/website/src/components/layout/Expander.module.css +++ b/packages/website/src/components/layout/Expander.module.css @@ -9,7 +9,9 @@ display: flex; flex-direction: row; align-items: center; - transition: background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default), color var(--ifm-transition-fast) var(--ifm-transition-timing-default); + transition: background-color var(--ifm-transition-fast) + var(--ifm-transition-timing-default), + color var(--ifm-transition-fast) var(--ifm-transition-timing-default); color: var(--ifm-color-emphasis-900); cursor: pointer; padding: 0.4rem 0.8rem; @@ -18,7 +20,8 @@ background: transparent; text-rendering: optimizelegibility; -webkit-text-size-adjust: 100%; - font: var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base); + font: var(--ifm-font-size-base) / var(--ifm-line-height-base) + var(--ifm-font-family-base); text-align: left; } diff --git a/yarn.lock b/yarn.lock index cf83b08f8e6..889f67f8132 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3770,7 +3770,7 @@ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== -"@types/prettier@*", "@types/prettier@^2.1.5", "@types/prettier@^2.3.2": +"@types/prettier@*", "@types/prettier@^2.1.5", "@types/prettier@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA== @@ -11706,10 +11706,10 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier@*, prettier@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== +prettier@*, prettier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.0.tgz#a6370e2d4594e093270419d9cc47f7670488f893" + integrity sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg== pretty-error@^4.0.0: version "4.0.0"