fork of hey-api/openapi-ts because I need some additional things
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #1668 from hey-api/fix/watch-mode-patch

fix: watch mode tweaks

authored by

Lubos and committed by
GitHub
b005a852 d0af19e1

+1099 -706
+5
.changeset/gentle-deers-sit.md
··· 1 + --- 2 + '@hey-api/openapi-ts': patch 3 + --- 4 + 5 + fix: watch mode handles servers not exposing HEAD method for spec
+5
.changeset/happy-eels-kick.md
··· 1 + --- 2 + '@hey-api/openapi-ts': patch 3 + --- 4 + 5 + fix: add watch.timeout option
+1 -1
docs/openapi-ts/configuration.md
··· 273 273 274 274 ## Config API 275 275 276 - You can view the complete list of options in the [UserConfig](https://github.com/hey-api/openapi-ts/blob/main/packages/openapi-ts/src/types/config.ts) interface. 276 + You can view the complete list of options in the [UserConfig](https://github.com/hey-api/openapi-ts/blob/main/packages/openapi-ts/src/types/config.d.ts) interface. 277 277 278 278 <!--@include: ../examples.md--> 279 279 <!--@include: ../sponsors.md-->
+1 -1
packages/openapi-ts/package.json
··· 79 79 "node": "^18.18.0 || ^20.9.0 || >=22.11.0" 80 80 }, 81 81 "dependencies": { 82 - "@hey-api/json-schema-ref-parser": "1.0.1", 82 + "@hey-api/json-schema-ref-parser": "1.0.2", 83 83 "c12": "2.0.1", 84 84 "commander": "13.0.0", 85 85 "handlebars": "4.7.8"
+101
packages/openapi-ts/src/createClient.ts
··· 1 + import path from 'node:path'; 2 + 3 + import { generateLegacyOutput, generateOutput } from './generate/output'; 4 + import { getSpec } from './getSpec'; 5 + import type { IR } from './ir/types'; 6 + import { parseLegacy, parseOpenApiSpec } from './openApi'; 7 + import { processOutput } from './processOutput'; 8 + import type { Client } from './types/client'; 9 + import type { Config } from './types/config'; 10 + import type { WatchValues } from './types/types'; 11 + import { isLegacyClient, legacyNameFromConfig } from './utils/config'; 12 + import type { Templates } from './utils/handlebars'; 13 + import { Performance } from './utils/performance'; 14 + import { postProcessClient } from './utils/postprocess'; 15 + 16 + export const createClient = async ({ 17 + config, 18 + templates, 19 + watch: _watch, 20 + }: { 21 + config: Config; 22 + templates: Templates; 23 + watch?: WatchValues; 24 + }) => { 25 + const inputPath = config.input.path; 26 + const timeout = config.watch.timeout; 27 + 28 + const watch: WatchValues = _watch || { headers: new Headers() }; 29 + 30 + Performance.start('spec'); 31 + const { data, error, response } = await getSpec({ 32 + inputPath, 33 + timeout, 34 + watch, 35 + }); 36 + Performance.end('spec'); 37 + 38 + // throw on first run if there's an error to preserve user experience 39 + // if in watch mode, subsequent errors won't throw to gracefully handle 40 + // cases where server might be reloading 41 + if (error && !_watch) { 42 + throw new Error( 43 + `Request failed with status ${response.status}: ${response.statusText}`, 44 + ); 45 + } 46 + 47 + let client: Client | undefined; 48 + let context: IR.Context | undefined; 49 + 50 + if (data) { 51 + if (_watch) { 52 + console.clear(); 53 + console.log(`⏳ Input changed, generating from ${inputPath}`); 54 + } else { 55 + console.log(`⏳ Generating from ${inputPath}`); 56 + } 57 + 58 + Performance.start('parser'); 59 + if ( 60 + config.experimentalParser && 61 + !isLegacyClient(config) && 62 + !legacyNameFromConfig(config) 63 + ) { 64 + context = parseOpenApiSpec({ config, spec: data }); 65 + } 66 + 67 + // fallback to legacy parser 68 + if (!context) { 69 + const parsed = parseLegacy({ openApi: data }); 70 + client = postProcessClient(parsed, config); 71 + } 72 + Performance.end('parser'); 73 + 74 + Performance.start('generator'); 75 + if (context) { 76 + await generateOutput({ context }); 77 + } else if (client) { 78 + await generateLegacyOutput({ client, openApi: data, templates }); 79 + } 80 + Performance.end('generator'); 81 + 82 + Performance.start('postprocess'); 83 + if (!config.dryRun) { 84 + processOutput({ config }); 85 + 86 + const outputPath = process.env.INIT_CWD 87 + ? `./${path.relative(process.env.INIT_CWD, config.output.path)}` 88 + : config.output.path; 89 + console.log(`🚀 Done! Your output is in ${outputPath}`); 90 + } 91 + Performance.end('postprocess'); 92 + } 93 + 94 + if (config.watch.enabled && typeof inputPath === 'string') { 95 + setTimeout(() => { 96 + createClient({ config, templates, watch }); 97 + }, config.watch.interval); 98 + } 99 + 100 + return context || client; 101 + };
+2 -1
packages/openapi-ts/src/generate/__tests__/class.test.ts
··· 60 60 useOptions: true, 61 61 watch: { 62 62 enabled: false, 63 - interval: 1000, 63 + interval: 1_000, 64 + timeout: 60_000, 64 65 }, 65 66 }); 66 67
+6 -3
packages/openapi-ts/src/generate/__tests__/core.test.ts
··· 75 75 useOptions: true, 76 76 watch: { 77 77 enabled: false, 78 - interval: 1000, 78 + interval: 1_000, 79 + timeout: 60_000, 79 80 }, 80 81 }); 81 82 ··· 166 167 useOptions: true, 167 168 watch: { 168 169 enabled: false, 169 - interval: 1000, 170 + interval: 1_000, 171 + timeout: 60_000, 170 172 }, 171 173 }); 172 174 ··· 240 242 useOptions: true, 241 243 watch: { 242 244 enabled: false, 243 - interval: 1000, 245 + interval: 1_000, 246 + timeout: 60_000, 244 247 }, 245 248 }); 246 249
+2 -1
packages/openapi-ts/src/generate/__tests__/index.test.ts
··· 59 59 useOptions: true, 60 60 watch: { 61 61 enabled: false, 62 - interval: 1000, 62 + interval: 1_000, 63 + timeout: 60_000, 63 64 }, 64 65 }); 65 66
+2 -1
packages/openapi-ts/src/generate/__tests__/output.test.ts
··· 61 61 useOptions: false, 62 62 watch: { 63 63 enabled: false, 64 - interval: 1000, 64 + interval: 1_000, 65 + timeout: 60_000, 65 66 }, 66 67 }); 67 68
+17
packages/openapi-ts/src/getLogs.ts
··· 1 + import type { Config, UserConfig } from './types/config'; 2 + 3 + export const getLogs = (userConfig: UserConfig): Config['logs'] => { 4 + let logs: Config['logs'] = { 5 + level: 'info', 6 + path: process.cwd(), 7 + }; 8 + if (typeof userConfig.logs === 'string') { 9 + logs.path = userConfig.logs; 10 + } else { 11 + logs = { 12 + ...logs, 13 + ...userConfig.logs, 14 + }; 15 + } 16 + return logs; 17 + };
+150
packages/openapi-ts/src/getSpec.ts
··· 1 + import { 2 + $RefParser, 3 + getResolvedInput, 4 + type JSONSchema, 5 + sendRequest, 6 + } from '@hey-api/json-schema-ref-parser'; 7 + 8 + import type { Config } from './types/config'; 9 + import type { WatchValues } from './types/types'; 10 + 11 + interface SpecResponse { 12 + data: JSONSchema; 13 + error?: undefined; 14 + response?: undefined; 15 + } 16 + 17 + interface SpecError { 18 + data?: undefined; 19 + error: 'not-modified' | 'not-ok'; 20 + response: Response; 21 + } 22 + 23 + export const getSpec = async ({ 24 + inputPath, 25 + timeout, 26 + watch, 27 + }: { 28 + inputPath: Config['input']['path']; 29 + timeout: number; 30 + watch: WatchValues; 31 + }): Promise<SpecResponse | SpecError> => { 32 + const refParser = new $RefParser(); 33 + const resolvedInput = getResolvedInput({ pathOrUrlOrSchema: inputPath }); 34 + 35 + let arrayBuffer: ArrayBuffer | undefined; 36 + // boolean signals whether the file has **definitely** changed 37 + let hasChanged: boolean | undefined; 38 + let response: Response | undefined; 39 + 40 + // no support for watching files and objects for now 41 + if (resolvedInput.type === 'url') { 42 + // do NOT send HEAD request on first run or if unsupported 43 + if (watch.lastValue && watch.isHeadMethodSupported !== false) { 44 + const request = await sendRequest({ 45 + init: { 46 + headers: watch.headers, 47 + method: 'HEAD', 48 + }, 49 + timeout, 50 + url: resolvedInput.path, 51 + }); 52 + response = request.response; 53 + 54 + if (!response.ok && watch.isHeadMethodSupported) { 55 + // assume the server is no longer running 56 + // do nothing, it might be restarted later 57 + return { 58 + error: 'not-ok', 59 + response, 60 + }; 61 + } 62 + 63 + if (watch.isHeadMethodSupported === undefined) { 64 + watch.isHeadMethodSupported = response.ok; 65 + } 66 + 67 + if (response.status === 304) { 68 + return { 69 + error: 'not-modified', 70 + response, 71 + }; 72 + } 73 + 74 + if (hasChanged === undefined) { 75 + const eTag = response.headers.get('ETag'); 76 + if (eTag) { 77 + hasChanged = eTag !== watch.headers.get('If-None-Match'); 78 + 79 + if (hasChanged) { 80 + watch.headers.set('If-None-Match', eTag); 81 + } 82 + } 83 + } 84 + 85 + if (hasChanged === undefined) { 86 + const lastModified = response.headers.get('Last-Modified'); 87 + if (lastModified) { 88 + hasChanged = lastModified !== watch.headers.get('If-Modified-Since'); 89 + 90 + if (hasChanged) { 91 + watch.headers.set('If-Modified-Since', lastModified); 92 + } 93 + } 94 + } 95 + 96 + // we definitely know the input has not changed 97 + if (hasChanged === false) { 98 + return { 99 + error: 'not-modified', 100 + response, 101 + }; 102 + } 103 + } 104 + 105 + const fileRequest = await sendRequest({ 106 + init: { 107 + method: 'GET', 108 + }, 109 + timeout, 110 + url: resolvedInput.path, 111 + }); 112 + response = fileRequest.response; 113 + 114 + if (!response.ok) { 115 + // assume the server is no longer running 116 + // do nothing, it might be restarted later 117 + return { 118 + error: 'not-ok', 119 + response, 120 + }; 121 + } 122 + 123 + arrayBuffer = response.body 124 + ? await response.arrayBuffer() 125 + : new ArrayBuffer(0); 126 + 127 + if (hasChanged === undefined) { 128 + const content = new TextDecoder().decode(arrayBuffer); 129 + hasChanged = content !== watch.lastValue; 130 + watch.lastValue = content; 131 + } 132 + } 133 + 134 + if (hasChanged === false) { 135 + return { 136 + error: 'not-modified', 137 + response: response!, 138 + }; 139 + } 140 + 141 + const data = await refParser.bundle({ 142 + arrayBuffer, 143 + pathOrUrlOrSchema: undefined, 144 + resolvedInput, 145 + }); 146 + 147 + return { 148 + data, 149 + }; 150 + };
+12 -641
packages/openapi-ts/src/index.ts
··· 1 1 import fs from 'node:fs'; 2 2 import path from 'node:path'; 3 3 4 - import { 5 - $RefParser, 6 - getResolvedInput, 7 - type JSONSchema, 8 - sendRequest, 9 - } from '@hey-api/json-schema-ref-parser'; 10 - import { loadConfig } from 'c12'; 11 - import { sync } from 'cross-spawn'; 12 - 13 - import { generateLegacyOutput, generateOutput } from './generate/output'; 4 + import { createClient as pCreateClient } from './createClient'; 14 5 import { ensureDirSync } from './generate/utils'; 6 + import { getLogs } from './getLogs'; 7 + import { initConfigs } from './initConfigs'; 15 8 import type { IR } from './ir/types'; 16 - import { parseLegacy, parseOpenApiSpec } from './openApi'; 17 - import type { ClientPlugins, UserPlugins } from './plugins'; 18 - import { defaultPluginConfigs } from './plugins'; 19 - import type { 20 - AnyPluginName, 21 - DefaultPluginConfigs, 22 - PluginContext, 23 - PluginNames, 24 - } from './plugins/types'; 25 9 import type { Client } from './types/client'; 26 - import type { Config, Formatters, Linters, UserConfig } from './types/config'; 27 - import { 28 - isLegacyClient, 29 - legacyNameFromConfig, 30 - setConfig, 31 - } from './utils/config'; 10 + import type { Config, UserConfig } from './types/config'; 32 11 import { registerHandlebarTemplates } from './utils/handlebars'; 33 12 import { Performance, PerformanceReport } from './utils/performance'; 34 - import { postProcessClient } from './utils/postprocess'; 35 - 36 - type OutputProcessor = { 37 - args: (path: string) => ReadonlyArray<string>; 38 - command: string; 39 - name: string; 40 - }; 41 13 42 14 /** 43 - * Map of supported formatters 44 - */ 45 - const formatters: Record<Formatters, OutputProcessor> = { 46 - biome: { 47 - args: (path) => ['format', '--write', path], 48 - command: 'biome', 49 - name: 'Biome (Format)', 50 - }, 51 - prettier: { 52 - args: (path) => [ 53 - '--ignore-unknown', 54 - path, 55 - '--write', 56 - '--ignore-path', 57 - './.prettierignore', 58 - ], 59 - command: 'prettier', 60 - name: 'Prettier', 61 - }, 62 - }; 63 - 64 - /** 65 - * Map of supported linters 15 + * Generate a client from the provided configuration. 16 + * 17 + * @param userConfig User provided {@link UserConfig} configuration. 66 18 */ 67 - const linters: Record<Linters, OutputProcessor> = { 68 - biome: { 69 - args: (path) => ['lint', '--apply', path], 70 - command: 'biome', 71 - name: 'Biome (Lint)', 72 - }, 73 - eslint: { 74 - args: (path) => [path, '--fix'], 75 - command: 'eslint', 76 - name: 'ESLint', 77 - }, 78 - oxlint: { 79 - args: (path) => ['--fix', path], 80 - command: 'oxlint', 81 - name: 'oxlint', 82 - }, 83 - }; 84 - 85 - const processOutput = ({ config }: { config: Config }) => { 86 - if (config.output.format) { 87 - const module = formatters[config.output.format]; 88 - console.log(`✨ Running ${module.name}`); 89 - sync(module.command, module.args(config.output.path)); 90 - } 91 - 92 - if (config.output.lint) { 93 - const module = linters[config.output.lint]; 94 - console.log(`✨ Running ${module.name}`); 95 - sync(module.command, module.args(config.output.path)); 96 - } 97 - }; 98 - 99 - const getInput = (userConfig: UserConfig): Config['input'] => { 100 - let input: Config['input'] = { 101 - path: '', 102 - }; 103 - if (typeof userConfig.input === 'string') { 104 - input.path = userConfig.input; 105 - } else if (userConfig.input && userConfig.input.path) { 106 - input = { 107 - ...input, 108 - ...userConfig.input, 109 - }; 110 - } else { 111 - input = { 112 - ...input, 113 - path: userConfig.input, 114 - }; 115 - } 116 - return input; 117 - }; 118 - 119 - const getLogs = (userConfig: UserConfig): Config['logs'] => { 120 - let logs: Config['logs'] = { 121 - level: 'info', 122 - path: process.cwd(), 123 - }; 124 - if (typeof userConfig.logs === 'string') { 125 - logs.path = userConfig.logs; 126 - } else { 127 - logs = { 128 - ...logs, 129 - ...userConfig.logs, 130 - }; 131 - } 132 - return logs; 133 - }; 134 - 135 - const getOutput = (userConfig: UserConfig): Config['output'] => { 136 - let output: Config['output'] = { 137 - clean: true, 138 - format: false, 139 - indexFile: true, 140 - lint: false, 141 - path: '', 142 - }; 143 - if (typeof userConfig.output === 'string') { 144 - output.path = userConfig.output; 145 - } else { 146 - output = { 147 - ...output, 148 - ...userConfig.output, 149 - }; 150 - } 151 - return output; 152 - }; 153 - 154 - const getPluginsConfig = ({ 155 - pluginConfigs, 156 - userPlugins, 157 - userPluginsConfig, 158 - }: { 159 - pluginConfigs: DefaultPluginConfigs<ClientPlugins>; 160 - userPlugins: ReadonlyArray<AnyPluginName>; 161 - userPluginsConfig: Config['plugins']; 162 - }): Pick<Config, 'plugins' | 'pluginOrder'> => { 163 - const circularReferenceTracker = new Set<AnyPluginName>(); 164 - const pluginOrder = new Set<AnyPluginName>(); 165 - const plugins: Config['plugins'] = {}; 166 - 167 - const dfs = (name: AnyPluginName) => { 168 - if (circularReferenceTracker.has(name)) { 169 - throw new Error(`Circular reference detected at '${name}'`); 170 - } 171 - 172 - if (!pluginOrder.has(name)) { 173 - circularReferenceTracker.add(name); 174 - 175 - const pluginConfig = pluginConfigs[name as PluginNames]; 176 - if (!pluginConfig) { 177 - throw new Error( 178 - `🚫 unknown plugin dependency "${name}" - do you need to register a custom plugin with this name?`, 179 - ); 180 - } 181 - 182 - const defaultOptions = defaultPluginConfigs[name as PluginNames]; 183 - const userOptions = userPluginsConfig[name as PluginNames]; 184 - if (userOptions && defaultOptions) { 185 - const nativePluginOption = Object.keys(userOptions).find((key) => 186 - key.startsWith('_'), 187 - ); 188 - if (nativePluginOption) { 189 - throw new Error( 190 - `🚫 cannot register plugin "${name}" - attempting to override a native plugin option "${nativePluginOption}"`, 191 - ); 192 - } 193 - } 194 - 195 - const config = { 196 - _dependencies: [], 197 - ...defaultOptions, 198 - ...userOptions, 199 - }; 200 - 201 - if (config._infer) { 202 - const context: PluginContext = { 203 - ensureDependency: (dependency) => { 204 - if ( 205 - typeof dependency === 'string' && 206 - !config._dependencies.includes(dependency) 207 - ) { 208 - config._dependencies = [...config._dependencies, dependency]; 209 - } 210 - }, 211 - pluginByTag: (tag, errorMessage) => { 212 - for (const userPlugin of userPlugins) { 213 - const defaultConfig = 214 - defaultPluginConfigs[userPlugin as PluginNames]; 215 - if ( 216 - defaultConfig && 217 - defaultConfig._tags?.includes(tag) && 218 - userPlugin !== name 219 - ) { 220 - return userPlugin; 221 - } 222 - } 223 - 224 - throw new Error( 225 - errorMessage || 226 - `🚫 missing plugin - no plugin with tag "${tag}" found`, 227 - ); 228 - }, 229 - }; 230 - config._infer(config, context); 231 - } 232 - 233 - for (const dependency of config._dependencies) { 234 - dfs(dependency); 235 - } 236 - 237 - circularReferenceTracker.delete(name); 238 - pluginOrder.add(name); 239 - 240 - // @ts-expect-error 241 - plugins[name] = config; 242 - } 243 - }; 244 - 245 - for (const name of userPlugins) { 246 - dfs(name); 247 - } 248 - 249 - return { 250 - pluginOrder: Array.from(pluginOrder) as ReadonlyArray<PluginNames>, 251 - plugins, 252 - }; 253 - }; 254 - 255 - const getPlugins = ( 19 + export const createClient = async ( 256 20 userConfig: UserConfig, 257 - ): Pick<Config, 'plugins' | 'pluginOrder'> => { 258 - const userPluginsConfig: Config['plugins'] = {}; 259 - 260 - let definedPlugins: UserConfig['plugins'] = defaultPlugins; 261 - if (userConfig.plugins) { 262 - if ( 263 - userConfig.plugins.length === 1 && 264 - ((typeof userConfig.plugins[0] === 'string' && 265 - (userConfig.plugins[0].startsWith('@hey-api/client') || 266 - userConfig.plugins[0].startsWith('legacy/'))) || 267 - (typeof userConfig.plugins[0] !== 'string' && 268 - (userConfig.plugins[0]?.name.startsWith('@hey-api/client') || 269 - userConfig.plugins[0]?.name.startsWith('legacy/')))) 270 - ) { 271 - definedPlugins = [...defaultPlugins, ...userConfig.plugins]; 272 - } else { 273 - definedPlugins = userConfig.plugins; 274 - } 275 - } 276 - 277 - const userPlugins = definedPlugins 278 - .map((plugin) => { 279 - if (typeof plugin === 'string') { 280 - return plugin; 281 - } 282 - 283 - if (plugin.name) { 284 - // @ts-expect-error 285 - userPluginsConfig[plugin.name] = plugin; 286 - } 287 - 288 - return plugin.name; 289 - }) 290 - .filter(Boolean); 291 - 292 - return getPluginsConfig({ 293 - pluginConfigs: { 294 - ...userPluginsConfig, 295 - ...defaultPluginConfigs, 296 - }, 297 - userPlugins, 298 - userPluginsConfig, 299 - }); 300 - }; 301 - 302 - interface WatchValues { 303 - headers: Headers; 304 - lastValue: string | undefined; 305 - } 306 - 307 - const getSpec = async ({ 308 - inputPath, 309 - watch, 310 - }: { 311 - inputPath: Config['input']['path']; 312 - watch: WatchValues; 313 - }): Promise< 314 - | { 315 - data: JSONSchema; 316 - error?: undefined; 317 - response?: undefined; 318 - } 319 - | { 320 - data?: undefined; 321 - error: 'not-modified' | 'not-ok'; 322 - response: Response; 323 - } 324 - > => { 325 - const refParser = new $RefParser(); 326 - const resolvedInput = getResolvedInput({ pathOrUrlOrSchema: inputPath }); 327 - 328 - let arrayBuffer: ArrayBuffer | undefined; 329 - // boolean signals whether the file has **definitely** changed 330 - let hasChanged: boolean | undefined; 331 - let response: Response | undefined; 332 - 333 - // no support for watching files and objects for now 334 - if (resolvedInput.type === 'url') { 335 - // do not send HEAD request on first run 336 - if (watch.lastValue) { 337 - const request = await sendRequest({ 338 - init: { 339 - headers: watch.headers, 340 - method: 'HEAD', 341 - }, 342 - url: resolvedInput.path, 343 - }); 344 - response = request.response; 345 - 346 - if (!response.ok) { 347 - // assume the server is no longer running 348 - // do nothing, it might be restarted later 349 - return { 350 - error: 'not-ok', 351 - response, 352 - }; 353 - } 354 - 355 - if (response.status === 304) { 356 - return { 357 - error: 'not-modified', 358 - response, 359 - }; 360 - } 361 - 362 - if (hasChanged === undefined) { 363 - const eTag = response.headers.get('ETag'); 364 - if (eTag) { 365 - hasChanged = eTag !== watch.headers.get('If-None-Match'); 366 - 367 - if (hasChanged) { 368 - watch.headers.set('If-None-Match', eTag); 369 - } 370 - } 371 - } 372 - 373 - if (hasChanged === undefined) { 374 - const lastModified = response.headers.get('Last-Modified'); 375 - if (lastModified) { 376 - hasChanged = lastModified !== watch.headers.get('If-Modified-Since'); 377 - 378 - if (hasChanged) { 379 - watch.headers.set('If-Modified-Since', lastModified); 380 - } 381 - } 382 - } 383 - 384 - // we definitely know the input has not changed 385 - if (hasChanged === false) { 386 - return { 387 - error: 'not-modified', 388 - response, 389 - }; 390 - } 391 - } 392 - 393 - const fileRequest = await sendRequest({ 394 - init: { 395 - method: 'GET', 396 - }, 397 - url: resolvedInput.path, 398 - }); 399 - response = fileRequest.response; 400 - 401 - if (!response.ok) { 402 - // assume the server is no longer running 403 - // do nothing, it might be restarted later 404 - return { 405 - error: 'not-ok', 406 - response, 407 - }; 408 - } 409 - 410 - arrayBuffer = response.body 411 - ? await response.arrayBuffer() 412 - : new ArrayBuffer(0); 413 - 414 - if (hasChanged === undefined) { 415 - const content = new TextDecoder().decode(arrayBuffer); 416 - hasChanged = content !== watch.lastValue; 417 - watch.lastValue = content; 418 - } 419 - } 420 - 421 - if (hasChanged === false) { 422 - return { 423 - error: 'not-modified', 424 - response: response!, 425 - }; 426 - } 427 - 428 - const data = await refParser.bundle({ 429 - arrayBuffer, 430 - pathOrUrlOrSchema: undefined, 431 - resolvedInput, 432 - }); 433 - 434 - return { 435 - data, 436 - }; 437 - }; 438 - 439 - const getWatch = ( 440 - userConfig: Pick<UserConfig, 'watch'> & Pick<Config, 'input'>, 441 - ): Config['watch'] => { 442 - let watch: Config['watch'] = { 443 - enabled: false, 444 - interval: 1000, 445 - }; 446 - // we cannot watch spec passed as an object 447 - if (typeof userConfig.input.path !== 'string') { 448 - return watch; 449 - } 450 - if (typeof userConfig.watch === 'boolean') { 451 - watch.enabled = userConfig.watch; 452 - } else if (typeof userConfig.watch === 'number') { 453 - watch = { 454 - enabled: true, 455 - interval: userConfig.watch, 456 - }; 457 - } else if (userConfig.watch) { 458 - watch = { 459 - ...watch, 460 - ...userConfig.watch, 461 - }; 462 - } 463 - return watch; 464 - }; 465 - 466 - const initConfigs = async (userConfig: UserConfig): Promise<Config[]> => { 467 - let configurationFile: string | undefined = undefined; 468 - if (userConfig.configFile) { 469 - const parts = userConfig.configFile.split('.'); 470 - configurationFile = parts.slice(0, parts.length - 1).join('.'); 471 - } 472 - 473 - const { config: configFromFile } = await loadConfig<UserConfig>({ 474 - configFile: configurationFile, 475 - name: 'openapi-ts', 476 - }); 477 - 478 - const userConfigs: UserConfig[] = Array.isArray(userConfig) 479 - ? userConfig 480 - : Array.isArray(configFromFile) 481 - ? configFromFile.map((config) => ({ 482 - ...config, 483 - ...userConfig, 484 - })) 485 - : [{ ...(configFromFile ?? {}), ...userConfig }]; 486 - 487 - return userConfigs.map((userConfig) => { 488 - const { 489 - base, 490 - configFile = '', 491 - dryRun = false, 492 - experimentalParser = true, 493 - exportCore = true, 494 - name, 495 - request, 496 - useOptions = true, 497 - } = userConfig; 498 - 499 - const logs = getLogs(userConfig); 500 - 501 - if (logs.level === 'debug') { 502 - console.warn('userConfig:', userConfig); 503 - } 504 - 505 - const input = getInput(userConfig); 506 - const output = getOutput(userConfig); 507 - 508 - if (!input.path) { 509 - throw new Error( 510 - '🚫 missing input - which OpenAPI specification should we use to generate your output?', 511 - ); 512 - } 513 - 514 - if (!output.path) { 515 - throw new Error( 516 - '🚫 missing output - where should we generate your output?', 517 - ); 518 - } 519 - 520 - if (!useOptions) { 521 - console.warn( 522 - '❗️ Deprecation warning: useOptions set to false. This setting will be removed in future versions. Please migrate useOptions to true https://heyapi.dev/openapi-ts/migrating.html#v0-27-38', 523 - ); 524 - } 525 - 526 - output.path = path.resolve(process.cwd(), output.path); 527 - 528 - const config = setConfig({ 529 - ...getPlugins(userConfig), 530 - base, 531 - configFile, 532 - dryRun, 533 - experimentalParser, 534 - exportCore: false, 535 - input, 536 - logs, 537 - name, 538 - output, 539 - request, 540 - useOptions, 541 - watch: getWatch({ ...userConfig, input }), 542 - }); 543 - config.exportCore = isLegacyClient(config) ? exportCore : false; 544 - 545 - if (logs.level === 'debug') { 546 - console.warn('config:', config); 547 - } 548 - 549 - return config; 550 - }); 551 - }; 552 - 553 - /** 554 - * Generate the OpenAPI client. This method will read the OpenAPI specification and based on the 555 - * given language it will generate the client, including the typed models, validation schemas, 556 - * service layer, etc. 557 - * @param userConfig {@link UserConfig} passed to the `createClient()` method 558 - */ 559 - export async function createClient( 560 - userConfig: UserConfig, 561 - ): Promise<ReadonlyArray<Client | IR.Context>> { 21 + ): Promise<ReadonlyArray<Client | IR.Context>> => { 562 22 let configs: Config[] = []; 563 23 564 24 try { ··· 572 32 const templates = registerHandlebarTemplates(); 573 33 Performance.end('handlebars'); 574 34 575 - const pCreateClient = async ({ 576 - config, 577 - watch: _watch, 578 - }: { 579 - config: Config; 580 - watch?: WatchValues; 581 - }) => { 582 - const inputPath = config.input.path; 583 - 584 - const watch = _watch || { 585 - headers: new Headers(), 586 - lastValue: undefined, 587 - }; 588 - 589 - Performance.start('spec'); 590 - const { data, error, response } = await getSpec({ inputPath, watch }); 591 - Performance.end('spec'); 592 - 593 - // throw on first run if there's an error to preserve user experience 594 - // if in watch mode, subsequent errors won't throw to gracefully handle 595 - // cases where server might be reloading 596 - if (error && !_watch) { 597 - throw new Error( 598 - `Request failed with status ${response.status}: ${response.statusText}`, 599 - ); 600 - } 601 - 602 - let client: Client | undefined; 603 - let context: IR.Context | undefined; 604 - 605 - if (data) { 606 - if (_watch) { 607 - console.log(`⏳ Input changed, generating from ${inputPath}`); 608 - } else { 609 - console.log(`⏳ Generating from ${inputPath}`); 610 - } 611 - 612 - Performance.start('parser'); 613 - if ( 614 - config.experimentalParser && 615 - !isLegacyClient(config) && 616 - !legacyNameFromConfig(config) 617 - ) { 618 - context = parseOpenApiSpec({ config, spec: data }); 619 - } 620 - 621 - // fallback to legacy parser 622 - if (!context) { 623 - const parsed = parseLegacy({ openApi: data }); 624 - client = postProcessClient(parsed, config); 625 - } 626 - Performance.end('parser'); 627 - 628 - Performance.start('generator'); 629 - if (context) { 630 - await generateOutput({ context }); 631 - } else if (client) { 632 - await generateLegacyOutput({ client, openApi: data, templates }); 633 - } 634 - Performance.end('generator'); 635 - 636 - Performance.start('postprocess'); 637 - if (!config.dryRun) { 638 - processOutput({ config }); 639 - 640 - const outputPath = process.env.INIT_CWD 641 - ? `./${path.relative(process.env.INIT_CWD, config.output.path)}` 642 - : config.output.path; 643 - console.log(`🚀 Done! Your output is in ${outputPath}`); 644 - } 645 - Performance.end('postprocess'); 646 - } 647 - 648 - if (config.watch.enabled && typeof inputPath === 'string') { 649 - setTimeout(() => { 650 - pCreateClient({ config, watch }); 651 - }, config.watch.interval); 652 - } 653 - 654 - return context || client; 655 - }; 656 - 657 35 const clients = await Promise.all( 658 - configs.map((config) => pCreateClient({ config })), 36 + configs.map((config) => pCreateClient({ config, templates })), 659 37 ); 660 38 const result = clients.filter((client) => Boolean(client)) as ReadonlyArray< 661 39 Client | IR.Context ··· 699 77 console.error(`🔥 Unexpected error occurred. ${error.message}`); 700 78 throw error; 701 79 } 702 - } 703 - 704 - /** 705 - * Default plugins used to generate artifacts if plugins aren't specified. 706 - */ 707 - export const defaultPlugins = [ 708 - '@hey-api/typescript', 709 - '@hey-api/sdk', 710 - ] as const satisfies ReadonlyArray<UserPlugins['name']>; 80 + }; 711 81 712 82 /** 713 83 * Type helper for openapi-ts.config.ts, returns {@link UserConfig} object 714 84 */ 715 85 export const defineConfig = (config: UserConfig): UserConfig => config; 716 86 87 + export { defaultPlugins } from './initConfigs'; 717 88 export type { IR } from './ir/types'; 718 89 export type { OpenApi } from './openApi/types'; 719 90 export type { Plugin } from './plugins/types';
+325
packages/openapi-ts/src/initConfigs.ts
··· 1 + import path from 'node:path'; 2 + 3 + import { loadConfig } from 'c12'; 4 + 5 + import { getLogs } from './getLogs'; 6 + import type { ClientPlugins, UserPlugins } from './plugins'; 7 + import { defaultPluginConfigs } from './plugins'; 8 + import type { 9 + AnyPluginName, 10 + DefaultPluginConfigs, 11 + PluginContext, 12 + PluginNames, 13 + } from './plugins/types'; 14 + import type { Config, UserConfig } from './types/config'; 15 + import { isLegacyClient, setConfig } from './utils/config'; 16 + 17 + /** 18 + * Default plugins used to generate artifacts if plugins aren't specified. 19 + */ 20 + export const defaultPlugins = [ 21 + '@hey-api/typescript', 22 + '@hey-api/sdk', 23 + ] as const satisfies ReadonlyArray<UserPlugins['name']>; 24 + 25 + const getInput = (userConfig: UserConfig): Config['input'] => { 26 + let input: Config['input'] = { 27 + path: '', 28 + }; 29 + if (typeof userConfig.input === 'string') { 30 + input.path = userConfig.input; 31 + } else if (userConfig.input && userConfig.input.path) { 32 + input = { 33 + ...input, 34 + ...userConfig.input, 35 + }; 36 + } else { 37 + input = { 38 + ...input, 39 + path: userConfig.input, 40 + }; 41 + } 42 + return input; 43 + }; 44 + 45 + const getPluginsConfig = ({ 46 + pluginConfigs, 47 + userPlugins, 48 + userPluginsConfig, 49 + }: { 50 + pluginConfigs: DefaultPluginConfigs<ClientPlugins>; 51 + userPlugins: ReadonlyArray<AnyPluginName>; 52 + userPluginsConfig: Config['plugins']; 53 + }): Pick<Config, 'plugins' | 'pluginOrder'> => { 54 + const circularReferenceTracker = new Set<AnyPluginName>(); 55 + const pluginOrder = new Set<AnyPluginName>(); 56 + const plugins: Config['plugins'] = {}; 57 + 58 + const dfs = (name: AnyPluginName) => { 59 + if (circularReferenceTracker.has(name)) { 60 + throw new Error(`Circular reference detected at '${name}'`); 61 + } 62 + 63 + if (!pluginOrder.has(name)) { 64 + circularReferenceTracker.add(name); 65 + 66 + const pluginConfig = pluginConfigs[name as PluginNames]; 67 + if (!pluginConfig) { 68 + throw new Error( 69 + `🚫 unknown plugin dependency "${name}" - do you need to register a custom plugin with this name?`, 70 + ); 71 + } 72 + 73 + const defaultOptions = defaultPluginConfigs[name as PluginNames]; 74 + const userOptions = userPluginsConfig[name as PluginNames]; 75 + if (userOptions && defaultOptions) { 76 + const nativePluginOption = Object.keys(userOptions).find((key) => 77 + key.startsWith('_'), 78 + ); 79 + if (nativePluginOption) { 80 + throw new Error( 81 + `🚫 cannot register plugin "${name}" - attempting to override a native plugin option "${nativePluginOption}"`, 82 + ); 83 + } 84 + } 85 + 86 + const config = { 87 + _dependencies: [], 88 + ...defaultOptions, 89 + ...userOptions, 90 + }; 91 + 92 + if (config._infer) { 93 + const context: PluginContext = { 94 + ensureDependency: (dependency) => { 95 + if ( 96 + typeof dependency === 'string' && 97 + !config._dependencies.includes(dependency) 98 + ) { 99 + config._dependencies = [...config._dependencies, dependency]; 100 + } 101 + }, 102 + pluginByTag: (tag, errorMessage) => { 103 + for (const userPlugin of userPlugins) { 104 + const defaultConfig = 105 + defaultPluginConfigs[userPlugin as PluginNames]; 106 + if ( 107 + defaultConfig && 108 + defaultConfig._tags?.includes(tag) && 109 + userPlugin !== name 110 + ) { 111 + return userPlugin; 112 + } 113 + } 114 + 115 + throw new Error( 116 + errorMessage || 117 + `🚫 missing plugin - no plugin with tag "${tag}" found`, 118 + ); 119 + }, 120 + }; 121 + config._infer(config, context); 122 + } 123 + 124 + for (const dependency of config._dependencies) { 125 + dfs(dependency); 126 + } 127 + 128 + circularReferenceTracker.delete(name); 129 + pluginOrder.add(name); 130 + 131 + // @ts-expect-error 132 + plugins[name] = config; 133 + } 134 + }; 135 + 136 + for (const name of userPlugins) { 137 + dfs(name); 138 + } 139 + 140 + return { 141 + pluginOrder: Array.from(pluginOrder) as ReadonlyArray<PluginNames>, 142 + plugins, 143 + }; 144 + }; 145 + 146 + const getOutput = (userConfig: UserConfig): Config['output'] => { 147 + let output: Config['output'] = { 148 + clean: true, 149 + format: false, 150 + indexFile: true, 151 + lint: false, 152 + path: '', 153 + }; 154 + if (typeof userConfig.output === 'string') { 155 + output.path = userConfig.output; 156 + } else { 157 + output = { 158 + ...output, 159 + ...userConfig.output, 160 + }; 161 + } 162 + return output; 163 + }; 164 + 165 + const getPlugins = ( 166 + userConfig: UserConfig, 167 + ): Pick<Config, 'plugins' | 'pluginOrder'> => { 168 + const userPluginsConfig: Config['plugins'] = {}; 169 + 170 + let definedPlugins: UserConfig['plugins'] = defaultPlugins; 171 + if (userConfig.plugins) { 172 + if ( 173 + userConfig.plugins.length === 1 && 174 + ((typeof userConfig.plugins[0] === 'string' && 175 + (userConfig.plugins[0].startsWith('@hey-api/client') || 176 + userConfig.plugins[0].startsWith('legacy/'))) || 177 + (typeof userConfig.plugins[0] !== 'string' && 178 + (userConfig.plugins[0]?.name.startsWith('@hey-api/client') || 179 + userConfig.plugins[0]?.name.startsWith('legacy/')))) 180 + ) { 181 + definedPlugins = [...defaultPlugins, ...userConfig.plugins]; 182 + } else { 183 + definedPlugins = userConfig.plugins; 184 + } 185 + } 186 + 187 + const userPlugins = definedPlugins 188 + .map((plugin) => { 189 + if (typeof plugin === 'string') { 190 + return plugin; 191 + } 192 + 193 + if (plugin.name) { 194 + // @ts-expect-error 195 + userPluginsConfig[plugin.name] = plugin; 196 + } 197 + 198 + return plugin.name; 199 + }) 200 + .filter(Boolean); 201 + 202 + return getPluginsConfig({ 203 + pluginConfigs: { 204 + ...userPluginsConfig, 205 + ...defaultPluginConfigs, 206 + }, 207 + userPlugins, 208 + userPluginsConfig, 209 + }); 210 + }; 211 + 212 + const getWatch = ( 213 + userConfig: Pick<UserConfig, 'watch'> & Pick<Config, 'input'>, 214 + ): Config['watch'] => { 215 + let watch: Config['watch'] = { 216 + enabled: false, 217 + interval: 1_000, 218 + timeout: 60_000, 219 + }; 220 + // we cannot watch spec passed as an object 221 + if (typeof userConfig.input.path !== 'string') { 222 + return watch; 223 + } 224 + if (typeof userConfig.watch === 'boolean') { 225 + watch.enabled = userConfig.watch; 226 + } else if (typeof userConfig.watch === 'number') { 227 + watch.enabled = true; 228 + watch.interval = userConfig.watch; 229 + } else if (userConfig.watch) { 230 + watch = { 231 + ...watch, 232 + ...userConfig.watch, 233 + }; 234 + } 235 + return watch; 236 + }; 237 + 238 + export const initConfigs = async ( 239 + userConfig: UserConfig, 240 + ): Promise<Config[]> => { 241 + let configurationFile: string | undefined = undefined; 242 + if (userConfig.configFile) { 243 + const parts = userConfig.configFile.split('.'); 244 + configurationFile = parts.slice(0, parts.length - 1).join('.'); 245 + } 246 + 247 + const { config: configFromFile } = await loadConfig<UserConfig>({ 248 + configFile: configurationFile, 249 + name: 'openapi-ts', 250 + }); 251 + 252 + const userConfigs: UserConfig[] = Array.isArray(userConfig) 253 + ? userConfig 254 + : Array.isArray(configFromFile) 255 + ? configFromFile.map((config) => ({ 256 + ...config, 257 + ...userConfig, 258 + })) 259 + : [{ ...(configFromFile ?? {}), ...userConfig }]; 260 + 261 + return userConfigs.map((userConfig) => { 262 + const { 263 + base, 264 + configFile = '', 265 + dryRun = false, 266 + experimentalParser = true, 267 + exportCore = true, 268 + name, 269 + request, 270 + useOptions = true, 271 + } = userConfig; 272 + 273 + const logs = getLogs(userConfig); 274 + 275 + if (logs.level === 'debug') { 276 + console.warn('userConfig:', userConfig); 277 + } 278 + 279 + const input = getInput(userConfig); 280 + const output = getOutput(userConfig); 281 + 282 + if (!input.path) { 283 + throw new Error( 284 + '🚫 missing input - which OpenAPI specification should we use to generate your output?', 285 + ); 286 + } 287 + 288 + if (!output.path) { 289 + throw new Error( 290 + '🚫 missing output - where should we generate your output?', 291 + ); 292 + } 293 + 294 + if (!useOptions) { 295 + console.warn( 296 + '❗️ Deprecation warning: useOptions set to false. This setting will be removed in future versions. Please migrate useOptions to true https://heyapi.dev/openapi-ts/migrating.html#v0-27-38', 297 + ); 298 + } 299 + 300 + output.path = path.resolve(process.cwd(), output.path); 301 + 302 + const config = setConfig({ 303 + ...getPlugins(userConfig), 304 + base, 305 + configFile, 306 + dryRun, 307 + experimentalParser, 308 + exportCore: false, 309 + input, 310 + logs, 311 + name, 312 + output, 313 + request, 314 + useOptions, 315 + watch: getWatch({ ...userConfig, input }), 316 + }); 317 + config.exportCore = isLegacyClient(config) ? exportCore : false; 318 + 319 + if (logs.level === 'debug') { 320 + console.warn('config:', config); 321 + } 322 + 323 + return config; 324 + }); 325 + };
+4 -2
packages/openapi-ts/src/plugins/@hey-api/schemas/__tests__/schemas.test.ts
··· 61 61 useOptions: true, 62 62 watch: { 63 63 enabled: false, 64 - interval: 1000, 64 + interval: 1_000, 65 + timeout: 60_000, 65 66 }, 66 67 }); 67 68 ··· 149 150 useOptions: true, 150 151 watch: { 151 152 enabled: false, 152 - interval: 1000, 153 + interval: 1_000, 154 + timeout: 60_000, 153 155 }, 154 156 }); 155 157
+8 -4
packages/openapi-ts/src/plugins/@hey-api/sdk/__tests__/plugin.test.ts
··· 63 63 useOptions: false, 64 64 watch: { 65 65 enabled: false, 66 - interval: 1000, 66 + interval: 1_000, 67 + timeout: 60_000, 67 68 }, 68 69 }); 69 70 ··· 222 223 useOptions: false, 223 224 watch: { 224 225 enabled: false, 225 - interval: 1000, 226 + interval: 1_000, 227 + timeout: 60_000, 226 228 }, 227 229 }); 228 230 ··· 304 306 useOptions: false, 305 307 watch: { 306 308 enabled: false, 307 - interval: 1000, 309 + interval: 1_000, 310 + timeout: 60_000, 308 311 }, 309 312 }); 310 313 ··· 388 391 useOptions: false, 389 392 watch: { 390 393 enabled: false, 391 - interval: 1000, 394 + interval: 1_000, 395 + timeout: 60_000, 392 396 }, 393 397 }); 394 398
+2 -1
packages/openapi-ts/src/plugins/@hey-api/typescript/__tests__/plugin.test.ts
··· 61 61 useOptions: true, 62 62 watch: { 63 63 enabled: false, 64 - interval: 1000, 64 + interval: 1_000, 65 + timeout: 60_000, 65 66 }, 66 67 }); 67 68
+66
packages/openapi-ts/src/processOutput.ts
··· 1 + import { sync } from 'cross-spawn'; 2 + 3 + import type { Config, Formatters, Linters } from './types/config'; 4 + 5 + type OutputProcessor = { 6 + args: (path: string) => ReadonlyArray<string>; 7 + command: string; 8 + name: string; 9 + }; 10 + 11 + /** 12 + * Map of supported formatters 13 + */ 14 + const formatters: Record<Formatters, OutputProcessor> = { 15 + biome: { 16 + args: (path) => ['format', '--write', path], 17 + command: 'biome', 18 + name: 'Biome (Format)', 19 + }, 20 + prettier: { 21 + args: (path) => [ 22 + '--ignore-unknown', 23 + path, 24 + '--write', 25 + '--ignore-path', 26 + './.prettierignore', 27 + ], 28 + command: 'prettier', 29 + name: 'Prettier', 30 + }, 31 + }; 32 + 33 + /** 34 + * Map of supported linters 35 + */ 36 + const linters: Record<Linters, OutputProcessor> = { 37 + biome: { 38 + args: (path) => ['lint', '--apply', path], 39 + command: 'biome', 40 + name: 'Biome (Lint)', 41 + }, 42 + eslint: { 43 + args: (path) => [path, '--fix'], 44 + command: 'eslint', 45 + name: 'ESLint', 46 + }, 47 + oxlint: { 48 + args: (path) => ['--fix', path], 49 + command: 'oxlint', 50 + name: 'oxlint', 51 + }, 52 + }; 53 + 54 + export const processOutput = ({ config }: { config: Config }) => { 55 + if (config.output.format) { 56 + const module = formatters[config.output.format]; 57 + console.log(`✨ Running ${module.name}`); 58 + sync(module.command, module.args(config.output.path)); 59 + } 60 + 61 + if (config.output.lint) { 62 + const module = linters[config.output.lint]; 63 + console.log(`✨ Running ${module.name}`); 64 + sync(module.command, module.args(config.output.path)); 65 + } 66 + };
packages/openapi-ts/src/types/client.ts packages/openapi-ts/src/types/client.d.ts
+10 -3
packages/openapi-ts/src/types/config.ts packages/openapi-ts/src/types/config.d.ts
··· 163 163 */ 164 164 plugins?: ReadonlyArray<UserPlugins['name'] | UserPlugins>; 165 165 /** 166 - * Regenerate the client when the input file changes? 166 + * Regenerate the client when the input file changes? You can alternatively 167 + * pass a numeric value for the interval in ms. 167 168 * 168 169 * @default false 169 170 */ ··· 178 179 */ 179 180 enabled?: boolean; 180 181 /** 181 - * How often should we attempt to detect the input file change? 182 + * How often should we attempt to detect the input file change? (in ms) 182 183 * 183 184 * @default 1000 184 185 */ 185 186 interval?: number; 187 + /** 188 + * How long will we wait before the request times out? 189 + * 190 + * @default 60_000 191 + */ 192 + timeout?: number; 186 193 }; 187 194 /** 188 195 * @deprecated ··· 258 265 ExtractArrayOfObjects<ReadonlyArray<ClientPlugins>, { name: string }>, 259 266 'name' 260 267 >; 261 - watch: Extract<UserConfig['watch'], object>; 268 + watch: Extract<Required<UserConfig['watch']>, object>; 262 269 };
+18
packages/openapi-ts/src/types/types.d.ts
··· 3 3 export namespace LegacyIR { 4 4 export type LegacyOperation = Operation; 5 5 } 6 + 7 + export interface WatchValues { 8 + /** 9 + * Headers to be sent with each HEAD and/or GET request. This effectively 10 + * serves as a mechanism resolver because setting certain headers will opt 11 + * into comparing the specifications using that method. 12 + */ 13 + headers: Headers; 14 + /** 15 + * Can we send a HEAD request instead of fetching the whole specification? 16 + * This value will be set after the first successful fetch. 17 + */ 18 + isHeadMethodSupported?: boolean; 19 + /** 20 + * String content of the last successfully fetched specification. 21 + */ 22 + lastValue?: string; 23 + }
packages/openapi-ts/src/types/utils.ts packages/openapi-ts/src/types/utils.d.ts
+4 -2
packages/openapi-ts/src/utils/__tests__/handlebars.test.ts
··· 58 58 useOptions: false, 59 59 watch: { 60 60 enabled: false, 61 - interval: 1000, 61 + interval: 1_000, 62 + timeout: 60_000, 62 63 }, 63 64 }); 64 65 registerHandlebarHelpers(); ··· 123 124 useOptions: false, 124 125 watch: { 125 126 enabled: false, 126 - interval: 1000, 127 + interval: 1_000, 128 + timeout: 60_000, 127 129 }, 128 130 }); 129 131 const templates = registerHandlebarTemplates();
+2 -1
packages/openapi-ts/src/utils/__tests__/parse.test.ts
··· 38 38 useOptions: false, 39 39 watch: { 40 40 enabled: false, 41 - interval: 1000, 41 + interval: 1_000, 42 + timeout: 60_000, 42 43 }, 43 44 }; 44 45
+7 -5
packages/openapi-ts/test/openapi-ts.config.ts
··· 6 6 // exclude: '^#/components/schemas/ModelWithCircularReference$', 7 7 // include: 8 8 // '^(#/components/schemas/import|#/paths/api/v{api-version}/simple/options)$', 9 - path: './packages/openapi-ts/test/spec/3.1.x/full.json', 9 + // path: './packages/openapi-ts/test/spec/3.1.x/full.json', 10 + path: 'http://localhost:8000/openapi.json', 10 11 // path: './test/spec/v3-transforms.json', 11 12 // path: 'https://mongodb-mms-prod-build-server.s3.amazonaws.com/openapi/2caffd88277a4e27c95dcefc7e3b6a63a3b03297-v2-2023-11-15.json', 12 13 // path: 'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml', ··· 81 82 }, 82 83 ], 83 84 // useOptions: false, 84 - // watch: { 85 - // enabled: true, 86 - // interval: 1_000, 87 - // }, 85 + watch: { 86 + enabled: true, 87 + interval: 1_000, 88 + timeout: 60_000, 89 + }, 88 90 });
+349 -39
pnpm-lock.yaml
··· 309 309 version: link:../../packages/client-nuxt 310 310 nuxt: 311 311 specifier: 3.14.1592 312 - version: 3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.37.0)(typescript@5.6.1-rc)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 312 + version: 3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.37.0)(typescript@5.5.3)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 313 313 vue: 314 314 specifier: 3.5.13 315 - version: 3.5.13(typescript@5.6.1-rc) 315 + version: 3.5.13(typescript@5.5.3) 316 316 vue-router: 317 317 specifier: 4.5.0 318 - version: 4.5.0(vue@3.5.13(typescript@5.6.1-rc)) 318 + version: 4.5.0(vue@3.5.13(typescript@5.5.3)) 319 319 zod: 320 320 specifier: 3.23.8 321 321 version: 3.23.8 ··· 444 444 devDependencies: 445 445 '@angular-devkit/build-angular': 446 446 specifier: ^19.0.6 447 - version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 447 + version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 448 448 '@angular/cli': 449 449 specifier: ^19.0.6 450 450 version: 19.0.6(@types/node@22.10.5)(chokidar@4.0.3) ··· 758 758 packages/openapi-ts: 759 759 dependencies: 760 760 '@hey-api/json-schema-ref-parser': 761 - specifier: 1.0.1 762 - version: 1.0.1 761 + specifier: 1.0.2 762 + version: 1.0.2 763 763 c12: 764 764 specifier: 2.0.1 765 765 version: 2.0.1(magicast@0.3.5) ··· 772 772 devDependencies: 773 773 '@angular-devkit/build-angular': 774 774 specifier: 19.0.6 775 - version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 775 + version: 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 776 776 '@angular/animations': 777 777 specifier: 19.0.5 778 778 version: 19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)) ··· 859 859 version: 3.3.2 860 860 nuxt: 861 861 specifier: 3.14.1592 862 - version: 3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.37.0)(typescript@5.5.3)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 862 + version: 3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 863 863 prettier: 864 864 specifier: 3.4.2 865 865 version: 3.4.2 ··· 2342 2342 '@fontsource/fira-mono@5.0.0': 2343 2343 resolution: {integrity: sha512-IsinH/oLYJyv/sQv7SbKmjoAXZsSjm6Q1Tz5GBBXCXi3Jg9MzXmKvWm9bSLC8lFI6CDsi8GkH/DAgZ98t8bhTQ==} 2344 2344 2345 - '@hey-api/json-schema-ref-parser@1.0.1': 2346 - resolution: {integrity: sha512-dBt0A7op9kf4BcK++x6HBYDmvCvnJUZEGe5QytghPFHnMXPyKwDKomwL/v5e9ERk6E0e1GzL/e/y6pWUso9zrQ==} 2345 + '@hey-api/json-schema-ref-parser@1.0.2': 2346 + resolution: {integrity: sha512-F6LSkttZcT/XiX3ydeDqTY3uRN3BLJMwyMTk4kg/ichZlKUp3+3Odv0WokSmXGSoZGTW/N66FROMYAm5NPdJlA==} 2347 2347 engines: {node: '>= 16'} 2348 2348 2349 2349 '@humanfs/core@0.19.1': ··· 11234 11234 transitivePeerDependencies: 11235 11235 - chokidar 11236 11236 11237 - '@angular-devkit/build-angular@19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 11237 + '@angular-devkit/build-angular@19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(@types/node@22.10.5)(chokidar@4.0.3)(karma@6.4.4)(tailwindcss@3.4.9(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.5.3)))(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 11238 11238 dependencies: 11239 11239 '@ampproject/remapping': 2.3.0 11240 11240 '@angular-devkit/architect': 0.1900.6(chokidar@4.0.3) ··· 11253 11253 '@babel/runtime': 7.26.0 11254 11254 '@discoveryjs/json-ext': 0.6.3 11255 11255 '@ngtools/webpack': 19.0.6(@angular/compiler-cli@19.0.5(@angular/compiler@19.0.5(@angular/core@19.0.5(rxjs@7.8.1)(zone.js@0.15.0)))(typescript@5.5.3))(typescript@5.5.3)(webpack@5.96.1(esbuild@0.24.0)) 11256 - '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 11256 + '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 11257 11257 ansi-colors: 4.1.3 11258 11258 autoprefixer: 10.4.20(postcss@8.4.49) 11259 11259 babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1(esbuild@0.24.0)) ··· 12886 12886 12887 12887 '@fontsource/fira-mono@5.0.0': {} 12888 12888 12889 - '@hey-api/json-schema-ref-parser@1.0.1': 12889 + '@hey-api/json-schema-ref-parser@1.0.2': 12890 12890 dependencies: 12891 12891 '@jsdevtools/ono': 7.1.3 12892 12892 '@types/json-schema': 7.0.15 ··· 13439 13439 13440 13440 '@nuxt/devalue@2.0.2': {} 13441 13441 13442 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))': 13442 + '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 13443 13443 dependencies: 13444 13444 '@nuxt/kit': 3.15.4(magicast@0.3.5)(rollup@4.31.0) 13445 13445 '@nuxt/schema': 3.15.4 13446 13446 execa: 7.2.0 13447 - vite: 6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 13447 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 13448 13448 transitivePeerDependencies: 13449 13449 - magicast 13450 13450 - rollup ··· 13474 13474 rc9: 2.1.2 13475 13475 semver: 7.7.0 13476 13476 13477 - '@nuxt/devtools@1.7.0(rollup@4.31.0)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3))': 13477 + '@nuxt/devtools@1.7.0(rollup@4.31.0)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3))': 13478 + dependencies: 13479 + '@antfu/utils': 0.7.10 13480 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 13481 + '@nuxt/devtools-wizard': 1.7.0 13482 + '@nuxt/kit': 3.15.4(magicast@0.3.5)(rollup@4.31.0) 13483 + '@vue/devtools-core': 7.6.8(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3)) 13484 + '@vue/devtools-kit': 7.6.8 13485 + birpc: 0.2.19 13486 + consola: 3.4.0 13487 + cronstrue: 2.53.0 13488 + destr: 2.0.3 13489 + error-stack-parser-es: 0.1.5 13490 + execa: 7.2.0 13491 + fast-npm-meta: 0.2.2 13492 + flatted: 3.3.2 13493 + get-port-please: 3.1.2 13494 + hookable: 5.5.3 13495 + image-meta: 0.2.1 13496 + is-installed-globally: 1.0.0 13497 + launch-editor: 2.9.1 13498 + local-pkg: 0.5.1 13499 + magicast: 0.3.5 13500 + nypm: 0.4.1 13501 + ohash: 1.1.4 13502 + pathe: 1.1.2 13503 + perfect-debounce: 1.0.0 13504 + pkg-types: 1.3.1 13505 + rc9: 2.1.2 13506 + scule: 1.3.0 13507 + semver: 7.7.0 13508 + simple-git: 3.27.0 13509 + sirv: 3.0.0 13510 + tinyglobby: 0.2.10 13511 + unimport: 3.14.6(rollup@4.31.0) 13512 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 13513 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 13514 + vite-plugin-vue-inspector: 5.3.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 13515 + which: 3.0.1 13516 + ws: 8.18.0 13517 + transitivePeerDependencies: 13518 + - bufferutil 13519 + - rollup 13520 + - supports-color 13521 + - utf-8-validate 13522 + - vue 13523 + 13524 + '@nuxt/devtools@1.7.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3))': 13478 13525 dependencies: 13479 13526 '@antfu/utils': 0.7.10 13480 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 13527 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 13481 13528 '@nuxt/devtools-wizard': 1.7.0 13482 13529 '@nuxt/kit': 3.15.4(magicast@0.3.5)(rollup@4.31.0) 13483 - '@vue/devtools-core': 7.6.8(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 13530 + '@vue/devtools-core': 7.6.8(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 13484 13531 '@vue/devtools-kit': 7.6.8 13485 13532 birpc: 0.2.19 13486 13533 consola: 3.4.0 ··· 13509 13556 sirv: 3.0.0 13510 13557 tinyglobby: 0.2.10 13511 13558 unimport: 3.14.6(rollup@4.31.0) 13512 - vite: 6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 13513 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 13514 - vite-plugin-vue-inspector: 5.3.1(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 13559 + vite: 6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 13560 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 13561 + vite-plugin-vue-inspector: 5.3.1(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 13515 13562 which: 3.0.1 13516 13563 ws: 8.18.0 13517 13564 transitivePeerDependencies: ··· 13708 13755 - rollup 13709 13756 - supports-color 13710 13757 13758 + '@nuxt/vite-builder@3.14.1592(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3))': 13759 + dependencies: 13760 + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.31.0) 13761 + '@rollup/plugin-replace': 6.0.2(rollup@4.31.0) 13762 + '@vitejs/plugin-vue': 5.2.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3)) 13763 + '@vitejs/plugin-vue-jsx': 4.1.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3)) 13764 + autoprefixer: 10.4.20(postcss@8.5.1) 13765 + clear: 0.1.0 13766 + consola: 3.4.0 13767 + cssnano: 7.0.6(postcss@8.5.1) 13768 + defu: 6.1.4 13769 + esbuild: 0.24.2 13770 + escape-string-regexp: 5.0.0 13771 + estree-walker: 3.0.3 13772 + externality: 1.0.2 13773 + get-port-please: 3.1.2 13774 + h3: 1.14.0 13775 + jiti: 2.4.2 13776 + knitwork: 1.2.0 13777 + magic-string: 0.30.17 13778 + mlly: 1.7.4 13779 + ohash: 1.1.4 13780 + pathe: 1.1.2 13781 + perfect-debounce: 1.0.0 13782 + pkg-types: 1.3.1 13783 + postcss: 8.5.1 13784 + rollup-plugin-visualizer: 5.14.0(rollup@4.31.0) 13785 + std-env: 3.8.0 13786 + strip-literal: 2.1.1 13787 + ufo: 1.5.4 13788 + unenv: 1.10.0 13789 + unplugin: 1.16.1 13790 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 13791 + vite-node: 2.1.8(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 13792 + vite-plugin-checker: 0.8.0(eslint@9.17.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 13793 + vue: 3.5.13(typescript@5.5.3) 13794 + vue-bundle-renderer: 2.1.1 13795 + transitivePeerDependencies: 13796 + - '@biomejs/biome' 13797 + - '@types/node' 13798 + - eslint 13799 + - less 13800 + - lightningcss 13801 + - magicast 13802 + - meow 13803 + - optionator 13804 + - rolldown 13805 + - rollup 13806 + - sass 13807 + - sass-embedded 13808 + - stylelint 13809 + - stylus 13810 + - sugarss 13811 + - supports-color 13812 + - terser 13813 + - typescript 13814 + - vls 13815 + - vti 13816 + - vue-tsc 13817 + 13711 13818 '@nuxt/vite-builder@3.14.1592(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.37.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3))': 13712 13819 dependencies: 13713 13820 '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.31.0) ··· 15494 15601 dependencies: 15495 15602 vite: 5.4.11(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 15496 15603 15604 + '@vitejs/plugin-basic-ssl@1.1.0(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))': 15605 + dependencies: 15606 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 15607 + 15497 15608 '@vitejs/plugin-basic-ssl@1.1.0(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))': 15498 15609 dependencies: 15499 15610 vite: 6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) ··· 15506 15617 '@types/babel__core': 7.20.5 15507 15618 react-refresh: 0.14.2 15508 15619 vite: 6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 15620 + transitivePeerDependencies: 15621 + - supports-color 15622 + 15623 + '@vitejs/plugin-vue-jsx@4.1.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3))': 15624 + dependencies: 15625 + '@babel/core': 7.26.7 15626 + '@babel/plugin-transform-typescript': 7.26.7(@babel/core@7.26.7) 15627 + '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.26.7) 15628 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 15629 + vue: 3.5.13(typescript@5.5.3) 15509 15630 transitivePeerDependencies: 15510 15631 - supports-color 15511 15632 ··· 15538 15659 vue: 3.5.13(typescript@5.5.3) 15539 15660 transitivePeerDependencies: 15540 15661 - supports-color 15662 + 15663 + '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3))': 15664 + dependencies: 15665 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 15666 + vue: 3.5.13(typescript@5.5.3) 15541 15667 15542 15668 '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.37.0))(vue@3.5.13(typescript@5.5.3))': 15543 15669 dependencies: ··· 15707 15833 dependencies: 15708 15834 '@vue/devtools-kit': 7.7.1 15709 15835 15710 - '@vue/devtools-core@7.6.8(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3))': 15836 + '@vue/devtools-core@7.6.8(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3))': 15711 15837 dependencies: 15712 15838 '@vue/devtools-kit': 7.7.1 15713 15839 '@vue/devtools-shared': 7.7.1 15714 15840 mitt: 3.0.1 15715 15841 nanoid: 5.0.9 15716 15842 pathe: 1.1.2 15717 - vite-hot-client: 0.2.4(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 15843 + vite-hot-client: 0.2.4(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)) 15844 + vue: 3.5.13(typescript@5.5.3) 15845 + transitivePeerDependencies: 15846 + - vite 15847 + 15848 + '@vue/devtools-core@7.6.8(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3))': 15849 + dependencies: 15850 + '@vue/devtools-kit': 7.7.1 15851 + '@vue/devtools-shared': 7.7.1 15852 + mitt: 3.0.1 15853 + nanoid: 5.0.9 15854 + pathe: 1.1.2 15855 + vite-hot-client: 0.2.4(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)) 15718 15856 vue: 3.5.13(typescript@5.5.3) 15719 15857 transitivePeerDependencies: 15720 15858 - vite ··· 17465 17603 '@typescript-eslint/parser': 7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3) 17466 17604 eslint: 9.17.0(jiti@2.4.2) 17467 17605 eslint-import-resolver-node: 0.3.9 17468 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 17469 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 17606 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) 17607 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) 17470 17608 eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.4.2)) 17471 17609 eslint-plugin-react: 7.37.4(eslint@9.17.0(jiti@2.4.2)) 17472 17610 eslint-plugin-react-hooks: 5.1.0(eslint@9.17.0(jiti@2.4.2)) ··· 17489 17627 transitivePeerDependencies: 17490 17628 - supports-color 17491 17629 17492 - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): 17630 + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)): 17493 17631 dependencies: 17494 17632 '@nolyfill/is-core-module': 1.0.39 17495 17633 debug: 4.4.0(supports-color@9.4.0) ··· 17501 17639 is-glob: 4.0.3 17502 17640 stable-hash: 0.0.4 17503 17641 optionalDependencies: 17504 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 17642 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) 17505 17643 transitivePeerDependencies: 17506 17644 - supports-color 17507 17645 17508 - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): 17646 + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)): 17509 17647 dependencies: 17510 17648 debug: 3.2.7 17511 17649 optionalDependencies: 17512 17650 '@typescript-eslint/parser': 7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3) 17513 17651 eslint: 9.17.0(jiti@2.4.2) 17514 17652 eslint-import-resolver-node: 0.3.9 17515 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 17653 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@2.4.2)) 17516 17654 transitivePeerDependencies: 17517 17655 - supports-color 17518 17656 17519 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)): 17657 + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)): 17520 17658 dependencies: 17521 17659 '@rtsao/scc': 1.1.0 17522 17660 array-includes: 3.1.8 ··· 17527 17665 doctrine: 2.1.0 17528 17666 eslint: 9.17.0(jiti@2.4.2) 17529 17667 eslint-import-resolver-node: 0.3.9 17530 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2)) 17668 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.15.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@2.4.2)) 17531 17669 hasown: 2.0.2 17532 17670 is-core-module: 2.16.1 17533 17671 is-glob: 4.0.3 ··· 19958 20096 19959 20097 nuxi@3.21.1: {} 19960 20098 19961 - nuxt@3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.37.0)(typescript@5.5.3)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)): 20099 + nuxt@3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 19962 20100 dependencies: 19963 20101 '@nuxt/devalue': 2.0.2 19964 - '@nuxt/devtools': 1.7.0(rollup@4.31.0)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 20102 + '@nuxt/devtools': 1.7.0(rollup@4.31.0)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0))(vue@3.5.13(typescript@5.5.3)) 20103 + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.31.0) 20104 + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.31.0) 20105 + '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.31.0) 20106 + '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.5)(eslint@9.17.0(jiti@2.4.2))(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.36.0)(typescript@5.5.3)(vue@3.5.13(typescript@5.5.3)) 20107 + '@unhead/dom': 1.11.18 20108 + '@unhead/shared': 1.11.18 20109 + '@unhead/ssr': 1.11.18 20110 + '@unhead/vue': 1.11.18(vue@3.5.13(typescript@5.5.3)) 20111 + '@vue/shared': 3.5.13 20112 + acorn: 8.14.0 20113 + c12: 2.0.1(magicast@0.3.5) 20114 + chokidar: 4.0.3 20115 + compatx: 0.1.8 20116 + consola: 3.4.0 20117 + cookie-es: 1.2.2 20118 + defu: 6.1.4 20119 + destr: 2.0.3 20120 + devalue: 5.1.1 20121 + errx: 0.1.0 20122 + esbuild: 0.24.2 20123 + escape-string-regexp: 5.0.0 20124 + estree-walker: 3.0.3 20125 + globby: 14.0.2 20126 + h3: 1.14.0 20127 + hookable: 5.5.3 20128 + ignore: 6.0.2 20129 + impound: 0.2.0(rollup@4.31.0) 20130 + jiti: 2.4.2 20131 + klona: 2.0.6 20132 + knitwork: 1.2.0 20133 + magic-string: 0.30.17 20134 + mlly: 1.7.4 20135 + nanotar: 0.1.1 20136 + nitropack: 2.10.4(encoding@0.1.13)(typescript@5.5.3) 20137 + nuxi: 3.21.1 20138 + nypm: 0.3.12 20139 + ofetch: 1.4.1 20140 + ohash: 1.1.4 20141 + pathe: 1.1.2 20142 + perfect-debounce: 1.0.0 20143 + pkg-types: 1.3.1 20144 + radix3: 1.1.2 20145 + scule: 1.3.0 20146 + semver: 7.7.0 20147 + std-env: 3.8.0 20148 + strip-literal: 2.1.1 20149 + tinyglobby: 0.2.10 20150 + ufo: 1.5.4 20151 + ultrahtml: 1.5.3 20152 + uncrypto: 0.1.3 20153 + unctx: 2.4.1 20154 + unenv: 1.10.0 20155 + unhead: 1.11.18 20156 + unimport: 3.14.6(rollup@4.31.0) 20157 + unplugin: 1.16.1 20158 + unplugin-vue-router: 0.10.9(rollup@4.31.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.3)))(vue@3.5.13(typescript@5.5.3)) 20159 + unstorage: 1.14.4(db0@0.2.3)(ioredis@5.4.2) 20160 + untyped: 1.5.2 20161 + vue: 3.5.13(typescript@5.5.3) 20162 + vue-bundle-renderer: 2.1.1 20163 + vue-devtools-stub: 0.1.0 20164 + vue-router: 4.5.0(vue@3.5.13(typescript@5.5.3)) 20165 + optionalDependencies: 20166 + '@parcel/watcher': 2.5.1 20167 + '@types/node': 22.10.5 20168 + transitivePeerDependencies: 20169 + - '@azure/app-configuration' 20170 + - '@azure/cosmos' 20171 + - '@azure/data-tables' 20172 + - '@azure/identity' 20173 + - '@azure/keyvault-secrets' 20174 + - '@azure/storage-blob' 20175 + - '@biomejs/biome' 20176 + - '@capacitor/preferences' 20177 + - '@deno/kv' 20178 + - '@electric-sql/pglite' 20179 + - '@libsql/client' 20180 + - '@netlify/blobs' 20181 + - '@planetscale/database' 20182 + - '@upstash/redis' 20183 + - '@vercel/blob' 20184 + - '@vercel/kv' 20185 + - aws4fetch 20186 + - better-sqlite3 20187 + - bufferutil 20188 + - db0 20189 + - drizzle-orm 20190 + - encoding 20191 + - eslint 20192 + - idb-keyval 20193 + - ioredis 20194 + - less 20195 + - lightningcss 20196 + - magicast 20197 + - meow 20198 + - mysql2 20199 + - optionator 20200 + - rolldown 20201 + - rollup 20202 + - sass 20203 + - sass-embedded 20204 + - sqlite3 20205 + - stylelint 20206 + - stylus 20207 + - sugarss 20208 + - supports-color 20209 + - terser 20210 + - typescript 20211 + - uploadthing 20212 + - utf-8-validate 20213 + - vite 20214 + - vls 20215 + - vti 20216 + - vue-tsc 20217 + - xml2js 20218 + 20219 + nuxt@3.14.1592(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.2.3)(encoding@0.1.13)(eslint@9.17.0(jiti@2.4.2))(ioredis@5.4.2)(less@4.2.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.31.0)(sass@1.80.7)(terser@5.37.0)(typescript@5.5.3)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)): 20220 + dependencies: 20221 + '@nuxt/devalue': 2.0.2 20222 + '@nuxt/devtools': 1.7.0(rollup@4.31.0)(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.5.3)) 19965 20223 '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.31.0) 19966 20224 '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.31.0) 19967 20225 '@nuxt/telemetry': 2.6.4(magicast@0.3.5)(rollup@4.31.0) ··· 22762 23020 '@types/unist': 3.0.3 22763 23021 vfile-message: 4.0.2 22764 23022 22765 - vite-hot-client@0.2.4(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)): 23023 + vite-hot-client@0.2.4(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 22766 23024 dependencies: 22767 - vite: 6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 23025 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 22768 23026 22769 23027 vite-hot-client@0.2.4(vite@6.0.9(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)): 22770 23028 dependencies: ··· 22788 23046 - supports-color 22789 23047 - terser 22790 23048 23049 + vite-node@2.1.8(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0): 23050 + dependencies: 23051 + cac: 6.7.14 23052 + debug: 4.4.0(supports-color@9.4.0) 23053 + es-module-lexer: 1.6.0 23054 + pathe: 1.1.2 23055 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 23056 + transitivePeerDependencies: 23057 + - '@types/node' 23058 + - less 23059 + - lightningcss 23060 + - sass 23061 + - sass-embedded 23062 + - stylus 23063 + - sugarss 23064 + - supports-color 23065 + - terser 23066 + 22791 23067 vite-node@2.1.8(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.37.0): 22792 23068 dependencies: 22793 23069 cac: 6.7.14 ··· 22806 23082 - supports-color 22807 23083 - terser 22808 23084 23085 + vite-plugin-checker@0.8.0(eslint@9.17.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 23086 + dependencies: 23087 + '@babel/code-frame': 7.26.2 23088 + ansi-escapes: 4.3.2 23089 + chalk: 4.1.2 23090 + chokidar: 3.6.0 23091 + commander: 8.3.0 23092 + fast-glob: 3.3.3 23093 + fs-extra: 11.3.0 23094 + npm-run-path: 4.0.1 23095 + strip-ansi: 6.0.1 23096 + tiny-invariant: 1.3.3 23097 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 23098 + vscode-languageclient: 7.0.0 23099 + vscode-languageserver: 7.0.0 23100 + vscode-languageserver-textdocument: 1.0.12 23101 + vscode-uri: 3.0.8 23102 + optionalDependencies: 23103 + eslint: 9.17.0(jiti@2.4.2) 23104 + optionator: 0.9.4 23105 + typescript: 5.5.3 23106 + 22809 23107 vite-plugin-checker@0.8.0(eslint@9.17.0(jiti@2.4.2))(optionator@0.9.4)(typescript@5.5.3)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)): 22810 23108 dependencies: 22811 23109 '@babel/code-frame': 7.26.2 ··· 22850 23148 optionator: 0.9.4 22851 23149 typescript: 5.6.1-rc 22852 23150 22853 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)): 23151 + vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5)(rollup@4.31.0))(rollup@4.31.0)(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 22854 23152 dependencies: 22855 23153 '@antfu/utils': 0.7.10 22856 23154 '@rollup/pluginutils': 5.1.4(rollup@4.31.0) ··· 22861 23159 perfect-debounce: 1.0.0 22862 23160 picocolors: 1.1.1 22863 23161 sirv: 3.0.0 22864 - vite: 6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 23162 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 22865 23163 optionalDependencies: 22866 23164 '@nuxt/kit': 3.15.4(magicast@0.3.5)(rollup@4.31.0) 22867 23165 transitivePeerDependencies: ··· 22902 23200 - supports-color 22903 23201 - vue 22904 23202 22905 - vite-plugin-vue-inspector@5.3.1(vite@6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0)): 23203 + vite-plugin-vue-inspector@5.3.1(vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0)): 22906 23204 dependencies: 22907 23205 '@babel/core': 7.26.7 22908 23206 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.7) ··· 22913 23211 '@vue/compiler-dom': 3.5.13 22914 23212 kolorist: 1.8.0 22915 23213 magic-string: 0.30.17 22916 - vite: 6.0.11(@types/node@22.10.5)(jiti@2.4.2)(less@4.2.0)(sass@1.80.7)(terser@5.37.0)(yaml@2.7.0) 23214 + vite: 5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0) 22917 23215 transitivePeerDependencies: 22918 23216 - supports-color 22919 23217 ··· 22936 23234 dependencies: 22937 23235 esbuild: 0.21.5 22938 23236 postcss: 8.4.49 23237 + rollup: 4.31.0 23238 + optionalDependencies: 23239 + '@types/node': 22.10.5 23240 + fsevents: 2.3.3 23241 + less: 4.2.0 23242 + sass: 1.80.7 23243 + terser: 5.36.0 23244 + 23245 + vite@5.4.14(@types/node@22.10.5)(less@4.2.0)(sass@1.80.7)(terser@5.36.0): 23246 + dependencies: 23247 + esbuild: 0.21.5 23248 + postcss: 8.5.1 22939 23249 rollup: 4.31.0 22940 23250 optionalDependencies: 22941 23251 '@types/node': 22.10.5