svelte-vitals 0.31.0 → 0.32.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
@@ -9,7 +9,7 @@ import {
9
9
  readCoreVersion,
10
10
  readPackageVersion,
11
11
  run
12
- } from "./chunk-3YO2A3YF.js";
12
+ } from "./chunk-CWCO6A5B.js";
13
13
 
14
14
  // src/bin.ts
15
15
  import mri3 from "mri";
@@ -341,6 +341,12 @@ function isConfigTargetId(id) {
341
341
  return CONFIG_TARGETS.some((t) => t.id === id);
342
342
  }
343
343
 
344
+ // src/ci/action-pin-comment.ts
345
+ function actionPinComment(version) {
346
+ return `action-v${version}`;
347
+ }
348
+ var ACTION_PIN_COMMENT_RE = /#\s*(?:action-v|@svelte-vitals\/action@)(\S+)/;
349
+
344
350
  // src/ci/workflow.ts
345
351
  var WORKFLOW_PATH = ".github/workflows/svelte-vitals.yml";
346
352
  var CHECKOUT_SHA = "9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0";
@@ -371,7 +377,7 @@ function buildWorkflowYaml(opts) {
371
377
  ` - uses: actions/checkout@${CHECKOUT_SHA} # ${CHECKOUT_VERSION}`,
372
378
  " with:",
373
379
  " fetch-depth: 0",
374
- ` - uses: oekazuma/svelte-vitals/packages/action@${actionSha} # @svelte-vitals/action@${actionVersion}`,
380
+ ` - uses: oekazuma/svelte-vitals/packages/action@${actionSha} # ${actionPinComment(actionVersion)}`,
375
381
  " with:",
376
382
  " diff: origin/${{ github.base_ref }}",
377
383
  " baseline: origin/${{ github.base_ref }}",
@@ -998,8 +1004,8 @@ function readInstalledViteVersion(io) {
998
1004
  }
999
1005
 
1000
1006
  // src/ci/action-pin.generated.ts
1001
- var ACTION_SHA = "4625e1a6266d99282463c8882bbd600b14123d92";
1002
- var ACTION_VERSION = "0.3.6";
1007
+ var ACTION_SHA = "a3af7b5cdb026fc3f6e685b87e964b5190583960";
1008
+ var ACTION_VERSION = "0.3.8";
1003
1009
 
1004
1010
  // src/install/index.ts
1005
1011
  function detectPackageManagerNear(io, appDir) {
@@ -1572,6 +1578,7 @@ import mri2 from "mri";
1572
1578
 
1573
1579
  // src/ci/upgrade.ts
1574
1580
  var ACTION_USES_LINE = /^(?<indent>\s*-\s*uses:\s*(?:&\S+\s+)?oekazuma\/svelte-vitals\/packages\/action@)(?<ref>[^\s#]+)(?<comment>\s*#.*)?$/;
1581
+ var LEGACY_COMMENT = /#\s*@svelte-vitals\/action@/;
1575
1582
  function upgradeActionPin(content, sha, version) {
1576
1583
  const lines = content.split("\n");
1577
1584
  let replaced = 0;
@@ -1583,13 +1590,15 @@ function upgradeActionPin(content, sha, version) {
1583
1590
  if (!match || !match.groups) return line;
1584
1591
  const { indent: indent2, ref } = match.groups;
1585
1592
  if (indent2 === void 0 || ref === void 0) return line;
1586
- if (ref === sha) return line;
1593
+ const comment = match.groups.comment ?? "";
1594
+ const commentMatch = ACTION_PIN_COMMENT_RE.exec(comment);
1595
+ const isCanonicalComment = commentMatch !== null && !LEGACY_COMMENT.test(comment);
1596
+ if (ref === sha && isCanonicalComment) return line;
1587
1597
  if (from === void 0) {
1588
- const commentMatch = /#\s*@svelte-vitals\/action@(\S+)/.exec(match.groups.comment ?? "");
1589
1598
  from = commentMatch ? commentMatch[1] : ref.slice(0, 7);
1590
1599
  }
1591
1600
  replaced += 1;
1592
- return `${indent2}${sha} # @svelte-vitals/action@${version}${eol}`;
1601
+ return `${indent2}${sha} # ${actionPinComment(version)}${eol}`;
1593
1602
  });
1594
1603
  if (replaced === 0) {
1595
1604
  const hasAnyReference = lines.some((line) => ACTION_USES_LINE.test(line.endsWith("\r") ? line.slice(0, -1) : line));
@@ -63,6 +63,38 @@ var ProjectError = class extends Error {
63
63
  }
64
64
  };
65
65
  var ROUTES_DIR = "src/routes";
66
+ var MIN_SVELTE_MAJOR = 5;
67
+ var MIN_KIT_MAJOR = 2;
68
+ function leadingMajor(range) {
69
+ const m = range ? /^(?:[\^~]|>=|<=|>|<|=)?\s*(\d+)/.exec(range.trim()) : null;
70
+ return m ? Number(m[1]) : void 0;
71
+ }
72
+ async function checkVersionFloor(rt, cwd) {
73
+ const pkgPath = rt.join(cwd, "package.json");
74
+ if (!await rt.exists(pkgPath)) return [];
75
+ let pkg;
76
+ try {
77
+ pkg = JSON.parse(await rt.readFile(pkgPath));
78
+ } catch {
79
+ return [];
80
+ }
81
+ const warnings = [];
82
+ const svelteRange = pkg.dependencies?.svelte ?? pkg.devDependencies?.svelte;
83
+ const svelteMajor = leadingMajor(svelteRange);
84
+ if (svelteMajor !== void 0 && svelteMajor < MIN_SVELTE_MAJOR) {
85
+ warnings.push(
86
+ `this project declares svelte "${svelteRange}", but rules assume Svelte ${MIN_SVELTE_MAJOR}+ (runes) \u2014 findings may miss the legacy (export let / $:) equivalent of runes-only checks.`
87
+ );
88
+ }
89
+ const kitRange = pkg.dependencies?.["@sveltejs/kit"] ?? pkg.devDependencies?.["@sveltejs/kit"];
90
+ const kitMajor = leadingMajor(kitRange);
91
+ if (kitMajor !== void 0 && kitMajor < MIN_KIT_MAJOR) {
92
+ warnings.push(
93
+ `this project declares @sveltejs/kit "${kitRange}", but rules assume SvelteKit ${MIN_KIT_MAJOR}+ \u2014 some checks may not apply.`
94
+ );
95
+ }
96
+ return warnings;
97
+ }
66
98
  async function detectProject(rt, cwd) {
67
99
  const pkgPath = rt.join(cwd, "package.json");
68
100
  let hasKitDep = false;
@@ -1376,7 +1408,6 @@ async function analyzeProject(opts = {}) {
1376
1408
  const rt = createNodeRuntime();
1377
1409
  const loaded = await loadConfigFile(cwd);
1378
1410
  const file = loaded?.config;
1379
- const warnings = loaded?.warnings ?? [];
1380
1411
  const weights = opts.weights ?? file?.weights;
1381
1412
  const config = defineConfig({
1382
1413
  treatDynamicAs: opts.treatDynamicAs ?? file?.treatDynamicAs ?? "pass",
@@ -1387,6 +1418,7 @@ async function analyzeProject(opts = {}) {
1387
1418
  ...file?.overrides !== void 0 ? { overrides: file.overrides } : {}
1388
1419
  });
1389
1420
  await detectProject(rt, cwd);
1421
+ const warnings = [...loaded?.warnings ?? [], ...await checkVersionFloor(rt, cwd)];
1390
1422
  const matches = routeMatcher(opts.route);
1391
1423
  const collected = await collectRoutes(rt, cwd, config, opts.parseCache);
1392
1424
  const heads = collected.heads.filter((h) => matches(h.route));
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  routeMatcher,
11
11
  run,
12
12
  spinnerEnabled
13
- } from "./chunk-3YO2A3YF.js";
13
+ } from "./chunk-CWCO6A5B.js";
14
14
  export {
15
15
  ProjectError,
16
16
  analyzeProject,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-vitals",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "description": "A SvelteKit SEO checker — not a runtime Web Vitals reporter. Static analysis of your routes' head metadata.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -46,7 +46,7 @@
46
46
  "smol-toml": "^1.7.0",
47
47
  "svelte": "^5.56.6",
48
48
  "tinyglobby": "^0.2.17",
49
- "@svelte-vitals/core": "0.28.0"
49
+ "@svelte-vitals/core": "0.29.0"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/estree": "^1.0.9",