-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathupdate-types-for-node.ts
105 lines (96 loc) · 2.95 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
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 codeFilename = path.join(dirname, "../src/types-for-node.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"),
)
let code = `import type { TSESTree, AST_NODE_TYPES } from "@typescript-eslint/types";
import type { AST } from "svelte-eslint-parser"
import type * as ESTree from "estree"
export type ASTNode =
| AST.SvelteNode
| ESTree.Node
| Exclude<TSESTree.Node, { type: ESTree.Node["type"] }>
export type ASTNodeWithParent =
| (Exclude<ASTNode, ESTree.Program> & { 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}}`
}
code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void
`
}
for (const nodeType of svelteNodeNames) {
let argType = `AST.${nodeType}`
if (nodeType === "Program") {
argType = `AST.SvelteProgram`
}
code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void
`
}
code += `
}`
code += `
export type ESNodeListener = {
`
for (const nodeType of esNodeNames) {
const argType = `ESTree.${nodeType}`
code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void
`
}
for (const nodeType of esSvelteNodeNames) {
let argType = `AST.${nodeType}`
if (nodeType === "Program") {
argType = `AST.SvelteProgram`
}
code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void
`
}
code += `
}`
code += `
export type TSNodeListener = {
`
for (const nodeType of tsNodeNames) {
let argType = `TSESTree.${nodeType}`
if (nodeType === "TSIntrinsicKeyword") {
argType = `TSESTree.Node & { type: AST_NODE_TYPES.${nodeType}}`
}
code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void
`
}
code += `
}`
code += `
export type SvelteNodeListener = {
`
for (const nodeType of svelteNodeNames.filter(
(k) => !esSvelteNodeNames.includes(k),
)) {
const argType = `AST.${nodeType}`
code += ` ${nodeType}?: (node: ${argType} & ASTNodeWithParent) => void
`
}
code += `
}`
fs.writeFileSync(codeFilename, code)