From 8e8aa969eb94968a05ba8c2638ffa260facdb0b5 Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Sun, 14 May 2023 09:46:04 +0900 Subject: [PATCH] Add support for defineOptions and defineSlots (#193) --- src/script-setup/scope-analyzer.ts | 3 + test/fixtures/ast/define-options/ast.json | 551 ++++++++ .../ast/define-options/parser-options.json | 3 + .../ast/define-options/requirements.json | 3 + test/fixtures/ast/define-options/scope.json | 79 ++ test/fixtures/ast/define-options/source.vue | 8 + .../ast/define-options/token-ranges.json | 18 + test/fixtures/ast/define-options/tree.json | 1 + test/fixtures/ast/define-slots01/ast.json | 782 ++++++++++++ .../ast/define-slots01/parser-options.json | 4 + .../ast/define-slots01/requirements.json | 3 + test/fixtures/ast/define-slots01/scope.json | 1114 +++++++++++++++++ test/fixtures/ast/define-slots01/source.vue | 5 + .../ast/define-slots01/token-ranges.json | 26 + test/fixtures/ast/define-slots01/tree.json | 1 + .../ast/define-slots02-without-ts/ast.json | 283 +++++ .../parser-options.json | 3 + .../requirements.json | 3 + .../ast/define-slots02-without-ts/scope.json | 184 +++ .../ast/define-slots02-without-ts/source.vue | 3 + .../token-ranges.json | 10 + .../ast/define-slots02-without-ts/tree.json | 1 + .../script-setup/no-undef/.eslintrc.json | 5 + .../no-undef/invalid/define-options.vue | 10 + .../no-undef/invalid/define-slots.vue | 7 + .../no-undef/valid/define-options.vue | 8 + .../no-undef/valid/define-slots-wthout-ts.vue | 3 + .../no-undef/valid/define-slots.vue | 5 + .../integrations/script-setup/output.json | 20 + 29 files changed, 3146 insertions(+) create mode 100644 test/fixtures/ast/define-options/ast.json create mode 100644 test/fixtures/ast/define-options/parser-options.json create mode 100644 test/fixtures/ast/define-options/requirements.json create mode 100644 test/fixtures/ast/define-options/scope.json create mode 100644 test/fixtures/ast/define-options/source.vue create mode 100644 test/fixtures/ast/define-options/token-ranges.json create mode 100644 test/fixtures/ast/define-options/tree.json create mode 100644 test/fixtures/ast/define-slots01/ast.json create mode 100644 test/fixtures/ast/define-slots01/parser-options.json create mode 100644 test/fixtures/ast/define-slots01/requirements.json create mode 100644 test/fixtures/ast/define-slots01/scope.json create mode 100644 test/fixtures/ast/define-slots01/source.vue create mode 100644 test/fixtures/ast/define-slots01/token-ranges.json create mode 100644 test/fixtures/ast/define-slots01/tree.json create mode 100644 test/fixtures/ast/define-slots02-without-ts/ast.json create mode 100644 test/fixtures/ast/define-slots02-without-ts/parser-options.json create mode 100644 test/fixtures/ast/define-slots02-without-ts/requirements.json create mode 100644 test/fixtures/ast/define-slots02-without-ts/scope.json create mode 100644 test/fixtures/ast/define-slots02-without-ts/source.vue create mode 100644 test/fixtures/ast/define-slots02-without-ts/token-ranges.json create mode 100644 test/fixtures/ast/define-slots02-without-ts/tree.json create mode 100644 test/fixtures/integrations/script-setup/no-undef/invalid/define-options.vue create mode 100644 test/fixtures/integrations/script-setup/no-undef/invalid/define-slots.vue create mode 100644 test/fixtures/integrations/script-setup/no-undef/valid/define-options.vue create mode 100644 test/fixtures/integrations/script-setup/no-undef/valid/define-slots-wthout-ts.vue create mode 100644 test/fixtures/integrations/script-setup/no-undef/valid/define-slots.vue diff --git a/src/script-setup/scope-analyzer.ts b/src/script-setup/scope-analyzer.ts index 1c078fad..e9f7cdfd 100644 --- a/src/script-setup/scope-analyzer.ts +++ b/src/script-setup/scope-analyzer.ts @@ -82,6 +82,9 @@ const COMPILER_MACROS_AT_ROOT = new Set([ "defineEmits", "defineExpose", "withDefaults", + // Added in vue 3.3 + "defineOptions", + "defineSlots", ]) /** diff --git a/test/fixtures/ast/define-options/ast.json b/test/fixtures/ast/define-options/ast.json new file mode 100644 index 00000000..07810f20 --- /dev/null +++ b/test/fixtures/ast/define-options/ast.json @@ -0,0 +1,551 @@ +{ + "type": "Program", + "start": 15, + "end": 93, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 7, + "column": 2 + } + }, + "range": [ + 15, + 93 + ], + "body": [ + { + "type": "ExpressionStatement", + "start": 15, + "end": 93, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 7, + "column": 2 + } + }, + "range": [ + 15, + 93 + ], + "expression": { + "type": "CallExpression", + "start": 15, + "end": 93, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 7, + "column": 2 + } + }, + "range": [ + 15, + 93 + ], + "callee": { + "type": "Identifier", + "start": 15, + "end": 28, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 13 + } + }, + "range": [ + 15, + 28 + ], + "name": "defineOptions" + }, + "arguments": [ + { + "type": "ObjectExpression", + "start": 29, + "end": 92, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 7, + "column": 1 + } + }, + "range": [ + 29, + 92 + ], + "properties": [ + { + "type": "Property", + "start": 33, + "end": 52, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 21 + } + }, + "range": [ + 33, + 52 + ], + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 33, + "end": 45, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 14 + } + }, + "range": [ + 33, + 45 + ], + "name": "inheritAttrs" + }, + "value": { + "type": "Literal", + "start": 47, + "end": 52, + "loc": { + "start": { + "line": 3, + "column": 16 + }, + "end": { + "line": 3, + "column": 21 + } + }, + "range": [ + 47, + 52 + ], + "value": false, + "raw": "false" + }, + "kind": "init" + }, + { + "type": "Property", + "start": 56, + "end": 90, + "loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 6, + "column": 3 + } + }, + "range": [ + 56, + 90 + ], + "method": false, + "shorthand": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 56, + "end": 69, + "loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 15 + } + }, + "range": [ + 56, + 69 + ], + "name": "customOptions" + }, + "value": { + "type": "ObjectExpression", + "start": 71, + "end": 90, + "loc": { + "start": { + "line": 4, + "column": 17 + }, + "end": { + "line": 6, + "column": 3 + } + }, + "range": [ + 71, + 90 + ], + "properties": [] + }, + "kind": "init" + } + ] + } + ], + "optional": false + } + } + ], + "sourceType": "module", + "comments": [ + { + "type": "Block", + "value": " ... ", + "start": 77, + "end": 86, + "range": [ + 77, + 86 + ], + "loc": { + "start": { + "line": 5, + "column": 4 + }, + "end": { + "line": 5, + "column": 13 + } + } + } + ], + "tokens": [ + { + "type": "Punctuator", + "range": [ + 0, + 14 + ], + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 14 + } + }, + "value": "" + } + ] +} \ No newline at end of file diff --git a/test/fixtures/ast/define-options/parser-options.json b/test/fixtures/ast/define-options/parser-options.json new file mode 100644 index 00000000..2104ca43 --- /dev/null +++ b/test/fixtures/ast/define-options/parser-options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/test/fixtures/ast/define-options/requirements.json b/test/fixtures/ast/define-options/requirements.json new file mode 100644 index 00000000..36659b1f --- /dev/null +++ b/test/fixtures/ast/define-options/requirements.json @@ -0,0 +1,3 @@ +{ + "eslint": ">=8" +} \ No newline at end of file diff --git a/test/fixtures/ast/define-options/scope.json b/test/fixtures/ast/define-options/scope.json new file mode 100644 index 00000000..da1a024b --- /dev/null +++ b/test/fixtures/ast/define-options/scope.json @@ -0,0 +1,79 @@ +{ + "type": "global", + "variables": [ + { + "name": "defineOptions", + "identifiers": [], + "defs": [], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "defineOptions", + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 13 + } + } + }, + "from": "module", + "init": null + } + ] + } + ], + "references": [], + "childScopes": [ + { + "type": "module", + "variables": [], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "defineOptions", + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 13 + } + } + }, + "from": "module", + "init": null + } + ], + "childScopes": [], + "through": [ + { + "identifier": { + "type": "Identifier", + "name": "defineOptions", + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 13 + } + } + }, + "from": "module", + "init": null + } + ] + } + ], + "through": [] +} \ No newline at end of file diff --git a/test/fixtures/ast/define-options/source.vue b/test/fixtures/ast/define-options/source.vue new file mode 100644 index 00000000..5cf53d0e --- /dev/null +++ b/test/fixtures/ast/define-options/source.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/test/fixtures/ast/define-options/token-ranges.json b/test/fixtures/ast/define-options/token-ranges.json new file mode 100644 index 00000000..320f9586 --- /dev/null +++ b/test/fixtures/ast/define-options/token-ranges.json @@ -0,0 +1,18 @@ +[ + "", + "/* ... */" +] \ No newline at end of file diff --git a/test/fixtures/ast/define-options/tree.json b/test/fixtures/ast/define-options/tree.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/test/fixtures/ast/define-options/tree.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/fixtures/ast/define-slots01/ast.json b/test/fixtures/ast/define-slots01/ast.json new file mode 100644 index 00000000..1dd238e5 --- /dev/null +++ b/test/fixtures/ast/define-slots01/ast.json @@ -0,0 +1,782 @@ +{ + "type": "Program", + "body": [ + { + "type": "VariableDeclaration", + "declarations": [ + { + "type": "VariableDeclarator", + "id": { + "type": "Identifier", + "name": "slots", + "range": [ + 31, + 36 + ], + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "init": { + "type": "CallExpression", + "callee": { + "type": "Identifier", + "name": "defineSlots", + "range": [ + 39, + 50 + ], + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "arguments": [], + "optional": false, + "range": [ + 39, + 96 + ], + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 4, + "column": 4 + } + }, + "typeParameters": { + "type": "TSTypeParameterInstantiation", + "range": [ + 50, + 94 + ], + "params": [ + { + "type": "TSTypeLiteral", + "members": [ + { + "type": "TSMethodSignature", + "computed": false, + "key": { + "type": "Identifier", + "name": "default", + "range": [ + 55, + 62 + ], + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 9 + } + } + }, + "params": [ + { + "type": "Identifier", + "name": "props", + "range": [ + 63, + 85 + ], + "loc": { + "start": { + "line": 3, + "column": 10 + }, + "end": { + "line": 3, + "column": 32 + } + }, + "typeAnnotation": { + "type": "TSTypeAnnotation", + "loc": { + "start": { + "line": 3, + "column": 15 + }, + "end": { + "line": 3, + "column": 32 + } + }, + "range": [ + 68, + 85 + ], + "typeAnnotation": { + "type": "TSTypeLiteral", + "members": [ + { + "type": "TSPropertySignature", + "computed": false, + "key": { + "type": "Identifier", + "name": "msg", + "range": [ + 72, + 75 + ], + "loc": { + "start": { + "line": 3, + "column": 19 + }, + "end": { + "line": 3, + "column": 22 + } + } + }, + "typeAnnotation": { + "type": "TSTypeAnnotation", + "loc": { + "start": { + "line": 3, + "column": 22 + }, + "end": { + "line": 3, + "column": 30 + } + }, + "range": [ + 75, + 83 + ], + "typeAnnotation": { + "type": "TSStringKeyword", + "range": [ + 77, + 83 + ], + "loc": { + "start": { + "line": 3, + "column": 24 + }, + "end": { + "line": 3, + "column": 30 + } + } + } + }, + "range": [ + 72, + 83 + ], + "loc": { + "start": { + "line": 3, + "column": 19 + }, + "end": { + "line": 3, + "column": 30 + } + } + } + ], + "range": [ + 70, + 85 + ], + "loc": { + "start": { + "line": 3, + "column": 17 + }, + "end": { + "line": 3, + "column": 32 + } + } + } + } + } + ], + "kind": "method", + "range": [ + 55, + 91 + ], + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 38 + } + }, + "returnType": { + "type": "TSTypeAnnotation", + "loc": { + "start": { + "line": 3, + "column": 33 + }, + "end": { + "line": 3, + "column": 38 + } + }, + "range": [ + 86, + 91 + ], + "typeAnnotation": { + "type": "TSAnyKeyword", + "range": [ + 88, + 91 + ], + "loc": { + "start": { + "line": 3, + "column": 35 + }, + "end": { + "line": 3, + "column": 38 + } + } + } + } + } + ], + "range": [ + 51, + 93 + ], + "loc": { + "start": { + "line": 2, + "column": 26 + }, + "end": { + "line": 4, + "column": 1 + } + } + } + ], + "loc": { + "start": { + "line": 2, + "column": 25 + }, + "end": { + "line": 4, + "column": 2 + } + } + } + }, + "range": [ + 31, + 96 + ], + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 4, + "column": 4 + } + } + } + ], + "kind": "const", + "range": [ + 25, + 96 + ], + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 4, + "column": 4 + } + } + } + ], + "sourceType": "module", + "range": [ + 25, + 97 + ], + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 5, + "column": 0 + } + }, + "tokens": [ + { + "type": "Punctuator", + "range": [ + 0, + 24 + ], + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "value": "" + } + ], + "comments": [] +} \ No newline at end of file diff --git a/test/fixtures/ast/define-slots01/parser-options.json b/test/fixtures/ast/define-slots01/parser-options.json new file mode 100644 index 00000000..6e1a0ab4 --- /dev/null +++ b/test/fixtures/ast/define-slots01/parser-options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "parser": "@typescript-eslint/parser" +} diff --git a/test/fixtures/ast/define-slots01/requirements.json b/test/fixtures/ast/define-slots01/requirements.json new file mode 100644 index 00000000..36659b1f --- /dev/null +++ b/test/fixtures/ast/define-slots01/requirements.json @@ -0,0 +1,3 @@ +{ + "eslint": ">=8" +} \ No newline at end of file diff --git a/test/fixtures/ast/define-slots01/scope.json b/test/fixtures/ast/define-slots01/scope.json new file mode 100644 index 00000000..3a65764c --- /dev/null +++ b/test/fixtures/ast/define-slots01/scope.json @@ -0,0 +1,1114 @@ +{ + "type": "global", + "variables": [ + { + "name": "ClassMemberDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "DecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassMethodDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassGetterDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassSetterDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassAccessorDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassAccessorDecoratorTarget", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassAccessorDecoratorResult", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassFieldDecoratorContext", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ClassDecorator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PropertyDecorator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "MethodDecorator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ParameterDecorator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Symbol", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PropertyKey", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PropertyDescriptor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PropertyDescriptorMap", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Object", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ObjectConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Function", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "FunctionConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ThisParameterType", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "OmitThisParameter", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "CallableFunction", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "NewableFunction", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "IArguments", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "String", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "StringConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Boolean", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "BooleanConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Number", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "NumberConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "TemplateStringsArray", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ImportMeta", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ImportCallOptions", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ImportAssertions", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Math", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Date", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "DateConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "RegExpMatchArray", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "RegExpExecArray", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "RegExp", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "RegExpConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Error", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "EvalError", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "EvalErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "RangeError", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "RangeErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ReferenceError", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ReferenceErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "SyntaxError", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "SyntaxErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "TypeError", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "TypeErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "URIError", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "URIErrorConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "JSON", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ReadonlyArray", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ConcatArray", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "TypedPropertyDescriptor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PromiseConstructorLike", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PromiseLike", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Promise", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Awaited", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayLike", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Partial", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Required", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Readonly", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Pick", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Record", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Exclude", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Extract", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Omit", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "NonNullable", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Parameters", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ConstructorParameters", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ReturnType", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "InstanceType", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uppercase", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Lowercase", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Capitalize", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uncapitalize", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ThisType", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayBuffer", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayBufferTypes", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayBufferLike", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayBufferConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ArrayBufferView", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "DataView", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "DataViewConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Int8Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Int8ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint8Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint8ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint8ClampedArray", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint8ClampedArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Int16Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Int16ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint16Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint16ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Int32Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Int32ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint32Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Uint32ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Float32Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Float32ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Float64Array", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Float64ArrayConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Intl", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Map", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "MapConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ReadonlyMap", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "WeakMap", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "WeakMapConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Set", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "SetConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ReadonlySet", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "WeakSet", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "WeakSetConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "SymbolConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "IteratorYieldResult", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "IteratorReturnResult", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "IteratorResult", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Iterator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Iterable", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "IterableIterator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "PromiseConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Generator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "GeneratorFunction", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "GeneratorFunctionConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ProxyHandler", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "ProxyConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Reflect", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "SharedArrayBuffer", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "SharedArrayBufferConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "Atomics", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "AsyncIterator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "AsyncIterable", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "AsyncIterableIterator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "AsyncGenerator", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "AsyncGeneratorFunction", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "AsyncGeneratorFunctionConstructor", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "const", + "identifiers": [], + "defs": [], + "references": [] + }, + { + "name": "defineSlots", + "identifiers": [], + "defs": [], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "defineSlots", + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "from": "module", + "init": null + } + ] + } + ], + "references": [], + "childScopes": [ + { + "type": "module", + "variables": [ + { + "name": "slots", + "identifiers": [ + { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + } + ], + "defs": [ + { + "type": "Variable", + "node": { + "type": "VariableDeclarator", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 4, + "column": 4 + } + } + }, + "name": "slots" + } + ], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "from": "module", + "resolved": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "init": true + } + ] + } + ], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "from": "module", + "resolved": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "init": true + }, + { + "identifier": { + "type": "Identifier", + "name": "defineSlots", + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "from": "module", + "init": null + } + ], + "childScopes": [ + { + "type": "functionType", + "variables": [ + { + "name": "props", + "identifiers": [ + { + "type": "Identifier", + "name": "props", + "loc": { + "start": { + "line": 3, + "column": 10 + }, + "end": { + "line": 3, + "column": 32 + } + } + } + ], + "defs": [ + { + "type": "Parameter", + "node": { + "type": "TSMethodSignature", + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 38 + } + } + }, + "name": "props" + } + ], + "references": [] + } + ], + "references": [], + "childScopes": [], + "through": [] + } + ], + "through": [ + { + "identifier": { + "type": "Identifier", + "name": "defineSlots", + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "from": "module", + "init": null + } + ] + } + ], + "through": [] +} \ No newline at end of file diff --git a/test/fixtures/ast/define-slots01/source.vue b/test/fixtures/ast/define-slots01/source.vue new file mode 100644 index 00000000..87ef917d --- /dev/null +++ b/test/fixtures/ast/define-slots01/source.vue @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/test/fixtures/ast/define-slots01/token-ranges.json b/test/fixtures/ast/define-slots01/token-ranges.json new file mode 100644 index 00000000..d7790915 --- /dev/null +++ b/test/fixtures/ast/define-slots01/token-ranges.json @@ -0,0 +1,26 @@ +[ + "" +] \ No newline at end of file diff --git a/test/fixtures/ast/define-slots01/tree.json b/test/fixtures/ast/define-slots01/tree.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/test/fixtures/ast/define-slots01/tree.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/fixtures/ast/define-slots02-without-ts/ast.json b/test/fixtures/ast/define-slots02-without-ts/ast.json new file mode 100644 index 00000000..14386930 --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/ast.json @@ -0,0 +1,283 @@ +{ + "type": "Program", + "start": 15, + "end": 42, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 27 + } + }, + "range": [ + 15, + 42 + ], + "body": [ + { + "type": "VariableDeclaration", + "start": 15, + "end": 42, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 27 + } + }, + "range": [ + 15, + 42 + ], + "declarations": [ + { + "type": "VariableDeclarator", + "start": 21, + "end": 42, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 27 + } + }, + "range": [ + 21, + 42 + ], + "id": { + "type": "Identifier", + "start": 21, + "end": 26, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + }, + "range": [ + 21, + 26 + ], + "name": "slots" + }, + "init": { + "type": "CallExpression", + "start": 29, + "end": 42, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 27 + } + }, + "range": [ + 29, + 42 + ], + "callee": { + "type": "Identifier", + "start": 29, + "end": 40, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + }, + "range": [ + 29, + 40 + ], + "name": "defineSlots" + }, + "arguments": [], + "optional": false + } + } + ], + "kind": "const" + } + ], + "sourceType": "module", + "comments": [], + "tokens": [ + { + "type": "Punctuator", + "range": [ + 0, + 14 + ], + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 14 + } + }, + "value": "" + } + ] +} \ No newline at end of file diff --git a/test/fixtures/ast/define-slots02-without-ts/parser-options.json b/test/fixtures/ast/define-slots02-without-ts/parser-options.json new file mode 100644 index 00000000..2104ca43 --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/parser-options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/test/fixtures/ast/define-slots02-without-ts/requirements.json b/test/fixtures/ast/define-slots02-without-ts/requirements.json new file mode 100644 index 00000000..36659b1f --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/requirements.json @@ -0,0 +1,3 @@ +{ + "eslint": ">=8" +} \ No newline at end of file diff --git a/test/fixtures/ast/define-slots02-without-ts/scope.json b/test/fixtures/ast/define-slots02-without-ts/scope.json new file mode 100644 index 00000000..f6347de2 --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/scope.json @@ -0,0 +1,184 @@ +{ + "type": "global", + "variables": [ + { + "name": "defineSlots", + "identifiers": [], + "defs": [], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "defineSlots", + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "from": "module", + "init": null + } + ] + } + ], + "references": [], + "childScopes": [ + { + "type": "module", + "variables": [ + { + "name": "slots", + "identifiers": [ + { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + } + ], + "defs": [ + { + "type": "Variable", + "node": { + "type": "VariableDeclarator", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 27 + } + } + }, + "name": "slots" + } + ], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "from": "module", + "resolved": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "init": true + } + ] + } + ], + "references": [ + { + "identifier": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "from": "module", + "resolved": { + "type": "Identifier", + "name": "slots", + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 11 + } + } + }, + "init": true + }, + { + "identifier": { + "type": "Identifier", + "name": "defineSlots", + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "from": "module", + "init": null + } + ], + "childScopes": [], + "through": [ + { + "identifier": { + "type": "Identifier", + "name": "defineSlots", + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 25 + } + } + }, + "from": "module", + "init": null + } + ] + } + ], + "through": [] +} \ No newline at end of file diff --git a/test/fixtures/ast/define-slots02-without-ts/source.vue b/test/fixtures/ast/define-slots02-without-ts/source.vue new file mode 100644 index 00000000..3c0ca3f3 --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/source.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/test/fixtures/ast/define-slots02-without-ts/token-ranges.json b/test/fixtures/ast/define-slots02-without-ts/token-ranges.json new file mode 100644 index 00000000..8f66a0dc --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/token-ranges.json @@ -0,0 +1,10 @@ +[ + "" +] \ No newline at end of file diff --git a/test/fixtures/ast/define-slots02-without-ts/tree.json b/test/fixtures/ast/define-slots02-without-ts/tree.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/test/fixtures/ast/define-slots02-without-ts/tree.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/test/fixtures/integrations/script-setup/no-undef/.eslintrc.json b/test/fixtures/integrations/script-setup/no-undef/.eslintrc.json index f21f62ca..1ac5b661 100644 --- a/test/fixtures/integrations/script-setup/no-undef/.eslintrc.json +++ b/test/fixtures/integrations/script-setup/no-undef/.eslintrc.json @@ -1,5 +1,10 @@ { "rules": { "no-undef": "error" + }, + "parserOptions": { + "parser": { + "ts": "@typescript-eslint/parser" + } } } diff --git a/test/fixtures/integrations/script-setup/no-undef/invalid/define-options.vue b/test/fixtures/integrations/script-setup/no-undef/invalid/define-options.vue new file mode 100644 index 00000000..65c75093 --- /dev/null +++ b/test/fixtures/integrations/script-setup/no-undef/invalid/define-options.vue @@ -0,0 +1,10 @@ + diff --git a/test/fixtures/integrations/script-setup/no-undef/invalid/define-slots.vue b/test/fixtures/integrations/script-setup/no-undef/invalid/define-slots.vue new file mode 100644 index 00000000..900e01c6 --- /dev/null +++ b/test/fixtures/integrations/script-setup/no-undef/invalid/define-slots.vue @@ -0,0 +1,7 @@ + diff --git a/test/fixtures/integrations/script-setup/no-undef/valid/define-options.vue b/test/fixtures/integrations/script-setup/no-undef/valid/define-options.vue new file mode 100644 index 00000000..39ae2bbf --- /dev/null +++ b/test/fixtures/integrations/script-setup/no-undef/valid/define-options.vue @@ -0,0 +1,8 @@ + diff --git a/test/fixtures/integrations/script-setup/no-undef/valid/define-slots-wthout-ts.vue b/test/fixtures/integrations/script-setup/no-undef/valid/define-slots-wthout-ts.vue new file mode 100644 index 00000000..6b367c16 --- /dev/null +++ b/test/fixtures/integrations/script-setup/no-undef/valid/define-slots-wthout-ts.vue @@ -0,0 +1,3 @@ + diff --git a/test/fixtures/integrations/script-setup/no-undef/valid/define-slots.vue b/test/fixtures/integrations/script-setup/no-undef/valid/define-slots.vue new file mode 100644 index 00000000..b28db98b --- /dev/null +++ b/test/fixtures/integrations/script-setup/no-undef/valid/define-slots.vue @@ -0,0 +1,5 @@ + diff --git a/test/fixtures/integrations/script-setup/output.json b/test/fixtures/integrations/script-setup/output.json index c8c96350..de66f4fa 100644 --- a/test/fixtures/integrations/script-setup/output.json +++ b/test/fixtures/integrations/script-setup/output.json @@ -9,6 +9,16 @@ } ] }, + { + "filePath": "/no-undef/invalid/define-options.vue", + "messages": [ + { + "ruleId": "no-undef", + "line": 3, + "message": "'defineOptions' is not defined." + } + ] + }, { "filePath": "/no-undef/invalid/define-props-and-emits.vue", "messages": [ @@ -24,6 +34,16 @@ } ] }, + { + "filePath": "/no-undef/invalid/define-slots.vue", + "messages": [ + { + "ruleId": "no-undef", + "line": 3, + "message": "'defineSlots' is not defined." + } + ] + }, { "filePath": "/no-unused-vars/invalid/component-names.vue", "messages": [