-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathupdate-types-for-node.ts
131 lines (122 loc) · 4.21 KB
/
update-types-for-node.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import { AST_NODE_TYPES } from "@typescript-eslint/types"
import { parseForESLint } from "svelte-eslint-parser"
import path from "path"
import fs from "fs"
// import { fileURLToPath } from "url"
// const filename = fileURLToPath(import.meta.url)
const dirname = __dirname // path.dirname(filename)
const typesForNodeFilename = path.join(dirname, "../src/types-for-node.ts")
const estreeFilename = path.join(dirname, "../typings/estree/index.d.ts")
const { visitorKeys } = parseForESLint("")
const esNextNodeNames = ["Decorator", "ImportAttribute", "StaticBlock"]
const esSvelteNodeNames = ["Program", "SvelteReactiveStatement"]
const tsEsNodeNames = Object.keys(AST_NODE_TYPES).filter((k) => k !== "Program")
const esNodeNames = tsEsNodeNames.filter(
(k) =>
!k.startsWith("TS") && !k.startsWith("JSX") && !esNextNodeNames.includes(k),
)
const tsNodeNames = tsEsNodeNames.filter(
(k) => !k.startsWith("JSX") && !esNodeNames.includes(k),
)
const svelteNodeNames = Object.keys(visitorKeys).filter(
(k) => !tsEsNodeNames.includes(k) && !k.startsWith("Experimental"),
)
const estreeCode = [
`/*
* IMPORTANT!
* This file has been automatically generated,
* in order to update its content execute "yarn update"
*/
//
// Replace type information to use "@typescript-eslint/types" instead of "estree".
//
import type { TSESTree } from "@typescript-eslint/types"
export type Node = TSESTree.Node
export type Program = TSESTree.Program
export type Expression = TSESTree.Expression
export type Statement = TSESTree.Statement
export type Pattern = TSESTree.Pattern`,
]
const typesForNodeCode = [
`/*
* IMPORTANT!
* This file has been automatically generated,
* in order to update its content execute "yarn update"
*/
//
// The information here can be calculated by calculating the type,
// but is pre-defined to avoid the computational cost.
//
import type { TSESTree, AST_NODE_TYPES } from "@typescript-eslint/types";
import type { AST } from "svelte-eslint-parser"
export type ASTNode =
| AST.SvelteNode
| Exclude<Omit<TSESTree.Node, "parent">, { type: AST.SvelteNode["type"] }>
export type ASTNodeWithParent =
| (Exclude<ASTNode, AST.SvelteProgram> & { parent: ASTNodeWithParent })
| AST.SvelteProgram
export type ASTNodeListener = {`,
]
for (const nodeType of tsEsNodeNames) {
let argType = `TSESTree.${nodeType}`
if (nodeType === "TSIntrinsicKeyword") {
argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}`
}
typesForNodeCode.push(
` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`,
)
}
for (const nodeType of svelteNodeNames) {
let argType = `AST.${nodeType}`
if (nodeType === "Program") {
argType = `AST.SvelteProgram`
}
typesForNodeCode.push(
` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`,
)
}
typesForNodeCode.push(`}`)
typesForNodeCode.push(``)
typesForNodeCode.push(`export type ESNodeListener = {`)
for (const nodeType of esNodeNames) {
const argType = `TSESTree.${nodeType}`
typesForNodeCode.push(
` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`,
)
estreeCode.push(`export type ${nodeType} = TSESTree.${nodeType}`)
}
for (const nodeType of esSvelteNodeNames) {
let argType = `AST.${nodeType}`
if (nodeType === "Program") {
argType = `AST.SvelteProgram`
}
typesForNodeCode.push(
` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`,
)
}
typesForNodeCode.push(`}`)
typesForNodeCode.push(``)
typesForNodeCode.push(`export type TSNodeListener = {`)
for (const nodeType of tsNodeNames) {
let argType = `TSESTree.${nodeType}`
if (nodeType === "TSIntrinsicKeyword") {
argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}`
}
typesForNodeCode.push(
` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`,
)
}
typesForNodeCode.push(`}`)
typesForNodeCode.push(``)
typesForNodeCode.push(`export type SvelteNodeListener = {`)
for (const nodeType of svelteNodeNames.filter(
(k) => !esSvelteNodeNames.includes(k),
)) {
const argType = `AST.${nodeType}`
typesForNodeCode.push(
` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void`,
)
}
typesForNodeCode.push(`}`)
fs.writeFileSync(typesForNodeFilename, typesForNodeCode.join("\n"))
fs.writeFileSync(estreeFilename, estreeCode.join("\n"))