├── .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 | 
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------