cabloy 5.1.233 → 5.1.234

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-socket",
3
- "version": "5.1.17",
3
+ "version": "5.1.18",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -75,8 +75,13 @@ export class ServiceSocket extends BeanBase {
75
75
  this.bean.socket.addClient(ws);
76
76
  // compose
77
77
  await this._getComposeSocketConnections(ws.namespace)({ method: 'enter', ws });
78
+ if (ws.readyState !== WebSocket.OPEN) {
79
+ this.bean.socket.removeClient(ws);
80
+ return;
81
+ }
78
82
  } catch (err: any) {
79
83
  this.app.handleError(err);
84
+ this.bean.socket.removeClient(ws);
80
85
  // terminate
81
86
  ws.terminate();
82
87
  return;
@@ -0,0 +1,122 @@
1
+ import type { IncomingMessage } from 'node:http';
2
+
3
+ import assert from 'node:assert/strict';
4
+ import { once } from 'node:events';
5
+ import { after, before, describe, it } from 'node:test';
6
+ import { setTimeout } from 'node:timers/promises';
7
+ import { acquireTestLock, app } from 'vona-mock';
8
+ import { WebSocket } from 'ws';
9
+
10
+ import { socketEventRecord } from '../src/types/socketEvent.ts';
11
+
12
+ describe('socket.test.ts', { concurrency: false, timeout: 15000 }, () => {
13
+ let release: () => void;
14
+
15
+ before(async () => {
16
+ release = await acquireTestLock('a-security');
17
+ });
18
+
19
+ after(() => {
20
+ release();
21
+ });
22
+
23
+ it('rejects a disallowed origin before event initialization without retaining the client', async () => {
24
+ await withConnection(
25
+ 'https://socket-rejected.invalid',
26
+ undefined,
27
+ async (client, server, messages) => {
28
+ await once(client, 'close');
29
+ assert.equal(typeof server.sendEvent, 'undefined');
30
+ assert.deepEqual(messages, []);
31
+ await assertClientRemoved(server);
32
+ },
33
+ );
34
+ });
35
+
36
+ it('sends one ready event for an accepted connection and removes it on close', async () => {
37
+ await withConnection(undefined, undefined, async (client, server, messages) => {
38
+ if (!messages.length) await once(client, 'message');
39
+ await app.bean.executor.mockCtx(async () => {
40
+ const scope = app.scope('a-socket');
41
+ assert.deepEqual(messages, [
42
+ `${scope.config.eventPrefix}${JSON.stringify([socketEventRecord.sysReady, null])}`,
43
+ ]);
44
+ assert.equal(app.bean.socket.getClient(server.id), server);
45
+ assert.ok(app.bean.socket.clientsNamespace[server.namespace]?.includes(server.id));
46
+ });
47
+ const closed = once(client, 'close');
48
+ client.close();
49
+ await closed;
50
+ await assertClientRemoved(server);
51
+ assert.equal(messages.length, 1);
52
+ });
53
+ });
54
+
55
+ it('removes a client when passport initialization throws after event initialization', async () => {
56
+ await withConnection(
57
+ undefined,
58
+ 'invalid-socket-test-token',
59
+ async (client, server, messages) => {
60
+ await once(client, 'close');
61
+ assert.equal(typeof server.sendEvent, 'function');
62
+ assert.deepEqual(messages, []);
63
+ await assertClientRemoved(server);
64
+ },
65
+ );
66
+ });
67
+ });
68
+
69
+ async function withConnection(
70
+ origin: string | undefined,
71
+ passportCode: string | undefined,
72
+ fn: (client: WebSocket, server: WebSocket, messages: string[]) => Promise<void>,
73
+ ) {
74
+ const address = app.server.address();
75
+ assert.ok(address && typeof address !== 'string');
76
+ const scope = app.scope('a-socket');
77
+ const url = new URL(`http://127.0.0.1:${address.port}${scope.config.globalPrefix}/`);
78
+ url.searchParams.set(scope.config.queryKey.instanceName, '');
79
+ url.searchParams.set('socketTest', crypto.randomUUID());
80
+ if (passportCode) url.searchParams.set(scope.config.queryKey.passportCode, passportCode);
81
+ const requestUrl = `${url.pathname}${url.search}`;
82
+ url.protocol = 'ws:';
83
+
84
+ const connected = Promise.withResolvers<WebSocket>();
85
+ let server: WebSocket | undefined;
86
+ const onConnection = (ws: WebSocket, req: IncomingMessage) => {
87
+ if (req.url !== requestUrl) return;
88
+ server = ws;
89
+ connected.resolve(ws);
90
+ };
91
+ app.wss.on('connection', onConnection);
92
+ const client = new WebSocket(url, { origin, handshakeTimeout: 5000 });
93
+ client.on('error', connected.reject);
94
+ const messages: string[] = [];
95
+ client.on('message', data => messages.push(data.toString()));
96
+ try {
97
+ await fn(client, await connected.promise, messages);
98
+ } finally {
99
+ app.wss.off('connection', onConnection);
100
+ if (client.readyState !== WebSocket.CLOSED) {
101
+ const closed = once(client, 'close');
102
+ client.terminate();
103
+ await closed;
104
+ }
105
+ if (server) {
106
+ await app.bean.executor.mockCtx(async () => {
107
+ app.bean.socket.removeClient(server!);
108
+ });
109
+ }
110
+ }
111
+ }
112
+
113
+ async function assertClientRemoved(server: WebSocket) {
114
+ await app.bean.executor.mockCtx(async () => {
115
+ // The peer close event can arrive before asynchronous server-side exit hooks finish.
116
+ for (let attempt = 0; attempt < 100 && app.bean.socket.getClient(server.id); attempt++) {
117
+ await setTimeout(10);
118
+ }
119
+ assert.equal(app.bean.socket.getClient(server.id), undefined);
120
+ assert.equal(app.bean.socket.clientsNamespace[server.namespace]?.includes(server.id), false);
121
+ });
122
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-module-a-ssr",
3
- "version": "5.1.35",
3
+ "version": "5.1.36",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "keywords": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vona-suite-a-cabloy",
3
- "version": "5.1.67",
3
+ "version": "5.1.68",
4
4
  "gitHead": "a79189b882c17af5911573896a781bbb0046d37d",
5
5
  "description": "",
6
6
  "author": "",
@@ -81,6 +81,7 @@
81
81
  "@quasar/app-vite": "npm:@cabloy/quasar-app-vite@^2.5.10",
82
82
  "@types/node": "^22.19.17",
83
83
  "@vitejs/plugin-vue": "^6.0.7",
84
+ "code-inspector-plugin": "2.0.9",
84
85
  "concurrently": "^10.0.4",
85
86
  "quasar-app-extension-zova": "^1.3.2",
86
87
  "sass": "^1.101.0",
@@ -546,6 +546,9 @@ importers:
546
546
  '@vitejs/plugin-vue':
547
547
  specifier: ^6.0.7
548
548
  version: 6.0.8(vite@8.3.4(@types/node@22.20.2)(esbuild@0.25.12)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)(terser@5.51.2)(yaml@2.9.1))(vue@3.5.42(typescript@5.9.3))
549
+ code-inspector-plugin:
550
+ specifier: 2.0.9
551
+ version: 2.0.9(supports-color@10.2.2)
549
552
  concurrently:
550
553
  specifier: ^10.0.4
551
554
  version: 10.0.5
@@ -610,7 +613,7 @@ importers:
610
613
  specifier: ^7.6.2
611
614
  version: 7.8.5
612
615
  zova-cli-set-front:
613
- specifier: ^1.2.119
616
+ specifier: ^1.2.120
614
617
  version: link:../cli-set-front
615
618
  devDependencies:
616
619
  clean-package:
@@ -719,7 +722,7 @@ importers:
719
722
  specifier: ^1.1.17
720
723
  version: link:../../packages-utils/zova-openapi
721
724
  zova-vite:
722
- specifier: ^1.1.50
725
+ specifier: ^1.1.51
723
726
  version: link:../../packages-utils/zova-vite
724
727
  devDependencies:
725
728
  clean-package:
@@ -1031,7 +1034,7 @@ importers:
1031
1034
  specifier: ^5.1.94
1032
1035
  version: link:../zova-core
1033
1036
  zova-suite-a-zova:
1034
- specifier: ^5.1.174
1037
+ specifier: ^5.1.175
1035
1038
  version: link:../../src/suite-vendor/a-zova
1036
1039
  devDependencies:
1037
1040
  clean-package:
@@ -1135,13 +1138,13 @@ importers:
1135
1138
  src/suite-vendor/a-cabloy:
1136
1139
  dependencies:
1137
1140
  zova-module-a-layoutprofile:
1138
- specifier: ^5.0.3
1141
+ specifier: ^5.0.4
1139
1142
  version: link:modules/a-layoutprofile
1140
1143
  zova-module-a-rbac:
1141
- specifier: ^5.0.1
1144
+ specifier: ^5.0.2
1142
1145
  version: link:modules/a-rbac
1143
1146
  zova-module-rest-resource:
1144
- specifier: ^5.1.56
1147
+ specifier: ^5.1.57
1145
1148
  version: link:modules/rest-resource
1146
1149
 
1147
1150
  src/suite-vendor/a-cabloy/modules/a-layoutprofile:
@@ -1174,16 +1177,16 @@ importers:
1174
1177
  src/suite-vendor/a-pay:
1175
1178
  dependencies:
1176
1179
  zova-module-a-pay:
1177
- specifier: ^5.0.9
1180
+ specifier: ^5.0.10
1178
1181
  version: link:modules/a-pay
1179
1182
  zova-module-pay-mock:
1180
- specifier: ^5.0.5
1183
+ specifier: ^5.0.6
1181
1184
  version: link:modules/pay-mock
1182
1185
  zova-module-pay-paypal:
1183
- specifier: ^5.0.2
1186
+ specifier: ^5.0.3
1184
1187
  version: link:modules/pay-paypal
1185
1188
  zova-module-pay-stripe:
1186
- specifier: ^5.0.2
1189
+ specifier: ^5.0.3
1187
1190
  version: link:modules/pay-stripe
1188
1191
 
1189
1192
  src/suite-vendor/a-pay/modules/a-pay:
@@ -1225,76 +1228,76 @@ importers:
1225
1228
  src/suite-vendor/a-zova:
1226
1229
  dependencies:
1227
1230
  zova-module-a-api:
1228
- specifier: ^5.1.22
1231
+ specifier: ^5.1.23
1229
1232
  version: link:modules/a-api
1230
1233
  zova-module-a-app:
1231
- specifier: ^5.1.26
1234
+ specifier: ^5.1.27
1232
1235
  version: link:modules/a-app
1233
1236
  zova-module-a-bean:
1234
- specifier: ^5.1.36
1237
+ specifier: ^5.1.37
1235
1238
  version: link:modules/a-bean
1236
1239
  zova-module-a-behavior:
1237
- specifier: ^5.1.27
1240
+ specifier: ^5.1.28
1238
1241
  version: link:modules/a-behavior
1239
1242
  zova-module-a-behaviors:
1240
- specifier: ^5.1.22
1243
+ specifier: ^5.1.23
1241
1244
  version: link:modules/a-behaviors
1242
1245
  zova-module-a-command:
1243
- specifier: ^5.1.35
1246
+ specifier: ^5.1.36
1244
1247
  version: link:modules/a-command
1245
1248
  zova-module-a-fetch:
1246
- specifier: ^5.1.25
1249
+ specifier: ^5.1.26
1247
1250
  version: link:modules/a-fetch
1248
1251
  zova-module-a-form:
1249
- specifier: ^5.1.54
1252
+ specifier: ^5.1.55
1250
1253
  version: link:modules/a-form
1251
1254
  zova-module-a-icon:
1252
- specifier: ^5.1.27
1255
+ specifier: ^5.1.28
1253
1256
  version: link:modules/a-icon
1254
1257
  zova-module-a-interceptor:
1255
- specifier: ^5.1.31
1258
+ specifier: ^5.1.32
1256
1259
  version: link:modules/a-interceptor
1257
1260
  zova-module-a-logger:
1258
- specifier: ^5.1.28
1261
+ specifier: ^5.1.29
1259
1262
  version: link:modules/a-logger
1260
1263
  zova-module-a-meta:
1261
- specifier: ^5.1.22
1264
+ specifier: ^5.1.23
1262
1265
  version: link:modules/a-meta
1263
1266
  zova-module-a-model:
1264
- specifier: ^5.1.38
1267
+ specifier: ^5.1.39
1265
1268
  version: link:modules/a-model
1266
1269
  zova-module-a-openapi:
1267
- specifier: ^5.1.58
1270
+ specifier: ^5.1.59
1268
1271
  version: link:modules/a-openapi
1269
1272
  zova-module-a-router:
1270
- specifier: ^5.1.42
1273
+ specifier: ^5.1.43
1271
1274
  version: link:modules/a-router
1272
1275
  zova-module-a-routerstack:
1273
- specifier: ^5.1.29
1276
+ specifier: ^5.1.30
1274
1277
  version: link:modules/a-routerstack
1275
1278
  zova-module-a-routertabs:
1276
- specifier: ^5.1.35
1279
+ specifier: ^5.1.36
1277
1280
  version: link:modules/a-routertabs
1278
1281
  zova-module-a-ssr:
1279
- specifier: ^5.1.40
1282
+ specifier: ^5.1.41
1280
1283
  version: link:modules/a-ssr
1281
1284
  zova-module-a-ssrhmr:
1282
- specifier: ^5.1.23
1285
+ specifier: ^5.1.24
1283
1286
  version: link:modules/a-ssrhmr
1284
1287
  zova-module-a-ssrserver:
1285
- specifier: ^5.1.26
1288
+ specifier: ^5.1.27
1286
1289
  version: link:modules/a-ssrserver
1287
1290
  zova-module-a-style:
1288
- specifier: ^5.1.35
1291
+ specifier: ^5.1.36
1289
1292
  version: link:modules/a-style
1290
1293
  zova-module-a-table:
1291
- specifier: ^5.1.44
1294
+ specifier: ^5.1.45
1292
1295
  version: link:modules/a-table
1293
1296
  zova-module-a-zod:
1294
- specifier: ^5.1.38
1297
+ specifier: ^5.1.39
1295
1298
  version: link:modules/a-zod
1296
1299
  zova-module-a-zova:
1297
- specifier: ^5.1.112
1300
+ specifier: ^5.1.113
1298
1301
  version: link:modules/a-zova
1299
1302
 
1300
1303
  src/suite-vendor/a-zova/modules/a-api:
@@ -2631,6 +2634,35 @@ packages:
2631
2634
  '@cacheable/utils@2.5.0':
2632
2635
  resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==}
2633
2636
 
2637
+ '@code-inspector/core@2.0.9':
2638
+ resolution: {integrity: sha512-7WkUlXfpwM95+KY5ra3KyivQGy0fUBq9dFcoI481LJKKnZNzwRW6kUkQF2hVP7zTj8TDy5esCMw8YuOwI8HhsQ==}
2639
+ peerDependencies:
2640
+ '@anthropic-ai/claude-agent-sdk': ^0.2.29
2641
+ '@openai/codex-sdk': ^0.106.0
2642
+ '@opencode-ai/sdk': ^1.2.24
2643
+ peerDependenciesMeta:
2644
+ '@anthropic-ai/claude-agent-sdk':
2645
+ optional: true
2646
+ '@openai/codex-sdk':
2647
+ optional: true
2648
+ '@opencode-ai/sdk':
2649
+ optional: true
2650
+
2651
+ '@code-inspector/esbuild@2.0.9':
2652
+ resolution: {integrity: sha512-uiddojMyD4HUtJ8pVq4/Iu0AgILaRZoe/zXJUK2ibqWdP6XtjIWCTLfvDL8IO9tOOxuEi+0SsRwr/Y8CEN5sTQ==}
2653
+
2654
+ '@code-inspector/mako@2.0.9':
2655
+ resolution: {integrity: sha512-HGb8oHXEj2fGnD5AtdUzFhMXkuRAXenKT1iCV53B8gFgiV5ddSrln+/mPQZt3v3FTu3TyQNd3aaHtPpSW+B0vg==}
2656
+
2657
+ '@code-inspector/turbopack@2.0.9':
2658
+ resolution: {integrity: sha512-uNTPCkDxS+4htXOKTJf+yEjYqKDFLIczILQ41dMqD5z9rbSDJkU/bvMs+8RcGUks0f7cB+TtRQyQCfwoFW1atA==}
2659
+
2660
+ '@code-inspector/vite@2.0.9':
2661
+ resolution: {integrity: sha512-XXwb3Cyz70Y8OqP7H7umKVM1RrfmWtKBZ7JrrtlwraEaRRefo70+guuQZr6vuNm8lOT2VHgsG1bH9wqs7WrrXw==}
2662
+
2663
+ '@code-inspector/webpack@2.0.9':
2664
+ resolution: {integrity: sha512-sauXo+GD6QIlqSymNtDTQOyrQid8er71Kr3Jh07viUKd1+U10//EML/tb/IpOzutwauizJeQslKqAvDV+Nqc9w==}
2665
+
2634
2666
  '@colors/colors@1.5.0':
2635
2667
  resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
2636
2668
  engines: {node: '>=0.1.90'}
@@ -5434,6 +5466,10 @@ packages:
5434
5466
  resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
5435
5467
  engines: {node: '>=8'}
5436
5468
 
5469
+ chalk@4.1.1:
5470
+ resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==}
5471
+ engines: {node: '>=10'}
5472
+
5437
5473
  chalk@4.1.2:
5438
5474
  resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
5439
5475
  engines: {node: '>=10'}
@@ -5515,6 +5551,9 @@ packages:
5515
5551
  resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
5516
5552
  engines: {node: '>=6'}
5517
5553
 
5554
+ code-inspector-plugin@2.0.9:
5555
+ resolution: {integrity: sha512-0CApBNHqPTrcbOL/1n4JJS0Wy0CGYTRmJVWY8qI0wkYmmeT/LhaQZ1EIGQNuHLepZn4SA/XWd+4No+8gshpRNA==}
5556
+
5518
5557
  color-convert@1.9.3:
5519
5558
  resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
5520
5559
 
@@ -6792,6 +6831,9 @@ packages:
6792
6831
  kolorist@1.8.0:
6793
6832
  resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
6794
6833
 
6834
+ launch-ide@1.4.10:
6835
+ resolution: {integrity: sha512-MqkYz5/dYDtBkvcDmz6tr2uFWU8AqRnrI+kLwcVmV83QZ/uhN0yns9GUQyLZJ5CJ5pglm8xko65JGcyzyI3dBQ==}
6836
+
6795
6837
  lazystream@1.0.1:
6796
6838
  resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
6797
6839
  engines: {node: '>= 0.6.3'}
@@ -7350,6 +7392,9 @@ packages:
7350
7392
  resolution: {integrity: sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==}
7351
7393
  engines: {node: '>=8.0.0'}
7352
7394
 
7395
+ node-pty@1.1.0:
7396
+ resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==}
7397
+
7353
7398
  node-releases@2.0.55:
7354
7399
  resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==}
7355
7400
  engines: {node: '>=18'}
@@ -7586,6 +7631,10 @@ packages:
7586
7631
  pnpm-workspace-yaml@1.9.1:
7587
7632
  resolution: {integrity: sha512-Xj/T2X6DNAWbtk/9UQ0/TJRswltiHZevmcMjqoL7WrpJi67lu3qaslU4+I+zJ8wtwqmuvAE0KkB8rbv2ZdogBg==}
7588
7633
 
7634
+ portfinder@1.0.38:
7635
+ resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==}
7636
+ engines: {node: '>= 10.12'}
7637
+
7589
7638
  possible-typed-array-names@1.1.0:
7590
7639
  resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
7591
7640
  engines: {node: '>= 0.4'}
@@ -8813,6 +8862,18 @@ packages:
8813
8862
  wrappy@1.0.2:
8814
8863
  resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
8815
8864
 
8865
+ ws@8.22.0:
8866
+ resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==}
8867
+ engines: {node: '>=10.0.0'}
8868
+ peerDependencies:
8869
+ bufferutil: ^4.0.1
8870
+ utf-8-validate: '>=5.0.2'
8871
+ peerDependenciesMeta:
8872
+ bufferutil:
8873
+ optional: true
8874
+ utf-8-validate:
8875
+ optional: true
8876
+
8816
8877
  wsl-utils@1.0.0:
8817
8878
  resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==}
8818
8879
  engines: {node: '>=20'}
@@ -9422,6 +9483,77 @@ snapshots:
9422
9483
  hashery: 1.5.1
9423
9484
  keyv: 5.6.0
9424
9485
 
9486
+ '@code-inspector/core@2.0.9(supports-color@10.2.2)':
9487
+ dependencies:
9488
+ '@vue/compiler-dom': 3.5.13
9489
+ chalk: 4.1.2
9490
+ launch-ide: 1.4.10
9491
+ portfinder: 1.0.38(supports-color@10.2.2)
9492
+ ws: 8.22.0
9493
+ optionalDependencies:
9494
+ node-pty: 1.1.0
9495
+ transitivePeerDependencies:
9496
+ - bufferutil
9497
+ - supports-color
9498
+ - utf-8-validate
9499
+
9500
+ '@code-inspector/esbuild@2.0.9(supports-color@10.2.2)':
9501
+ dependencies:
9502
+ '@code-inspector/core': 2.0.9(supports-color@10.2.2)
9503
+ transitivePeerDependencies:
9504
+ - '@anthropic-ai/claude-agent-sdk'
9505
+ - '@openai/codex-sdk'
9506
+ - '@opencode-ai/sdk'
9507
+ - bufferutil
9508
+ - supports-color
9509
+ - utf-8-validate
9510
+
9511
+ '@code-inspector/mako@2.0.9(supports-color@10.2.2)':
9512
+ dependencies:
9513
+ '@code-inspector/core': 2.0.9(supports-color@10.2.2)
9514
+ transitivePeerDependencies:
9515
+ - '@anthropic-ai/claude-agent-sdk'
9516
+ - '@openai/codex-sdk'
9517
+ - '@opencode-ai/sdk'
9518
+ - bufferutil
9519
+ - supports-color
9520
+ - utf-8-validate
9521
+
9522
+ '@code-inspector/turbopack@2.0.9(supports-color@10.2.2)':
9523
+ dependencies:
9524
+ '@code-inspector/core': 2.0.9(supports-color@10.2.2)
9525
+ '@code-inspector/webpack': 2.0.9(supports-color@10.2.2)
9526
+ transitivePeerDependencies:
9527
+ - '@anthropic-ai/claude-agent-sdk'
9528
+ - '@openai/codex-sdk'
9529
+ - '@opencode-ai/sdk'
9530
+ - bufferutil
9531
+ - supports-color
9532
+ - utf-8-validate
9533
+
9534
+ '@code-inspector/vite@2.0.9(supports-color@10.2.2)':
9535
+ dependencies:
9536
+ '@code-inspector/core': 2.0.9(supports-color@10.2.2)
9537
+ chalk: 4.1.1
9538
+ transitivePeerDependencies:
9539
+ - '@anthropic-ai/claude-agent-sdk'
9540
+ - '@openai/codex-sdk'
9541
+ - '@opencode-ai/sdk'
9542
+ - bufferutil
9543
+ - supports-color
9544
+ - utf-8-validate
9545
+
9546
+ '@code-inspector/webpack@2.0.9(supports-color@10.2.2)':
9547
+ dependencies:
9548
+ '@code-inspector/core': 2.0.9(supports-color@10.2.2)
9549
+ transitivePeerDependencies:
9550
+ - '@anthropic-ai/claude-agent-sdk'
9551
+ - '@openai/codex-sdk'
9552
+ - '@opencode-ai/sdk'
9553
+ - bufferutil
9554
+ - supports-color
9555
+ - utf-8-validate
9556
+
9425
9557
  '@colors/colors@1.5.0':
9426
9558
  optional: true
9427
9559
 
@@ -11718,6 +11850,11 @@ snapshots:
11718
11850
  ansi-styles: 4.3.0
11719
11851
  supports-color: 7.2.0
11720
11852
 
11853
+ chalk@4.1.1:
11854
+ dependencies:
11855
+ ansi-styles: 4.3.0
11856
+ supports-color: 7.2.0
11857
+
11721
11858
  chalk@4.1.2:
11722
11859
  dependencies:
11723
11860
  ansi-styles: 4.3.0
@@ -11806,6 +11943,23 @@ snapshots:
11806
11943
  kind-of: 6.0.3
11807
11944
  shallow-clone: 3.0.1
11808
11945
 
11946
+ code-inspector-plugin@2.0.9(supports-color@10.2.2):
11947
+ dependencies:
11948
+ '@code-inspector/core': 2.0.9(supports-color@10.2.2)
11949
+ '@code-inspector/esbuild': 2.0.9(supports-color@10.2.2)
11950
+ '@code-inspector/mako': 2.0.9(supports-color@10.2.2)
11951
+ '@code-inspector/turbopack': 2.0.9(supports-color@10.2.2)
11952
+ '@code-inspector/vite': 2.0.9(supports-color@10.2.2)
11953
+ '@code-inspector/webpack': 2.0.9(supports-color@10.2.2)
11954
+ chalk: 4.1.1
11955
+ transitivePeerDependencies:
11956
+ - '@anthropic-ai/claude-agent-sdk'
11957
+ - '@openai/codex-sdk'
11958
+ - '@opencode-ai/sdk'
11959
+ - bufferutil
11960
+ - supports-color
11961
+ - utf-8-validate
11962
+
11809
11963
  color-convert@1.9.3:
11810
11964
  dependencies:
11811
11965
  color-name: 1.1.3
@@ -13218,6 +13372,11 @@ snapshots:
13218
13372
 
13219
13373
  kolorist@1.8.0: {}
13220
13374
 
13375
+ launch-ide@1.4.10:
13376
+ dependencies:
13377
+ chalk: 4.1.2
13378
+ dotenv: 16.6.1
13379
+
13221
13380
  lazystream@1.0.1:
13222
13381
  dependencies:
13223
13382
  readable-stream: 2.3.8
@@ -13946,6 +14105,11 @@ snapshots:
13946
14105
 
13947
14106
  node-hex@1.0.1: {}
13948
14107
 
14108
+ node-pty@1.1.0:
14109
+ dependencies:
14110
+ node-addon-api: 7.1.1
14111
+ optional: true
14112
+
13949
14113
  node-releases@2.0.55: {}
13950
14114
 
13951
14115
  nopt@9.0.0:
@@ -14198,6 +14362,13 @@ snapshots:
14198
14362
  dependencies:
14199
14363
  yaml: 2.9.1
14200
14364
 
14365
+ portfinder@1.0.38(supports-color@10.2.2):
14366
+ dependencies:
14367
+ async: 3.2.6
14368
+ debug: 4.4.3(supports-color@10.2.2)
14369
+ transitivePeerDependencies:
14370
+ - supports-color
14371
+
14201
14372
  possible-typed-array-names@1.1.0: {}
14202
14373
 
14203
14374
  postcss-modules-extract-imports@3.1.0(postcss@8.1.10):
@@ -15625,6 +15796,8 @@ snapshots:
15625
15796
 
15626
15797
  wrappy@1.0.2: {}
15627
15798
 
15799
+ ws@8.22.0: {}
15800
+
15628
15801
  wsl-utils@1.0.0:
15629
15802
  dependencies:
15630
15803
  is-wsl: 3.1.1
@@ -56,4 +56,5 @@ allowBuilds:
56
56
  '@zhennann/ejs': true
57
57
  esbuild: true
58
58
  micromark: true
59
+ node-pty: false
59
60
  vue-demi: true
@@ -4,12 +4,36 @@
4
4
  // https://v2.quasar.dev/quasar-cli-vite/quasar-config-file
5
5
 
6
6
  import { defineConfig } from '@quasar/app-vite/wrappers';
7
+ import { codeInspectorPlugin } from 'code-inspector-plugin';
7
8
 
8
- export default defineConfig(_ctx => {
9
+ export default defineConfig(ctx => {
9
10
  return {
10
11
  build: {
11
- // extendViteConf(_viteConf) {},
12
- // viteVuePluginOptions: {},
12
+ extendViteConf(viteConf) {
13
+ if (!ctx.dev) return;
14
+ // Quasar provides this resolver at runtime but omits it from IResolve.
15
+ const resolveEntry = (
16
+ ctx.appPaths.resolve as typeof ctx.appPaths.resolve & { entry: (file: string) => string }
17
+ ).entry;
18
+ viteConf.plugins ??= [];
19
+ viteConf.plugins.unshift(
20
+ codeInspectorPlugin({
21
+ bundler: 'vite',
22
+ dev: ctx.dev,
23
+ enforcePre: true,
24
+ injectTo: resolveEntry('client-entry.js'),
25
+ match: /\.tsx$/,
26
+ exclude: /\/\.metadata\//,
27
+ pathType: 'absolute',
28
+ server: 'close',
29
+ skipSnippets: ['console'],
30
+ behavior: {
31
+ locate: false,
32
+ target: 'vscode://file/{file}:{line}:{column}',
33
+ },
34
+ }),
35
+ );
36
+ },
13
37
  },
14
38
 
15
39
  devServer: {