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.

chore: port function functionality

Lubos 71025a37 24db8ca7

+747 -606
+3 -3
dev/openapi-ts.config.ts
··· 240 240 { 241 241 // baseUrl: false, 242 242 // exportFromIndex: true, 243 - // name: '@hey-api/client-angular', 243 + name: '@hey-api/client-nuxt', 244 244 // runtimeConfigPath: path.resolve(__dirname, 'hey-api.ts'), 245 245 // runtimeConfigPath: './src/hey-api.ts', 246 246 // strictBaseUrl: true, ··· 274 274 // }, 275 275 }, 276 276 { 277 - asClass: true, 277 + // asClass: true, 278 278 // auth: false, 279 279 // classNameBuilder: '{{name}}', 280 280 classNameBuilder: '{{name}}Service', ··· 285 285 // fields.unwrap('path') 286 286 // }, 287 287 // include... 288 - instance: 'Root', 288 + // instance: 'Root', 289 289 methodNameBuilder: '{{name}}Methods', 290 290 name: '@hey-api/sdk', 291 291 // operationId: false,
+2
dev/package.json
··· 19 19 "@tanstack/svelte-query": "5.73.3", 20 20 "@tanstack/vue-query": "5.73.3", 21 21 "arktype": "2.1.29", 22 + "nuxt": "3.14.1592", 22 23 "swr": "2.3.8", 23 24 "typescript": "5.9.3", 24 25 "valibot": "1.2.0", 26 + "vue": "3.5.25", 25 27 "zod": "4.1.12" 26 28 } 27 29 }
-334
packages/openapi-ts/src/plugins/@hey-api/sdk/model/class.ts
··· 1 - import type { SymbolMeta } from '@hey-api/codegen-core'; 2 - 3 - import type { IR } from '~/ir/types'; 4 - import { getClientPlugin } from '~/plugins/@hey-api/client-core/utils'; 5 - import { 6 - createOperationComment, 7 - isOperationOptionsRequired, 8 - } from '~/plugins/shared/utils/operation'; 9 - import { $ } from '~/ts-dsl'; 10 - import { toCase } from '~/utils/to-case'; 11 - 12 - import { createClientClass, createRegistryClass } from '../shared/class'; 13 - import { nuxtTypeComposable, nuxtTypeDefault } from '../shared/constants'; 14 - import { 15 - operationClassName, 16 - operationMethodName, 17 - operationParameters, 18 - operationStatements, 19 - } from '../shared/operation'; 20 - import type { HeyApiSdkPlugin } from '../types'; 21 - 22 - /** 23 - * Represents a class in the SDK hierarchy. 24 - * 25 - * Classes can be nested (via children) and contain operations (methods). 26 - */ 27 - export class SdkClassModel { 28 - /** Nested classes within this class. */ 29 - children: Map<string, SdkClassModel> = new Map(); 30 - /** The name of this class (e.g., "Users", "Accounts"). */ 31 - name: string; 32 - /** Operations that will become methods in this class. */ 33 - operations: Array<IR.OperationObject> = []; 34 - /** Parent class in the hierarchy. Undefined if this is the root class. */ 35 - parent?: SdkClassModel; 36 - 37 - constructor(name: string, parent?: SdkClassModel) { 38 - this.name = name; 39 - this.parent = parent; 40 - } 41 - 42 - get isRoot(): boolean { 43 - return !this.parent; 44 - } 45 - 46 - /** 47 - * Adds an operation to this class. 48 - * 49 - * The operation will be converted to a method during code generation. 50 - */ 51 - addOperation(operation: IR.OperationObject): void { 52 - this.operations.push(operation); 53 - } 54 - 55 - /** 56 - * Gets or creates a child class. 57 - * 58 - * If the child doesn't exist, it's created automatically. 59 - * 60 - * @param name - The name of the child class 61 - * @returns The child class instance 62 - */ 63 - child(name: string): SdkClassModel { 64 - if (!this.children.has(name)) { 65 - this.children.set(name, new SdkClassModel(name, this)); 66 - } 67 - return this.children.get(name)!; 68 - } 69 - 70 - /** 71 - * Gets the full path of this class in the hierarchy. 72 - * 73 - * @returns An array of class names from the root to this class 74 - */ 75 - getPath(): ReadonlyArray<string> { 76 - const path: Array<string> = []; 77 - // eslint-disable-next-line @typescript-eslint/no-this-alias 78 - let cursor: SdkClassModel | undefined = this; 79 - while (cursor) { 80 - path.unshift(cursor.name); 81 - cursor = cursor.parent; 82 - } 83 - return path; 84 - } 85 - 86 - /** 87 - * Inserts an operation into the class tree. 88 - * 89 - * Parses the operation ID and creates the class hierarchy. 90 - */ 91 - insert( 92 - operation: IR.OperationObject, 93 - plugin: HeyApiSdkPlugin['Instance'], 94 - ): void { 95 - const classSegments = 96 - plugin.config.classStructure === 'auto' && operation.operationId 97 - ? operation.operationId.split(/[./]/).slice(0, -1) 98 - : []; 99 - 100 - // eslint-disable-next-line @typescript-eslint/no-this-alias 101 - let cursor: SdkClassModel = this; 102 - for (const segment of classSegments) { 103 - cursor = cursor.child(segment); 104 - } 105 - 106 - cursor.addOperation(operation); 107 - } 108 - 109 - /** 110 - * Converts this class group to a class node. 111 - */ 112 - toNode(plugin: HeyApiSdkPlugin['Instance']): { 113 - dependencies: Array<ReturnType<typeof $.class>>; 114 - node: ReturnType<typeof $.class>; 115 - } { 116 - const dependencies: Array<ReturnType<typeof $.class>> = []; 117 - 118 - const client = getClientPlugin(plugin.context.config); 119 - const isAngularClient = client.name === '@hey-api/client-angular'; 120 - const isNuxtClient = client.name === '@hey-api/client-nuxt'; 121 - 122 - const symbolClass = plugin.symbol( 123 - operationClassName({ plugin, value: this.name }), 124 - { 125 - meta: { 126 - category: 'utility', 127 - resource: 'class', 128 - resourceId: this.getPath().join('.'), 129 - tool: 'sdk', 130 - }, 131 - }, 132 - ); 133 - const metaClient: SymbolMeta = { 134 - category: 'utility', 135 - resource: 'class', 136 - resourceId: 'HeyApiClient', 137 - tool: 'sdk', 138 - }; 139 - const node = $.class(symbolClass) 140 - .export() 141 - .$if(plugin.config.instance, (c) => 142 - c.extends(plugin.referenceSymbol(metaClient)), 143 - ) 144 - .$if(isAngularClient && this.isRoot, (c) => 145 - c.decorator( 146 - plugin.referenceSymbol({ 147 - category: 'external', 148 - resource: '@angular/core.Injectable', 149 - }), 150 - $.object().prop('providedIn', $.literal('root')), 151 - ), 152 - ); 153 - 154 - if (this.isRoot && plugin.config.instance) { 155 - const symbolClient = plugin.symbol('HeyApiClient', { meta: metaClient }); 156 - const clientNode = createClientClass({ plugin, symbol: symbolClient }); 157 - dependencies.push(clientNode); 158 - const symbolRegistry = plugin.symbol('HeyApiRegistry', { 159 - meta: { 160 - category: 'utility', 161 - resource: 'class', 162 - resourceId: 'HeyApiRegistry', 163 - tool: 'sdk', 164 - }, 165 - }); 166 - const registryNode = createRegistryClass({ 167 - plugin, 168 - sdkSymbol: symbolClass, 169 - symbol: symbolRegistry, 170 - }); 171 - dependencies.push(registryNode); 172 - node.field('__registry', (f) => 173 - f 174 - .public() 175 - .static() 176 - .readonly() 177 - .assign($.new(symbolRegistry).generic(symbolClass)), 178 - ); 179 - node.newline(); 180 - 181 - const symClient = plugin.getSymbol({ category: 'client' }); 182 - const isClientRequired = !plugin.config.client || !symClient; 183 - const symbolClientType = plugin.referenceSymbol({ 184 - category: 'external', 185 - resource: 'client.Client', 186 - }); 187 - node.init((i) => 188 - i 189 - .param('args', (p) => 190 - p.required(isClientRequired).type( 191 - $.type 192 - .object() 193 - .prop('client', (p) => 194 - p.required(isClientRequired).type(symbolClientType), 195 - ) 196 - .prop('key', (p) => p.optional().type('string')), 197 - ), 198 - ) 199 - .do( 200 - $('super').call('args'), 201 - $(symbolClass) 202 - .attr('__registry') 203 - .attr('set') 204 - .call('this', $('args').attr('key').required(isClientRequired)), 205 - ), 206 - ); 207 - } 208 - 209 - this.operations.forEach((operation, index) => { 210 - if (index > 0 || node.hasBody) node.newline(); 211 - const symbolMethod = plugin.symbol( 212 - operationMethodName({ 213 - operation, 214 - plugin, 215 - value: 216 - plugin.config.classStructure === 'auto' && operation.operationId 217 - ? toCase(operation.operationId.split(/[./]/).pop()!, 'camelCase') 218 - : operation.id, 219 - }), 220 - ); 221 - const isRequiredOptions = isOperationOptionsRequired({ 222 - context: plugin.context, 223 - operation, 224 - }); 225 - const opParameters = operationParameters({ 226 - isRequiredOptions, 227 - operation, 228 - plugin, 229 - }); 230 - const statements = operationStatements({ 231 - isRequiredOptions, 232 - opParameters, 233 - operation, 234 - plugin, 235 - }); 236 - node.method(symbolMethod, (m) => 237 - m 238 - .$if(createOperationComment(operation), (m, v) => m.doc(v)) 239 - .public() 240 - .static(!isAngularClient && !plugin.config.instance) 241 - .$if( 242 - isNuxtClient, 243 - (m) => 244 - m 245 - .generic(nuxtTypeComposable, (t) => 246 - t 247 - .extends( 248 - plugin.referenceSymbol({ 249 - category: 'external', 250 - resource: 'client.Composable', 251 - }), 252 - ) 253 - .default($.type.literal('$fetch')), 254 - ) 255 - .generic(nuxtTypeDefault, (t) => 256 - t.$if( 257 - plugin.querySymbol({ 258 - category: 'type', 259 - resource: 'operation', 260 - resourceId: operation.id, 261 - role: 'response', 262 - }), 263 - (t, s) => t.extends(s).default(s), 264 - ), 265 - ), 266 - (m) => 267 - m.generic('ThrowOnError', (t) => 268 - t 269 - .extends('boolean') 270 - .default( 271 - ('throwOnError' in client.config 272 - ? client.config.throwOnError 273 - : false) ?? false, 274 - ), 275 - ), 276 - ) 277 - .params(...opParameters.parameters) 278 - .do(...statements), 279 - ); 280 - }); 281 - 282 - for (const child of this.children.values()) { 283 - if (node.hasBody) node.newline(); 284 - const refChild = plugin.referenceSymbol({ 285 - category: 'utility', 286 - resource: 'class', 287 - resourceId: child.getPath().join('.'), 288 - tool: 'sdk', 289 - }); 290 - const memberName = toCase(refChild.name, 'camelCase'); 291 - if (plugin.config.instance) { 292 - const privateName = plugin.symbol(`_${memberName}`); 293 - const getterName = plugin.symbol(memberName); 294 - node.field(privateName, (f) => f.private().optional().type(refChild)); 295 - node.do( 296 - $.getter(getterName, (g) => 297 - g.returns(refChild).do( 298 - $('this') 299 - .attr(privateName) 300 - .nullishAssign( 301 - $.new(refChild).args( 302 - $.object().prop('client', $('this').attr('client')), 303 - ), 304 - ) 305 - .return(), 306 - ), 307 - ), 308 - ); 309 - } else { 310 - node.do( 311 - plugin.isSymbolRegistered(refChild.id) 312 - ? $.field(memberName, (f) => f.static().assign($(refChild))) 313 - : $.getter(memberName, (g) => 314 - g.public().static().do($.return(refChild)), 315 - ), 316 - ); 317 - } 318 - } 319 - 320 - return { dependencies, node }; 321 - } 322 - 323 - /** 324 - * Recursively walks the tree depth-first. 325 - * 326 - * Yields this node, then all descendants. 327 - */ 328 - *walk(): Generator<SdkClassModel> { 329 - for (const child of this.children.values()) { 330 - yield* child.walk(); 331 - } 332 - yield this; 333 - } 334 - }
+425
packages/openapi-ts/src/plugins/@hey-api/sdk/model/resource.ts
··· 1 + import type { Symbol } from '@hey-api/codegen-core'; 2 + 3 + import type { IR } from '~/ir/types'; 4 + import { getClientPlugin } from '~/plugins/@hey-api/client-core/utils'; 5 + import { 6 + createOperationComment, 7 + isOperationOptionsRequired, 8 + } from '~/plugins/shared/utils/operation'; 9 + import { $ } from '~/ts-dsl'; 10 + import { toCase } from '~/utils/to-case'; 11 + 12 + import { createClientClass, createRegistryClass } from '../shared/class'; 13 + import { nuxtTypeComposable, nuxtTypeDefault } from '../shared/constants'; 14 + import { 15 + operationClassName, 16 + operationMethodName, 17 + operationParameters, 18 + operationStatements, 19 + } from '../shared/operation'; 20 + import type { HeyApiSdkPlugin } from '../types'; 21 + 22 + export type Event = { 23 + operation: IR.OperationObject; 24 + path: ReadonlyArray<string | number>; 25 + tags: ReadonlyArray<string> | undefined; 26 + }; 27 + 28 + /** 29 + * Represents a resource layer in the SDK hierarchy. 30 + * 31 + * Resources can be nested (via children) and contain operations (methods). 32 + */ 33 + export class SdkResourceModel { 34 + /** Nested resources within this resource. */ 35 + children: Map<string, SdkResourceModel> = new Map(); 36 + /** The name of this resource (e.g., "Users", "Accounts"). */ 37 + name: string; 38 + /** Operations that will become methods in this resource. */ 39 + operations: Array<Event> = []; 40 + /** Parent resource in the hierarchy. Undefined if this is the root resource. */ 41 + parent?: SdkResourceModel; 42 + 43 + constructor(name: string, parent?: SdkResourceModel) { 44 + this.name = name; 45 + this.parent = parent; 46 + } 47 + 48 + get isRoot(): boolean { 49 + return !this.parent; 50 + } 51 + 52 + /** 53 + * Gets or creates a child resource. 54 + * 55 + * If the child doesn't exist, it's created automatically. 56 + * 57 + * @param name - The name of the child resource 58 + * @returns The child resource instance 59 + */ 60 + child(name: string): SdkResourceModel { 61 + if (!this.children.has(name)) { 62 + this.children.set(name, new SdkResourceModel(name, this)); 63 + } 64 + return this.children.get(name)!; 65 + } 66 + 67 + /** 68 + * Gets the full path of this resource in the hierarchy. 69 + * 70 + * @returns An array of resource names from the root to this resource 71 + */ 72 + getPath(): ReadonlyArray<string> { 73 + const path: Array<string> = []; 74 + // eslint-disable-next-line @typescript-eslint/no-this-alias 75 + let cursor: SdkResourceModel | undefined = this; 76 + while (cursor) { 77 + path.unshift(cursor.name); 78 + cursor = cursor.parent; 79 + } 80 + return path; 81 + } 82 + 83 + /** 84 + * Inserts an operation event into the resource tree. 85 + * 86 + * Parses the operation ID and creates the resource hierarchy. 87 + */ 88 + insert(event: Event, plugin: HeyApiSdkPlugin['Instance']): void { 89 + const { operation } = event; 90 + const classSegments = 91 + this.name && 92 + plugin.config.classStructure === 'auto' && 93 + operation.operationId 94 + ? operation.operationId.split(/[./]/).slice(0, -1) 95 + : []; 96 + 97 + // eslint-disable-next-line @typescript-eslint/no-this-alias 98 + let cursor: SdkResourceModel = this; 99 + for (const segment of classSegments) { 100 + cursor = cursor.child(segment); 101 + } 102 + 103 + cursor.operations.push(event); 104 + } 105 + 106 + /** 107 + * Converts this class group to a class node. 108 + */ 109 + toNode(plugin: HeyApiSdkPlugin['Instance']): { 110 + dependencies: Array<ReturnType<typeof $.class>>; 111 + nodes: ReadonlyArray<ReturnType<typeof $.class | typeof $.var>>; 112 + } { 113 + const dependencies: Array<ReturnType<typeof $.class>> = []; 114 + const nodes: Array<ReturnType<typeof $.class | typeof $.var>> = []; 115 + 116 + const client = getClientPlugin(plugin.context.config); 117 + const isAngularClient = client.name === '@hey-api/client-angular'; 118 + 119 + if (this.name) { 120 + const { node, symbol: symbolClass } = this.classToNode(plugin); 121 + 122 + if (this.isRoot && plugin.config.instance) { 123 + node.do(...this.rootClassToNode(symbolClass, dependencies, plugin)); 124 + } 125 + 126 + this.operations.forEach((event, index) => { 127 + const { operation } = event; 128 + if (index > 0 || node.hasBody) node.newline(); 129 + node.do( 130 + this.implementFn({ 131 + node: $.method(this.createFnSymbol(plugin, event), (m) => 132 + m 133 + .public() 134 + .static(!isAngularClient && !plugin.config.instance) 135 + .$if(createOperationComment(operation), (m, v) => m.doc(v)), 136 + ), 137 + operation, 138 + plugin, 139 + }), 140 + ); 141 + }); 142 + 143 + for (const child of this.children.values()) { 144 + if (node.hasBody) node.newline(); 145 + node.do(...this.childToNode(child, plugin)); 146 + } 147 + 148 + nodes.push(node); 149 + } else { 150 + this.operations.forEach((event) => { 151 + const { operation } = event; 152 + const node = $.const(this.createFnSymbol(plugin, event)) 153 + .export() 154 + .$if(createOperationComment(operation), (c, v) => c.doc(v)) 155 + .assign( 156 + this.implementFn({ 157 + node: $.func(), 158 + operation, 159 + plugin, 160 + }), 161 + ); 162 + nodes.push(node); 163 + }); 164 + } 165 + 166 + return { dependencies, nodes }; 167 + } 168 + 169 + /** 170 + * Recursively walks the tree depth-first. 171 + * 172 + * Yields this node, then all descendants. 173 + */ 174 + *walk(): Generator<SdkResourceModel> { 175 + for (const child of this.children.values()) { 176 + yield* child.walk(); 177 + } 178 + yield this; 179 + } 180 + 181 + private createFnSymbol( 182 + plugin: HeyApiSdkPlugin['Instance'], 183 + event: Event, 184 + ): Symbol { 185 + const { operation, path, tags } = event; 186 + const extractFromOperationId = 187 + this.name && plugin.config.classStructure === 'auto'; 188 + return plugin.symbol( 189 + operationMethodName({ 190 + operation, 191 + plugin, 192 + value: 193 + extractFromOperationId && operation.operationId 194 + ? toCase(operation.operationId.split(/[./]/).pop()!, 'camelCase') 195 + : operation.id, 196 + }), 197 + { 198 + meta: { 199 + category: 'sdk', 200 + path, 201 + resource: 'operation', 202 + resourceId: operation.id, 203 + tags, 204 + tool: 'sdk', 205 + }, 206 + }, 207 + ); 208 + } 209 + 210 + private childToNode( 211 + resource: SdkResourceModel, 212 + plugin: HeyApiSdkPlugin['Instance'], 213 + ): ReadonlyArray<ReturnType<typeof $.field | typeof $.getter>> { 214 + const refChild = plugin.referenceSymbol({ 215 + category: 'utility', 216 + resource: 'class', 217 + resourceId: resource.getPath().join('.'), 218 + tool: 'sdk', 219 + }); 220 + const memberName = toCase(refChild.name, 'camelCase'); 221 + if (plugin.config.instance) { 222 + const privateName = plugin.symbol(`_${memberName}`); 223 + const getterName = plugin.symbol(memberName); 224 + return [ 225 + $.field(privateName, (f) => f.private().optional().type(refChild)), 226 + $.getter(getterName, (g) => 227 + g.returns(refChild).do( 228 + $('this') 229 + .attr(privateName) 230 + .nullishAssign( 231 + $.new(refChild).args( 232 + $.object().prop('client', $('this').attr('client')), 233 + ), 234 + ) 235 + .return(), 236 + ), 237 + ), 238 + ]; 239 + } 240 + if (plugin.isSymbolRegistered(refChild.id)) { 241 + return [$.field(memberName, (f) => f.static().assign($(refChild)))]; 242 + } 243 + return [ 244 + $.getter(memberName, (g) => g.public().static().do($.return(refChild))), 245 + ]; 246 + } 247 + 248 + private classToNode(plugin: HeyApiSdkPlugin['Instance']): { 249 + node: ReturnType<typeof $.class>; 250 + symbol: Symbol; 251 + } { 252 + const client = getClientPlugin(plugin.context.config); 253 + const isAngularClient = client.name === '@hey-api/client-angular'; 254 + const symbol = plugin.symbol( 255 + operationClassName({ plugin, value: this.name }), 256 + { 257 + meta: { 258 + category: 'utility', 259 + resource: 'class', 260 + resourceId: this.getPath().join('.'), 261 + tool: 'sdk', 262 + }, 263 + }, 264 + ); 265 + const node = $.class(symbol) 266 + .export() 267 + .$if(plugin.config.instance, (c) => 268 + c.extends( 269 + plugin.referenceSymbol({ 270 + category: 'utility', 271 + resource: 'class', 272 + resourceId: 'HeyApiClient', 273 + tool: 'sdk', 274 + }), 275 + ), 276 + ) 277 + .$if(isAngularClient && this.isRoot, (c) => 278 + c.decorator( 279 + plugin.referenceSymbol({ 280 + category: 'external', 281 + resource: '@angular/core.Injectable', 282 + }), 283 + $.object().prop('providedIn', $.literal('root')), 284 + ), 285 + ); 286 + return { node, symbol }; 287 + } 288 + 289 + private implementFn< 290 + T extends ReturnType<typeof $.func | typeof $.method>, 291 + >(args: { 292 + node: T; 293 + operation: IR.OperationObject; 294 + plugin: HeyApiSdkPlugin['Instance']; 295 + }): T { 296 + const { node, operation, plugin } = args; 297 + const client = getClientPlugin(plugin.context.config); 298 + const isNuxtClient = client.name === '@hey-api/client-nuxt'; 299 + const isRequiredOptions = isOperationOptionsRequired({ 300 + context: plugin.context, 301 + operation, 302 + }); 303 + const opParameters = operationParameters({ 304 + isRequiredOptions, 305 + operation, 306 + plugin, 307 + }); 308 + const statements = operationStatements({ 309 + isRequiredOptions, 310 + opParameters, 311 + operation, 312 + plugin, 313 + }); 314 + return node 315 + .$if( 316 + isNuxtClient, 317 + (m) => 318 + m 319 + .generic(nuxtTypeComposable, (t) => 320 + t 321 + .extends( 322 + plugin.referenceSymbol({ 323 + category: 'external', 324 + resource: 'client.Composable', 325 + }), 326 + ) 327 + .default($.type.literal('$fetch')), 328 + ) 329 + .generic(nuxtTypeDefault, (t) => 330 + t.$if( 331 + plugin.querySymbol({ 332 + category: 'type', 333 + resource: 'operation', 334 + resourceId: operation.id, 335 + role: 'response', 336 + }), 337 + (t, s) => t.extends(s).default(s), 338 + (t) => t.default('undefined'), 339 + ), 340 + ), 341 + (m) => 342 + m.generic('ThrowOnError', (t) => 343 + t 344 + .extends('boolean') 345 + .default( 346 + ('throwOnError' in client.config 347 + ? client.config.throwOnError 348 + : false) ?? false, 349 + ), 350 + ), 351 + ) 352 + .params(...opParameters.parameters) 353 + .do(...statements) as T; 354 + } 355 + 356 + private rootClassToNode( 357 + symbol: Symbol, 358 + dependencies: Array<ReturnType<typeof $.class>>, 359 + plugin: HeyApiSdkPlugin['Instance'], 360 + ): ReadonlyArray< 361 + ReturnType<typeof $.field | typeof $.init | typeof $.newline> 362 + > { 363 + const symbolClient = plugin.symbol('HeyApiClient', { 364 + meta: { 365 + category: 'utility', 366 + resource: 'class', 367 + resourceId: 'HeyApiClient', 368 + tool: 'sdk', 369 + }, 370 + }); 371 + dependencies.push(createClientClass({ plugin, symbol: symbolClient })); 372 + const symbolRegistry = plugin.symbol('HeyApiRegistry', { 373 + meta: { 374 + category: 'utility', 375 + resource: 'class', 376 + resourceId: 'HeyApiRegistry', 377 + tool: 'sdk', 378 + }, 379 + }); 380 + dependencies.push( 381 + createRegistryClass({ 382 + plugin, 383 + sdkSymbol: symbol, 384 + symbol: symbolRegistry, 385 + }), 386 + ); 387 + const isClientRequired = 388 + !plugin.config.client || !plugin.getSymbol({ category: 'client' }); 389 + return [ 390 + $.field('__registry', (f) => 391 + f 392 + .public() 393 + .static() 394 + .readonly() 395 + .assign($.new(symbolRegistry).generic(symbol)), 396 + ), 397 + $.newline(), 398 + $.init((i) => 399 + i 400 + .param('args', (p) => 401 + p.required(isClientRequired).type( 402 + $.type 403 + .object() 404 + .prop('client', (p) => 405 + p.required(isClientRequired).type( 406 + plugin.referenceSymbol({ 407 + category: 'external', 408 + resource: 'client.Client', 409 + }), 410 + ), 411 + ) 412 + .prop('key', (p) => p.optional().type('string')), 413 + ), 414 + ) 415 + .do( 416 + $('super').call('args'), 417 + $(symbol) 418 + .attr('__registry') 419 + .attr('set') 420 + .call('this', $('args').attr('key').required(isClientRequired)), 421 + ), 422 + ), 423 + ]; 424 + } 425 + }
+35 -23
packages/openapi-ts/src/plugins/@hey-api/sdk/model/structure.ts
··· 1 - import type { IR } from '~/ir/types'; 2 - 3 1 import type { HeyApiSdkPlugin } from '../types'; 4 - import { SdkClassModel } from './class'; 2 + import type { Event } from './resource'; 3 + import { SdkResourceModel } from './resource'; 5 4 6 5 export class SdkStructureModel { 6 + /** If true, generates a flat SDK without resource hierarchy. */ 7 + private _flat: boolean; 7 8 /** Name of the SDK. If empty, we fallback to operation tags. */ 8 9 private _name: string; 9 10 10 - /** Root classes mapped by their names. */ 11 - roots: Map<string, SdkClassModel> = new Map(); 11 + /** Root resources mapped by their names. */ 12 + roots: Map<string, SdkResourceModel> = new Map(); 12 13 13 - constructor(name: string) { 14 + constructor( 15 + name: string, 16 + options?: { 17 + /** If true, generates a flat SDK without resource hierarchy. */ 18 + flat?: boolean; 19 + }, 20 + ) { 21 + this._flat = options?.flat ?? false; 14 22 this._name = name; 15 23 } 16 24 17 25 /** 18 - * Inserts an operation into the structure. 26 + * Inserts an operation event into the structure. 19 27 * 20 28 * Parses the operation ID and organizes it into classes based on tags. 21 29 */ 22 - insert( 23 - operation: IR.OperationObject, 24 - plugin: HeyApiSdkPlugin['Instance'], 25 - ): void { 26 - const roots = this._name ? [this._name] : (operation.tags ?? ['default']); 30 + insert(event: Event, plugin: HeyApiSdkPlugin['Instance']): void { 31 + const { operation } = event; 32 + const roots = this._name 33 + ? [this._name] 34 + : this._flat 35 + ? [''] 36 + : operation.tags && operation.tags.length > 0 37 + ? operation.tags 38 + : ['default']; 27 39 28 40 for (const name of roots) { 29 - const model = this.root(name); 30 - model.insert(operation, plugin); 41 + const resource = this.root(name); 42 + resource.insert(event, plugin); 31 43 } 32 44 } 33 45 34 46 /** 35 - * Gets or creates a root class by name. 47 + * Gets or creates a root resource by name. 36 48 * 37 49 * If the root doesn't exist, it's created automatically. 38 50 * 39 - * @param name - The name of the root class 40 - * @returns The root class instance 51 + * @param name - The name of the root resource 52 + * @returns The root resource instance 41 53 */ 42 - root(name: string): SdkClassModel { 54 + root(name: string): SdkResourceModel { 43 55 if (!this.roots.has(name)) { 44 - this.roots.set(name, new SdkClassModel(name)); 56 + this.roots.set(name, new SdkResourceModel(name)); 45 57 } 46 58 return this.roots.get(name)!; 47 59 } ··· 49 61 /** 50 62 * Recursively walks the structure. 51 63 * 52 - * Yields all classes in the structure. 64 + * Yields all resources in the structure. 53 65 */ 54 - *walk(): Generator<SdkClassModel> { 55 - for (const model of this.roots.values()) { 56 - yield* model.walk(); 66 + *walk(): Generator<SdkResourceModel> { 67 + for (const resource of this.roots.values()) { 68 + yield* resource.walk(); 57 69 } 58 70 } 59 71 }
-38
packages/openapi-ts/src/plugins/@hey-api/sdk/shared/class.ts
··· 2 2 3 3 import { $ } from '~/ts-dsl'; 4 4 5 - import { SdkStructureModel } from '../model/structure'; 6 5 import type { HeyApiSdkPlugin } from '../types'; 7 6 8 7 export const registryName = '__registry'; ··· 109 108 ), 110 109 ); 111 110 }; 112 - 113 - export const generateClassSdk = ({ 114 - plugin, 115 - }: { 116 - plugin: HeyApiSdkPlugin['Instance']; 117 - }): void => { 118 - const structure = new SdkStructureModel(plugin.config.instance); 119 - 120 - plugin.forEach( 121 - 'operation', 122 - ({ operation }) => { 123 - structure.insert(operation, plugin); 124 - }, 125 - { order: 'declarations' }, 126 - ); 127 - 128 - const allDependencies: Array<ReturnType<typeof $.class>> = []; 129 - const allNodes: Array<ReturnType<typeof $.class>> = []; 130 - 131 - for (const model of structure.walk()) { 132 - const { dependencies, node } = model.toNode(plugin); 133 - allDependencies.push(...dependencies); 134 - allNodes.push(node); 135 - } 136 - 137 - const uniqueDependencies = new Map<number, ReturnType<typeof $.class>>(); 138 - for (const dep of allDependencies) { 139 - if (dep.symbol) uniqueDependencies.set(dep.symbol.id, dep); 140 - } 141 - for (const dep of uniqueDependencies.values()) { 142 - plugin.node(dep); 143 - } 144 - 145 - for (const node of allNodes) { 146 - plugin.node(node); 147 - } 148 - };
-107
packages/openapi-ts/src/plugins/@hey-api/sdk/shared/functions.ts
··· 1 - import { getClientPlugin } from '~/plugins/@hey-api/client-core/utils'; 2 - import { 3 - createOperationComment, 4 - isOperationOptionsRequired, 5 - } from '~/plugins/shared/utils/operation'; 6 - import { $ } from '~/ts-dsl'; 7 - 8 - import type { HeyApiSdkPlugin } from '../types'; 9 - import { nuxtTypeComposable, nuxtTypeDefault } from './constants'; 10 - import { 11 - operationMethodName, 12 - operationParameters, 13 - operationStatements, 14 - } from './operation'; 15 - 16 - export const generateFlatSdk = ({ 17 - plugin, 18 - }: { 19 - plugin: HeyApiSdkPlugin['Instance']; 20 - }): void => { 21 - const client = getClientPlugin(plugin.context.config); 22 - const isNuxtClient = client.name === '@hey-api/client-nuxt'; 23 - 24 - plugin.forEach( 25 - 'operation', 26 - (event) => { 27 - const { operation } = event; 28 - const isRequiredOptions = isOperationOptionsRequired({ 29 - context: plugin.context, 30 - operation, 31 - }); 32 - const symbolResponse = isNuxtClient 33 - ? plugin.querySymbol({ 34 - category: 'type', 35 - resource: 'operation', 36 - resourceId: operation.id, 37 - role: 'response', 38 - }) 39 - : undefined; 40 - const opParameters = operationParameters({ 41 - isRequiredOptions, 42 - operation, 43 - plugin, 44 - }); 45 - const statements = operationStatements({ 46 - isRequiredOptions, 47 - opParameters, 48 - operation, 49 - plugin, 50 - }); 51 - const symbol = plugin.symbol(operationMethodName({ operation, plugin }), { 52 - meta: { 53 - category: 'sdk', 54 - path: event._path, 55 - resource: 'operation', 56 - resourceId: operation.id, 57 - tags: event.tags, 58 - tool: 'sdk', 59 - }, 60 - }); 61 - const node = $.const(symbol) 62 - .export() 63 - .$if(createOperationComment(operation), (c, v) => c.doc(v)) 64 - .assign( 65 - $.func() 66 - .params(...opParameters.parameters) 67 - .$if( 68 - isNuxtClient, 69 - (f) => 70 - f 71 - .generic(nuxtTypeComposable, (g) => 72 - g 73 - .extends( 74 - plugin.referenceSymbol({ 75 - category: 'external', 76 - resource: 'client.Composable', 77 - }), 78 - ) 79 - .default($.type.literal('$fetch')), 80 - ) 81 - .generic(nuxtTypeDefault, (g) => 82 - g.$if( 83 - symbolResponse, 84 - (t, s) => t.extends(s).default(s), 85 - (t) => t.default('undefined'), 86 - ), 87 - ), 88 - (f) => 89 - f.generic('ThrowOnError', (g) => 90 - g 91 - .extends('boolean') 92 - .default( 93 - ('throwOnError' in client.config 94 - ? client.config.throwOnError 95 - : false) ?? false, 96 - ), 97 - ), 98 - ) 99 - .do(...statements), 100 - ); 101 - plugin.node(node); 102 - }, 103 - { 104 - order: 'declarations', 105 - }, 106 - ); 107 - };
+45 -16
packages/openapi-ts/src/plugins/@hey-api/sdk/v1/plugin.ts
··· 1 1 import { clientFolderAbsolutePath } from '~/generate/client'; 2 2 import { getClientPlugin } from '~/plugins/@hey-api/client-core/utils'; 3 + import type { $ } from '~/ts-dsl'; 3 4 4 - import { generateClassSdk } from '../shared/class'; 5 - import { generateFlatSdk } from '../shared/functions'; 5 + import { SdkStructureModel } from '../model/structure'; 6 6 import { createTypeOptions } from '../shared/typeOptions'; 7 7 import type { HeyApiSdkPlugin } from '../types'; 8 8 ··· 12 12 const isAngularClient = client.name === '@hey-api/client-angular'; 13 13 const isNuxtClient = client.name === '@hey-api/client-nuxt'; 14 14 15 - plugin.registerSymbol({ 15 + plugin.symbol('formDataBodySerializer', { 16 16 external: clientModule, 17 17 meta: { 18 18 category: 'external', 19 19 resource: 'client.formDataBodySerializer', 20 20 tool: client.name, 21 21 }, 22 - name: 'formDataBodySerializer', 23 22 }); 24 - plugin.registerSymbol({ 23 + plugin.symbol('urlSearchParamsBodySerializer', { 25 24 external: clientModule, 26 25 meta: { 27 26 category: 'external', 28 27 resource: 'client.urlSearchParamsBodySerializer', 29 28 tool: client.name, 30 29 }, 31 - name: 'urlSearchParamsBodySerializer', 32 30 }); 33 - plugin.registerSymbol({ 31 + plugin.symbol('buildClientParams', { 34 32 external: clientModule, 35 33 meta: { 36 34 category: 'external', 37 35 resource: 'client.buildClientParams', 38 36 tool: client.name, 39 37 }, 40 - name: 'buildClientParams', 41 38 }); 42 39 if (isNuxtClient) { 43 - plugin.registerSymbol({ 40 + plugin.symbol('Composable', { 44 41 external: clientModule, 45 42 kind: 'type', 46 43 meta: { ··· 48 45 resource: 'client.Composable', 49 46 tool: client.name, 50 47 }, 51 - name: 'Composable', 52 48 }); 53 49 } 54 50 if (isAngularClient && plugin.config.asClass) { 55 - plugin.registerSymbol({ 51 + plugin.symbol('Injectable', { 56 52 external: '@angular/core', 57 53 meta: { 58 54 category: 'external', 59 55 resource: '@angular/core.Injectable', 60 56 }, 61 - name: 'Injectable', 62 57 }); 63 58 } 64 59 65 60 createTypeOptions({ plugin }); 66 61 67 - if (plugin.config.asClass) { 68 - generateClassSdk({ plugin }); 69 - } else { 70 - generateFlatSdk({ plugin }); 62 + const structure = plugin.config.asClass 63 + ? new SdkStructureModel(plugin.config.instance) 64 + : new SdkStructureModel('', { flat: true }); 65 + 66 + plugin.forEach( 67 + 'operation', 68 + (event) => { 69 + structure.insert( 70 + { 71 + operation: event.operation, 72 + path: event._path, 73 + tags: event.tags, 74 + }, 75 + plugin, 76 + ); 77 + }, 78 + { order: 'declarations' }, 79 + ); 80 + 81 + const allDependencies: Array<ReturnType<typeof $.class>> = []; 82 + const allNodes: Array<ReturnType<typeof $.class | typeof $.var>> = []; 83 + 84 + for (const model of structure.walk()) { 85 + const { dependencies, nodes } = model.toNode(plugin); 86 + allDependencies.push(...dependencies); 87 + allNodes.push(...nodes); 88 + } 89 + 90 + const uniqueDependencies = new Map<number, ReturnType<typeof $.class>>(); 91 + for (const dep of allDependencies) { 92 + if (dep.symbol) uniqueDependencies.set(dep.symbol.id, dep); 93 + } 94 + for (const dep of uniqueDependencies.values()) { 95 + plugin.node(dep); 96 + } 97 + 98 + for (const node of allNodes) { 99 + plugin.node(node); 71 100 } 72 101 };
+237 -85
pnpm-lock.yaml
··· 139 139 arktype: 140 140 specifier: 2.1.29 141 141 version: 2.1.29 142 + nuxt: 143 + specifier: 3.14.1592 144 + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) 142 145 swr: 143 146 specifier: 2.3.8 144 147 version: 2.3.8(react@19.0.0) ··· 148 151 valibot: 149 152 specifier: 1.2.0 150 153 version: 1.2.0(typescript@5.9.3) 154 + vue: 155 + specifier: 3.5.25 156 + version: 3.5.25(typescript@5.9.3) 151 157 zod: 152 158 specifier: 4.1.12 153 159 version: 4.1.12 ··· 1385 1391 version: 1.14.2 1386 1392 nuxt: 1387 1393 specifier: 3.14.1592 1388 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)) 1394 + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3) 1389 1395 ofetch: 1390 1396 specifier: 1.5.1 1391 1397 version: 1.5.1 ··· 2800 2806 resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} 2801 2807 engines: {node: '>=6.9.0'} 2802 2808 2803 - '@babel/types@7.28.4': 2804 - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} 2805 - engines: {node: '>=6.9.0'} 2806 - 2807 2809 '@babel/types@7.28.5': 2808 2810 resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 2809 2811 engines: {node: '>=6.9.0'} ··· 7212 7214 '@vue/shared@3.5.13': 7213 7215 resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} 7214 7216 7215 - '@vue/shared@3.5.21': 7216 - resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} 7217 - 7218 7217 '@vue/shared@3.5.24': 7219 7218 resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==} 7220 7219 ··· 10556 10555 magic-string@0.30.18: 10557 10556 resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} 10558 10557 10559 - magic-string@0.30.19: 10560 - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} 10561 - 10562 10558 magic-string@0.30.21: 10563 10559 resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 10564 10560 ··· 14313 14309 whatwg-encoding@3.1.1: 14314 14310 resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 14315 14311 engines: {node: '>=18'} 14316 - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation 14317 14312 14318 14313 whatwg-mimetype@4.0.0: 14319 14314 resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} ··· 14584 14579 dependencies: 14585 14580 '@ampproject/remapping': 2.3.0 14586 14581 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 14587 - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) 14582 + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0)) 14588 14583 '@angular-devkit/core': 19.2.0(chokidar@4.0.3) 14589 14584 '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.2) 14590 14585 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) ··· 14635 14630 tslib: 2.8.1 14636 14631 typescript: 5.8.3 14637 14632 webpack: 5.98.0(esbuild@0.25.0) 14638 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14639 - webpack-dev-server: 5.2.0(webpack@5.98.0) 14633 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14634 + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 14640 14635 webpack-merge: 6.0.1 14641 14636 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) 14642 14637 optionalDependencies: ··· 14672 14667 dependencies: 14673 14668 '@ampproject/remapping': 2.3.0 14674 14669 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 14675 - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) 14670 + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0)) 14676 14671 '@angular-devkit/core': 19.2.0(chokidar@4.0.3) 14677 14672 '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.2) 14678 14673 '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) ··· 14723 14718 tslib: 2.8.1 14724 14719 typescript: 5.8.3 14725 14720 webpack: 5.98.0(esbuild@0.25.0) 14726 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14727 - webpack-dev-server: 5.2.0(webpack@5.98.0) 14721 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14722 + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 14728 14723 webpack-merge: 6.0.1 14729 14724 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) 14730 14725 optionalDependencies: ··· 14811 14806 tslib: 2.8.1 14812 14807 typescript: 5.8.3 14813 14808 webpack: 5.98.0(esbuild@0.25.4) 14814 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14809 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14815 14810 webpack-dev-server: 5.2.2(webpack@5.98.0) 14816 14811 webpack-merge: 6.0.1 14817 14812 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) ··· 14899 14894 tslib: 2.8.1 14900 14895 typescript: 5.9.3 14901 14896 webpack: 5.98.0(esbuild@0.25.4) 14902 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) 14897 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 14903 14898 webpack-dev-server: 5.2.2(webpack@5.98.0) 14904 14899 webpack-merge: 6.0.1 14905 14900 webpack-subresource-integrity: 5.1.0(webpack@5.98.0) ··· 14931 14926 - webpack-cli 14932 14927 - yaml 14933 14928 14934 - '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0))': 14929 + '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)))(webpack@5.98.0(esbuild@0.25.0))': 14935 14930 dependencies: 14936 14931 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) 14937 14932 rxjs: 7.8.1 14938 14933 webpack: 5.98.0(esbuild@0.25.0) 14939 - webpack-dev-server: 5.2.0(webpack@5.98.0) 14934 + webpack-dev-server: 5.2.0(webpack@5.98.0(esbuild@0.25.0)) 14940 14935 transitivePeerDependencies: 14941 14936 - chokidar 14942 14937 ··· 16922 16917 '@babel/helper-string-parser': 7.27.1 16923 16918 '@babel/helper-validator-identifier': 7.27.1 16924 16919 16925 - '@babel/types@7.28.4': 16926 - dependencies: 16927 - '@babel/helper-string-parser': 7.27.1 16928 - '@babel/helper-validator-identifier': 7.27.1 16929 - 16930 16920 '@babel/types@7.28.5': 16931 16921 dependencies: 16932 16922 '@babel/helper-string-parser': 7.27.1 ··· 18283 18273 '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': 18284 18274 dependencies: 18285 18275 consola: 3.4.2 18286 - detect-libc: 2.0.4 18276 + detect-libc: 2.1.2 18287 18277 https-proxy-agent: 7.0.6 18288 18278 node-fetch: 2.7.0(encoding@0.1.13) 18289 18279 nopt: 8.1.0 ··· 18841 18831 - utf-8-validate 18842 18832 - vue 18843 18833 18834 + '@nuxt/devtools@1.7.0(rollup@4.54.0)(vue@3.5.25(typescript@5.9.3))': 18835 + dependencies: 18836 + '@antfu/utils': 0.7.10 18837 + '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) 18838 + '@nuxt/devtools-wizard': 1.7.0 18839 + '@nuxt/kit': 3.15.4(magicast@0.3.5) 18840 + '@vue/devtools-core': 7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) 18841 + '@vue/devtools-kit': 7.6.8 18842 + birpc: 0.2.19 18843 + consola: 3.4.2 18844 + cronstrue: 2.59.0 18845 + destr: 2.0.5 18846 + error-stack-parser-es: 0.1.5 18847 + execa: 7.2.0 18848 + fast-npm-meta: 0.2.2 18849 + flatted: 3.3.3 18850 + get-port-please: 3.2.0 18851 + hookable: 5.5.3 18852 + image-meta: 0.2.1 18853 + is-installed-globally: 1.0.0 18854 + launch-editor: 2.11.1 18855 + local-pkg: 0.5.1 18856 + magicast: 0.3.5 18857 + nypm: 0.4.1 18858 + ohash: 1.1.6 18859 + pathe: 1.1.2 18860 + perfect-debounce: 1.0.0 18861 + pkg-types: 1.3.1 18862 + rc9: 2.1.2 18863 + scule: 1.3.0 18864 + semver: 7.7.3 18865 + simple-git: 3.28.0 18866 + sirv: 3.0.2 18867 + tinyglobby: 0.2.15 18868 + unimport: 3.14.6(rollup@4.54.0) 18869 + vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.54.0)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) 18870 + vite-plugin-vue-inspector: 5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) 18871 + which: 3.0.1 18872 + ws: 8.18.3 18873 + transitivePeerDependencies: 18874 + - bufferutil 18875 + - rollup 18876 + - supports-color 18877 + - utf-8-validate 18878 + - vue 18879 + 18844 18880 '@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@3.29.5)': 18845 18881 dependencies: 18846 18882 '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@3.29.5) ··· 18853 18889 ignore: 6.0.2 18854 18890 jiti: 2.6.1 18855 18891 klona: 2.0.6 18856 - knitwork: 1.2.0 18892 + knitwork: 1.3.0 18857 18893 mlly: 1.8.0 18858 18894 pathe: 1.1.2 18859 18895 pkg-types: 1.3.1 ··· 18880 18916 ignore: 6.0.2 18881 18917 jiti: 2.6.1 18882 18918 klona: 2.0.6 18883 - knitwork: 1.2.0 18919 + knitwork: 1.3.0 18884 18920 mlly: 1.8.0 18885 18921 pathe: 1.1.2 18886 18922 pkg-types: 1.3.1 ··· 18976 19012 pathe: 1.1.2 18977 19013 pkg-types: 1.3.1 18978 19014 scule: 1.3.0 18979 - std-env: 3.9.0 19015 + std-env: 3.10.0 18980 19016 ufo: 1.6.1 18981 19017 uncrypto: 0.1.3 18982 19018 unimport: 3.14.6(rollup@3.29.5) ··· 18996 19032 pathe: 1.1.2 18997 19033 pkg-types: 1.3.1 18998 19034 scule: 1.3.0 18999 - std-env: 3.9.0 19035 + std-env: 3.10.0 19000 19036 ufo: 1.6.1 19001 19037 uncrypto: 0.1.3 19002 19038 unimport: 3.14.6(rollup@4.54.0) ··· 19026 19062 package-manager-detector: 1.3.0 19027 19063 pathe: 2.0.3 19028 19064 rc9: 2.1.2 19029 - std-env: 3.9.0 19065 + std-env: 3.10.0 19030 19066 transitivePeerDependencies: 19031 19067 - magicast 19032 19068 - supports-color ··· 19084 19120 get-port-please: 3.2.0 19085 19121 h3: 1.15.4 19086 19122 jiti: 2.6.1 19087 - knitwork: 1.2.0 19123 + knitwork: 1.3.0 19088 19124 magic-string: 0.30.21 19089 19125 mlly: 1.8.0 19090 19126 ohash: 1.1.6 ··· 19093 19129 pkg-types: 1.3.1 19094 19130 postcss: 8.5.6 19095 19131 rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.57)(rollup@3.29.5) 19096 - std-env: 3.9.0 19132 + std-env: 3.10.0 19097 19133 strip-literal: 2.1.1 19098 19134 ufo: 1.6.1 19099 19135 unenv: 1.10.0 ··· 19144 19180 get-port-please: 3.2.0 19145 19181 h3: 1.15.4 19146 19182 jiti: 2.6.1 19147 - knitwork: 1.2.0 19183 + knitwork: 1.3.0 19148 19184 magic-string: 0.30.21 19149 19185 mlly: 1.8.0 19150 19186 ohash: 1.1.6 ··· 19153 19189 pkg-types: 1.3.1 19154 19190 postcss: 8.5.6 19155 19191 rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.57)(rollup@4.54.0) 19156 - std-env: 3.9.0 19192 + std-env: 3.10.0 19157 19193 strip-literal: 2.1.1 19158 19194 ufo: 1.6.1 19159 19195 unenv: 1.10.0 ··· 19204 19240 get-port-please: 3.2.0 19205 19241 h3: 1.15.4 19206 19242 jiti: 2.6.1 19207 - knitwork: 1.2.0 19243 + knitwork: 1.3.0 19208 19244 magic-string: 0.30.21 19209 19245 mlly: 1.8.0 19210 19246 ohash: 1.1.6 ··· 19213 19249 pkg-types: 1.3.1 19214 19250 postcss: 8.5.6 19215 19251 rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.57)(rollup@4.54.0) 19216 - std-env: 3.9.0 19252 + std-env: 3.10.0 19217 19253 strip-literal: 2.1.1 19218 19254 ufo: 1.6.1 19219 19255 unenv: 1.10.0 ··· 21743 21779 21744 21780 '@vue/shared@3.5.13': {} 21745 21781 21746 - '@vue/shared@3.5.21': {} 21747 - 21748 21782 '@vue/shared@3.5.24': {} 21749 21783 21750 21784 '@vue/shared@3.5.25': {} ··· 23112 23146 23113 23147 detect-libc@1.0.3: {} 23114 23148 23115 - detect-libc@2.0.4: {} 23149 + detect-libc@2.0.4: 23150 + optional: true 23116 23151 23117 23152 detect-libc@2.1.2: {} 23118 23153 ··· 23678 23713 '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 23679 23714 eslint: 9.17.0(jiti@2.6.1) 23680 23715 eslint-import-resolver-node: 0.3.9 23681 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)) 23682 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) 23716 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23717 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23683 23718 eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@2.6.1)) 23684 23719 eslint-plugin-react: 7.37.5(eslint@9.17.0(jiti@2.6.1)) 23685 23720 eslint-plugin-react-hooks: 5.2.0(eslint@9.17.0(jiti@2.6.1)) ··· 23706 23741 transitivePeerDependencies: 23707 23742 - supports-color 23708 23743 23709 - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)): 23744 + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): 23710 23745 dependencies: 23711 23746 '@nolyfill/is-core-module': 1.0.39 23712 23747 debug: 4.4.3 ··· 23717 23752 tinyglobby: 0.2.15 23718 23753 unrs-resolver: 1.11.1 23719 23754 optionalDependencies: 23720 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) 23755 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23721 23756 transitivePeerDependencies: 23722 23757 - supports-color 23723 23758 23724 - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)): 23759 + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): 23725 23760 dependencies: 23726 23761 debug: 3.2.7 23727 23762 optionalDependencies: 23728 23763 '@typescript-eslint/parser': 8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3) 23729 23764 eslint: 9.17.0(jiti@2.6.1) 23730 23765 eslint-import-resolver-node: 0.3.9 23731 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.17.0(jiti@2.6.1)) 23766 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23732 23767 transitivePeerDependencies: 23733 23768 - supports-color 23734 23769 23735 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)): 23770 + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)): 23736 23771 dependencies: 23737 23772 '@rtsao/scc': 1.1.0 23738 23773 array-includes: 3.1.9 ··· 23743 23778 doctrine: 2.1.0 23744 23779 eslint: 9.17.0(jiti@2.6.1) 23745 23780 eslint-import-resolver-node: 0.3.9 23746 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.17.0(jiti@2.6.1)) 23781 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.29.1(eslint@9.17.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)))(eslint@9.17.0(jiti@2.6.1)) 23747 23782 hasown: 2.0.2 23748 23783 is-core-module: 2.16.1 23749 23784 is-glob: 4.0.3 ··· 24928 24963 mlly: 1.8.0 24929 24964 mocked-exports: 0.1.1 24930 24965 pathe: 2.0.3 24931 - unplugin: 2.3.10 24966 + unplugin: 2.3.11 24932 24967 transitivePeerDependencies: 24933 24968 - rollup 24934 24969 ··· 24938 24973 mlly: 1.8.0 24939 24974 mocked-exports: 0.1.1 24940 24975 pathe: 2.0.3 24941 - unplugin: 2.3.10 24976 + unplugin: 2.3.11 24942 24977 transitivePeerDependencies: 24943 24978 - rollup 24944 24979 ··· 25763 25798 dependencies: 25764 25799 '@jridgewell/sourcemap-codec': 1.5.5 25765 25800 25766 - magic-string@0.30.19: 25767 - dependencies: 25768 - '@jridgewell/sourcemap-codec': 1.5.5 25769 - 25770 25801 magic-string@0.30.21: 25771 25802 dependencies: 25772 25803 '@jridgewell/sourcemap-codec': 1.5.5 ··· 26361 26392 ioredis: 5.7.0 26362 26393 jiti: 2.6.1 26363 26394 klona: 2.0.6 26364 - knitwork: 1.2.0 26395 + knitwork: 1.3.0 26365 26396 listhen: 1.9.0 26366 26397 magic-string: 0.30.21 26367 26398 magicast: 0.3.5 26368 26399 mime: 4.0.7 26369 26400 mlly: 1.8.0 26370 26401 node-fetch-native: 1.6.7 26371 - node-mock-http: 1.0.2 26402 + node-mock-http: 1.0.4 26372 26403 ofetch: 1.5.1 26373 26404 ohash: 2.0.11 26374 26405 pathe: 2.0.3 ··· 26383 26414 serve-placeholder: 2.0.2 26384 26415 serve-static: 2.2.0 26385 26416 source-map: 0.7.6 26386 - std-env: 3.9.0 26417 + std-env: 3.10.0 26387 26418 ufo: 1.6.1 26388 26419 ultrahtml: 1.6.0 26389 26420 uncrypto: 0.1.3 ··· 26592 26623 '@unhead/shared': 1.11.20 26593 26624 '@unhead/ssr': 1.11.20 26594 26625 '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) 26595 - '@vue/shared': 3.5.21 26626 + '@vue/shared': 3.5.25 26596 26627 acorn: 8.14.0 26597 26628 c12: 2.0.1(magicast@0.3.5) 26598 26629 chokidar: 4.0.3 ··· 26613 26644 impound: 0.2.2(rollup@3.29.5) 26614 26645 jiti: 2.6.1 26615 26646 klona: 2.0.6 26616 - knitwork: 1.2.0 26617 - magic-string: 0.30.19 26647 + knitwork: 1.3.0 26648 + magic-string: 0.30.21 26618 26649 mlly: 1.8.0 26619 26650 nanotar: 0.1.1 26620 26651 nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) ··· 26628 26659 radix3: 1.1.2 26629 26660 scule: 1.3.0 26630 26661 semver: 7.7.3 26631 - std-env: 3.9.0 26662 + std-env: 3.10.0 26632 26663 strip-literal: 2.1.1 26633 26664 tinyglobby: 0.2.10 26634 26665 ufo: 1.6.1 ··· 26713 26744 '@unhead/shared': 1.11.20 26714 26745 '@unhead/ssr': 1.11.20 26715 26746 '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) 26716 - '@vue/shared': 3.5.21 26747 + '@vue/shared': 3.5.25 26717 26748 acorn: 8.14.0 26718 26749 c12: 2.0.1(magicast@0.3.5) 26719 26750 chokidar: 4.0.3 ··· 26734 26765 impound: 0.2.2(rollup@4.54.0) 26735 26766 jiti: 2.6.1 26736 26767 klona: 2.0.6 26737 - knitwork: 1.2.0 26738 - magic-string: 0.30.19 26768 + knitwork: 1.3.0 26769 + magic-string: 0.30.21 26739 26770 mlly: 1.8.0 26740 26771 nanotar: 0.1.1 26741 26772 nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) ··· 26749 26780 radix3: 1.1.2 26750 26781 scule: 1.3.0 26751 26782 semver: 7.7.3 26752 - std-env: 3.9.0 26783 + std-env: 3.10.0 26784 + strip-literal: 2.1.1 26785 + tinyglobby: 0.2.10 26786 + ufo: 1.6.1 26787 + ultrahtml: 1.6.0 26788 + uncrypto: 0.1.3 26789 + unctx: 2.4.1 26790 + unenv: 1.10.0 26791 + unhead: 1.11.20 26792 + unimport: 3.14.6(rollup@4.54.0) 26793 + unplugin: 1.16.1 26794 + unplugin-vue-router: 0.10.9(rollup@4.54.0)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) 26795 + unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) 26796 + untyped: 1.5.2 26797 + vue: 3.5.25(typescript@5.9.3) 26798 + vue-bundle-renderer: 2.1.2 26799 + vue-devtools-stub: 0.1.0 26800 + vue-router: 4.5.0(vue@3.5.25(typescript@5.9.3)) 26801 + optionalDependencies: 26802 + '@parcel/watcher': 2.5.1 26803 + '@types/node': 22.10.5 26804 + transitivePeerDependencies: 26805 + - '@azure/app-configuration' 26806 + - '@azure/cosmos' 26807 + - '@azure/data-tables' 26808 + - '@azure/identity' 26809 + - '@azure/keyvault-secrets' 26810 + - '@azure/storage-blob' 26811 + - '@biomejs/biome' 26812 + - '@capacitor/preferences' 26813 + - '@deno/kv' 26814 + - '@electric-sql/pglite' 26815 + - '@libsql/client' 26816 + - '@netlify/blobs' 26817 + - '@planetscale/database' 26818 + - '@upstash/redis' 26819 + - '@vercel/blob' 26820 + - '@vercel/functions' 26821 + - '@vercel/kv' 26822 + - aws4fetch 26823 + - better-sqlite3 26824 + - bufferutil 26825 + - db0 26826 + - drizzle-orm 26827 + - encoding 26828 + - eslint 26829 + - idb-keyval 26830 + - ioredis 26831 + - less 26832 + - lightningcss 26833 + - magicast 26834 + - meow 26835 + - mysql2 26836 + - optionator 26837 + - rolldown 26838 + - rollup 26839 + - sass 26840 + - sass-embedded 26841 + - sqlite3 26842 + - stylelint 26843 + - stylus 26844 + - sugarss 26845 + - supports-color 26846 + - terser 26847 + - typescript 26848 + - uploadthing 26849 + - utf-8-validate 26850 + - vite 26851 + - vls 26852 + - vti 26853 + - vue-tsc 26854 + - xml2js 26855 + 26856 + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3): 26857 + dependencies: 26858 + '@nuxt/devalue': 2.0.2 26859 + '@nuxt/devtools': 1.7.0(rollup@4.54.0)(vue@3.5.25(typescript@5.9.3)) 26860 + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.54.0) 26861 + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.54.0) 26862 + '@nuxt/telemetry': 2.6.6(magicast@0.3.5) 26863 + '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.5)(eslint@9.39.1(jiti@2.6.1))(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.54.0)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) 26864 + '@unhead/dom': 1.11.20 26865 + '@unhead/shared': 1.11.20 26866 + '@unhead/ssr': 1.11.20 26867 + '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) 26868 + '@vue/shared': 3.5.25 26869 + acorn: 8.14.0 26870 + c12: 2.0.1(magicast@0.3.5) 26871 + chokidar: 4.0.3 26872 + compatx: 0.1.8 26873 + consola: 3.4.2 26874 + cookie-es: 1.2.2 26875 + defu: 6.1.4 26876 + destr: 2.0.5 26877 + devalue: 5.3.2 26878 + errx: 0.1.0 26879 + esbuild: 0.24.2 26880 + escape-string-regexp: 5.0.0 26881 + estree-walker: 3.0.3 26882 + globby: 14.1.0 26883 + h3: 1.15.4 26884 + hookable: 5.5.3 26885 + ignore: 6.0.2 26886 + impound: 0.2.2(rollup@4.54.0) 26887 + jiti: 2.6.1 26888 + klona: 2.0.6 26889 + knitwork: 1.3.0 26890 + magic-string: 0.30.21 26891 + mlly: 1.8.0 26892 + nanotar: 0.1.1 26893 + nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) 26894 + nuxi: 3.28.0 26895 + nypm: 0.3.12 26896 + ofetch: 1.5.1 26897 + ohash: 1.1.6 26898 + pathe: 1.1.2 26899 + perfect-debounce: 1.0.0 26900 + pkg-types: 1.3.1 26901 + radix3: 1.1.2 26902 + scule: 1.3.0 26903 + semver: 7.7.3 26904 + std-env: 3.10.0 26753 26905 strip-literal: 2.1.1 26754 26906 tinyglobby: 0.2.10 26755 26907 ufo: 1.6.1 ··· 26834 26986 '@unhead/shared': 1.11.20 26835 26987 '@unhead/ssr': 1.11.20 26836 26988 '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) 26837 - '@vue/shared': 3.5.21 26989 + '@vue/shared': 3.5.25 26838 26990 acorn: 8.14.0 26839 26991 c12: 2.0.1(magicast@0.3.5) 26840 26992 chokidar: 4.0.3 ··· 26855 27007 impound: 0.2.2(rollup@4.54.0) 26856 27008 jiti: 2.6.1 26857 27009 klona: 2.0.6 26858 - knitwork: 1.2.0 26859 - magic-string: 0.30.19 27010 + knitwork: 1.3.0 27011 + magic-string: 0.30.21 26860 27012 mlly: 1.8.0 26861 27013 nanotar: 0.1.1 26862 27014 nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) ··· 26870 27022 radix3: 1.1.2 26871 27023 scule: 1.3.0 26872 27024 semver: 7.7.3 26873 - std-env: 3.9.0 27025 + std-env: 3.10.0 26874 27026 strip-literal: 2.1.1 26875 27027 tinyglobby: 0.2.10 26876 27028 ufo: 1.6.1 ··· 26955 27107 '@unhead/shared': 1.11.20 26956 27108 '@unhead/ssr': 1.11.20 26957 27109 '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) 26958 - '@vue/shared': 3.5.21 27110 + '@vue/shared': 3.5.25 26959 27111 acorn: 8.14.0 26960 27112 c12: 2.0.1(magicast@0.3.5) 26961 27113 chokidar: 4.0.3 ··· 26976 27128 impound: 0.2.2(rollup@4.54.0) 26977 27129 jiti: 2.6.1 26978 27130 klona: 2.0.6 26979 - knitwork: 1.2.0 26980 - magic-string: 0.30.19 27131 + knitwork: 1.3.0 27132 + magic-string: 0.30.21 26981 27133 mlly: 1.8.0 26982 27134 nanotar: 0.1.1 26983 27135 nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) ··· 26991 27143 radix3: 1.1.2 26992 27144 scule: 1.3.0 26993 27145 semver: 7.7.3 26994 - std-env: 3.9.0 27146 + std-env: 3.10.0 26995 27147 strip-literal: 2.1.1 26996 27148 tinyglobby: 0.2.10 26997 27149 ufo: 1.6.1 ··· 29831 29983 scule: 1.3.0 29832 29984 strip-literal: 3.0.0 29833 29985 tinyglobby: 0.2.15 29834 - unplugin: 2.3.10 29986 + unplugin: 2.3.11 29835 29987 unplugin-utils: 0.2.5 29836 29988 29837 29989 unique-filename@4.0.0: ··· 29895 30047 29896 30048 unplugin-vue-router@0.10.9(rollup@3.29.5)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)): 29897 30049 dependencies: 29898 - '@babel/types': 7.28.4 30050 + '@babel/types': 7.28.5 29899 30051 '@rollup/pluginutils': 5.2.0(rollup@3.29.5) 29900 30052 '@vue-macros/common': 1.16.1(vue@3.5.25(typescript@5.9.3)) 29901 30053 ast-walker-scope: 0.6.2 ··· 29917 30069 29918 30070 unplugin-vue-router@0.10.9(rollup@4.54.0)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)): 29919 30071 dependencies: 29920 - '@babel/types': 7.28.4 30072 + '@babel/types': 7.28.5 29921 30073 '@rollup/pluginutils': 5.2.0(rollup@4.54.0) 29922 30074 '@vue-macros/common': 1.16.1(vue@3.5.25(typescript@5.9.3)) 29923 30075 ast-walker-scope: 0.6.2 ··· 29939 30091 29940 30092 unplugin-vue-router@0.10.9(rollup@4.54.0)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)): 29941 30093 dependencies: 29942 - '@babel/types': 7.28.4 30094 + '@babel/types': 7.28.5 29943 30095 '@rollup/pluginutils': 5.2.0(rollup@4.54.0) 29944 30096 '@vue-macros/common': 1.16.1(vue@3.5.25(typescript@5.9.3)) 29945 30097 ast-walker-scope: 0.6.2 ··· 30057 30209 30058 30210 unwasm@0.3.11: 30059 30211 dependencies: 30060 - knitwork: 1.2.0 30212 + knitwork: 1.3.0 30061 30213 magic-string: 0.30.21 30062 30214 mlly: 1.8.0 30063 30215 pathe: 2.0.3 30064 30216 pkg-types: 2.3.0 30065 - unplugin: 2.3.10 30217 + unplugin: 2.3.11 30066 30218 30067 30219 update-browserslist-db@1.1.3(browserslist@4.25.4): 30068 30220 dependencies: ··· 30899 31051 30900 31052 webidl-conversions@7.0.0: {} 30901 31053 30902 - webpack-dev-middleware@7.4.2(webpack@5.98.0): 31054 + webpack-dev-middleware@7.4.2(webpack@5.98.0(esbuild@0.25.0)): 30903 31055 dependencies: 30904 31056 colorette: 2.0.20 30905 31057 memfs: 4.38.2 ··· 30910 31062 optionalDependencies: 30911 31063 webpack: 5.98.0(esbuild@0.25.0) 30912 31064 30913 - webpack-dev-server@5.2.0(webpack@5.98.0): 31065 + webpack-dev-server@5.2.0(webpack@5.98.0(esbuild@0.25.0)): 30914 31066 dependencies: 30915 31067 '@types/bonjour': 3.5.13 30916 31068 '@types/connect-history-api-fallback': 1.5.4 ··· 30937 31089 serve-index: 1.9.1 30938 31090 sockjs: 0.3.24 30939 31091 spdy: 4.0.2 30940 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) 31092 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 30941 31093 ws: 8.18.3 30942 31094 optionalDependencies: 30943 31095 webpack: 5.98.0(esbuild@0.25.0) ··· 30975 31127 serve-index: 1.9.1 30976 31128 sockjs: 0.3.24 30977 31129 spdy: 4.0.2 30978 - webpack-dev-middleware: 7.4.2(webpack@5.98.0) 31130 + webpack-dev-middleware: 7.4.2(webpack@5.98.0(esbuild@0.25.0)) 30979 31131 ws: 8.18.3 30980 31132 optionalDependencies: 30981 31133 webpack: 5.98.0(esbuild@0.25.0)