@geoql/doctor-core 1.1.1 → 1.2.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoql/doctor-core",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "private": false,
5
5
  "description": "Audit engine for @geoql/vue-doctor and @geoql/nuxt-doctor. Hybrid two-pass: @vue/compiler-sfc template AST + oxlint subprocess. TypeScript, ESM.",
6
6
  "keywords": [
@@ -29,7 +29,8 @@
29
29
  "directory": "packages/doctor-core"
30
30
  },
31
31
  "files": [
32
- "dist"
32
+ "dist",
33
+ "schema.json"
33
34
  ],
34
35
  "type": "module",
35
36
  "types": "./dist/index.d.ts",
@@ -43,29 +44,33 @@
43
44
  "access": "public"
44
45
  },
45
46
  "dependencies": {
46
- "@vue/compiler-sfc": "^3.5.35",
47
+ "@vue/compiler-sfc": "^3.5.38",
47
48
  "c12": "^4.0.0-beta.5",
48
49
  "kolorist": "^1.8.0",
49
50
  "oxc-parser": "0.133.0",
50
- "oxlint": "^1.67.0",
51
+ "oxlint": "^1.70.0",
51
52
  "picocolors": "^1.1.1",
52
- "semver": "^7.8.1",
53
- "tinyglobby": "^0.2.16",
54
- "@geoql/oxlint-plugin-nuxt-doctor": "1.0.0",
55
- "@geoql/oxlint-plugin-vue-doctor": "^1.0.0"
53
+ "semver": "^7.8.4",
54
+ "tinyglobby": "^0.2.17",
55
+ "zod": "^4.4.3",
56
+ "@geoql/oxlint-plugin-nuxt-doctor": "1.1.0",
57
+ "@geoql/oxlint-plugin-vue-doctor": "^1.1.0"
56
58
  },
57
59
  "devDependencies": {
58
- "@types/node": "^25.9.1",
60
+ "@types/node": "^25.9.3",
59
61
  "@types/semver": "^7.7.1",
60
- "@vue/compiler-core": "^3.5.35",
61
- "knip": "^6.14.2",
62
+ "@vue/compiler-core": "^3.5.38",
63
+ "knip": "^6.17.1",
62
64
  "typescript": "^6.0.3",
63
- "vitest": "^4.1.7"
65
+ "vitest": "^4.1.9"
64
66
  },
65
67
  "peerDependencies": {
66
68
  "knip": "^6.14.2",
67
69
  "oxlint": "^1.66.0"
68
70
  },
71
+ "engines": {
72
+ "node": ">=24"
73
+ },
69
74
  "scripts": {
70
75
  "lint": "vp lint src",
71
76
  "lint:fix": "vp lint src --fix",
package/schema.json ADDED
@@ -0,0 +1,443 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "$schema": {
6
+ "type": "string"
7
+ },
8
+ "rootDir": {
9
+ "type": "string"
10
+ },
11
+ "include": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "string"
15
+ }
16
+ },
17
+ "exclude": {
18
+ "type": "array",
19
+ "items": {
20
+ "type": "string"
21
+ }
22
+ },
23
+ "failOn": {
24
+ "type": "string",
25
+ "enum": ["error", "warn", "none"]
26
+ },
27
+ "threshold": {
28
+ "type": "integer",
29
+ "minimum": 0,
30
+ "maximum": 100
31
+ },
32
+ "preset": {
33
+ "type": "string",
34
+ "enum": ["minimal", "recommended", "strict", "all"]
35
+ },
36
+ "extends": {
37
+ "type": "array",
38
+ "items": {
39
+ "type": "string"
40
+ }
41
+ },
42
+ "fixExcludes": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "string"
46
+ }
47
+ },
48
+ "rules": {
49
+ "type": "object",
50
+ "properties": {
51
+ "vue/no-export-in-script-setup": {
52
+ "type": "string",
53
+ "enum": ["error", "warn", "info", "off"]
54
+ },
55
+ "vue/require-typed-ref": {
56
+ "type": "string",
57
+ "enum": ["error", "warn", "info", "off"]
58
+ },
59
+ "vue/no-arrow-functions-in-watch": {
60
+ "type": "string",
61
+ "enum": ["error", "warn", "info", "off"]
62
+ },
63
+ "vue/no-deprecated-data-object-declaration": {
64
+ "type": "string",
65
+ "enum": ["error", "warn", "info", "off"]
66
+ },
67
+ "vue/no-deprecated-events-api": {
68
+ "type": "string",
69
+ "enum": ["error", "warn", "info", "off"]
70
+ },
71
+ "vue/no-deprecated-destroyed-lifecycle": {
72
+ "type": "string",
73
+ "enum": ["error", "warn", "info", "off"]
74
+ },
75
+ "vue/no-deprecated-model-definition": {
76
+ "type": "string",
77
+ "enum": ["error", "warn", "info", "off"]
78
+ },
79
+ "vue/no-deprecated-delete-set": {
80
+ "type": "string",
81
+ "enum": ["error", "warn", "info", "off"]
82
+ },
83
+ "vue/no-deprecated-vue-config-keycodes": {
84
+ "type": "string",
85
+ "enum": ["error", "warn", "info", "off"]
86
+ },
87
+ "vue/no-lifecycle-after-await": {
88
+ "type": "string",
89
+ "enum": ["error", "warn", "info", "off"]
90
+ },
91
+ "vue/no-this-in-before-route-enter": {
92
+ "type": "string",
93
+ "enum": ["error", "warn", "info", "off"]
94
+ },
95
+ "vue/return-in-computed-property": {
96
+ "type": "string",
97
+ "enum": ["error", "warn", "info", "off"]
98
+ },
99
+ "vue/valid-define-emits": {
100
+ "type": "string",
101
+ "enum": ["error", "warn", "info", "off"]
102
+ },
103
+ "vue/valid-define-props": {
104
+ "type": "string",
105
+ "enum": ["error", "warn", "info", "off"]
106
+ },
107
+ "vue/no-required-prop-with-default": {
108
+ "type": "string",
109
+ "enum": ["error", "warn", "info", "off"]
110
+ },
111
+ "vue/prefer-import-from-vue": {
112
+ "type": "string",
113
+ "enum": ["error", "warn", "info", "off"]
114
+ },
115
+ "vue/no-import-compiler-macros": {
116
+ "type": "string",
117
+ "enum": ["error", "warn", "info", "off"]
118
+ },
119
+ "vue/no-multiple-slot-args": {
120
+ "type": "string",
121
+ "enum": ["error", "warn", "info", "off"]
122
+ },
123
+ "vue/require-default-export": {
124
+ "type": "string",
125
+ "enum": ["error", "warn", "info", "off"]
126
+ },
127
+ "vue/define-emits-declaration": {
128
+ "type": "string",
129
+ "enum": ["error", "warn", "info", "off"]
130
+ },
131
+ "vue/define-props-declaration": {
132
+ "type": "string",
133
+ "enum": ["error", "warn", "info", "off"]
134
+ },
135
+ "vue/define-props-destructuring": {
136
+ "type": "string",
137
+ "enum": ["error", "warn", "info", "off"]
138
+ },
139
+ "vue/max-props": {
140
+ "type": "string",
141
+ "enum": ["error", "warn", "info", "off"]
142
+ },
143
+ "vue-doctor/no-em-dash-in-string": {
144
+ "type": "string",
145
+ "enum": ["error", "warn", "info", "off"]
146
+ },
147
+ "vue-doctor/no-destructure-props-without-to-refs": {
148
+ "type": "string",
149
+ "enum": ["error", "warn", "info", "off"]
150
+ },
151
+ "vue-doctor/no-destructure-reactive-without-to-refs": {
152
+ "type": "string",
153
+ "enum": ["error", "warn", "info", "off"]
154
+ },
155
+ "vue-doctor/no-non-null-assertion-on-ref-value": {
156
+ "type": "string",
157
+ "enum": ["error", "warn", "info", "off"]
158
+ },
159
+ "vue-doctor/no-imports-from-vue-when-auto-imported": {
160
+ "type": "string",
161
+ "enum": ["error", "warn", "info", "off"]
162
+ },
163
+ "vue-doctor/reactivity/watch-without-cleanup": {
164
+ "type": "string",
165
+ "enum": ["error", "warn", "info", "off"]
166
+ },
167
+ "vue-doctor/reactivity/prefer-shallowRef-for-large-data": {
168
+ "type": "string",
169
+ "enum": ["error", "warn", "info", "off"]
170
+ },
171
+ "vue-doctor/reactivity/prefer-readonly-for-injected": {
172
+ "type": "string",
173
+ "enum": ["error", "warn", "info", "off"]
174
+ },
175
+ "vue-doctor/composition/prefer-script-setup-for-new-files": {
176
+ "type": "string",
177
+ "enum": ["error", "warn", "info", "off"]
178
+ },
179
+ "vue-doctor/composition/defineProps-typed": {
180
+ "type": "string",
181
+ "enum": ["error", "warn", "info", "off"]
182
+ },
183
+ "vue-doctor/performance/prefer-defineAsyncComponent-on-route": {
184
+ "type": "string",
185
+ "enum": ["error", "warn", "info", "off"]
186
+ },
187
+ "vue-doctor/template/v-for-has-key": {
188
+ "type": "string",
189
+ "enum": ["error", "warn", "info", "off"]
190
+ },
191
+ "vue-doctor/template/v-if-v-for-precedence": {
192
+ "type": "string",
193
+ "enum": ["error", "warn", "info", "off"]
194
+ },
195
+ "vue-doctor/template/v-memo-on-large-list": {
196
+ "type": "string",
197
+ "enum": ["error", "warn", "info", "off"]
198
+ },
199
+ "vue-doctor/template/no-inline-object-prop-in-list": {
200
+ "type": "string",
201
+ "enum": ["error", "warn", "info", "off"]
202
+ },
203
+ "vue-doctor/template/no-computed-getter-in-template-loop": {
204
+ "type": "string",
205
+ "enum": ["error", "warn", "info", "off"]
206
+ },
207
+ "vue-doctor/template/avoid-deep-v-bind-spread-in-list": {
208
+ "type": "string",
209
+ "enum": ["error", "warn", "info", "off"]
210
+ },
211
+ "vue-doctor/sfc/no-mixed-options-and-composition-api": {
212
+ "type": "string",
213
+ "enum": ["error", "warn", "info", "off"]
214
+ },
215
+ "vue-doctor/build-quality/tsconfig-strict-required": {
216
+ "type": "string",
217
+ "enum": ["error", "warn", "info", "off"]
218
+ },
219
+ "vue-doctor/build-quality/vue-tsc-in-devDeps": {
220
+ "type": "string",
221
+ "enum": ["error", "warn", "info", "off"]
222
+ },
223
+ "vue-doctor/build-quality/no-vue-cli": {
224
+ "type": "string",
225
+ "enum": ["error", "warn", "info", "off"]
226
+ },
227
+ "vue-doctor/build-quality/eslint-plugin-vue-installed": {
228
+ "type": "string",
229
+ "enum": ["error", "warn", "info", "off"]
230
+ },
231
+ "vue-doctor/deps/duplicate-vue-versions": {
232
+ "type": "string",
233
+ "enum": ["error", "warn", "info", "off"]
234
+ },
235
+ "vue-doctor/deps/vue-major-current": {
236
+ "type": "string",
237
+ "enum": ["error", "warn", "info", "off"]
238
+ },
239
+ "dead-code/unused-file": {
240
+ "type": "string",
241
+ "enum": ["error", "warn", "info", "off"]
242
+ },
243
+ "dead-code/unused-export": {
244
+ "type": "string",
245
+ "enum": ["error", "warn", "info", "off"]
246
+ },
247
+ "dead-code/unused-type-export": {
248
+ "type": "string",
249
+ "enum": ["error", "warn", "info", "off"]
250
+ },
251
+ "dead-code/unused-member": {
252
+ "type": "string",
253
+ "enum": ["error", "warn", "info", "off"]
254
+ },
255
+ "dead-code/unused-dependency": {
256
+ "type": "string",
257
+ "enum": ["error", "warn", "info", "off"]
258
+ },
259
+ "dead-code/unlisted-dependency": {
260
+ "type": "string",
261
+ "enum": ["error", "warn", "info", "off"]
262
+ },
263
+ "dead-code/duplicate-export": {
264
+ "type": "string",
265
+ "enum": ["error", "warn", "info", "off"]
266
+ },
267
+ "nuxt-doctor/structure/uses-app-directory": {
268
+ "type": "string",
269
+ "enum": ["error", "warn", "info", "off"]
270
+ },
271
+ "nuxt-doctor/structure/nuxt-major-current": {
272
+ "type": "string",
273
+ "enum": ["error", "warn", "info", "off"]
274
+ },
275
+ "nuxt-doctor/modules-deps/no-modules-incompatible-with-nuxt-4": {
276
+ "type": "string",
277
+ "enum": ["error", "warn", "info", "off"]
278
+ },
279
+ "nuxt-doctor/modules-deps/recommended-modules-installed": {
280
+ "type": "string",
281
+ "enum": ["error", "warn", "info", "off"]
282
+ },
283
+ "nuxt-doctor/nitro/compatibilityDate-set": {
284
+ "type": "string",
285
+ "enum": ["error", "warn", "info", "off"]
286
+ },
287
+ "nuxt-doctor/nitro/preset-defined-for-deploy-target": {
288
+ "type": "string",
289
+ "enum": ["error", "warn", "info", "off"]
290
+ },
291
+ "nuxt-doctor/nitro/runtime-config-typed": {
292
+ "type": "string",
293
+ "enum": ["error", "warn", "info", "off"]
294
+ },
295
+ "nuxt-doctor/seo/lang-on-html": {
296
+ "type": "string",
297
+ "enum": ["error", "warn", "info", "off"]
298
+ },
299
+ "nuxt-doctor/seo/useSeoMeta-on-public-page": {
300
+ "type": "string",
301
+ "enum": ["error", "warn", "info", "off"]
302
+ },
303
+ "nuxt-doctor/seo/og-image-defined": {
304
+ "type": "string",
305
+ "enum": ["error", "warn", "info", "off"]
306
+ },
307
+ "nuxt-doctor/cloudflare/nitro-cloudflare-preset": {
308
+ "type": "string",
309
+ "enum": ["error", "warn", "info", "off"]
310
+ },
311
+ "nuxt-doctor/cloudflare/og-image-via-satori": {
312
+ "type": "string",
313
+ "enum": ["error", "warn", "info", "off"]
314
+ },
315
+ "nuxt-doctor/cloudflare/no-node-only-modules": {
316
+ "type": "string",
317
+ "enum": ["error", "warn", "info", "off"]
318
+ },
319
+ "nuxt-doctor/data-fetching/no-shared-key-across-pages": {
320
+ "type": "string",
321
+ "enum": ["error", "warn", "info", "off"]
322
+ },
323
+ "nuxt-doctor/data-fetching/ssr-safe-onMounted-only-for-client": {
324
+ "type": "string",
325
+ "enum": ["error", "warn", "info", "off"]
326
+ },
327
+ "nuxt-doctor/ai-slop/no-mixed-app-and-root-layout": {
328
+ "type": "string",
329
+ "enum": ["error", "warn", "info", "off"]
330
+ },
331
+ "nuxt-doctor/ai-slop/no-process-client-server": {
332
+ "type": "string",
333
+ "enum": ["error", "warn", "info", "off"]
334
+ },
335
+ "nuxt-doctor/ai-slop/no-explicit-imports-of-auto-imported": {
336
+ "type": "string",
337
+ "enum": ["error", "warn", "info", "off"]
338
+ },
339
+ "nuxt-doctor/ai-slop/no-useState-for-server-data": {
340
+ "type": "string",
341
+ "enum": ["error", "warn", "info", "off"]
342
+ },
343
+ "nuxt-doctor/ai-slop/no-fetch-in-setup": {
344
+ "type": "string",
345
+ "enum": ["error", "warn", "info", "off"]
346
+ },
347
+ "nuxt-doctor/data-fetching/useAsyncData-key-required-in-loop": {
348
+ "type": "string",
349
+ "enum": ["error", "warn", "info", "off"]
350
+ },
351
+ "nuxt-doctor/server-routes/defineEventHandler-typed": {
352
+ "type": "string",
353
+ "enum": ["error", "warn", "info", "off"]
354
+ },
355
+ "nuxt-doctor/server-routes/validate-body-with-h3-v2": {
356
+ "type": "string",
357
+ "enum": ["error", "warn", "info", "off"]
358
+ },
359
+ "nuxt-doctor/server-routes/createError-on-failure": {
360
+ "type": "string",
361
+ "enum": ["error", "warn", "info", "off"]
362
+ },
363
+ "nuxt-doctor/hydration/no-document-in-setup": {
364
+ "type": "string",
365
+ "enum": ["error", "warn", "info", "off"]
366
+ },
367
+ "nuxt-doctor/hydration/clientOnly-for-browser-apis": {
368
+ "type": "string",
369
+ "enum": ["error", "warn", "info", "off"]
370
+ },
371
+ "vue-doctor/security/no-v-html": {
372
+ "type": "string",
373
+ "enum": ["error", "warn", "info", "off"]
374
+ },
375
+ "vue-doctor/security/no-inner-html": {
376
+ "type": "string",
377
+ "enum": ["error", "warn", "info", "off"]
378
+ },
379
+ "vue-doctor/security/no-eval-like": {
380
+ "type": "string",
381
+ "enum": ["error", "warn", "info", "off"]
382
+ },
383
+ "vue-doctor/security/no-auth-token-in-web-storage": {
384
+ "type": "string",
385
+ "enum": ["error", "warn", "info", "off"]
386
+ },
387
+ "vue-doctor/security/no-secrets-in-source": {
388
+ "type": "string",
389
+ "enum": ["error", "warn", "info", "off"]
390
+ },
391
+ "vue-doctor/security/no-target-blank-without-rel": {
392
+ "type": "string",
393
+ "enum": ["error", "warn", "info", "off"]
394
+ },
395
+ "vue-doctor/security/no-javascript-uri": {
396
+ "type": "string",
397
+ "enum": ["error", "warn", "info", "off"]
398
+ },
399
+ "nuxt-doctor/security/no-secret-in-public-runtime-config": {
400
+ "type": "string",
401
+ "enum": ["error", "warn", "info", "off"]
402
+ },
403
+ "nuxt-doctor/security/no-user-input-in-fetch-url": {
404
+ "type": "string",
405
+ "enum": ["error", "warn", "info", "off"]
406
+ },
407
+ "vue-doctor/design/no-arbitrary-tailwind-values": {
408
+ "type": "string",
409
+ "enum": ["error", "warn", "info", "off"]
410
+ },
411
+ "vue-doctor/design/no-raw-hex-color": {
412
+ "type": "string",
413
+ "enum": ["error", "warn", "info", "off"]
414
+ },
415
+ "vue-doctor/design/no-default-tailwind-palette": {
416
+ "type": "string",
417
+ "enum": ["error", "warn", "info", "off"]
418
+ },
419
+ "vue-doctor/design/no-important-utility": {
420
+ "type": "string",
421
+ "enum": ["error", "warn", "info", "off"]
422
+ },
423
+ "vue-doctor/design/no-hardcoded-inline-style": {
424
+ "type": "string",
425
+ "enum": ["error", "warn", "info", "off"]
426
+ },
427
+ "vue-doctor/design/no-missing-alt": {
428
+ "type": "string",
429
+ "enum": ["error", "warn", "info", "off"]
430
+ },
431
+ "vue-doctor/design/no-absurd-z-index": {
432
+ "type": "string",
433
+ "enum": ["error", "warn", "info", "off"]
434
+ }
435
+ },
436
+ "additionalProperties": {
437
+ "type": "string",
438
+ "enum": ["error", "warn", "info", "off"]
439
+ }
440
+ }
441
+ },
442
+ "additionalProperties": {}
443
+ }