diff options
author | 2021-03-25 10:38:17 -0500 | |
---|---|---|
committer | 2021-03-25 10:38:17 -0500 | |
commit | 18e7cc5af903543ac6f46780bfea67c13c6517df (patch) | |
tree | f61100a6adf3d4641cab89a23ac071268ed911e2 | |
parent | 30cccdf7154b6470e876464da9e412af10894dd5 (diff) | |
download | astro-18e7cc5af903543ac6f46780bfea67c13c6517df.tar.gz astro-18e7cc5af903543ac6f46780bfea67c13c6517df.tar.zst astro-18e7cc5af903543ac6f46780bfea67c13c6517df.zip |
Scaffold language server (#25)
* wip: scaffold astro extension
* wip: scaffold astro extension
* WIP: vscode extension
* fix: autoCloseBefore
* chore: update package.json
* fix: use tsx instead of plain ts
* chore: remove dist files
* chore: remove comments
* chore: cleanup package build process, switch build to esbuild
* refactor: use shared esbuild config
Co-authored-by: Nate Moore <nate@skypack.dev>
26 files changed, 1594 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore index 88edb6288..83786476b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ node_modules/ lib/ +dist/ +*.tsbuildinfo +.DS_Store diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..d7e68782a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +{ + "version": "0.2.0", + "configurations": [ + { + "type": "extensionHost", + "request": "launch", + "name": "Launch Extension", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}/vscode" + ], + "outFiles": [ + "${workspaceRoot}/vscode/packages/client/out/**/*.js" + ], + "preLaunchTask": { + "type": "npm", + "script": "watch:extension" + } + }, + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..cd137b601 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,34 @@ + +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "compile:extension", + "group": "build", + "presentation": { + "panel": "dedicated", + "reveal": "never" + }, + "problemMatcher": [ + "$tsc" + ] + }, + { + "type": "npm", + "script": "watch:extension", + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "panel": "dedicated", + "reveal": "never" + }, + "problemMatcher": [ + "$tsc-watch" + ] + } + ] +} diff --git a/package.json b/package.json index fcd9944ea..d3ce9acc8 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "dev": "tsc --watch", "lint": "eslint 'src/**/*.{js,ts}'", "format": "prettier -w 'src/**/*.{js,ts}'", - "test": "uvu test -i fixtures -i test-utils.js" + "test": "uvu test -i fixtures -i test-utils.js", + "watch:extension": "cd vscode && npm run watch" }, "dependencies": { "@babel/generator": "^7.13.9", diff --git a/vscode/.vscodeignore b/vscode/.vscodeignore new file mode 100644 index 000000000..23053de09 --- /dev/null +++ b/vscode/.vscodeignore @@ -0,0 +1 @@ +packages/ diff --git a/vscode/languages/astro-language-configuration.json b/vscode/languages/astro-language-configuration.json new file mode 100644 index 000000000..a6e9cae46 --- /dev/null +++ b/vscode/languages/astro-language-configuration.json @@ -0,0 +1,36 @@ +{ + "comments": { + "blockComment": [ "<!--", "-->" ] + }, + "brackets": [ + ["---", "---"], + ["<!--", "-->"], + ["<", ">"], + ["{", "}"], + ["(", ")"] + ], + "autoClosingPairs": [ + { "open": "{", "close": "}"}, + { "open": "[", "close": "]"}, + { "open": "(", "close": ")" }, + { "open": "'", "close": "'" }, + { "open": "\"", "close": "\"" }, + { "open": "<!--", "close": "-->", "notIn": [ "comment", "string" ]}, + { "open": "/**", "close": " */", "notIn": ["string"] } + ], + "autoCloseBefore": ";:.,=}])>` \n\t", + "surroundingPairs": [ + { "open": "'", "close": "'" }, + { "open": "\"", "close": "\"" }, + { "open": "{", "close": "}"}, + { "open": "[", "close": "]"}, + { "open": "(", "close": ")" }, + { "open": "<", "close": ">" } + ], + "folding": { + "markers": { + "start": "^\\s*<!--\\s*#region\\b.*-->", + "end": "^\\s*<!--\\s*#endregion\\b.*-->" + } + } +} diff --git a/vscode/package-lock.json b/vscode/package-lock.json new file mode 100644 index 000000000..69a36528d --- /dev/null +++ b/vscode/package-lock.json @@ -0,0 +1,234 @@ +{ + "name": "astro", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@astro-vscode/client": { + "version": "file:packages/client", + "dev": true, + "requires": { + "vscode-languageclient": "^7.1.0-next.4" + } + }, + "@astro-vscode/server": { + "version": "file:packages/server", + "dev": true, + "requires": { + "vscode-html-languageservice": "^3.0.3", + "vscode-languageserver": "^6.1.1", + "vscode-languageserver-textdocument": "^1.0.1" + }, + "dependencies": { + "astro": { + "version": "0.1.0", + "dependencies": { + "@astro-vscode/client": { + "version": "file:packages/client", + "dev": true, + "requires": { + "vscode-languageclient": "^7.1.0-next.4" + } + } + } + }, + "vscode-html-languageservice": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-3.2.0.tgz", + "integrity": "sha512-aLWIoWkvb5HYTVE0kI9/u3P0ZAJGrYOSAAE6L0wqB9radKRtbJNrF9+BjSUFyCgBdNBE/GFExo35LoknQDJrfw==", + "dev": true, + "requires": { + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "3.16.0-next.2", + "vscode-nls": "^5.0.0", + "vscode-uri": "^2.1.2" + } + }, + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true + }, + "vscode-languageserver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", + "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==", + "dev": true, + "requires": { + "vscode-languageserver-protocol": "^3.15.3" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + }, + "dependencies": { + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + } + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz", + "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==", + "dev": true + }, + "vscode-languageserver-types": { + "version": "3.16.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", + "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==", + "dev": true + }, + "vscode-nls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.0.tgz", + "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==", + "dev": true + }, + "vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "esbuild": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.10.0.tgz", + "integrity": "sha512-g+/Fk18bP7GAx0eG2RTfvjbsdB6RSchvvrrokFX8UexrTtPo0ZF0R1KViUu5v0A4Uu8m3I7pZhEyZveiOk0/JA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "vscode-html-languageservice": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-3.2.0.tgz", + "integrity": "sha512-aLWIoWkvb5HYTVE0kI9/u3P0ZAJGrYOSAAE6L0wqB9radKRtbJNrF9+BjSUFyCgBdNBE/GFExo35LoknQDJrfw==", + "requires": { + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "3.16.0-next.2", + "vscode-nls": "^5.0.0", + "vscode-uri": "^2.1.2" + }, + "dependencies": { + "vscode-languageserver-types": { + "version": "3.16.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", + "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==" + } + } + }, + "vscode-jsonrpc": { + "version": "6.1.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.1.0-next.2.tgz", + "integrity": "sha512-nkiNDGI+Ytp7uj1lxHXddXCoEunhcry1D+KmVHBfUUgWT9jMF8ZJyH5KQObdF+OGAh7bXZxD/SV4uGwSCeHHWA==", + "dev": true + }, + "vscode-languageclient": { + "version": "7.1.0-next.4", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.1.0-next.4.tgz", + "integrity": "sha512-Gal+DvbI1KIwO1z90MvSnghMCVBCGlwdpOVIS0Hhmep7rjHUOwuC5Df7YlVkpzfPm+RCRyZQnUSJ19VNrnxxhA==", + "dev": true, + "requires": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.17.0-next.5" + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.0-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.0-next.5.tgz", + "integrity": "sha512-LFZ6WMB3iPezQAU9OnGoERzcIVKhcs0OLfD/NHcqSj3g1wgxuLUL5kSlZbbjFySQCmhzm6b0yb3hjTSeBtq1+w==", + "dev": true, + "requires": { + "vscode-jsonrpc": "6.1.0-next.2", + "vscode-languageserver-types": "3.17.0-next.1" + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz", + "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==" + }, + "vscode-languageserver-types": { + "version": "3.17.0-next.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.1.tgz", + "integrity": "sha512-VGzh06oynbYa6JbTKUbxOEZN7CYEtWhN7DK5wfzUpeCJl8X8xZX39g2PVfpqXrIEduu7dcJgK007KgnX9tHNKA==", + "dev": true + }, + "vscode-nls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.0.tgz", + "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==" + }, + "vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/vscode/package.json b/vscode/package.json new file mode 100644 index 000000000..5dbbde546 --- /dev/null +++ b/vscode/package.json @@ -0,0 +1,64 @@ +{ + "name": "astro", + "displayName": "Astro", + "description": "Language support for Astro", + "version": "0.1.0", + "author": "Astro", + "publisher": "astro-build", + "license": "MIT", + "scripts": { + "vscode:prepublish": "npm run build", + "bootstrap": "cd packages/client && npm ci && cd ../server && npm ci", + "build": "node scripts/build.mjs", + "watch": "node scripts/watch.mjs" + }, + "engines": { + "vscode": "^1.52.0" + }, + "activationEvents": [ + "*" + ], + "dependencies": { + "vscode-html-languageservice": "^3.0.3" + }, + "devDependencies": { + "esbuild": "0.10.0", + "@astro-vscode/client": "file:./packages/client", + "@astro-vscode/server": "file:./packages/server" + }, + "main": "./dist/index.js", + "files": [ + "dist/", + "languages/", + "syntaxes/" + ], + "contributes": { + "languages": [ + { + "id": "astro", + "extensions": [ + ".astro" + ], + "aliases": [ + "Astro" + ], + "configuration": "./languages/astro-language-configuration.json" + } + ], + "grammars": [ + { + "language": "astro", + "scopeName": "text.html.astro", + "path": "./syntaxes/astro.tmLanguage.json", + "embeddedLanguages": { + "text.html.astro": "astro", + "text.html": "html", + "source.css": "css", + "source.scss": "scss", + "source.sass": "sass", + "source.tsx": "typescriptreact" + } + } + ] + } +} diff --git a/vscode/packages/.DS_Store b/vscode/packages/.DS_Store Binary files differnew file mode 100644 index 000000000..9bb33f4a5 --- /dev/null +++ b/vscode/packages/.DS_Store diff --git a/vscode/packages/client/.DS_Store b/vscode/packages/client/.DS_Store Binary files differnew file mode 100644 index 000000000..5008ddfcf --- /dev/null +++ b/vscode/packages/client/.DS_Store diff --git a/vscode/packages/client/package-lock.json b/vscode/packages/client/package-lock.json new file mode 100644 index 000000000..58d3b4e97 --- /dev/null +++ b/vscode/packages/client/package-lock.json @@ -0,0 +1,91 @@ +{ + "name": "@astro-vscode/client", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/vscode": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.54.0.tgz", + "integrity": "sha512-sHHw9HG4bTrnKhLGgmEiOS88OLO/2RQytUN4COX9Djv81zc0FSZsSiYaVyjNidDzUSpXsySKBkZ31lk2/FbdCg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "vscode-jsonrpc": { + "version": "6.1.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.1.0-next.2.tgz", + "integrity": "sha512-nkiNDGI+Ytp7uj1lxHXddXCoEunhcry1D+KmVHBfUUgWT9jMF8ZJyH5KQObdF+OGAh7bXZxD/SV4uGwSCeHHWA==" + }, + "vscode-languageclient": { + "version": "7.1.0-next.4", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.1.0-next.4.tgz", + "integrity": "sha512-Gal+DvbI1KIwO1z90MvSnghMCVBCGlwdpOVIS0Hhmep7rjHUOwuC5Df7YlVkpzfPm+RCRyZQnUSJ19VNrnxxhA==", + "requires": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.17.0-next.5" + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.0-next.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.0-next.5.tgz", + "integrity": "sha512-LFZ6WMB3iPezQAU9OnGoERzcIVKhcs0OLfD/NHcqSj3g1wgxuLUL5kSlZbbjFySQCmhzm6b0yb3hjTSeBtq1+w==", + "requires": { + "vscode-jsonrpc": "6.1.0-next.2", + "vscode-languageserver-types": "3.17.0-next.1" + } + }, + "vscode-languageserver-types": { + "version": "3.17.0-next.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.1.tgz", + "integrity": "sha512-VGzh06oynbYa6JbTKUbxOEZN7CYEtWhN7DK5wfzUpeCJl8X8xZX39g2PVfpqXrIEduu7dcJgK007KgnX9tHNKA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/vscode/packages/client/package.json b/vscode/packages/client/package.json new file mode 100644 index 000000000..3a693790d --- /dev/null +++ b/vscode/packages/client/package.json @@ -0,0 +1,12 @@ +{ + "name": "@astro-vscode/client", + "version": "0.1.0", + "author": "Skypack", + "license": "MIT", + "dependencies": { + "vscode-languageclient": "next" + }, + "devDependencies": { + "@types/vscode": "latest" + } +} diff --git a/vscode/packages/client/src/features/defaultSettings.ts b/vscode/packages/client/src/features/defaultSettings.ts new file mode 100644 index 000000000..ec3de70a1 --- /dev/null +++ b/vscode/packages/client/src/features/defaultSettings.ts @@ -0,0 +1,30 @@ +import * as vscode from 'vscode'; + +export async function activate() { + onConfigUpdated(); + + vscode.workspace.onDidChangeConfiguration(onConfigUpdated); + + function onConfigUpdated() { + const astro = vscode.extensions.getExtension('skypack.astro'); + if (!astro) { + return; + } + const emmet = vscode.extensions.getExtension('vscode.emmet'); + if (!emmet) { + return; + } + + const emmetIncludeLanguages = getEmmetIncludeLanguages(); + if (emmetIncludeLanguages && emmetIncludeLanguages['astro']) { + return; + } + setEmmetIncludeLanguages({ ...emmetIncludeLanguages, astro: 'html' }); + } + function getEmmetIncludeLanguages() { + return vscode.workspace.getConfiguration('emmet').get<Record<string, string>>('includeLanguages'); + } + function setEmmetIncludeLanguages(value: Record<string, string>) { + return vscode.workspace.getConfiguration('emmet').set('includeLanguages', value); + } +} diff --git a/vscode/packages/client/src/index.ts b/vscode/packages/client/src/index.ts new file mode 100644 index 000000000..c7233892b --- /dev/null +++ b/vscode/packages/client/src/index.ts @@ -0,0 +1,79 @@ +import * as path from 'path'; +import * as vscode from 'vscode'; +import * as lsp from 'vscode-languageclient/node'; + +import * as defaultSettings from './features/defaultSettings.js'; + +let docClient: lsp.LanguageClient; + +export async function activate(context: vscode.ExtensionContext) { + docClient = createLanguageService(context, 'doc', 'astro', 'Astro', 6040); + + defaultSettings.activate(); + + await docClient.onReady(); + startEmbeddedLanguageServices(); +} + +function createLanguageService(context: vscode.ExtensionContext, mode: 'doc', id: string, name: string, port: number) { + const serverModule = context.asAbsolutePath(path.join('dist', 'server.js')); + const debugOptions = { execArgv: ['--nolazy', '--inspect=' + port] }; + const serverOptions: lsp.ServerOptions = { + run: { module: serverModule, transport: lsp.TransportKind.ipc }, + debug: { + module: serverModule, + transport: lsp.TransportKind.ipc, + options: debugOptions, + }, + }; + const serverInitOptions: any = { + mode: mode, + appRoot: vscode.env.appRoot, + language: vscode.env.language, + }; + const clientOptions: lsp.LanguageClientOptions = { + documentSelector: [{ scheme: 'file', language: 'astro' }], + initializationOptions: serverInitOptions, + }; + const client = new lsp.LanguageClient(id, name, serverOptions, clientOptions); + context.subscriptions.push(client.start()); + + return client; +} + +async function startEmbeddedLanguageServices() { + const ts = vscode.extensions.getExtension('vscode.typescript-language-features'); + const css = vscode.extensions.getExtension('vscode.css-language-features'); + const html = vscode.extensions.getExtension('vscode.html-language-features'); + + if (ts && !ts.isActive) { + await ts.activate(); + } + if (css && !css.isActive) { + await css.activate(); + } + if (html && !html.isActive) { + await html.activate(); + } + + /* from html-language-features */ + const EMPTY_ELEMENTS: string[] = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']; + vscode.languages.setLanguageConfiguration('astro', { + indentationRules: { + increaseIndentPattern: /<(?!\?|(?:area|base|br|col|frame|hr|html|img|input|link|meta|param)\b|[^>]*\/>)([-_\.A-Za-z0-9]+)(?=\s|>)\b[^>]*>(?!.*<\/\1>)|<!--(?!.*-->)|\{[^}"']*$/, + decreaseIndentPattern: /^\s*(<\/(?!html)[-_\.A-Za-z0-9]+\b[^>]*>|-->|\})/, + }, + wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g, + onEnterRules: [ + { + beforeText: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join('|')}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'), + afterText: /^<\/([_:\w][_:\w-.\d]*)\s*>/i, + action: { indentAction: vscode.IndentAction.IndentOutdent }, + }, + { + beforeText: new RegExp(`<(?!(?:${EMPTY_ELEMENTS.join('|')}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`, 'i'), + action: { indentAction: vscode.IndentAction.Indent }, + }, + ], + }); +} diff --git a/vscode/packages/client/tsconfig.json b/vscode/packages/client/tsconfig.json new file mode 100644 index 000000000..51e95f536 --- /dev/null +++ b/vscode/packages/client/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + }, + "include": ["src"], + "exclude": ["node_modules"], + "references": [ + { "path": "../server" } + ] +} diff --git a/vscode/packages/server/.DS_Store b/vscode/packages/server/.DS_Store Binary files differnew file mode 100644 index 000000000..5008ddfcf --- /dev/null +++ b/vscode/packages/server/.DS_Store diff --git a/vscode/packages/server/package-lock.json b/vscode/packages/server/package-lock.json new file mode 100644 index 000000000..71cdde13c --- /dev/null +++ b/vscode/packages/server/package-lock.json @@ -0,0 +1,115 @@ +{ + "name": "@astro-vscode/server", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "astro": { + "version": "file:../..", + "dev": true, + "requires": { + "typescript": "^4.2.3", + "vscode-languageserver": "^7.0.0" + }, + "dependencies": { + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "dev": true + }, + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true + }, + "vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "requires": { + "vscode-languageserver-protocol": "3.16.0" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + } + } + }, + "vscode-html-languageservice": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-3.2.0.tgz", + "integrity": "sha512-aLWIoWkvb5HYTVE0kI9/u3P0ZAJGrYOSAAE6L0wqB9radKRtbJNrF9+BjSUFyCgBdNBE/GFExo35LoknQDJrfw==", + "requires": { + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "3.16.0-next.2", + "vscode-nls": "^5.0.0", + "vscode-uri": "^2.1.2" + } + }, + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" + }, + "vscode-languageserver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", + "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==", + "requires": { + "vscode-languageserver-protocol": "^3.15.3" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + }, + "dependencies": { + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + } + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz", + "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==" + }, + "vscode-languageserver-types": { + "version": "3.16.0-next.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz", + "integrity": "sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q==" + }, + "vscode-nls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.0.0.tgz", + "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==" + }, + "vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" + } + } +} diff --git a/vscode/packages/server/package.json b/vscode/packages/server/package.json new file mode 100644 index 000000000..d5837cc08 --- /dev/null +++ b/vscode/packages/server/package.json @@ -0,0 +1,21 @@ +{ + "name": "@astro-vscode/server", + "version": "0.1.0", + "author": "Skypack", + "license": "MIT", + "main": "dist/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc" + }, + "devDependencies": { + "astro": "file:../../" + }, + "dependencies": { + "vscode-html-languageservice": "^3.0.3", + "vscode-languageserver": "^6.1.1", + "vscode-languageserver-textdocument": "^1.0.1" + } +} diff --git a/vscode/packages/server/src/index.ts b/vscode/packages/server/src/index.ts new file mode 100644 index 000000000..dda369929 --- /dev/null +++ b/vscode/packages/server/src/index.ts @@ -0,0 +1,32 @@ +import { getLanguageService } from 'vscode-html-languageservice'; +import { createConnection, ProposedFeatures, TextDocuments, TextDocumentSyncKind } from 'vscode-languageserver'; +import { TextDocument } from 'vscode-languageserver-textdocument'; + +let connection = createConnection(ProposedFeatures.all); +let documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument); + +const htmlLanguageService = getLanguageService(); + +connection.onInitialize(() => { + return { + capabilities: { + textDocumentSync: TextDocumentSyncKind.Full, + completionProvider: { + resolveProvider: false, + }, + }, + }; +}); + +connection.onCompletion(async (textDocumentPosition, token) => { + console.log(token); + const document = documents.get(textDocumentPosition.textDocument.uri); + if (!document) { + return null; + } + + return htmlLanguageService.doComplete(document, textDocumentPosition.position, htmlLanguageService.parseHTMLDocument(document)); +}); + +documents.listen(connection); +connection.listen(); diff --git a/vscode/packages/server/tsconfig.json b/vscode/packages/server/tsconfig.json new file mode 100644 index 000000000..6af42d0b2 --- /dev/null +++ b/vscode/packages/server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + }, + "include": ["src"], + "exclude": ["node_modules"], +} diff --git a/vscode/scripts/build.mjs b/vscode/scripts/build.mjs new file mode 100644 index 000000000..baaaa207f --- /dev/null +++ b/vscode/scripts/build.mjs @@ -0,0 +1,37 @@ +import esbuild from 'esbuild'; +import config from './esbuild.config.mjs'; +import { performance } from 'perf_hooks'; + +function buildClient() { + return esbuild.build({ + ...config, + entryPoints: ['packages/client/src/index.ts'], + outfile: 'dist/index.js', + }); +} + +function buildServer() { + return esbuild.build({ + ...config, + entryPoints: ['packages/server/src/index.ts'], + outfile: 'dist/server.js', + }); +} + +async function build() { + const start = performance.now(); + try { + await Promise.all([buildClient(), buildServer()]); + } catch ({ errors }) { + if (errors[0].text.indexOf('Could not resolve') > -1) { + console.error('Make sure you run "npm run bootstrap" first!'); + } + return; + } + const end = performance.now(); + const span = end - start; + + console.log(`✨ Built in ${Math.round(span)}ms!`); +} + +build(); diff --git a/vscode/scripts/esbuild.config.mjs b/vscode/scripts/esbuild.config.mjs new file mode 100644 index 000000000..22f77b377 --- /dev/null +++ b/vscode/scripts/esbuild.config.mjs @@ -0,0 +1,7 @@ +export default { + bundle: true, + logLevel: 'error', + platform: 'node', + format: 'cjs', + external: ['vscode', 'vscode-html-languageservice'], +}; diff --git a/vscode/scripts/watch.mjs b/vscode/scripts/watch.mjs new file mode 100644 index 000000000..37bdc53e6 --- /dev/null +++ b/vscode/scripts/watch.mjs @@ -0,0 +1,27 @@ +import esbuild from 'esbuild'; +import config from './esbuild.config.mjs'; + +function buildClient() { + return esbuild.build({ + ...config, + watch: true, + entryPoints: ['packages/client/src/index.ts'], + outfile: 'dist/index.js', + }); +} + +function buildServer() { + return esbuild.build({ + ...config, + watch: true, + entryPoints: ['packages/server/src/index.ts'], + outfile: 'dist/server.js', + }); +} + +async function watch() { + await Promise.all([buildClient(), buildServer()]); + console.log('👀 Watching for changes...'); +} + +watch(); diff --git a/vscode/syntaxes/astro.tmLanguage.json b/vscode/syntaxes/astro.tmLanguage.json new file mode 100644 index 000000000..76d3d16de --- /dev/null +++ b/vscode/syntaxes/astro.tmLanguage.json @@ -0,0 +1,694 @@ +{ + "fileTypes": [ + "astro" + ], + "foldingStartMarker": "(?x)\n(<(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|li|form|dl)\\b.*?>\n|<!--(?!.*--\\s*>)\n|^<!--\\ \\#tminclude\\ (?>.*?-->)$\n|<\\?(?:php)?.*\\b(if|for(each)?|while)\\b.+:\n|\\{\\{?(if|foreach|capture|literal|foreach|php|section|strip)\n|\\{\\s*($|\\?>\\s*$|\/\/|\/\\*(.*\\*\/\\s*$|(?!.*?\\*\/)))\n)", + "foldingStopMarker": "(?x)\n(<\/(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|li|form|dl)>\n|^(?!.*?<!--).*?--\\s*>\n|^<!--\\ end\\ tminclude\\ -->$\n|<\\?(?:php)?.*\\bend(if|for(each)?|while)\\b\n|\\{\\{?\/(if|foreach|capture|literal|foreach|php|section|strip)\n|^[^{]*\\}\n)", + "keyEquivalent": "^~H", + "name": "Astro Component", + "patterns": [ + { + "include": "#astro-interpolations" + }, + { + "begin": "(<)([a-zA-Z0-9:-]++)(?=[^>]*><\/\\2>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.html" + } + }, + "end": "(>)(<)(\/)(\\2)(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + }, + "2": { + "name": "punctuation.definition.tag.begin.html meta.scope.between-tag-pair.html" + }, + "3": { + "name": "punctuation.definition.tag.begin.html" + }, + "4": { + "name": "entity.name.tag.html" + }, + "5": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.any.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(<\\?)(xml)", + "captures": { + "1": { + "name": "punctuation.definition.tag.html" + }, + "2": { + "name": "entity.name.tag.xml.html" + } + }, + "end": "(\\?>)", + "name": "meta.tag.preprocessor.xml.html", + "patterns": [ + { + "include": "#tag-generic-attribute" + }, + { + "include": "#string-double-quoted" + }, + { + "include": "#string-single-quoted" + } + ] + }, + { + "begin": "<!--", + "captures": [ + { + "name": "punctuation.definition.comment.html" + } + ], + "end": "--\\s*>", + "name": "comment.block.html", + "patterns": [ + { + "match": "--", + "name": "invalid.illegal.bad-comments-or-CDATA.html" + } + ] + }, + { + "begin": "<!", + "captures": [ + { + "name": "punctuation.definition.tag.html" + } + ], + "end": ">", + "name": "meta.tag.sgml.html", + "patterns": [ + { + "begin": "(?i:DOCTYPE)", + "captures": { + "1": { + "name": "entity.name.tag.doctype.html" + } + }, + "end": "(?=>)", + "name": "meta.tag.sgml.doctype.html", + "patterns": [ + { + "match": "\"[^\">]*\"", + "name": "string.quoted.double.doctype.identifiers-and-DTDs.html" + } + ] + }, + { + "begin": "\\[CDATA\\[", + "end": "]](?=>)", + "name": "constant.other.inline-data.html" + }, + { + "match": "(\\s*)(?!--|>)\\S(\\s*)", + "name": "invalid.illegal.bad-comments-or-CDATA.html" + } + ] + }, + { + "begin": "(?:^\\s+)?(<)((?i:style))\\b(?=[^>]*lang=(['\"])css\\1?)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.style.html" + }, + "3": { + "name": "punctuation.definition.tag.html" + } + }, + "end": "(<\/)((?i:style))(>)(?:\\s*\\n)?", + "name": "source.css.embedded.html", + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "(?=<\/(?i:style))", + "patterns": [ + { + "include": "source.css" + } + ] + } + ] + }, + { + "begin": "(?:^\\s+)?(<)((?i:style))\\b(?=[^>]*lang=(['\"])sass\\1?)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.style.html" + }, + "3": { + "name": "punctuation.definition.tag.html" + } + }, + "end": "(<\/)((?i:style))(>)(?:\\s*\\n)?", + "name": "source.sass.embedded.html", + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "(?=<\/(?i:style))", + "patterns": [ + { + "include": "source.sass" + } + ] + } + ] + }, + { + "begin": "(?:^\\s+)?(<)((?i:style))\\b(?=[^>]*lang=(['\"])scss\\1?)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.style.html" + }, + "3": { + "name": "punctuation.definition.tag.html" + } + }, + "end": "(<\/)((?i:style))(>)(?:\\s*\\n)?", + "name": "source.scss.embedded.html", + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "(?=<\/(?i:style))", + "patterns": [ + { + "include": "source.css.scss" + } + ] + } + ] + }, + { + "begin": "(?:^\\s+)?(<)((?i:style))\\b(?![^>]*\/>)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.style.html" + }, + "3": { + "name": "punctuation.definition.tag.html" + } + }, + "end": "(<\/)((?i:style))(>)(?:\\s*\\n)?", + "__DEFAULT_STYLE_NAME_START__": null,"name": "source.css.embedded.html","__DEFAULT_STYLE_NAME_END__": null, + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "end": "(?=<\/(?i:style))", + "patterns": [ + { + "__DEFAULT_STYLE_INCLUDE_START__": null,"include": "source.css","__DEFAULT_STYLE_INCLUDE_END__": null + } + ] + } + ] + }, + { + "begin": "(?:^\\s+)?(<)((?i:script))\\b(?=[^>]*lang=(['\"])tsx\\1?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.script.html" + } + }, + "end": "(?<=<\/(script|SCRIPT))(>)(?:\\s*\\n)?", + "endCaptures": { + "2": { + "name": "punctuation.definition.tag.html" + } + }, + "name": "source.tsx.embedded.html", + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(?<!<\/(?:script|SCRIPT))(>)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.script.html" + } + }, + "end": "(<\/)((?i:script))", + "patterns": [ + { + "include": "source.tsx" + } + ] + } + ] + }, + { + "begin": "(?:^\\s+)?(<)((?i:script))\\b(?=[^>]*lang=(['\"])ts\\1?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.script.html" + } + }, + "end": "(?<=<\/(script|SCRIPT))(>)(?:\\s*\\n)?", + "endCaptures": { + "2": { + "name": "punctuation.definition.tag.html" + } + }, + "name": "source.tsx.embedded.html", + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(?<!<\/(?:script|SCRIPT))(>)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.script.html" + } + }, + "end": "(<\/)((?i:script))", + "patterns": [ + { + "include": "source.tsx" + } + ] + } + ] + }, + { + "begin": "(<)((?i:script))\\b(?![^>]*\/>)(?![^>]*(?i:type.?=.?text\/((?!javascript|babel|ecmascript).*)))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.script.html" + } + }, + "end": "(?<=<\/(script|SCRIPT))(>)(?:\\s*\\n)?", + "endCaptures": { + "2": { + "name": "punctuation.definition.tag.html" + } + }, + "name": "source.tsx.embedded.html", + "patterns": [ + { + "include": "#tag-stuff" + }, + { + "begin": "(?<!<\/(?:script|SCRIPT))(>)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.script.html" + } + }, + "end": "(<\/)((?i:script))", + "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.definition.comment.js" + } + }, + "match": "(\/\/).*?((?=<\/script)|$\\n?)", + "name": "comment.line.double-slash.js" + }, + { + "begin": "\/\\*", + "captures": [ + { + "name": "punctuation.definition.comment.js" + } + ], + "end": "\\*\/|(?=<\/script)", + "name": "comment.block.js" + }, + { + "include": "source.tsx" + } + ] + } + ] + }, + { + "begin": "(<\/?)((?i:body|head|html)\\b)", + "captures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.structure.any.html" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.structure.any.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(<\/?)((?i:address|blockquote|dd|div|dl|dt|fieldset|form|frame|frameset|h1|h2|h3|h4|h5|h6|iframe|noframes|object|ol|p|ul|applet|center|dir|hr|menu|pre)\\b)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.block.any.html" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.block.any.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(<\/?)((?i:a|abbr|acronym|area|b|base|basefont|bdo|big|br|button|caption|cite|code|col|colgroup|del|dfn|em|font|head|html|i|img|input|ins|isindex|kbd|label|legend|li|link|map|meta|noscript|optgroup|option|param|q|s|samp|script|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|var)\\b)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.inline.any.html" + } + }, + "end": "((?: ?\/)?>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.inline.any.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(<\/?)([a-zA-Z0-9:-]+)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "entity.name.tag.other.html" + } + }, + "end": "(/?>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.other.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "include": "#entities" + }, + { + "include": "#frontmatter" + }, + { + "match": "<>", + "name": "invalid.illegal.incomplete.html" + }, + { + "match": "<", + "name": "invalid.illegal.bad-angle-bracket.html" + } + ], + "repository": { + "frontmatter": { + "begin": "\\A-{3}\\s*$", + "contentName": "meta.embedded.block.frontmatter", + "patterns": [ + { + "include": "source.tsx" + } + ], + "end": "(^|\\G)-{3}|\\.{3}\\s*$" + }, + "entities": { + "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.definition.entity.html" + }, + "3": { + "name": "punctuation.definition.entity.html" + } + }, + "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", + "name": "constant.character.entity.html" + }, + { + "match": "&", + "name": "invalid.illegal.bad-ampersand.html" + } + ] + }, + "string-double-quoted": { + "begin": "\"", + "beginCaptures": [ + { + "name": "punctuation.definition.string.begin.html" + } + ], + "end": "\"", + "endCaptures": [ + { + "name": "punctuation.definition.string.end.html" + } + ], + "name": "string.quoted.double.html", + "patterns": [ + { + "include": "#entities" + } + ] + }, + "string-single-quoted": { + "begin": "'", + "beginCaptures": [ + { + "name": "punctuation.definition.string.begin.html" + } + ], + "end": "'", + "endCaptures": [ + { + "name": "punctuation.definition.string.end.html" + } + ], + "name": "string.quoted.single.html", + "patterns": [ + { + "include": "#entities" + } + ] + }, + "tag-generic-attribute": { + "match": "\\b([a-zA-Z\\-:]+)", + "name": "entity.other.attribute-name.html" + }, + "tag-id-attribute": { + "begin": "\\b(id)\\b\\s*(=)", + "captures": { + "1": { + "name": "entity.other.attribute-name.id.html" + }, + "2": { + "name": "punctuation.separator.key-value.html" + } + }, + "end": "(?<='|\")", + "name": "meta.attribute-with-value.id.html", + "patterns": [ + { + "begin": "\"", + "beginCaptures": [ + { + "name": "punctuation.definition.string.begin.html" + } + ], + "contentName": "meta.toc-list.id.html", + "end": "\"", + "endCaptures": [ + { + "name": "punctuation.definition.string.end.html" + } + ], + "name": "string.quoted.double.html", + "patterns": [ + { + "include": "#astro-interpolations" + }, + { + "include": "#entities" + } + ] + }, + { + "begin": "'", + "beginCaptures": [ + { + "name": "punctuation.definition.string.begin.html" + } + ], + "contentName": "meta.toc-list.id.html", + "end": "'", + "endCaptures": [ + { + "name": "punctuation.definition.string.end.html" + } + ], + "name": "string.quoted.single.html", + "patterns": [ + { + "include": "#astro-interpolations" + }, + { + "include": "#entities" + } + ] + } + ] + }, + "tag-stuff": { + "patterns": [ + { + "include": "#tag-id-attribute" + }, + { + "include": "#tag-generic-attribute" + }, + { + "include": "#string-double-quoted" + }, + { + "include": "#string-single-quoted" + }, + { + "include": "#astro-interpolations" + } + ] + }, + "astro-interpolations": { + "patterns": [ + { + "begin": "\\{", + "beginCaptures": [ + { + "name": "punctuation.definition.generic.begin.html" + } + ], + "end": "\\}", + "endCaptures": [ + { + "name": "punctuation.definition.generic.end.html" + } + ], + "name": "expression.embbeded.astro", + "patterns": [ + { + "include": "source.tsx" + } + ] + } + ] + } + }, + "scopeName": "text.html.astro" +} diff --git a/vscode/tsconfig.base.json b/vscode/tsconfig.base.json new file mode 100644 index 000000000..8b7556d77 --- /dev/null +++ b/vscode/tsconfig.base.json @@ -0,0 +1,18 @@ + +{ + "compilerOptions": { + "target": "es2019", + "lib": ["ESNext"], + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "composite": true, + "declaration": true, + "strict": true, + "skipLibCheck": true, + "baseUrl": "./", + "paths": { + "@astro-vscode/*": ["packages/*/src"] + }, + }, +} diff --git a/vscode/tsconfig.json b/vscode/tsconfig.json new file mode 100644 index 000000000..56c433fea --- /dev/null +++ b/vscode/tsconfig.json @@ -0,0 +1,14 @@ + +{ + "extends": "./tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./packages/client" + }, + { + "path": "./packages/server" + } + ] +} |