Skip to content

Commit 7e434b0

Browse files
authored
Fix bugs (#32)
1 parent 3625050 commit 7e434b0

File tree

6 files changed

+47
-20
lines changed

6 files changed

+47
-20
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"homepage": "https://github.com/ota-meshi/astro-eslint-parser#readme",
4444
"dependencies": {
4545
"@astrojs/compiler": "^0.14.3",
46+
"@typescript-eslint/types": "^5.25.0",
4647
"debug": "^4.3.4",
4748
"eslint-visitor-keys": "^3.0.0",
4849
"espree": "^9.0.0",

src/ast/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,8 @@
11
export * from "./astro"
22
export * from "./jsx"
3+
import type { TSESTree } from "@typescript-eslint/types"
4+
export type Comment = TSESTree.Comment
5+
export type Token = TSESTree.Token
6+
export type SourceLocation = TSESTree.SourceLocation
7+
export type Range = TSESTree.Range
8+
export type Position = TSESTree.Position

src/ast/jsx.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { TSESTree as ES, AST_NODE_TYPES } from "@typescript-eslint/types"
1+
import type { TSESTree as ES } from "@typescript-eslint/types"
22
import type {
33
AstroFragment,
44
AstroHTMLComment,
@@ -32,21 +32,21 @@ export type JSXChild =
3232
export type JSXParentNode = JSXElement | JSXFragment | AstroFragment
3333
/* --- Tags --- */
3434
export interface JSXElement extends BaseNode {
35-
type: AST_NODE_TYPES.JSXElement
35+
type: "JSXElement"
3636
openingElement: JSXOpeningElement
3737
closingElement: JSXClosingElement | null
3838
children: JSXChild[]
3939
parent?: JSXParentNode
4040
}
4141
export interface JSXFragment extends BaseNode {
42-
type: AST_NODE_TYPES.JSXFragment
42+
type: "JSXFragment"
4343
openingFragment: JSXOpeningFragment
4444
closingFragment: JSXClosingFragment
4545
children: JSXChild[]
4646
parent?: JSXParentNode
4747
}
4848
export interface JSXOpeningElement extends BaseNode {
49-
type: AST_NODE_TYPES.JSXOpeningElement
49+
type: "JSXOpeningElement"
5050
typeParameters?: ES.TSTypeParameterInstantiation
5151
selfClosing: boolean
5252
name: JSXTagNameExpression
@@ -59,28 +59,28 @@ export interface JSXOpeningElement extends BaseNode {
5959
parent?: JSXElement
6060
}
6161
export interface JSXClosingElement extends BaseNode {
62-
type: AST_NODE_TYPES.JSXClosingElement
62+
type: "JSXClosingElement"
6363
name: JSXTagNameExpression
6464
parent?: JSXElement
6565
}
6666
export interface JSXClosingFragment extends BaseNode {
67-
type: AST_NODE_TYPES.JSXClosingFragment
67+
type: "JSXClosingFragment"
6868
parent?: JSXFragment
6969
}
7070
export interface JSXOpeningFragment extends BaseNode {
71-
type: AST_NODE_TYPES.JSXOpeningFragment
71+
type: "JSXOpeningFragment"
7272
parent?: JSXFragment
7373
}
7474

7575
/* --- Attributes --- */
7676
export interface JSXAttribute extends BaseNode {
77-
type: AST_NODE_TYPES.JSXAttribute
77+
type: "JSXAttribute"
7878
name: JSXIdentifier | JSXNamespacedName
7979
value: JSXExpression | ES.Literal | null
8080
parent?: JSXOpeningElement
8181
}
8282
export interface JSXSpreadAttribute extends BaseNode {
83-
type: AST_NODE_TYPES.JSXSpreadAttribute
83+
type: "JSXSpreadAttribute"
8484
argument: ES.Expression
8585
parent?: JSXOpeningElement
8686
}
@@ -91,7 +91,7 @@ export type JSXTagNameExpression =
9191
| JSXMemberExpression
9292
| JSXNamespacedName
9393
export interface JSXIdentifier extends BaseNode {
94-
type: AST_NODE_TYPES.JSXIdentifier
94+
type: "JSXIdentifier"
9595
name: string
9696
parent?:
9797
| JSXAttribute
@@ -103,13 +103,13 @@ export interface JSXIdentifier extends BaseNode {
103103
| JSXClosingElement
104104
}
105105
export interface JSXMemberExpression extends BaseNode {
106-
type: AST_NODE_TYPES.JSXMemberExpression
106+
type: "JSXMemberExpression"
107107
object: JSXTagNameExpression
108108
property: JSXIdentifier
109109
parent?: JSXMemberExpression | JSXOpeningElement | JSXClosingElement
110110
}
111111
export interface JSXNamespacedName extends BaseNode {
112-
type: AST_NODE_TYPES.JSXNamespacedName
112+
type: "JSXNamespacedName"
113113
namespace: JSXIdentifier
114114
name: JSXIdentifier
115115
parent?:
@@ -124,7 +124,7 @@ export interface JSXNamespacedName extends BaseNode {
124124
/* --- Expressions --- */
125125
export type JSXExpression = JSXExpressionContainer | JSXSpreadChild
126126
export interface JSXExpressionContainer extends BaseNode {
127-
type: AST_NODE_TYPES.JSXExpressionContainer
127+
type: "JSXExpressionContainer"
128128
expression: ES.Expression | JSXEmptyExpression
129129
parent?:
130130
| JSXAttribute
@@ -133,18 +133,18 @@ export interface JSXExpressionContainer extends BaseNode {
133133
| JSXParentNode
134134
}
135135
export interface JSXSpreadChild extends BaseNode {
136-
type: AST_NODE_TYPES.JSXSpreadChild
136+
type: "JSXSpreadChild"
137137
expression: ES.Expression
138138
parent?: JSXAttribute | JSXParentNode
139139
}
140140
export interface JSXEmptyExpression extends BaseNode {
141-
type: AST_NODE_TYPES.JSXEmptyExpression
141+
type: "JSXEmptyExpression"
142142
parent?: JSXExpressionContainer
143143
}
144144

145145
/* --- Texts --- */
146146
export interface JSXText extends BaseNode {
147-
type: AST_NODE_TYPES.JSXText
147+
type: "JSXText"
148148
value: string
149149
raw: string
150150
parent?: JSXParentNode

src/astro-tools/index.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,27 @@
11
import type { ParseResult } from "@astrojs/compiler"
22
import { parseTemplate as parse } from "../parser/template"
3-
import { getEndOffset, walk } from "../astro"
3+
import {
4+
getEndOffset,
5+
walk,
6+
calcAttributeValueStartOffset,
7+
calcAttributeEndOffset,
8+
} from "../astro"
49
import type { AttributeNode, Node, ParentNode } from "@astrojs/compiler/types"
510

611
export interface ParseTemplateResult {
712
result: ParseResult
813
getEndOffset: (node: Node) => number
14+
calcAttributeValueStartOffset: (node: AttributeNode) => number
15+
calcAttributeEndOffset: (node: AttributeNode) => number
916
walk: (
1017
parent: ParentNode,
1118
enter: (n: Node | AttributeNode, parents: ParentNode[]) => void,
1219
leave?: (n: Node | AttributeNode, parents: ParentNode[]) => void,
1320
) => void
21+
getLocFromIndex: (index: number) => { line: number; column: number }
22+
getIndexFromLoc: (loc: { line: number; column: number }) => number
1423
}
24+
1525
/**
1626
* Parse the astro component template.
1727
*/
@@ -20,6 +30,10 @@ export function parseTemplate(code: string): ParseTemplateResult {
2030
return {
2131
result: parsed.result,
2232
getEndOffset: (node) => getEndOffset(node, parsed.context),
33+
calcAttributeValueStartOffset: (node) =>
34+
calcAttributeValueStartOffset(node, parsed.context),
35+
calcAttributeEndOffset: (node) =>
36+
calcAttributeEndOffset(node, parsed.context),
2337
walk(parent, enter, leave) {
2438
walk(
2539
parent,
@@ -31,5 +45,7 @@ export function parseTemplate(code: string): ParseTemplateResult {
3145
}),
3246
)
3347
},
48+
getLocFromIndex: (index) => parsed.context.getLocFromIndex(index),
49+
getIndexFromLoc: (loc) => parsed.context.locs.getIndexFromLoc(loc),
3450
}
3551
}

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { parseForESLint } from "./parser"
2-
import { parseTemplate } from "./astro-tools"
2+
import { parseTemplate, ParseTemplateResult } from "./astro-tools"
33
import * as AST from "./ast"
44
import { traverseNodes } from "./traverse"
55
import { KEYS } from "./visitor-keys"
@@ -14,4 +14,4 @@ export { parseForESLint }
1414
export const VisitorKeys = KEYS
1515

1616
// tools
17-
export { traverseNodes, parseTemplate }
17+
export { traverseNodes, parseTemplate, ParseTemplateResult }

src/parser/script.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ export function parseScript(
1818

1919
try {
2020
const scriptParserOptions = { ...parserOptions.parserOptions }
21-
if (parserOptions.isTypeScript() && scriptParserOptions.filePath) {
21+
if (
22+
parserOptions.isTypeScript() &&
23+
scriptParserOptions.filePath &&
24+
scriptParserOptions.project
25+
) {
2226
scriptParserOptions.filePath += ".tsx"
2327
if (!fs.existsSync(scriptParserOptions.filePath)) {
2428
fs.writeFileSync(

0 commit comments

Comments
 (0)