├── .gitignore ├── .node-version ├── .prettierrc.yaml ├── LICENSE ├── README.md ├── assets ├── logo.svg └── promo.gif ├── index.ts ├── package.json ├── pnpm-lock.yaml └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node,windows,macos,linux 3 | 4 | ### Linux ### 5 | *~ 6 | 7 | # temporary files which can be created if a process still has a handle open of a deleted file 8 | .fuse_hidden* 9 | 10 | # KDE directory preferences 11 | .directory 12 | 13 | # Linux trash folder which might appear on any partition or disk 14 | .Trash-* 15 | 16 | # .nfs files are created when an open file is removed but is still being accessed 17 | .nfs* 18 | 19 | ### macOS ### 20 | # General 21 | .DS_Store 22 | .AppleDouble 23 | .LSOverride 24 | 25 | # Icon must end with two \r 26 | Icon 27 | 28 | 29 | # Thumbnails 30 | ._* 31 | 32 | # Files that might appear in the root of a volume 33 | .DocumentRevisions-V100 34 | .fseventsd 35 | .Spotlight-V100 36 | .TemporaryItems 37 | .Trashes 38 | .VolumeIcon.icns 39 | .com.apple.timemachine.donotpresent 40 | 41 | # Directories potentially created on remote AFP share 42 | .AppleDB 43 | .AppleDesktop 44 | Network Trash Folder 45 | Temporary Items 46 | .apdisk 47 | 48 | ### macOS Patch ### 49 | # iCloud generated files 50 | *.icloud 51 | 52 | ### Node ### 53 | # Logs 54 | logs 55 | *.log 56 | npm-debug.log* 57 | yarn-debug.log* 58 | yarn-error.log* 59 | lerna-debug.log* 60 | .pnpm-debug.log* 61 | 62 | # Diagnostic reports (https://nodejs.org/api/report.html) 63 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 64 | 65 | # Runtime data 66 | pids 67 | *.pid 68 | *.seed 69 | *.pid.lock 70 | 71 | # Directory for instrumented libs generated by jscoverage/JSCover 72 | lib-cov 73 | 74 | # Coverage directory used by tools like istanbul 75 | coverage 76 | *.lcov 77 | 78 | # nyc test coverage 79 | .nyc_output 80 | 81 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 82 | .grunt 83 | 84 | # Bower dependency directory (https://bower.io/) 85 | bower_components 86 | 87 | # node-waf configuration 88 | .lock-wscript 89 | 90 | # Compiled binary addons (https://nodejs.org/api/addons.html) 91 | build/Release 92 | 93 | # Dependency directories 94 | node_modules/ 95 | jspm_packages/ 96 | 97 | # Snowpack dependency directory (https://snowpack.dev/) 98 | web_modules/ 99 | 100 | # TypeScript cache 101 | *.tsbuildinfo 102 | 103 | # Optional npm cache directory 104 | .npm 105 | 106 | # Optional eslint cache 107 | .eslintcache 108 | 109 | # Optional stylelint cache 110 | .stylelintcache 111 | 112 | # Microbundle cache 113 | .rpt2_cache/ 114 | .rts2_cache_cjs/ 115 | .rts2_cache_es/ 116 | .rts2_cache_umd/ 117 | 118 | # Optional REPL history 119 | .node_repl_history 120 | 121 | # Output of 'npm pack' 122 | *.tgz 123 | 124 | # Yarn Integrity file 125 | .yarn-integrity 126 | 127 | # dotenv environment variable files 128 | .env 129 | .env.development.local 130 | .env.test.local 131 | .env.production.local 132 | .env.local 133 | 134 | # parcel-bundler cache (https://parceljs.org/) 135 | .cache 136 | .parcel-cache 137 | 138 | # Next.js build output 139 | .next 140 | out 141 | 142 | # Nuxt.js build / generate output 143 | .nuxt 144 | dist 145 | 146 | # Gatsby files 147 | .cache/ 148 | # Comment in the public line in if your project uses Gatsby and not Next.js 149 | # https://nextjs.org/blog/next-9-1#public-directory-support 150 | # public 151 | 152 | # vuepress build output 153 | .vuepress/dist 154 | 155 | # vuepress v2.x temp and cache directory 156 | .temp 157 | 158 | # Docusaurus cache and generated files 159 | .docusaurus 160 | 161 | # Serverless directories 162 | .serverless/ 163 | 164 | # FuseBox cache 165 | .fusebox/ 166 | 167 | # DynamoDB Local files 168 | .dynamodb/ 169 | 170 | # TernJS port file 171 | .tern-port 172 | 173 | # Stores VSCode versions used for testing VSCode extensions 174 | .vscode-test 175 | 176 | # yarn v2 177 | .yarn/cache 178 | .yarn/unplugged 179 | .yarn/build-state.yml 180 | .yarn/install-state.gz 181 | .pnp.* 182 | 183 | ### Node Patch ### 184 | # Serverless Webpack directories 185 | .webpack/ 186 | 187 | # Optional stylelint cache 188 | 189 | # SvelteKit build / generate output 190 | .svelte-kit 191 | 192 | ### Windows ### 193 | # Windows thumbnail cache files 194 | Thumbs.db 195 | Thumbs.db:encryptable 196 | ehthumbs.db 197 | ehthumbs_vista.db 198 | 199 | # Dump file 200 | *.stackdump 201 | 202 | # Folder config file 203 | [Dd]esktop.ini 204 | 205 | # Recycle Bin used on file shares 206 | $RECYCLE.BIN/ 207 | 208 | # Windows Installer files 209 | *.cab 210 | *.msi 211 | *.msix 212 | *.msm 213 | *.msp 214 | 215 | # Windows shortcuts 216 | *.lnk 217 | 218 | # End of https://www.toptal.com/developers/gitignore/api/node,windows,macos,linux 219 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 22 2 | -------------------------------------------------------------------------------- /.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | singleQuote: true 2 | semi: false 3 | trailingComma: all 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 José Olórtegui 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |

emmet-language-server

5 |

A language server for emmet.io

6 |
7 | 8 | ![Promo gif](./assets/promo.gif) 9 | 10 | --- 11 | 12 | ### Why another language server? 13 | 14 | While [aca/emmet-ls](https://github.com/aca/emmet-ls) works for what I need, there were a couple of things that annoyed me from time to time and while trying to fix one of those things (aca/emmet-ls#55) I've discovered that we can leverage [microsoft/vscode-emmet-helper](https://github.com/microsoft/vscode-emmet-helper) and make a simple language server that wraps that package to provide completions. 15 | 16 | So I decided to do that and it worked! 17 | 18 | The most important thing is that [microsoft/vscode](https://github.com/microsoft/vscode) has an excellent integration with emmet and we can have that, in all editors that implement the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/). 19 | 20 | ### Setup 21 | 22 | **Using npm:** 23 | 24 | ```sh 25 | npm i -g @olrtg/emmet-language-server 26 | ``` 27 | 28 | **Using mason.nvim:** 29 | 30 | ```sh 31 | :MasonInstall emmet-language-server 32 | ``` 33 | 34 | ### Neovim 35 | 36 | > [!NOTE] 37 | > Want deeper integration (eg. wrap with abbreviation)? Check out [nvim-emmet](https://github.com/olrtg/nvim-emmet). 38 | 39 | **With nvim-lspconfig:** 40 | 41 | Remember that if you don't need to support a new filetype or change the default settings of the language server you just need to pass an empty table to the `setup` function (like this: `lspconfig.emmet_language_server.setup({})`). 42 | 43 | ```lua 44 | lspconfig.emmet_language_server.setup({ 45 | filetypes = { "css", "eruby", "html", "javascript", "javascriptreact", "less", "sass", "scss", "pug", "typescriptreact" }, 46 | -- Read more about this options in the [vscode docs](https://code.visualstudio.com/docs/editor/emmet#_emmet-configuration). 47 | -- **Note:** only the options listed in the table are supported. 48 | init_options = { 49 | ---@type table 50 | includeLanguages = {}, 51 | --- @type string[] 52 | excludeLanguages = {}, 53 | --- @type string[] 54 | extensionsPath = {}, 55 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/preferences/) 56 | preferences = {}, 57 | --- @type boolean Defaults to `true` 58 | showAbbreviationSuggestions = true, 59 | --- @type "always" | "never" Defaults to `"always"` 60 | showExpandedAbbreviation = "always", 61 | --- @type boolean Defaults to `false` 62 | showSuggestionsAsSnippets = false, 63 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/syntax-profiles/) 64 | syntaxProfiles = {}, 65 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/snippets/#variables) 66 | variables = {}, 67 | }, 68 | }) 69 | ``` 70 | 71 | **Without nvim-lspconfig:** 72 | 73 | ```lua 74 | vim.api.nvim_create_autocmd({ "FileType" }, { 75 | pattern = "css,eruby,html,htmldjango,javascriptreact,less,pug,sass,scss,typescriptreact", 76 | callback = function() 77 | vim.lsp.start({ 78 | cmd = { "emmet-language-server", "--stdio" }, 79 | root_dir = vim.fs.dirname(vim.fs.find({ ".git" }, { upward = true })[1]), 80 | -- Read more about this options in the [vscode docs](https://code.visualstudio.com/docs/editor/emmet#_emmet-configuration). 81 | -- **Note:** only the options listed in the table are supported. 82 | init_options = { 83 | ---@type table 84 | includeLanguages = {}, 85 | --- @type string[] 86 | excludeLanguages = {}, 87 | --- @type string[] 88 | extensionsPath = {}, 89 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/preferences/) 90 | preferences = {}, 91 | --- @type boolean Defaults to `true` 92 | showAbbreviationSuggestions = true, 93 | --- @type "always" | "never" Defaults to `"always"` 94 | showExpandedAbbreviation = "always", 95 | --- @type boolean Defaults to `false` 96 | showSuggestionsAsSnippets = false, 97 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/syntax-profiles/) 98 | syntaxProfiles = {}, 99 | --- @type table [Emmet Docs](https://docs.emmet.io/customization/snippets/#variables) 100 | variables = {}, 101 | }, 102 | }) 103 | end, 104 | }) 105 | ``` 106 | 107 | ### Helix 108 | 109 | Install normally with npm (or your favourite package manager), then add the following to `languages.toml`: 110 | 111 | ```toml 112 | [language-server.emmet-lsp] 113 | command = "emmet-language-server" 114 | args = ["--stdio"] 115 | 116 | [[language]] 117 | name = "html" 118 | roots = [".git"] 119 | language-servers = ["emmet-lsp"] 120 | ``` 121 | 122 | ### Credits 123 | 124 | - [@aca](https://github.com/aca) for the first language server ([aca/emmet-ls](https://github.com/aca/emmet-ls)) 125 | - [@wassimk](https://github.com/wassimk) for bringing the [microsoft/vscode-emmet-helper](https://github.com/microsoft/vscode-emmet-helper) repo to my attention in aca/emmet-ls#55 126 | - [microsoft/vscode](https://github.com/microsoft/vscode) for having such an amazing integration with emmet and the easy and open package to integrate with 127 | - [emmetio/emmet](https://github.com/emmetio/emmet) for the awesome tool 128 | -------------------------------------------------------------------------------- /assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Emmet Logo 4 | 5 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /assets/promo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olrtg/emmet-language-server/673e7d58ab2d82c81f46e8bbf89d7a3c2d65c0f8/assets/promo.gif -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { 4 | FileType, 5 | doComplete, 6 | expandAbbreviation, 7 | getEmmetMode, 8 | updateExtensionsPath, 9 | type FileService, 10 | type VSCodeEmmetConfig, 11 | } from '@vscode/emmet-helper' 12 | import fs from 'fs' 13 | import path from 'path' 14 | import util from 'util' 15 | import { TextDocument } from 'vscode-languageserver-textdocument' 16 | import { 17 | ProposedFeatures, 18 | TextDocumentSyncKind, 19 | TextDocuments, 20 | createConnection, 21 | } from 'vscode-languageserver/node' 22 | 23 | const connection = createConnection(ProposedFeatures.all) 24 | const documents = new TextDocuments(TextDocument) 25 | 26 | interface GlobalConfig extends VSCodeEmmetConfig { 27 | extensionsPath?: string[] 28 | includeLanguages?: Record 29 | } 30 | 31 | let globalConfig: GlobalConfig = {} 32 | 33 | /** 34 | * @see {@link https://github.com/microsoft/vscode-emmet-helper/blob/ea184b3b7d6d7ffbc1721b5ce986c8477d420127/src/test/emmetHelper.test.ts#L40-L79} 35 | */ 36 | const fileService: FileService = { 37 | async readFile(uri) { 38 | if (uri.scheme !== 'file') { 39 | throw new Error(`schema ${uri.scheme} is not supported`) 40 | } 41 | 42 | return await util.promisify(fs.readFile)(uri.fsPath) 43 | }, 44 | async stat(uri) { 45 | if (uri.scheme !== 'file') { 46 | throw new Error(`schema ${uri.scheme} is not supported`) 47 | } 48 | 49 | return new Promise((c, e) => { 50 | fs.stat(uri.fsPath, (err, stats) => { 51 | if (err) { 52 | if (err.code === 'ENOENT') { 53 | return c({ type: FileType.Unknown, ctime: -1, mtime: -1, size: -1 }) 54 | } else { 55 | return e(err) 56 | } 57 | } 58 | 59 | let type = FileType.Unknown 60 | if (stats.isFile()) { 61 | type = FileType.File 62 | } else if (stats.isDirectory()) { 63 | type = FileType.Directory 64 | } else if (stats.isSymbolicLink()) { 65 | type = FileType.SymbolicLink 66 | } 67 | 68 | c({ 69 | type, 70 | ctime: stats.ctime.getTime(), 71 | mtime: stats.mtime.getTime(), 72 | size: stats.size, 73 | }) 74 | }) 75 | }) 76 | }, 77 | } 78 | 79 | connection.onInitialize((params) => { 80 | globalConfig = params.initializationOptions || {} 81 | 82 | if (globalConfig.extensionsPath?.length) { 83 | const absolutePaths = globalConfig.extensionsPath.map((extensionPath) => 84 | path.isAbsolute(extensionPath) 85 | ? extensionPath 86 | : path.resolve(extensionPath), 87 | ) 88 | 89 | updateExtensionsPath(absolutePaths, fileService) 90 | } 91 | 92 | return { 93 | capabilities: { 94 | textDocumentSync: TextDocumentSyncKind.Incremental, 95 | completionProvider: { 96 | resolveProvider: false, 97 | triggerCharacters: [ 98 | // NOTE: For cases where is valid to expand emmet abbreviations with 99 | // special characters 100 | '!', // eg. `!` and `!!!` snippets in html or `!important` in css 101 | ':', // eg. `w:` should expand to `width: |;` 102 | '>', // https://docs.emmet.io/abbreviations/syntax/#child-gt 103 | '+', // https://docs.emmet.io/abbreviations/syntax/#sibling 104 | '^', // https://docs.emmet.io/abbreviations/syntax/#climb-up 105 | '*', // https://docs.emmet.io/abbreviations/syntax/#multiplication 106 | ')', // https://docs.emmet.io/abbreviations/syntax/#grouping 107 | '.', // https://docs.emmet.io/abbreviations/syntax/#id-and-class 108 | ']', // https://docs.emmet.io/abbreviations/syntax/#custom-attributes 109 | '@', // https://docs.emmet.io/abbreviations/syntax/#changing-numbering-base-and-direction 110 | '}', // https://docs.emmet.io/abbreviations/syntax/#text 111 | '/', // for self-closing tags, eg. `div/` should expand to `
|` 112 | 113 | // NOTE: For cases where completion is not triggered by typing a 114 | // single character 115 | ...'abcdefghijklmnopqrstuvwxyz', 116 | 117 | // NOTE: For cases where completion is not triggered by typing a 118 | // single character or because numbers cannot be used to trigger 119 | // completion 120 | ...'0123456789', 121 | ], 122 | }, 123 | }, 124 | } 125 | }) 126 | 127 | connection.onCompletion((textDocumentPosition) => { 128 | const document = documents.get(textDocumentPosition.textDocument.uri) 129 | 130 | if (!document) { 131 | return 132 | } 133 | 134 | const editorLanguage = document.languageId 135 | const emmetLanguage = getEmmetMode(editorLanguage) ?? 'html' 136 | 137 | const syntax = !!globalConfig.includeLanguages?.[editorLanguage] 138 | ? (getEmmetMode(globalConfig.includeLanguages[editorLanguage]) ?? 139 | emmetLanguage) 140 | : emmetLanguage 141 | 142 | const position = textDocumentPosition.position 143 | 144 | return doComplete(document, position, syntax, globalConfig) 145 | }) 146 | 147 | connection.onRequest( 148 | 'emmet/expandAbbreviation', 149 | (params: { 150 | abbreviation: string 151 | language: string 152 | options: Parameters[1] 153 | }) => { 154 | const emmetLanguage = getEmmetMode(params.language) ?? 'html' 155 | 156 | const syntax = !!globalConfig.includeLanguages?.[params.language] 157 | ? (getEmmetMode(globalConfig.includeLanguages[params.language]) ?? 158 | emmetLanguage) 159 | : emmetLanguage 160 | 161 | return expandAbbreviation(params.abbreviation, { 162 | syntax, 163 | ...params.options, 164 | }) 165 | }, 166 | ) 167 | 168 | documents.listen(connection) 169 | connection.listen() 170 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@olrtg/emmet-language-server", 3 | "version": "2.6.1", 4 | "description": "A language server for emmet.io", 5 | "scripts": { 6 | "dev": "nodemon --watch index.ts --exec \"nr build && npm link\"", 7 | "build": "tsc", 8 | "prepublishOnly": "nr build", 9 | "publish": "bumpp && npm publish" 10 | }, 11 | "author": "José Olórtegui ", 12 | "license": "MIT", 13 | "homepage": "https://github.com/olrtg/emmet-language-server#readme", 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/olrtg/emmet-language-server.git" 17 | }, 18 | "bugs": { 19 | "url": "https://github.com/olrtg/emmet-language-server/issues" 20 | }, 21 | "dependencies": { 22 | "@vscode/emmet-helper": "^2.11.0", 23 | "bumpp": "^9.8.1", 24 | "vscode-languageserver": "^9.0.1", 25 | "vscode-languageserver-textdocument": "^1.0.12" 26 | }, 27 | "devDependencies": { 28 | "@tsconfig/recommended": "^1.0.8", 29 | "@types/node": "^22.9.1", 30 | "nodemon": "^3.1.7", 31 | "typescript": "^5.6.3" 32 | }, 33 | "bin": { 34 | "emmet-language-server": "./dist/index.js" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@vscode/emmet-helper': 12 | specifier: ^2.11.0 13 | version: 2.11.0 14 | bumpp: 15 | specifier: ^9.8.1 16 | version: 9.8.1 17 | vscode-languageserver: 18 | specifier: ^9.0.1 19 | version: 9.0.1 20 | vscode-languageserver-textdocument: 21 | specifier: ^1.0.12 22 | version: 1.0.12 23 | devDependencies: 24 | '@tsconfig/recommended': 25 | specifier: ^1.0.8 26 | version: 1.0.8 27 | '@types/node': 28 | specifier: ^22.9.1 29 | version: 22.9.1 30 | nodemon: 31 | specifier: ^3.1.7 32 | version: 3.1.7 33 | typescript: 34 | specifier: ^5.6.3 35 | version: 5.6.3 36 | 37 | packages: 38 | 39 | '@emmetio/abbreviation@2.3.3': 40 | resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} 41 | 42 | '@emmetio/css-abbreviation@2.1.8': 43 | resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} 44 | 45 | '@emmetio/scanner@1.0.4': 46 | resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} 47 | 48 | '@jsdevtools/ez-spawn@3.0.4': 49 | resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} 50 | engines: {node: '>=10'} 51 | 52 | '@tsconfig/recommended@1.0.8': 53 | resolution: {integrity: sha512-TotjFaaXveVUdsrXCdalyF6E5RyG6+7hHHQVZonQtdlk1rJZ1myDIvPUUKPhoYv+JAzThb2lQJh9+9ZfF46hsA==} 54 | 55 | '@types/node@22.9.1': 56 | resolution: {integrity: sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==} 57 | 58 | '@vscode/emmet-helper@2.11.0': 59 | resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} 60 | 61 | abbrev@1.1.1: 62 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 63 | 64 | acorn@8.14.0: 65 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 66 | engines: {node: '>=0.4.0'} 67 | hasBin: true 68 | 69 | anymatch@3.1.3: 70 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 71 | engines: {node: '>= 8'} 72 | 73 | argparse@2.0.1: 74 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 75 | 76 | balanced-match@1.0.2: 77 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 78 | 79 | binary-extensions@2.2.0: 80 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 81 | engines: {node: '>=8'} 82 | 83 | brace-expansion@1.1.11: 84 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 85 | 86 | braces@3.0.2: 87 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 88 | engines: {node: '>=8'} 89 | 90 | bumpp@9.8.1: 91 | resolution: {integrity: sha512-25W55DZI/rq6FboM0Q5y8eHbUk9eNn9oZ4bg/I5kiWn8/rdZCw6iqML076akQiUOQGhrm6QDvSSn4PgQ48bS4A==} 92 | engines: {node: '>=10'} 93 | hasBin: true 94 | 95 | c12@1.11.2: 96 | resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} 97 | peerDependencies: 98 | magicast: ^0.3.4 99 | peerDependenciesMeta: 100 | magicast: 101 | optional: true 102 | 103 | cac@6.7.14: 104 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 105 | engines: {node: '>=8'} 106 | 107 | call-me-maybe@1.0.2: 108 | resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} 109 | 110 | chokidar@3.6.0: 111 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 112 | engines: {node: '>= 8.10.0'} 113 | 114 | chownr@2.0.0: 115 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 116 | engines: {node: '>=10'} 117 | 118 | citty@0.1.6: 119 | resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} 120 | 121 | concat-map@0.0.1: 122 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 123 | 124 | confbox@0.1.8: 125 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 126 | 127 | consola@3.2.3: 128 | resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} 129 | engines: {node: ^14.18.0 || >=16.10.0} 130 | 131 | cross-spawn@7.0.3: 132 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 133 | engines: {node: '>= 8'} 134 | 135 | debug@4.3.7: 136 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 137 | engines: {node: '>=6.0'} 138 | peerDependencies: 139 | supports-color: '*' 140 | peerDependenciesMeta: 141 | supports-color: 142 | optional: true 143 | 144 | defu@6.1.4: 145 | resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 146 | 147 | destr@2.0.3: 148 | resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} 149 | 150 | dotenv@16.4.5: 151 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 152 | engines: {node: '>=12'} 153 | 154 | emmet@2.4.4: 155 | resolution: {integrity: sha512-v8Mwpjym55CS3EjJgiCLWUB3J2HSR93jhzXW325720u8KvYxdI2voYLstW3pHBxFz54H6jFjayR9G4LfTG0q+g==} 156 | 157 | escalade@3.2.0: 158 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 159 | engines: {node: '>=6'} 160 | 161 | execa@8.0.1: 162 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 163 | engines: {node: '>=16.17'} 164 | 165 | fdir@6.4.2: 166 | resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} 167 | peerDependencies: 168 | picomatch: ^3 || ^4 169 | peerDependenciesMeta: 170 | picomatch: 171 | optional: true 172 | 173 | fill-range@7.0.1: 174 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 175 | engines: {node: '>=8'} 176 | 177 | fs-minipass@2.1.0: 178 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 179 | engines: {node: '>= 8'} 180 | 181 | fsevents@2.3.2: 182 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 183 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 184 | os: [darwin] 185 | 186 | get-stream@8.0.1: 187 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 188 | engines: {node: '>=16'} 189 | 190 | giget@1.2.3: 191 | resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} 192 | hasBin: true 193 | 194 | glob-parent@5.1.2: 195 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 196 | engines: {node: '>= 6'} 197 | 198 | has-flag@3.0.0: 199 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 200 | engines: {node: '>=4'} 201 | 202 | human-signals@5.0.0: 203 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 204 | engines: {node: '>=16.17.0'} 205 | 206 | ignore-by-default@1.0.1: 207 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 208 | 209 | is-binary-path@2.1.0: 210 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 211 | engines: {node: '>=8'} 212 | 213 | is-extglob@2.1.1: 214 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 215 | engines: {node: '>=0.10.0'} 216 | 217 | is-glob@4.0.3: 218 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 219 | engines: {node: '>=0.10.0'} 220 | 221 | is-number@7.0.0: 222 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 223 | engines: {node: '>=0.12.0'} 224 | 225 | is-stream@3.0.0: 226 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 227 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 228 | 229 | isexe@2.0.0: 230 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 231 | 232 | jiti@1.21.6: 233 | resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} 234 | hasBin: true 235 | 236 | js-yaml@4.1.0: 237 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 238 | hasBin: true 239 | 240 | jsonc-parser@2.3.1: 241 | resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} 242 | 243 | jsonc-parser@3.3.1: 244 | resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} 245 | 246 | kleur@3.0.3: 247 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 248 | engines: {node: '>=6'} 249 | 250 | merge-stream@2.0.0: 251 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 252 | 253 | mimic-fn@4.0.0: 254 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 255 | engines: {node: '>=12'} 256 | 257 | minimatch@3.1.2: 258 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 259 | 260 | minipass@3.3.6: 261 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 262 | engines: {node: '>=8'} 263 | 264 | minipass@5.0.0: 265 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 266 | engines: {node: '>=8'} 267 | 268 | minizlib@2.1.2: 269 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 270 | engines: {node: '>= 8'} 271 | 272 | mkdirp@1.0.4: 273 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 274 | engines: {node: '>=10'} 275 | hasBin: true 276 | 277 | mlly@1.7.3: 278 | resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} 279 | 280 | ms@2.1.3: 281 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 282 | 283 | node-fetch-native@1.6.4: 284 | resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} 285 | 286 | nodemon@3.1.7: 287 | resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} 288 | engines: {node: '>=10'} 289 | hasBin: true 290 | 291 | nopt@1.0.10: 292 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 293 | hasBin: true 294 | 295 | normalize-path@3.0.0: 296 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 297 | engines: {node: '>=0.10.0'} 298 | 299 | npm-run-path@5.3.0: 300 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 301 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 302 | 303 | nypm@0.3.12: 304 | resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} 305 | engines: {node: ^14.16.0 || >=16.10.0} 306 | hasBin: true 307 | 308 | ohash@1.1.4: 309 | resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} 310 | 311 | onetime@6.0.0: 312 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 313 | engines: {node: '>=12'} 314 | 315 | path-key@3.1.1: 316 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 317 | engines: {node: '>=8'} 318 | 319 | path-key@4.0.0: 320 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 321 | engines: {node: '>=12'} 322 | 323 | pathe@1.1.2: 324 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 325 | 326 | perfect-debounce@1.0.0: 327 | resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} 328 | 329 | picomatch@2.3.1: 330 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 331 | engines: {node: '>=8.6'} 332 | 333 | picomatch@4.0.2: 334 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 335 | engines: {node: '>=12'} 336 | 337 | pkg-types@1.2.1: 338 | resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} 339 | 340 | prompts@2.4.2: 341 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 342 | engines: {node: '>= 6'} 343 | 344 | pstree.remy@1.1.8: 345 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 346 | 347 | rc9@2.1.2: 348 | resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} 349 | 350 | readdirp@3.6.0: 351 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 352 | engines: {node: '>=8.10.0'} 353 | 354 | semver@7.6.3: 355 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 356 | engines: {node: '>=10'} 357 | hasBin: true 358 | 359 | shebang-command@2.0.0: 360 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 361 | engines: {node: '>=8'} 362 | 363 | shebang-regex@3.0.0: 364 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 365 | engines: {node: '>=8'} 366 | 367 | signal-exit@4.1.0: 368 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 369 | engines: {node: '>=14'} 370 | 371 | simple-update-notifier@2.0.0: 372 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 373 | engines: {node: '>=10'} 374 | 375 | sisteransi@1.0.5: 376 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 377 | 378 | string-argv@0.3.2: 379 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 380 | engines: {node: '>=0.6.19'} 381 | 382 | strip-final-newline@3.0.0: 383 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 384 | engines: {node: '>=12'} 385 | 386 | supports-color@5.5.0: 387 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 388 | engines: {node: '>=4'} 389 | 390 | tar@6.2.1: 391 | resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 392 | engines: {node: '>=10'} 393 | 394 | tinyglobby@0.2.10: 395 | resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} 396 | engines: {node: '>=12.0.0'} 397 | 398 | to-regex-range@5.0.1: 399 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 400 | engines: {node: '>=8.0'} 401 | 402 | touch@3.1.0: 403 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 404 | hasBin: true 405 | 406 | type-detect@4.0.8: 407 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 408 | engines: {node: '>=4'} 409 | 410 | typescript@5.6.3: 411 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 412 | engines: {node: '>=14.17'} 413 | hasBin: true 414 | 415 | ufo@1.5.4: 416 | resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} 417 | 418 | undefsafe@2.0.5: 419 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 420 | 421 | undici-types@6.19.8: 422 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 423 | 424 | vscode-jsonrpc@8.2.0: 425 | resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} 426 | engines: {node: '>=14.0.0'} 427 | 428 | vscode-languageserver-protocol@3.17.5: 429 | resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} 430 | 431 | vscode-languageserver-textdocument@1.0.12: 432 | resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} 433 | 434 | vscode-languageserver-types@3.17.3: 435 | resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} 436 | 437 | vscode-languageserver-types@3.17.5: 438 | resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} 439 | 440 | vscode-languageserver@9.0.1: 441 | resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} 442 | hasBin: true 443 | 444 | vscode-uri@3.0.8: 445 | resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} 446 | 447 | which@2.0.2: 448 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 449 | engines: {node: '>= 8'} 450 | hasBin: true 451 | 452 | yallist@4.0.0: 453 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 454 | 455 | snapshots: 456 | 457 | '@emmetio/abbreviation@2.3.3': 458 | dependencies: 459 | '@emmetio/scanner': 1.0.4 460 | 461 | '@emmetio/css-abbreviation@2.1.8': 462 | dependencies: 463 | '@emmetio/scanner': 1.0.4 464 | 465 | '@emmetio/scanner@1.0.4': {} 466 | 467 | '@jsdevtools/ez-spawn@3.0.4': 468 | dependencies: 469 | call-me-maybe: 1.0.2 470 | cross-spawn: 7.0.3 471 | string-argv: 0.3.2 472 | type-detect: 4.0.8 473 | 474 | '@tsconfig/recommended@1.0.8': {} 475 | 476 | '@types/node@22.9.1': 477 | dependencies: 478 | undici-types: 6.19.8 479 | 480 | '@vscode/emmet-helper@2.11.0': 481 | dependencies: 482 | emmet: 2.4.4 483 | jsonc-parser: 2.3.1 484 | vscode-languageserver-textdocument: 1.0.12 485 | vscode-languageserver-types: 3.17.3 486 | vscode-uri: 3.0.8 487 | 488 | abbrev@1.1.1: {} 489 | 490 | acorn@8.14.0: {} 491 | 492 | anymatch@3.1.3: 493 | dependencies: 494 | normalize-path: 3.0.0 495 | picomatch: 2.3.1 496 | 497 | argparse@2.0.1: {} 498 | 499 | balanced-match@1.0.2: {} 500 | 501 | binary-extensions@2.2.0: {} 502 | 503 | brace-expansion@1.1.11: 504 | dependencies: 505 | balanced-match: 1.0.2 506 | concat-map: 0.0.1 507 | 508 | braces@3.0.2: 509 | dependencies: 510 | fill-range: 7.0.1 511 | 512 | bumpp@9.8.1: 513 | dependencies: 514 | '@jsdevtools/ez-spawn': 3.0.4 515 | c12: 1.11.2 516 | cac: 6.7.14 517 | escalade: 3.2.0 518 | js-yaml: 4.1.0 519 | jsonc-parser: 3.3.1 520 | prompts: 2.4.2 521 | semver: 7.6.3 522 | tinyglobby: 0.2.10 523 | transitivePeerDependencies: 524 | - magicast 525 | 526 | c12@1.11.2: 527 | dependencies: 528 | chokidar: 3.6.0 529 | confbox: 0.1.8 530 | defu: 6.1.4 531 | dotenv: 16.4.5 532 | giget: 1.2.3 533 | jiti: 1.21.6 534 | mlly: 1.7.3 535 | ohash: 1.1.4 536 | pathe: 1.1.2 537 | perfect-debounce: 1.0.0 538 | pkg-types: 1.2.1 539 | rc9: 2.1.2 540 | 541 | cac@6.7.14: {} 542 | 543 | call-me-maybe@1.0.2: {} 544 | 545 | chokidar@3.6.0: 546 | dependencies: 547 | anymatch: 3.1.3 548 | braces: 3.0.2 549 | glob-parent: 5.1.2 550 | is-binary-path: 2.1.0 551 | is-glob: 4.0.3 552 | normalize-path: 3.0.0 553 | readdirp: 3.6.0 554 | optionalDependencies: 555 | fsevents: 2.3.2 556 | 557 | chownr@2.0.0: {} 558 | 559 | citty@0.1.6: 560 | dependencies: 561 | consola: 3.2.3 562 | 563 | concat-map@0.0.1: {} 564 | 565 | confbox@0.1.8: {} 566 | 567 | consola@3.2.3: {} 568 | 569 | cross-spawn@7.0.3: 570 | dependencies: 571 | path-key: 3.1.1 572 | shebang-command: 2.0.0 573 | which: 2.0.2 574 | 575 | debug@4.3.7(supports-color@5.5.0): 576 | dependencies: 577 | ms: 2.1.3 578 | optionalDependencies: 579 | supports-color: 5.5.0 580 | 581 | defu@6.1.4: {} 582 | 583 | destr@2.0.3: {} 584 | 585 | dotenv@16.4.5: {} 586 | 587 | emmet@2.4.4: 588 | dependencies: 589 | '@emmetio/abbreviation': 2.3.3 590 | '@emmetio/css-abbreviation': 2.1.8 591 | 592 | escalade@3.2.0: {} 593 | 594 | execa@8.0.1: 595 | dependencies: 596 | cross-spawn: 7.0.3 597 | get-stream: 8.0.1 598 | human-signals: 5.0.0 599 | is-stream: 3.0.0 600 | merge-stream: 2.0.0 601 | npm-run-path: 5.3.0 602 | onetime: 6.0.0 603 | signal-exit: 4.1.0 604 | strip-final-newline: 3.0.0 605 | 606 | fdir@6.4.2(picomatch@4.0.2): 607 | optionalDependencies: 608 | picomatch: 4.0.2 609 | 610 | fill-range@7.0.1: 611 | dependencies: 612 | to-regex-range: 5.0.1 613 | 614 | fs-minipass@2.1.0: 615 | dependencies: 616 | minipass: 3.3.6 617 | 618 | fsevents@2.3.2: 619 | optional: true 620 | 621 | get-stream@8.0.1: {} 622 | 623 | giget@1.2.3: 624 | dependencies: 625 | citty: 0.1.6 626 | consola: 3.2.3 627 | defu: 6.1.4 628 | node-fetch-native: 1.6.4 629 | nypm: 0.3.12 630 | ohash: 1.1.4 631 | pathe: 1.1.2 632 | tar: 6.2.1 633 | 634 | glob-parent@5.1.2: 635 | dependencies: 636 | is-glob: 4.0.3 637 | 638 | has-flag@3.0.0: {} 639 | 640 | human-signals@5.0.0: {} 641 | 642 | ignore-by-default@1.0.1: {} 643 | 644 | is-binary-path@2.1.0: 645 | dependencies: 646 | binary-extensions: 2.2.0 647 | 648 | is-extglob@2.1.1: {} 649 | 650 | is-glob@4.0.3: 651 | dependencies: 652 | is-extglob: 2.1.1 653 | 654 | is-number@7.0.0: {} 655 | 656 | is-stream@3.0.0: {} 657 | 658 | isexe@2.0.0: {} 659 | 660 | jiti@1.21.6: {} 661 | 662 | js-yaml@4.1.0: 663 | dependencies: 664 | argparse: 2.0.1 665 | 666 | jsonc-parser@2.3.1: {} 667 | 668 | jsonc-parser@3.3.1: {} 669 | 670 | kleur@3.0.3: {} 671 | 672 | merge-stream@2.0.0: {} 673 | 674 | mimic-fn@4.0.0: {} 675 | 676 | minimatch@3.1.2: 677 | dependencies: 678 | brace-expansion: 1.1.11 679 | 680 | minipass@3.3.6: 681 | dependencies: 682 | yallist: 4.0.0 683 | 684 | minipass@5.0.0: {} 685 | 686 | minizlib@2.1.2: 687 | dependencies: 688 | minipass: 3.3.6 689 | yallist: 4.0.0 690 | 691 | mkdirp@1.0.4: {} 692 | 693 | mlly@1.7.3: 694 | dependencies: 695 | acorn: 8.14.0 696 | pathe: 1.1.2 697 | pkg-types: 1.2.1 698 | ufo: 1.5.4 699 | 700 | ms@2.1.3: {} 701 | 702 | node-fetch-native@1.6.4: {} 703 | 704 | nodemon@3.1.7: 705 | dependencies: 706 | chokidar: 3.6.0 707 | debug: 4.3.7(supports-color@5.5.0) 708 | ignore-by-default: 1.0.1 709 | minimatch: 3.1.2 710 | pstree.remy: 1.1.8 711 | semver: 7.6.3 712 | simple-update-notifier: 2.0.0 713 | supports-color: 5.5.0 714 | touch: 3.1.0 715 | undefsafe: 2.0.5 716 | 717 | nopt@1.0.10: 718 | dependencies: 719 | abbrev: 1.1.1 720 | 721 | normalize-path@3.0.0: {} 722 | 723 | npm-run-path@5.3.0: 724 | dependencies: 725 | path-key: 4.0.0 726 | 727 | nypm@0.3.12: 728 | dependencies: 729 | citty: 0.1.6 730 | consola: 3.2.3 731 | execa: 8.0.1 732 | pathe: 1.1.2 733 | pkg-types: 1.2.1 734 | ufo: 1.5.4 735 | 736 | ohash@1.1.4: {} 737 | 738 | onetime@6.0.0: 739 | dependencies: 740 | mimic-fn: 4.0.0 741 | 742 | path-key@3.1.1: {} 743 | 744 | path-key@4.0.0: {} 745 | 746 | pathe@1.1.2: {} 747 | 748 | perfect-debounce@1.0.0: {} 749 | 750 | picomatch@2.3.1: {} 751 | 752 | picomatch@4.0.2: {} 753 | 754 | pkg-types@1.2.1: 755 | dependencies: 756 | confbox: 0.1.8 757 | mlly: 1.7.3 758 | pathe: 1.1.2 759 | 760 | prompts@2.4.2: 761 | dependencies: 762 | kleur: 3.0.3 763 | sisteransi: 1.0.5 764 | 765 | pstree.remy@1.1.8: {} 766 | 767 | rc9@2.1.2: 768 | dependencies: 769 | defu: 6.1.4 770 | destr: 2.0.3 771 | 772 | readdirp@3.6.0: 773 | dependencies: 774 | picomatch: 2.3.1 775 | 776 | semver@7.6.3: {} 777 | 778 | shebang-command@2.0.0: 779 | dependencies: 780 | shebang-regex: 3.0.0 781 | 782 | shebang-regex@3.0.0: {} 783 | 784 | signal-exit@4.1.0: {} 785 | 786 | simple-update-notifier@2.0.0: 787 | dependencies: 788 | semver: 7.6.3 789 | 790 | sisteransi@1.0.5: {} 791 | 792 | string-argv@0.3.2: {} 793 | 794 | strip-final-newline@3.0.0: {} 795 | 796 | supports-color@5.5.0: 797 | dependencies: 798 | has-flag: 3.0.0 799 | 800 | tar@6.2.1: 801 | dependencies: 802 | chownr: 2.0.0 803 | fs-minipass: 2.1.0 804 | minipass: 5.0.0 805 | minizlib: 2.1.2 806 | mkdirp: 1.0.4 807 | yallist: 4.0.0 808 | 809 | tinyglobby@0.2.10: 810 | dependencies: 811 | fdir: 6.4.2(picomatch@4.0.2) 812 | picomatch: 4.0.2 813 | 814 | to-regex-range@5.0.1: 815 | dependencies: 816 | is-number: 7.0.0 817 | 818 | touch@3.1.0: 819 | dependencies: 820 | nopt: 1.0.10 821 | 822 | type-detect@4.0.8: {} 823 | 824 | typescript@5.6.3: {} 825 | 826 | ufo@1.5.4: {} 827 | 828 | undefsafe@2.0.5: {} 829 | 830 | undici-types@6.19.8: {} 831 | 832 | vscode-jsonrpc@8.2.0: {} 833 | 834 | vscode-languageserver-protocol@3.17.5: 835 | dependencies: 836 | vscode-jsonrpc: 8.2.0 837 | vscode-languageserver-types: 3.17.5 838 | 839 | vscode-languageserver-textdocument@1.0.12: {} 840 | 841 | vscode-languageserver-types@3.17.3: {} 842 | 843 | vscode-languageserver-types@3.17.5: {} 844 | 845 | vscode-languageserver@9.0.1: 846 | dependencies: 847 | vscode-languageserver-protocol: 3.17.5 848 | 849 | vscode-uri@3.0.8: {} 850 | 851 | which@2.0.2: 852 | dependencies: 853 | isexe: 2.0.0 854 | 855 | yallist@4.0.0: {} 856 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "dist" 4 | }, 5 | "extends": ["@tsconfig/recommended/tsconfig"] 6 | } 7 | --------------------------------------------------------------------------------