svelte-vitals 0.45.1 → 0.46.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/dist/bin.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runAnalyzeCliGunshi
4
- } from "./chunk-P4YNVJUO.js";
5
- import "./chunk-VNVRHWO3.js";
4
+ } from "./chunk-Z2DBOC5X.js";
5
+ import "./chunk-FVN7R2YK.js";
6
6
  import "./chunk-MUIOPL5F.js";
7
7
  import "./chunk-M5KM5SV7.js";
8
8
  import {
@@ -18,29 +18,34 @@ import {
18
18
 
19
19
  // src/cli.ts
20
20
  async function runCli(argv, io = consoleIO, env = process.env) {
21
- const locale = resolveLocale(env);
22
- if (argv[0] === "complete") {
23
- const { runCompleteCliGunshi } = await import("./complete-HGLO72TI.js");
24
- return { code: await runCompleteCliGunshi(argv, io), exit: "natural" };
21
+ try {
22
+ const locale = resolveLocale(env);
23
+ if (argv[0] === "complete") {
24
+ const { runCompleteCliGunshi } = await import("./complete-7TW5PTE6.js");
25
+ return { code: await runCompleteCliGunshi(argv, io), exit: "natural" };
26
+ }
27
+ if (argv[0] === "docs") {
28
+ const { runDocsCliGunshi } = await import("./docs-WRZT4ZJN.js");
29
+ return { code: await runDocsCliGunshi(argv.slice(1), io, locale), exit: "natural" };
30
+ }
31
+ if (argv[0] === "explain") {
32
+ const { runExplainCliGunshi } = await import("./explain-W3BU3CYJ.js");
33
+ return { code: await runExplainCliGunshi(argv.slice(1), io, locale), exit: "natural" };
34
+ }
35
+ if (argv[0] === "install") {
36
+ const { runInstallCliGunshi } = await import("./install-EP364SRT.js");
37
+ return { code: await runInstallCliGunshi(argv.slice(1), io, locale), exit: "immediate" };
38
+ }
39
+ if (argv[0] === "ci") {
40
+ const { runCiCliGunshi } = await import("./ci-TFTS5QAU.js");
41
+ const code = await runCiCliGunshi(argv.slice(1), { ...realIO(), log: io.log, errorLog: io.errorLog }, locale);
42
+ return { code, exit: "immediate" };
43
+ }
44
+ return await runAnalyzeCliGunshi(argv, io, locale);
45
+ } catch (err) {
46
+ io.errorLog(`svelte-vitals: ${err instanceof Error ? err.message : String(err)}`);
47
+ return { code: 2, exit: "natural" };
25
48
  }
26
- if (argv[0] === "docs") {
27
- const { runDocsCliGunshi } = await import("./docs-CRZC47P7.js");
28
- return { code: await runDocsCliGunshi(argv.slice(1), io, locale), exit: "natural" };
29
- }
30
- if (argv[0] === "explain") {
31
- const { runExplainCliGunshi } = await import("./explain-52QDQUOY.js");
32
- return { code: await runExplainCliGunshi(argv.slice(1), io, locale), exit: "natural" };
33
- }
34
- if (argv[0] === "install") {
35
- const { runInstallCliGunshi } = await import("./install-3FI7M5BM.js");
36
- return { code: await runInstallCliGunshi(argv.slice(1), io, locale), exit: "immediate" };
37
- }
38
- if (argv[0] === "ci") {
39
- const { runCiCliGunshi } = await import("./ci-CLKU3TR6.js");
40
- const code = await runCiCliGunshi(argv.slice(1), { ...realIO(), log: io.log, errorLog: io.errorLog }, locale);
41
- return { code, exit: "immediate" };
42
- }
43
- return runAnalyzeCliGunshi(argv, io, locale);
44
49
  }
45
50
 
46
51
  // src/bin.ts
@@ -52,4 +57,7 @@ async function main() {
52
57
  process.exitCode = code;
53
58
  }
54
59
  }
55
- void main();
60
+ main().catch((err) => {
61
+ console.error(`svelte-vitals: ${err instanceof Error ? err.message : String(err)}`);
62
+ process.exit(2);
63
+ });
@@ -17,7 +17,7 @@ import {
17
17
  WORKFLOW_PATH,
18
18
  buildWorkflowYaml,
19
19
  planWorkflowWrite
20
- } from "./chunk-F5P3REI7.js";
20
+ } from "./chunk-CTMKTFST.js";
21
21
  import {
22
22
  clackPrompts,
23
23
  realIO
@@ -17,10 +17,7 @@ import {
17
17
  import { cli } from "gunshi/bone";
18
18
  import { define } from "gunshi/definition";
19
19
  import "gunshi/generator";
20
- import { explainRule as explainRule2, allRules as allRules2 } from "@svelte-vitals/core";
21
-
22
- // src/explain.ts
23
- import { allRules, CATEGORIES } from "@svelte-vitals/core";
20
+ import { explainRule, allRules, CATEGORIES } from "@svelte-vitals/core";
24
21
  function describeOptions(id, options) {
25
22
  const MERGE = {
26
23
  integer: "replaces the default",
@@ -56,8 +53,6 @@ function renderRuleList() {
56
53
  "\n\n"
57
54
  );
58
55
  }
59
-
60
- // src/gunshi/explain.ts
61
56
  var BOOLEAN_FLAGS = ["json", "list", "help"];
62
57
  var KNOWN_LONG_FLAGS = new Set(BOOLEAN_FLAGS);
63
58
  var KNOWN_SHORT_FLAGS = /* @__PURE__ */ new Set(["h"]);
@@ -113,7 +108,7 @@ async function runExplainCliGunshi(args, io = consoleIO, locale = "en") {
113
108
  }
114
109
  io.log(
115
110
  ctx.values.json ? JSON.stringify(
116
- allRules2.map((r) => ({ id: r.id, category: r.category, severity: r.severity, title: r.title })),
111
+ allRules.map((r) => ({ id: r.id, category: r.category, severity: r.severity, title: r.title })),
117
112
  null,
118
113
  2
119
114
  ) : renderRuleList()
@@ -130,7 +125,7 @@ async function runExplainCliGunshi(args, io = consoleIO, locale = "en") {
130
125
  exitCode = 2;
131
126
  return;
132
127
  }
133
- const info = explainRule2(id);
128
+ const info = explainRule(id);
134
129
  if (!info) {
135
130
  io.errorLog(`svelte-vitals: unknown rule id '${id}'.`);
136
131
  const hint = suggestClosest(id, knownRuleIds());
@@ -4,7 +4,7 @@ import {
4
4
  WORKFLOW_PATH,
5
5
  buildWorkflowYaml,
6
6
  planWorkflowWrite
7
- } from "./chunk-F5P3REI7.js";
7
+ } from "./chunk-CTMKTFST.js";
8
8
  import {
9
9
  realIO
10
10
  } from "./chunk-GE7TKVTX.js";
@@ -1,7 +1,7 @@
1
1
  // src/ci/workflow.ts
2
2
  var WORKFLOW_PATH = ".github/workflows/svelte-vitals.yml";
3
- var CHECKOUT_SHA = "9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0";
4
- var CHECKOUT_VERSION = "v7.0.0";
3
+ var CHECKOUT_SHA = "3d3c42e5aac5ba805825da76410c181273ba90b1";
4
+ var CHECKOUT_VERSION = "v7.0.1";
5
5
  function planWorkflowWrite(existing, force) {
6
6
  if (existing === void 0) return { status: "created" };
7
7
  if (!force) return { status: "exists" };
@@ -28,6 +28,7 @@ function buildWorkflowYaml(opts) {
28
28
  ` - uses: actions/checkout@${CHECKOUT_SHA} # ${CHECKOUT_VERSION}`,
29
29
  " with:",
30
30
  " fetch-depth: 0",
31
+ " persist-credentials: false",
31
32
  ` - uses: oekazuma/svelte-vitals-action@${actionSha} # v${actionVersion}`,
32
33
  " with:",
33
34
  " diff: origin/${{ github.base_ref }}",
@@ -32,7 +32,9 @@ import {
32
32
  applyRuleSeverities,
33
33
  applyOverrides,
34
34
  settingSeverity,
35
- withFailedRulesOff
35
+ withFailedRulesOff,
36
+ formatFailedRuleWarning,
37
+ terminalSafe
36
38
  } from "@svelte-vitals/core";
37
39
 
38
40
  // src/runtime/node.ts
@@ -1002,15 +1004,16 @@ function applySuppressions(results, entries, config, allResults) {
1002
1004
  }
1003
1005
 
1004
1006
  // src/color.ts
1007
+ import { styleText } from "util";
1005
1008
  import { noColorPalette } from "@svelte-vitals/core";
1006
- var wrap = (open, close = 0) => (s) => `\x1B[${open}m${s}\x1B[${close}m`;
1009
+ var wrap = (format) => (s) => styleText(format, s, { validateStream: false });
1007
1010
  var ansiPalette = {
1008
- bold: wrap(1, 22),
1009
- dim: wrap(2, 22),
1010
- red: wrap(31, 39),
1011
- yellow: wrap(33, 39),
1012
- green: wrap(32, 39),
1013
- cyan: wrap(36, 39)
1011
+ bold: wrap("bold"),
1012
+ dim: wrap("dim"),
1013
+ red: wrap("red"),
1014
+ yellow: wrap("yellow"),
1015
+ green: wrap("green"),
1016
+ cyan: wrap("cyan")
1014
1017
  };
1015
1018
  function colorEnabled(opts) {
1016
1019
  if (opts.noColorFlag) return false;
@@ -1021,28 +1024,6 @@ function colorEnabled(opts) {
1021
1024
  }
1022
1025
  var paletteFor = (enabled) => enabled ? ansiPalette : noColorPalette;
1023
1026
 
1024
- // src/spinner.ts
1025
- var FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
1026
- function startSpinner(text, opts) {
1027
- const stream = opts.stream ?? process.stderr;
1028
- if (!opts.enabled) return { stop() {
1029
- } };
1030
- let i = 0;
1031
- const tick = () => {
1032
- stream.write(`\r${FRAMES[i % FRAMES.length]} ${text}`);
1033
- i++;
1034
- };
1035
- tick();
1036
- const timer = setInterval(tick, 80);
1037
- if (typeof timer.unref === "function") timer.unref();
1038
- return {
1039
- stop() {
1040
- clearInterval(timer);
1041
- stream.write("\r\x1B[K");
1042
- }
1043
- };
1044
- }
1045
-
1046
1027
  // src/mascot.ts
1047
1028
  import { createLogUpdate } from "log-update";
1048
1029
  function mascotStateFor(score) {
@@ -1119,24 +1100,28 @@ function renderConfettiFrame(offset, mascotBlock) {
1119
1100
  return [confettiRow(offset), mascotBlock, confettiRow(offset + 2)].join("\n");
1120
1101
  }
1121
1102
  var IDLE_TICK_MS = 160;
1103
+ var PLAIN_FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
1104
+ var PLAIN_TICK_MS = 80;
1122
1105
  function startMascotSpinner(text, opts) {
1123
1106
  if (!opts.enabled) return { stop() {
1124
1107
  } };
1125
1108
  const stream = opts.stream ?? process.stderr;
1109
+ const mascot = opts.mascot ?? true;
1126
1110
  const render = createLogUpdate(stream);
1127
1111
  let i = 0;
1128
1112
  const tick = () => {
1129
- render(`${renderMascotIdleFrame(i)}
1130
- ${text}`);
1113
+ render(mascot ? `${renderMascotIdleFrame(i)}
1114
+ ${text}` : `${PLAIN_FRAMES[i % PLAIN_FRAMES.length]} ${text}`);
1131
1115
  i++;
1132
1116
  };
1133
1117
  tick();
1134
- const timer = setInterval(tick, IDLE_TICK_MS);
1118
+ const timer = setInterval(tick, mascot ? IDLE_TICK_MS : PLAIN_TICK_MS);
1135
1119
  if (typeof timer.unref === "function") timer.unref();
1136
1120
  return {
1137
1121
  stop() {
1138
1122
  clearInterval(timer);
1139
1123
  render.clear();
1124
+ render.done();
1140
1125
  }
1141
1126
  };
1142
1127
  }
@@ -1307,7 +1292,7 @@ function skippedFileWarnings(facts) {
1307
1292
  ];
1308
1293
  }
1309
1294
  function failedRuleWarnings(failedRules) {
1310
- return failedRules.map((f) => `rule ${f.id} failed and was skipped: ${f.message.split("\n")[0]}`);
1295
+ return failedRules.map(formatFailedRuleWarning);
1311
1296
  }
1312
1297
  async function analyzeProject(opts = {}) {
1313
1298
  const cwd = opts.cwd ?? process.cwd();
@@ -1355,22 +1340,22 @@ async function analyzeProject(opts = {}) {
1355
1340
  sourceFiles
1356
1341
  });
1357
1342
  const results = applyOverrides(applyRuleSeverities(rawResults, config), config);
1358
- const scoringConfig = withFailedRulesOff(
1359
- config,
1360
- failedRules.map((f) => f.id)
1361
- );
1343
+ const failedRuleIds = failedRules.map((f) => f.id);
1344
+ const scoringConfig = withFailedRulesOff(config, failedRuleIds);
1362
1345
  return {
1363
1346
  results,
1364
1347
  config: scoringConfig,
1365
1348
  version: readPackageVersion(),
1366
1349
  ruleIds: rules.map((r) => r.id),
1367
1350
  examined,
1351
+ failedRuleIds,
1368
1352
  warnings: [...warnings, ...skippedFileWarnings([...components, ...kitModules]), ...failedRuleWarnings(failedRules)],
1369
1353
  loadedConfig: loaded
1370
1354
  };
1371
1355
  }
1372
1356
  async function applyScope(results, opts) {
1373
- const errorLog = opts.errorLog ?? ((line) => console.error(line));
1357
+ const rawErrorLog = opts.errorLog ?? ((line) => console.error(line));
1358
+ const errorLog = (line) => rawErrorLog(terminalSafe(line));
1374
1359
  let scoped = results;
1375
1360
  if (opts.staged || opts.diffBase !== void 0) {
1376
1361
  const changed = opts.staged ? getChangedFiles(opts.cwd, { staged: true }) : getChangedFiles(opts.cwd, { base: opts.diffBase });
@@ -1433,7 +1418,8 @@ function runAnalyzeOptions(opts) {
1433
1418
  }
1434
1419
  async function run(opts = {}) {
1435
1420
  const log = opts.log ?? ((line) => console.log(line));
1436
- const errorLog = opts.errorLog ?? ((line) => console.error(line));
1421
+ const rawErrorLog = opts.errorLog ?? ((line) => console.error(line));
1422
+ const errorLog = (line) => rawErrorLog(terminalSafe(line));
1437
1423
  if (opts.minHealth != null && (!Number.isFinite(opts.minHealth) || opts.minHealth < 0 || opts.minHealth > 100)) {
1438
1424
  errorLog(`svelte-vitals: invalid minHealth '${opts.minHealth}'; expected a number 0-100.`);
1439
1425
  return 2;
@@ -1452,7 +1438,11 @@ async function run(opts = {}) {
1452
1438
  if (useMascotSpinner && bubbleFitsWidth(stderrStream.columns)) {
1453
1439
  await playMascotGreeting({ enabled: true, stream: stderrStream, holdMs: opts.animationFrameDelayMs });
1454
1440
  }
1455
- const spinner = useMascotSpinner ? startMascotSpinner("Analyzing\u2026", { enabled: true, stream: stderrStream }) : startSpinner("Analyzing\u2026", { enabled: spinnerBaseEnabled, stream: stderrStream });
1441
+ const spinner = startMascotSpinner("Analyzing\u2026", {
1442
+ enabled: spinnerBaseEnabled,
1443
+ stream: stderrStream,
1444
+ mascot: useMascotSpinner
1445
+ });
1456
1446
  let cwd = opts.cwd ?? process.cwd();
1457
1447
  let analysis;
1458
1448
  try {
@@ -53,7 +53,7 @@ var EMBEDDED_DOCS = [
53
53
  }
54
54
  ];
55
55
 
56
- // src/docs/cli.ts
56
+ // src/gunshi/docs.ts
57
57
  var DOCS_HELP = `svelte-vitals docs \u2014 read the bundled guides without leaving the terminal
58
58
 
59
59
  Usage:
@@ -83,8 +83,6 @@ function renderList() {
83
83
  "Rule-level detail is a separate command: `svelte-vitals explain --list`."
84
84
  ].join("\n");
85
85
  }
86
-
87
- // src/gunshi/docs.ts
88
86
  var BOOLEAN_FLAGS = ["json", "help"];
89
87
  var HELP_ARG = { help: { type: "boolean", short: "h", description: "Show this help" } };
90
88
  var JSON_ARG = { json: { type: "boolean", description: "Machine-readable output (list only)" } };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  run
3
- } from "./chunk-VNVRHWO3.js";
3
+ } from "./chunk-FVN7R2YK.js";
4
4
  import {
5
5
  VALUE_FLAGS,
6
6
  parseRunArgs,
@@ -2,8 +2,8 @@ import {
2
2
  CI_ARGS,
3
3
  CI_UPGRADE_ARGS,
4
4
  runCiCliGunshi
5
- } from "./chunk-ACQ5HB32.js";
6
- import "./chunk-F5P3REI7.js";
5
+ } from "./chunk-6BUOZU6F.js";
6
+ import "./chunk-CTMKTFST.js";
7
7
  import "./chunk-GE7TKVTX.js";
8
8
  import "./chunk-NMVBVKLX.js";
9
9
  export {
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  ROOT_ARGS
3
- } from "./chunk-P4YNVJUO.js";
4
- import "./chunk-VNVRHWO3.js";
3
+ } from "./chunk-Z2DBOC5X.js";
4
+ import "./chunk-FVN7R2YK.js";
5
5
  import {
6
6
  DOCS_LIST_ARGS,
7
7
  DOCS_ROOT_ARGS,
8
8
  DOCS_SHOW_ARGS
9
- } from "./chunk-MBOONBC4.js";
9
+ } from "./chunk-X7BU4DLG.js";
10
10
  import {
11
11
  EXPLAIN_ARGS
12
- } from "./chunk-O2CQPUSP.js";
12
+ } from "./chunk-4ZE7NBVE.js";
13
13
  import {
14
14
  INSTALL_ARGS
15
- } from "./chunk-4O5F7EUJ.js";
15
+ } from "./chunk-2RQRPUCR.js";
16
16
  import {
17
17
  CATEGORIES,
18
18
  FAIL_ON_VALUES,
@@ -28,8 +28,8 @@ import "./chunk-TFBLQUAC.js";
28
28
  import {
29
29
  CI_ARGS,
30
30
  CI_UPGRADE_ARGS
31
- } from "./chunk-ACQ5HB32.js";
32
- import "./chunk-F5P3REI7.js";
31
+ } from "./chunk-6BUOZU6F.js";
32
+ import "./chunk-CTMKTFST.js";
33
33
  import "./chunk-GE7TKVTX.js";
34
34
  import "./chunk-NMVBVKLX.js";
35
35
 
@@ -43,7 +43,15 @@ function forCompletion(args) {
43
43
  const out = {};
44
44
  for (const [key, schema] of Object.entries(args)) {
45
45
  if (schema.hidden) continue;
46
- out[schema.type === "positional" || !schema.toKebab ? key : kebabnize(key)] = schema;
46
+ const outKey = schema.type === "positional" || !schema.toKebab ? key : kebabnize(key);
47
+ const description = schema.description?.replace(/\s*\n\s*/g, " ");
48
+ out[outKey] = description === schema.description ? schema : { ...schema, description };
49
+ }
50
+ for (const [key, schema] of Object.entries(out)) {
51
+ const stripped = key.startsWith("no-") ? key.slice(3) : void 0;
52
+ if (stripped && !(stripped in out)) {
53
+ out[stripped] = { type: "positional", required: false, description: schema.description };
54
+ }
47
55
  }
48
56
  return out;
49
57
  }
@@ -3,7 +3,7 @@ import {
3
3
  DOCS_ROOT_ARGS,
4
4
  DOCS_SHOW_ARGS,
5
5
  runDocsCliGunshi
6
- } from "./chunk-MBOONBC4.js";
6
+ } from "./chunk-X7BU4DLG.js";
7
7
  import "./chunk-SLUMRYUD.js";
8
8
  import "./chunk-TFBLQUAC.js";
9
9
  import "./chunk-NMVBVKLX.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  EXPLAIN_ARGS,
3
3
  runExplainCliGunshi
4
- } from "./chunk-O2CQPUSP.js";
4
+ } from "./chunk-4ZE7NBVE.js";
5
5
  import "./chunk-SLUMRYUD.js";
6
6
  import "./chunk-TFBLQUAC.js";
7
7
  import "./chunk-NMVBVKLX.js";
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  ROOT_ARGS
3
- } from "./chunk-P4YNVJUO.js";
4
- import "./chunk-VNVRHWO3.js";
3
+ } from "./chunk-Z2DBOC5X.js";
4
+ import "./chunk-FVN7R2YK.js";
5
5
  import {
6
6
  JA_ARG_DESCRIPTIONS
7
7
  } from "./chunk-MHRO4GU7.js";
8
8
  import {
9
9
  INSTALL_ARGS
10
- } from "./chunk-4O5F7EUJ.js";
10
+ } from "./chunk-2RQRPUCR.js";
11
11
  import "./chunk-MUIOPL5F.js";
12
12
  import "./chunk-M5KM5SV7.js";
13
13
  import "./chunk-SLUMRYUD.js";
14
14
  import "./chunk-TFBLQUAC.js";
15
- import "./chunk-F5P3REI7.js";
15
+ import "./chunk-CTMKTFST.js";
16
16
  import "./chunk-GE7TKVTX.js";
17
17
  import "./chunk-NMVBVKLX.js";
18
18
  export {
package/dist/index.d.ts CHANGED
@@ -231,6 +231,8 @@ interface AnalyzeResult {
231
231
  ruleIds: string[];
232
232
  /** Per-rule, per-declaration counts of places examined, unfiltered by `--diff`/`--baseline`/suppressions. */
233
233
  examined: Record<string, Record<string, number>>;
234
+ /** Ids of rules `runRules` caught throwing — already folded into `config` via `withFailedRulesOff`; exposed separately so a caller with its own base config (the vite dev dashboard) can apply the same correction without adopting this call's `config`. */
235
+ failedRuleIds: string[];
234
236
  /** Non-fatal issues surfaced during analysis: config-file problems (unknown top-level keys, invalid enum values), version-floor notices, `--rules`/overrides conflicts, and skipped-file notices. Empty when none apply. */
235
237
  warnings: string[];
236
238
  /**
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  routeMatcher,
7
7
  run,
8
8
  spinnerEnabled
9
- } from "./chunk-VNVRHWO3.js";
9
+ } from "./chunk-FVN7R2YK.js";
10
10
  import {
11
11
  loadConfigFile
12
12
  } from "./chunk-M5KM5SV7.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  INSTALL_ARGS,
3
3
  runInstallCliGunshi
4
- } from "./chunk-4O5F7EUJ.js";
4
+ } from "./chunk-2RQRPUCR.js";
5
5
  import "./chunk-MUIOPL5F.js";
6
6
  import "./chunk-M5KM5SV7.js";
7
7
  import "./chunk-SLUMRYUD.js";
8
8
  import "./chunk-TFBLQUAC.js";
9
- import "./chunk-F5P3REI7.js";
9
+ import "./chunk-CTMKTFST.js";
10
10
  import "./chunk-GE7TKVTX.js";
11
11
  import "./chunk-NMVBVKLX.js";
12
12
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-vitals",
3
- "version": "0.45.1",
3
+ "version": "0.46.0",
4
4
  "description": "A deterministic SvelteKit code-health scanner (SEO, performance, correctness, security, architecture) — not a runtime Web Vitals reporter.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -52,7 +52,7 @@
52
52
  "magicast": "^0.5.4",
53
53
  "svelte": "^5.56.8",
54
54
  "tinyglobby": "^0.2.17",
55
- "@svelte-vitals/core": "0.41.1"
55
+ "@svelte-vitals/core": "0.42.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@gunshi/docs": "0.37.1",