@jomae/catalog 0.9.0 → 0.10.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.
Files changed (162) hide show
  1. package/dist/baseline.d.ts +41 -2
  2. package/dist/baseline.d.ts.map +1 -1
  3. package/dist/baseline.js +52 -10
  4. package/dist/baseline.js.map +1 -1
  5. package/dist/detect.d.ts +26 -0
  6. package/dist/detect.d.ts.map +1 -1
  7. package/dist/detect.js +27 -1
  8. package/dist/detect.js.map +1 -1
  9. package/dist/generated/baseline-history.d.ts.map +1 -1
  10. package/dist/generated/baseline-history.js +16 -4
  11. package/dist/generated/baseline-history.js.map +1 -1
  12. package/dist/generated/baseline.d.ts.map +1 -1
  13. package/dist/generated/baseline.js +301 -37
  14. package/dist/generated/baseline.js.map +1 -1
  15. package/dist/generated/guides.d.ts.map +1 -1
  16. package/dist/generated/guides.js +22 -3
  17. package/dist/generated/guides.js.map +1 -1
  18. package/dist/generated/sizes.d.ts.map +1 -1
  19. package/dist/generated/sizes.js +284 -29
  20. package/dist/generated/sizes.js.map +1 -1
  21. package/dist/generated/support-claims.d.ts.map +1 -1
  22. package/dist/generated/support-claims.js +28 -3
  23. package/dist/generated/support-claims.js.map +1 -1
  24. package/dist/index.d.ts +3 -2
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +3 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/rules/color-functions.d.ts.map +1 -1
  29. package/dist/rules/color-functions.js +4 -0
  30. package/dist/rules/color-functions.js.map +1 -1
  31. package/dist/rules/container-queries.d.ts.map +1 -1
  32. package/dist/rules/container-queries.js +1 -0
  33. package/dist/rules/container-queries.js.map +1 -1
  34. package/dist/rules/cookie-store.d.ts +3 -0
  35. package/dist/rules/cookie-store.d.ts.map +1 -0
  36. package/dist/rules/cookie-store.js +38 -0
  37. package/dist/rules/cookie-store.js.map +1 -0
  38. package/dist/rules/css-has.d.ts +3 -0
  39. package/dist/rules/css-has.d.ts.map +1 -0
  40. package/dist/rules/css-has.js +35 -0
  41. package/dist/rules/css-has.js.map +1 -0
  42. package/dist/rules/css-nesting.d.ts +3 -0
  43. package/dist/rules/css-nesting.d.ts.map +1 -0
  44. package/dist/rules/css-nesting.js +35 -0
  45. package/dist/rules/css-nesting.js.map +1 -0
  46. package/dist/rules/date-format.d.ts +3 -0
  47. package/dist/rules/date-format.d.ts.map +1 -0
  48. package/dist/rules/date-format.js +33 -0
  49. package/dist/rules/date-format.js.map +1 -0
  50. package/dist/rules/diacritics.d.ts +3 -0
  51. package/dist/rules/diacritics.d.ts.map +1 -0
  52. package/dist/rules/diacritics.js +34 -0
  53. package/dist/rules/diacritics.js.map +1 -0
  54. package/dist/rules/display-names.d.ts.map +1 -1
  55. package/dist/rules/display-names.js +4 -0
  56. package/dist/rules/display-names.js.map +1 -1
  57. package/dist/rules/drag-and-drop.d.ts.map +1 -1
  58. package/dist/rules/drag-and-drop.js +4 -0
  59. package/dist/rules/drag-and-drop.js.map +1 -1
  60. package/dist/rules/fetch.d.ts.map +1 -1
  61. package/dist/rules/fetch.js +4 -0
  62. package/dist/rules/fetch.js.map +1 -1
  63. package/dist/rules/field-sizing.d.ts.map +1 -1
  64. package/dist/rules/field-sizing.js +4 -0
  65. package/dist/rules/field-sizing.js.map +1 -1
  66. package/dist/rules/file-download.d.ts +3 -0
  67. package/dist/rules/file-download.d.ts.map +1 -0
  68. package/dist/rules/file-download.js +40 -0
  69. package/dist/rules/file-download.js.map +1 -0
  70. package/dist/rules/file-drop.d.ts +3 -0
  71. package/dist/rules/file-drop.d.ts.map +1 -0
  72. package/dist/rules/file-drop.js +40 -0
  73. package/dist/rules/file-drop.js.map +1 -0
  74. package/dist/rules/font-loading.d.ts +3 -0
  75. package/dist/rules/font-loading.d.ts.map +1 -0
  76. package/dist/rules/font-loading.js +33 -0
  77. package/dist/rules/font-loading.js.map +1 -0
  78. package/dist/rules/form-validation.d.ts +3 -0
  79. package/dist/rules/form-validation.d.ts.map +1 -0
  80. package/dist/rules/form-validation.js +40 -0
  81. package/dist/rules/form-validation.js.map +1 -0
  82. package/dist/rules/index.d.ts.map +1 -1
  83. package/dist/rules/index.js +34 -0
  84. package/dist/rules/index.js.map +1 -1
  85. package/dist/rules/inert.d.ts.map +1 -1
  86. package/dist/rules/inert.js +2 -0
  87. package/dist/rules/inert.js.map +1 -1
  88. package/dist/rules/jquery.d.ts +3 -0
  89. package/dist/rules/jquery.d.ts.map +1 -0
  90. package/dist/rules/jquery.js +37 -0
  91. package/dist/rules/jquery.js.map +1 -0
  92. package/dist/rules/light-dark.d.ts +3 -0
  93. package/dist/rules/light-dark.d.ts.map +1 -0
  94. package/dist/rules/light-dark.js +37 -0
  95. package/dist/rules/light-dark.js.map +1 -0
  96. package/dist/rules/list-format.d.ts.map +1 -1
  97. package/dist/rules/list-format.js +3 -0
  98. package/dist/rules/list-format.js.map +1 -1
  99. package/dist/rules/match-media.d.ts +3 -0
  100. package/dist/rules/match-media.d.ts.map +1 -0
  101. package/dist/rules/match-media.js +36 -0
  102. package/dist/rules/match-media.js.map +1 -0
  103. package/dist/rules/number-format.d.ts.map +1 -1
  104. package/dist/rules/number-format.js +10 -1
  105. package/dist/rules/number-format.js.map +1 -1
  106. package/dist/rules/passkeys.d.ts +3 -0
  107. package/dist/rules/passkeys.d.ts.map +1 -0
  108. package/dist/rules/passkeys.js +44 -0
  109. package/dist/rules/passkeys.js.map +1 -0
  110. package/dist/rules/plural-rules.d.ts +3 -0
  111. package/dist/rules/plural-rules.d.ts.map +1 -0
  112. package/dist/rules/plural-rules.js +33 -0
  113. package/dist/rules/plural-rules.js.map +1 -0
  114. package/dist/rules/pointer-events.d.ts +3 -0
  115. package/dist/rules/pointer-events.d.ts.map +1 -0
  116. package/dist/rules/pointer-events.js +43 -0
  117. package/dist/rules/pointer-events.js.map +1 -0
  118. package/dist/rules/progress-indicator.d.ts +3 -0
  119. package/dist/rules/progress-indicator.d.ts.map +1 -0
  120. package/dist/rules/progress-indicator.js +39 -0
  121. package/dist/rules/progress-indicator.js.map +1 -0
  122. package/dist/rules/screen-wake-lock.d.ts.map +1 -1
  123. package/dist/rules/screen-wake-lock.js +4 -0
  124. package/dist/rules/screen-wake-lock.js.map +1 -1
  125. package/dist/rules/scroll-into-view.d.ts +3 -0
  126. package/dist/rules/scroll-into-view.d.ts.map +1 -0
  127. package/dist/rules/scroll-into-view.js +38 -0
  128. package/dist/rules/scroll-into-view.js.map +1 -0
  129. package/dist/rules/segmenter.d.ts.map +1 -1
  130. package/dist/rules/segmenter.js +4 -0
  131. package/dist/rules/segmenter.js.map +1 -1
  132. package/dist/rules/select.d.ts.map +1 -1
  133. package/dist/rules/select.js +1 -0
  134. package/dist/rules/select.js.map +1 -1
  135. package/dist/rules/server-sent-events.d.ts.map +1 -1
  136. package/dist/rules/server-sent-events.js +4 -0
  137. package/dist/rules/server-sent-events.js.map +1 -1
  138. package/dist/rules/speculation-rules.d.ts +3 -0
  139. package/dist/rules/speculation-rules.d.ts.map +1 -0
  140. package/dist/rules/speculation-rules.js +35 -0
  141. package/dist/rules/speculation-rules.js.map +1 -0
  142. package/dist/rules/temporal.d.ts +3 -0
  143. package/dist/rules/temporal.d.ts.map +1 -0
  144. package/dist/rules/temporal.js +34 -0
  145. package/dist/rules/temporal.js.map +1 -0
  146. package/dist/rules/url-pattern.d.ts.map +1 -1
  147. package/dist/rules/url-pattern.js +4 -0
  148. package/dist/rules/url-pattern.js.map +1 -1
  149. package/dist/rules/web-animations.d.ts.map +1 -1
  150. package/dist/rules/web-animations.js +4 -0
  151. package/dist/rules/web-animations.js.map +1 -1
  152. package/dist/rules/web-crypto.d.ts.map +1 -1
  153. package/dist/rules/web-crypto.js +4 -0
  154. package/dist/rules/web-crypto.js.map +1 -1
  155. package/dist/rules/web-locks.d.ts.map +1 -1
  156. package/dist/rules/web-locks.js +4 -0
  157. package/dist/rules/web-locks.js.map +1 -1
  158. package/dist/tier-diff.d.ts +55 -0
  159. package/dist/tier-diff.d.ts.map +1 -0
  160. package/dist/tier-diff.js +61 -0
  161. package/dist/tier-diff.js.map +1 -0
  162. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"web-crypto.d.ts","sourceRoot":"","sources":["../../src/rules/web-crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IA+BvB,CAAC"}
1
+ {"version":3,"file":"web-crypto.d.ts","sourceRoot":"","sources":["../../src/rules/web-crypto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,IAmCvB,CAAC"}
@@ -27,6 +27,10 @@ export const webCrypto = {
27
27
  ],
28
28
  snippet: `const bytes = new TextEncoder().encode(text);
29
29
  const digest = await crypto.subtle.digest("SHA-256", bytes);`,
30
+ handRolled: [
31
+ "a session token, nonce or password-reset key built from Math.random(), which is not a cryptographic source and is predictable from earlier outputs",
32
+ "a SHA-256 or HMAC implementation pasted into the project as a single file of bit-shifting helpers",
33
+ ],
30
34
  },
31
35
  };
32
36
  //# sourceMappingURL=web-crypto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-crypto.js","sourceRoot":"","sources":["../../src/rules/web-crypto.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,wBAAwB;IAC/B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC;IACnD,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE;QACL,SAAS,EACP,qbAAqb;QACvb,OAAO,EAAE;;;;;;EAMX;QACE,MAAM,EAAE,+DAA+D;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,8DAA8D;QACpE,MAAM,EAAE;YACN,yJAAyJ;YACzJ,kKAAkK;YAClK,kHAAkH;YAClH,2KAA2K;YAC3K,wJAAwJ;SACzJ;QACD,OAAO,EAAE;6DACgD;KAC1D;CACF,CAAC"}
1
+ {"version":3,"file":"web-crypto.js","sourceRoot":"","sources":["../../src/rules/web-crypto.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,EAAE,EAAE,YAAY;IAChB,KAAK,EAAE,wBAAwB;IAC/B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC;IACnD,UAAU,EAAE,CAAC,kBAAkB,CAAC;IAChC,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE;QACL,SAAS,EACP,qbAAqb;QACvb,OAAO,EAAE;;;;;;EAMX;QACE,MAAM,EAAE,+DAA+D;KACxE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,8DAA8D;QACpE,MAAM,EAAE;YACN,yJAAyJ;YACzJ,kKAAkK;YAClK,kHAAkH;YAClH,2KAA2K;YAC3K,wJAAwJ;SACzJ;QACD,OAAO,EAAE;6DACgD;QACzD,UAAU,EAAE;YACV,oJAAoJ;YACpJ,mGAAmG;SACpG;KACF;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"web-locks.d.ts","sourceRoot":"","sources":["../../src/rules/web-locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IAkCtB,CAAC"}
1
+ {"version":3,"file":"web-locks.d.ts","sourceRoot":"","sources":["../../src/rules/web-locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IAsCtB,CAAC"}
@@ -30,6 +30,10 @@ await navigator.locks.request("cache", { mode: "shared" }, async () => {
30
30
  snippet: `await navigator.locks.request("sync-outbox", async () => {
31
31
  await flushPendingWrites();
32
32
  });`,
33
+ handRolled: [
34
+ "a boolean flag guarding an async section, set before the work and cleared in a finally",
35
+ "a promise chained onto the previous one in a module-level variable, so calls run one at a time",
36
+ ],
33
37
  },
34
38
  };
35
39
  //# sourceMappingURL=web-locks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-locks.js","sourceRoot":"","sources":["../../src/rules/web-locks.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,+BAA+B;IACtC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC;IAC9D,UAAU,EAAE,CAAC,WAAW,CAAC;IACzB,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE;QACL,SAAS,EACP,4cAA4c;QAC9c,OAAO,EAAE;;;;;;;IAOT;QACA,MAAM,EAAE,gEAAgE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,2EAA2E;QACjF,MAAM,EAAE;YACN,8LAA8L;YAC9L,iSAAiS;YACjS,4JAA4J;YAC5J,4LAA4L;YAC5L,+TAA+T;YAC/T,mMAAmM;SACpM;QACD,OAAO,EAAE;;IAET;KACD;CACF,CAAC"}
1
+ {"version":3,"file":"web-locks.js","sourceRoot":"","sources":["../../src/rules/web-locks.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,+BAA+B;IACtC,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC;IAC9D,UAAU,EAAE,CAAC,WAAW,CAAC;IACzB,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE;QACL,SAAS,EACP,4cAA4c;QAC9c,OAAO,EAAE;;;;;;;IAOT;QACA,MAAM,EAAE,gEAAgE;KACzE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,2EAA2E;QACjF,MAAM,EAAE;YACN,8LAA8L;YAC9L,iSAAiS;YACjS,4JAA4J;YAC5J,4LAA4L;YAC5L,+TAA+T;YAC/T,mMAAmM;SACpM;QACD,OAAO,EAAE;;IAET;QACA,UAAU,EAAE;YACV,wFAAwF;YACxF,gGAAgG;SACjG;KACF;CACF,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { BaselineStatus } from "./schema.ts";
2
+ /**
3
+ * Compares two Baseline snapshots and says which rules changed tier.
4
+ *
5
+ * Pure, and deliberately takes plain maps rather than reaching for
6
+ * `web-features` itself: the caller holds the committed snapshot and the live
7
+ * package, and this only has to know how to subtract one from the other. That
8
+ * keeps it inside the same purity walk as the rest of the catalog and makes
9
+ * it testable without a network or a filesystem.
10
+ */
11
+ /** The shape both the committed snapshot and web-features agree on. */
12
+ export interface TierEntry {
13
+ baseline: "high" | "low" | false;
14
+ }
15
+ /** web-features' own shape, named so callers need no positional cast. */
16
+ export type LiveFeatures = Readonly<Record<string, {
17
+ status?: {
18
+ baseline?: "high" | "low" | false;
19
+ };
20
+ }>>;
21
+ export type TierDirection = "promotion" | "regression" | "missing";
22
+ interface TierChangeBase {
23
+ ruleId: string;
24
+ featureId: string;
25
+ from: BaselineStatus;
26
+ }
27
+ /**
28
+ * A discriminated union rather than a nullable `to`, because "gone from the
29
+ * live data" has no destination tier and a shared shape forces every consumer
30
+ * to write a null branch it can never reach. Narrowing on `direction` hands
31
+ * the report builder a `to` it can print without checking.
32
+ */
33
+ export type TierChange = (TierChangeBase & {
34
+ direction: "promotion" | "regression";
35
+ to: BaselineStatus;
36
+ }) | (TierChangeBase & {
37
+ direction: "missing";
38
+ });
39
+ export declare function tierOf(baseline: "high" | "low" | false | undefined): BaselineStatus;
40
+ /**
41
+ * Every tier move among the features some rule actually requires.
42
+ *
43
+ * A feature present in the committed snapshot and absent from the live data
44
+ * is reported as `missing` rather than skipped. That is what an upstream
45
+ * rename looks like, and skipping it would drop the one case most likely to
46
+ * need a person: the rule keeps rendering a tier from a feature ID that no
47
+ * longer exists, and `check:freshness` only fails once the snapshot is
48
+ * regenerated without it.
49
+ */
50
+ export declare function diffTiers(rules: readonly {
51
+ id: string;
52
+ featureIds: readonly string[];
53
+ }[], committed: Readonly<Record<string, TierEntry>>, live: LiveFeatures): TierChange[];
54
+ export {};
55
+ //# sourceMappingURL=tier-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier-diff.d.ts","sourceRoot":"","sources":["../src/tier-diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;GAQG;AAEH,uEAAuE;AACvE,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;CAClC;AAED,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC,MAAM,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAA;KAAE,CAAA;CAAE,CAAC,CACnE,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAEnE,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAClB,CAAC,cAAc,GAAG;IAChB,SAAS,EAAE,WAAW,GAAG,YAAY,CAAC;IACtC,EAAE,EAAE,cAAc,CAAC;CACpB,CAAC,GACF,CAAC,cAAc,GAAG;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAUhD,wBAAgB,MAAM,CACpB,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,GAC3C,cAAc,CAKhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,EAC/D,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAC9C,IAAI,EAAE,YAAY,GACjB,UAAU,EAAE,CAMd"}
@@ -0,0 +1,61 @@
1
+ /** Higher is better supported, so a rise in rank is a promotion. */
2
+ const RANK = {
3
+ unknown: 0,
4
+ limited: 1,
5
+ newly: 2,
6
+ widely: 3,
7
+ };
8
+ export function tierOf(baseline) {
9
+ if (baseline === "high")
10
+ return "widely";
11
+ if (baseline === "low")
12
+ return "newly";
13
+ if (baseline === false)
14
+ return "limited";
15
+ return "unknown";
16
+ }
17
+ /**
18
+ * Every tier move among the features some rule actually requires.
19
+ *
20
+ * A feature present in the committed snapshot and absent from the live data
21
+ * is reported as `missing` rather than skipped. That is what an upstream
22
+ * rename looks like, and skipping it would drop the one case most likely to
23
+ * need a person: the rule keeps rendering a tier from a feature ID that no
24
+ * longer exists, and `check:freshness` only fails once the snapshot is
25
+ * regenerated without it.
26
+ */
27
+ export function diffTiers(rules, committed, live) {
28
+ return rules.flatMap((rule) => rule.featureIds
29
+ .map((featureId) => compare(rule.id, featureId, committed, live))
30
+ .filter((change) => change !== null));
31
+ }
32
+ /** One feature of one rule, or null when there is nothing to report. */
33
+ function compare(ruleId, featureId, committed, live) {
34
+ // One lookup each, rather than a presence check plus a cast undoing what
35
+ // the check established. Neither the generated snapshot nor web-features
36
+ // sets a key to an explicit undefined, so the two read the same.
37
+ const entry = committed[featureId];
38
+ if (entry === undefined)
39
+ return null;
40
+ const from = tierOf(entry.baseline);
41
+ const liveEntry = live[featureId];
42
+ if (liveEntry === undefined) {
43
+ return { ruleId, featureId, direction: "missing", from };
44
+ }
45
+ // `?? false` to match how refresh-baseline.ts writes the snapshot. A
46
+ // feature web-features publishes with no status at all, masonry today,
47
+ // becomes `false` there and would read as `unknown` here, so the two
48
+ // disagreed by construction and the report opened with a regression that
49
+ // was never real. Read it the same way the writer does.
50
+ const to = tierOf(liveEntry.status?.baseline ?? false);
51
+ if (to === from)
52
+ return null;
53
+ return {
54
+ ruleId,
55
+ featureId,
56
+ direction: RANK[to] > RANK[from] ? "promotion" : "regression",
57
+ from,
58
+ to,
59
+ };
60
+ }
61
+ //# sourceMappingURL=tier-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier-diff.js","sourceRoot":"","sources":["../src/tier-diff.ts"],"names":[],"mappings":"AA2CA,oEAAoE;AACpE,MAAM,IAAI,GAAmC;IAC3C,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,UAAU,MAAM,CACpB,QAA4C;IAE5C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,QAAQ,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,KAA+D,EAC/D,SAA8C,EAC9C,IAAkB;IAElB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,IAAI,CAAC,UAAU;SACZ,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;SAChE,MAAM,CAAC,CAAC,MAAM,EAAwB,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAC7D,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAS,OAAO,CACd,MAAc,EACd,SAAiB,EACjB,SAA8C,EAC9C,IAAkB;IAElB,yEAAyE;IACzE,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,qEAAqE;IACrE,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAC,CAAC;IACvD,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE7B,OAAO;QACL,MAAM;QACN,SAAS;QACT,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;QAC7D,IAAI;QACJ,EAAE;KACH,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jomae/catalog",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "description": "The rule catalog behind youmightnotneed. Maps npm packages to the CSS, HTML, or Web API that replaces them.",
6
6
  "license": "MIT",