reload on config file change
parent
6d1a8b2772
commit
fb15cfb57e
175
src/extension.ts
175
src/extension.ts
|
@ -6,15 +6,47 @@ const tailwindClassNames = require('tailwind-class-names')
|
||||||
// const tailwindClassNames = require('/Users/brad/Code/tailwind-class-names/dist')
|
// const tailwindClassNames = require('/Users/brad/Code/tailwind-class-names/dist')
|
||||||
const dlv = require('dlv')
|
const dlv = require('dlv')
|
||||||
|
|
||||||
|
const CONFIG_GLOB = '{tailwind,tailwind.config,.tailwindrc}.js'
|
||||||
|
|
||||||
export async function activate(context: vscode.ExtensionContext) {
|
export async function activate(context: vscode.ExtensionContext) {
|
||||||
|
let tw
|
||||||
|
|
||||||
|
try {
|
||||||
|
tw = await getTailwind()
|
||||||
|
} catch (err) {}
|
||||||
|
|
||||||
|
let intellisense = new TailwindIntellisense(tw)
|
||||||
|
context.subscriptions.push(intellisense)
|
||||||
|
|
||||||
|
let watcher = vscode.workspace.createFileSystemWatcher(`**/${CONFIG_GLOB}`)
|
||||||
|
|
||||||
|
watcher.onDidChange(onFileChange)
|
||||||
|
watcher.onDidCreate(onFileChange)
|
||||||
|
watcher.onDidDelete(onFileChange)
|
||||||
|
|
||||||
|
async function onFileChange(event) {
|
||||||
|
try {
|
||||||
|
tw = await getTailwind()
|
||||||
|
} catch (err) {
|
||||||
|
intellisense.dispose()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
intellisense.reload(tw)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getTailwind() {
|
||||||
if (!vscode.workspace.name) return
|
if (!vscode.workspace.name) return
|
||||||
|
|
||||||
const configFile = await vscode.workspace.findFiles(
|
let files = await vscode.workspace.findFiles(
|
||||||
'{tailwind,tailwind.config,.tailwindrc}.js',
|
CONFIG_GLOB,
|
||||||
'**/node_modules/**',
|
'**/node_modules/**',
|
||||||
1
|
1
|
||||||
)
|
)
|
||||||
if (!configFile) return
|
if (!files) return null
|
||||||
|
|
||||||
|
let configPath = files[0].fsPath
|
||||||
|
|
||||||
const plugin = join(
|
const plugin = join(
|
||||||
vscode.workspace.workspaceFolders[0].uri.fsPath,
|
vscode.workspace.workspaceFolders[0].uri.fsPath,
|
||||||
|
@ -26,7 +58,7 @@ export async function activate(context: vscode.ExtensionContext) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
tw = await tailwindClassNames(
|
tw = await tailwindClassNames(
|
||||||
configFile[0].fsPath,
|
configPath,
|
||||||
{
|
{
|
||||||
tree: true,
|
tree: true,
|
||||||
strings: true
|
strings: true
|
||||||
|
@ -34,61 +66,10 @@ export async function activate(context: vscode.ExtensionContext) {
|
||||||
plugin
|
plugin
|
||||||
)
|
)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const separator = dlv(tw.config, 'options.separator', ':')
|
return tw
|
||||||
|
|
||||||
if (separator !== ':') return
|
|
||||||
|
|
||||||
const items = createItems(tw.classNames, separator, tw.config)
|
|
||||||
|
|
||||||
context.subscriptions.push(
|
|
||||||
createCompletionItemProvider(
|
|
||||||
items,
|
|
||||||
['typescriptreact', 'javascript', 'javascriptreact'],
|
|
||||||
/\btw`([^`]*)$/,
|
|
||||||
['`', ' ', separator],
|
|
||||||
tw.config
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
context.subscriptions.push(
|
|
||||||
createCompletionItemProvider(
|
|
||||||
items,
|
|
||||||
['css', 'sass', 'scss'],
|
|
||||||
/@apply ([^;}]*)$/,
|
|
||||||
['.', separator],
|
|
||||||
tw.config,
|
|
||||||
'.'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
context.subscriptions.push(
|
|
||||||
createCompletionItemProvider(
|
|
||||||
items,
|
|
||||||
[
|
|
||||||
'html',
|
|
||||||
'jade',
|
|
||||||
'razor',
|
|
||||||
'php',
|
|
||||||
'blade',
|
|
||||||
'vue',
|
|
||||||
'twig',
|
|
||||||
'markdown',
|
|
||||||
'erb',
|
|
||||||
'handlebars',
|
|
||||||
'ejs',
|
|
||||||
// for jsx
|
|
||||||
'typescriptreact',
|
|
||||||
'javascript',
|
|
||||||
'javascriptreact'
|
|
||||||
],
|
|
||||||
/\bclass(Name)?=["']([^"']*)/, // /\bclass(Name)?=(["'])(?!.*?\2)/
|
|
||||||
["'", '"', ' ', separator],
|
|
||||||
tw.config
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deactivate() {}
|
export function deactivate() {}
|
||||||
|
@ -201,7 +182,6 @@ function createItems(classNames, separator, config, parent = '') {
|
||||||
item
|
item
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log(key)
|
|
||||||
const item = new vscode.CompletionItem(
|
const item = new vscode.CompletionItem(
|
||||||
`${key}${separator}`,
|
`${key}${separator}`,
|
||||||
vscode.CompletionItemKind.Constant
|
vscode.CompletionItemKind.Constant
|
||||||
|
@ -226,3 +206,82 @@ function createItems(classNames, separator, config, parent = '') {
|
||||||
|
|
||||||
return items
|
return items
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TailwindIntellisense {
|
||||||
|
private _completionProviders: vscode.Disposable[]
|
||||||
|
private _disposable: vscode.Disposable
|
||||||
|
private _items
|
||||||
|
|
||||||
|
constructor(tailwind) {
|
||||||
|
if (tailwind) {
|
||||||
|
this.reload(tailwind)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public reload(tailwind) {
|
||||||
|
this.dispose()
|
||||||
|
|
||||||
|
const separator = dlv(tailwind.config, 'options.separator', ':')
|
||||||
|
|
||||||
|
if (separator !== ':') return
|
||||||
|
|
||||||
|
this._items = createItems(tailwind.classNames, separator, tailwind.config)
|
||||||
|
|
||||||
|
this._completionProviders = []
|
||||||
|
|
||||||
|
this._completionProviders.push(
|
||||||
|
createCompletionItemProvider(
|
||||||
|
this._items,
|
||||||
|
['typescriptreact', 'javascript', 'javascriptreact'],
|
||||||
|
/\btw`([^`]*)$/,
|
||||||
|
['`', ' ', separator],
|
||||||
|
tailwind.config
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
this._completionProviders.push(
|
||||||
|
createCompletionItemProvider(
|
||||||
|
this._items,
|
||||||
|
['css', 'sass', 'scss'],
|
||||||
|
/@apply ([^;}]*)$/,
|
||||||
|
['.', separator],
|
||||||
|
tailwind.config,
|
||||||
|
'.'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
this._completionProviders.push(
|
||||||
|
createCompletionItemProvider(
|
||||||
|
this._items,
|
||||||
|
[
|
||||||
|
'html',
|
||||||
|
'jade',
|
||||||
|
'razor',
|
||||||
|
'php',
|
||||||
|
'blade',
|
||||||
|
'vue',
|
||||||
|
'twig',
|
||||||
|
'markdown',
|
||||||
|
'erb',
|
||||||
|
'handlebars',
|
||||||
|
'ejs',
|
||||||
|
// for jsx
|
||||||
|
'typescriptreact',
|
||||||
|
'javascript',
|
||||||
|
'javascriptreact'
|
||||||
|
],
|
||||||
|
/\bclass(Name)?=["']([^"']*)/, // /\bclass(Name)?=(["'])(?!.*?\2)/
|
||||||
|
["'", '"', ' ', separator],
|
||||||
|
tailwind.config
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
this._disposable = vscode.Disposable.from(...this._completionProviders)
|
||||||
|
}
|
||||||
|
|
||||||
|
dispose() {
|
||||||
|
if (this._disposable) {
|
||||||
|
this._disposable.dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue