Skip to content

Commit 64b229e

Browse files
committed
feat: add VSCode intellisense hints
1 parent 0b341bf commit 64b229e

File tree

5 files changed

+116
-9
lines changed

5 files changed

+116
-9
lines changed

build/buildVscodeHints.js

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
const fs = require('fs-extra')
2+
const types = fs.readFileSync('src/components/index.d.ts', 'utf-8')
3+
const classes = getTypesClasses(types)
4+
5+
function getTypesClasses (types) {
6+
let classes = {}
7+
const rawClasses = types.replace(/(\r|\n)/ig, '').match(/(.*?class).*?(})/g)
8+
rawClasses.forEach(rawClass => {
9+
const name = rawClass.match(/(?<=class\s+).*?(?=\s+extends)/gs)[0]
10+
11+
const propsRaw = rawClass.substring(rawClass.indexOf('{') + 1, rawClass.indexOf('}'))
12+
let props = propsRaw.match(/([a-zA-Z]+:).*?(?=[a-zA-Z]+:|$)/g)
13+
if (props) {
14+
props = props.map(prop => prop.trim())
15+
}
16+
17+
classes[name] = {
18+
isExported: rawClass.includes('export'),
19+
extend: rawClass.match(/(?<=extends\s+).*?(?=\s+{)/gs)[0],
20+
props,
21+
}
22+
})
23+
Object.entries(classes).forEach(([key, value]) => {
24+
if (value.extend !== 'Vue') {
25+
const props = classes[key].props || []
26+
classes[key].props = [...props, ...(classes[value.extend].props)]
27+
}
28+
})
29+
return classes
30+
}
31+
32+
const components = {}
33+
Object.entries(classes).forEach(([key,value]) => {
34+
if (value.isExported) {
35+
components[key] = value
36+
}
37+
})
38+
39+
generateVeturFiles(components)
40+
41+
function generateVeturFiles (content) {
42+
const dir = 'dist/vetur'
43+
if (!fs.existsSync(dir)) {
44+
fs.mkdirSync(dir)
45+
}
46+
47+
const attributes = generateAttributes(content)
48+
fs.writeFile(
49+
`dist/vetur/coreui-attributes.json`,
50+
attributes,
51+
() => ''
52+
)
53+
54+
const tags = generateTags(content)
55+
fs.writeFile(
56+
`dist/vetur/coreui-tags.json`,
57+
tags,
58+
() => ''
59+
)
60+
}
61+
62+
function generateTags (content) {
63+
let tags = {}
64+
Object.entries(content).forEach(([name, component]) => {
65+
let attributes = []
66+
if (component.props) {
67+
attributes = component.props.map(prop => toKebabCase(prop.split(':')[0]))
68+
}
69+
tags[name] = {
70+
attributes,
71+
description: ''
72+
}
73+
tags[toKebabCase(name)] = {
74+
attributes,
75+
description: ''
76+
}
77+
})
78+
return JSON.stringify(tags)
79+
}
80+
81+
function generateAttributes (content) {
82+
let attributes = {}
83+
Object.entries(content).forEach(([name, component]) => {
84+
if (component.props) {
85+
component.props.forEach(prop => {
86+
const propName = toKebabCase(prop.split(':')[0])
87+
const key = name + '/' + propName
88+
const kebabKey = toKebabCase(name) + '/' + propName
89+
const type = prop.split(':')[1].trim()
90+
const description = ''
91+
92+
attributes[kebabKey] = {
93+
type,
94+
description
95+
}
96+
attributes[key] = {
97+
type,
98+
description
99+
}
100+
})
101+
}
102+
})
103+
return JSON.stringify(attributes)
104+
}
105+
106+
function toKebabCase (str) {
107+
const camelCase = str.charAt(0).toLowerCase() + str.slice(1)
108+
return camelCase.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
109+
}

dist/vetur/coreui-attributes.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)