@jomae/catalog 0.3.0 → 0.6.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 (257) hide show
  1. package/README.md +21 -3
  2. package/dist/baseline.d.ts +36 -0
  3. package/dist/baseline.d.ts.map +1 -1
  4. package/dist/baseline.js +75 -2
  5. package/dist/baseline.js.map +1 -1
  6. package/dist/categories.d.ts +20 -0
  7. package/dist/categories.d.ts.map +1 -0
  8. package/dist/categories.js +62 -0
  9. package/dist/categories.js.map +1 -0
  10. package/dist/detect.d.ts +2 -1
  11. package/dist/detect.d.ts.map +1 -1
  12. package/dist/detect.js +17 -2
  13. package/dist/detect.js.map +1 -1
  14. package/dist/format.js +1 -1
  15. package/dist/format.js.map +1 -1
  16. package/dist/generated/baseline-history.d.ts +21 -0
  17. package/dist/generated/baseline-history.d.ts.map +1 -0
  18. package/dist/generated/baseline-history.js +20 -0
  19. package/dist/generated/baseline-history.js.map +1 -0
  20. package/dist/generated/baseline.d.ts +16 -0
  21. package/dist/generated/baseline.d.ts.map +1 -1
  22. package/dist/generated/baseline.js +683 -44
  23. package/dist/generated/baseline.js.map +1 -1
  24. package/dist/generated/guides.d.ts +16 -0
  25. package/dist/generated/guides.d.ts.map +1 -0
  26. package/dist/generated/guides.js +153 -0
  27. package/dist/generated/guides.js.map +1 -0
  28. package/dist/generated/sizes.d.ts.map +1 -1
  29. package/dist/generated/sizes.js +683 -48
  30. package/dist/generated/sizes.js.map +1 -1
  31. package/dist/generated/support-claims.d.ts +15 -0
  32. package/dist/generated/support-claims.d.ts.map +1 -0
  33. package/dist/generated/support-claims.js +69 -0
  34. package/dist/generated/support-claims.js.map +1 -0
  35. package/dist/guides.d.ts +46 -0
  36. package/dist/guides.d.ts.map +1 -0
  37. package/dist/guides.js +55 -0
  38. package/dist/guides.js.map +1 -0
  39. package/dist/history.d.ts +11 -0
  40. package/dist/history.d.ts.map +1 -0
  41. package/dist/history.js +14 -0
  42. package/dist/history.js.map +1 -0
  43. package/dist/index.d.ts +5 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +5 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/rules/abort-controller.d.ts +3 -0
  48. package/dist/rules/abort-controller.d.ts.map +1 -0
  49. package/dist/rules/abort-controller.js +26 -0
  50. package/dist/rules/abort-controller.js.map +1 -0
  51. package/dist/rules/accordion.d.ts.map +1 -1
  52. package/dist/rules/accordion.js +3 -0
  53. package/dist/rules/accordion.js.map +1 -1
  54. package/dist/rules/array-grouping.d.ts +3 -0
  55. package/dist/rules/array-grouping.d.ts.map +1 -0
  56. package/dist/rules/array-grouping.js +29 -0
  57. package/dist/rules/array-grouping.js.map +1 -0
  58. package/dist/rules/aspect-ratio.d.ts.map +1 -1
  59. package/dist/rules/aspect-ratio.js +1 -0
  60. package/dist/rules/aspect-ratio.js.map +1 -1
  61. package/dist/rules/base64.d.ts +3 -0
  62. package/dist/rules/base64.d.ts.map +1 -0
  63. package/dist/rules/base64.js +41 -0
  64. package/dist/rules/base64.js.map +1 -0
  65. package/dist/rules/broadcast-channel.d.ts +3 -0
  66. package/dist/rules/broadcast-channel.d.ts.map +1 -0
  67. package/dist/rules/broadcast-channel.js +26 -0
  68. package/dist/rules/broadcast-channel.js.map +1 -0
  69. package/dist/rules/carousel.d.ts.map +1 -1
  70. package/dist/rules/carousel.js +10 -0
  71. package/dist/rules/carousel.js.map +1 -1
  72. package/dist/rules/clipboard.d.ts +3 -0
  73. package/dist/rules/clipboard.d.ts.map +1 -0
  74. package/dist/rules/clipboard.js +35 -0
  75. package/dist/rules/clipboard.js.map +1 -0
  76. package/dist/rules/color-functions.d.ts.map +1 -1
  77. package/dist/rules/color-functions.js +9 -1
  78. package/dist/rules/color-functions.js.map +1 -1
  79. package/dist/rules/compression-streams.d.ts +3 -0
  80. package/dist/rules/compression-streams.d.ts.map +1 -0
  81. package/dist/rules/compression-streams.js +26 -0
  82. package/dist/rules/compression-streams.js.map +1 -0
  83. package/dist/rules/container-queries.d.ts.map +1 -1
  84. package/dist/rules/container-queries.js +3 -0
  85. package/dist/rules/container-queries.js.map +1 -1
  86. package/dist/rules/content-visibility.d.ts.map +1 -1
  87. package/dist/rules/content-visibility.js +11 -2
  88. package/dist/rules/content-visibility.js.map +1 -1
  89. package/dist/rules/custom-highlight.d.ts +3 -0
  90. package/dist/rules/custom-highlight.d.ts.map +1 -0
  91. package/dist/rules/custom-highlight.js +39 -0
  92. package/dist/rules/custom-highlight.js.map +1 -0
  93. package/dist/rules/date-time-input.d.ts.map +1 -1
  94. package/dist/rules/date-time-input.js +4 -0
  95. package/dist/rules/date-time-input.js.map +1 -1
  96. package/dist/rules/dialog.d.ts.map +1 -1
  97. package/dist/rules/dialog.js +11 -0
  98. package/dist/rules/dialog.js.map +1 -1
  99. package/dist/rules/discrete-transitions.d.ts.map +1 -1
  100. package/dist/rules/discrete-transitions.js +6 -0
  101. package/dist/rules/discrete-transitions.js.map +1 -1
  102. package/dist/rules/drag-and-drop.d.ts +3 -0
  103. package/dist/rules/drag-and-drop.d.ts.map +1 -0
  104. package/dist/rules/drag-and-drop.js +47 -0
  105. package/dist/rules/drag-and-drop.js.map +1 -0
  106. package/dist/rules/duration-format.d.ts +3 -0
  107. package/dist/rules/duration-format.d.ts.map +1 -0
  108. package/dist/rules/duration-format.js +37 -0
  109. package/dist/rules/duration-format.js.map +1 -0
  110. package/dist/rules/event-target.d.ts +3 -0
  111. package/dist/rules/event-target.d.ts.map +1 -0
  112. package/dist/rules/event-target.js +51 -0
  113. package/dist/rules/event-target.js.map +1 -0
  114. package/dist/rules/fetch.d.ts +3 -0
  115. package/dist/rules/fetch.d.ts.map +1 -0
  116. package/dist/rules/fetch.js +46 -0
  117. package/dist/rules/fetch.js.map +1 -0
  118. package/dist/rules/field-sizing.d.ts.map +1 -1
  119. package/dist/rules/field-sizing.js +10 -2
  120. package/dist/rules/field-sizing.js.map +1 -1
  121. package/dist/rules/fluid-type.d.ts.map +1 -1
  122. package/dist/rules/fluid-type.js +3 -1
  123. package/dist/rules/fluid-type.js.map +1 -1
  124. package/dist/rules/focus-visible.d.ts +3 -0
  125. package/dist/rules/focus-visible.d.ts.map +1 -0
  126. package/dist/rules/focus-visible.js +27 -0
  127. package/dist/rules/focus-visible.js.map +1 -0
  128. package/dist/rules/fullscreen.d.ts +3 -0
  129. package/dist/rules/fullscreen.d.ts.map +1 -0
  130. package/dist/rules/fullscreen.js +29 -0
  131. package/dist/rules/fullscreen.js.map +1 -0
  132. package/dist/rules/height-animation.d.ts.map +1 -1
  133. package/dist/rules/height-animation.js +2 -0
  134. package/dist/rules/height-animation.js.map +1 -1
  135. package/dist/rules/index.d.ts.map +1 -1
  136. package/dist/rules/index.js +102 -3
  137. package/dist/rules/index.js.map +1 -1
  138. package/dist/rules/inert.d.ts +3 -0
  139. package/dist/rules/inert.d.ts.map +1 -0
  140. package/dist/rules/inert.js +37 -0
  141. package/dist/rules/inert.js.map +1 -0
  142. package/dist/rules/intersection-observer.d.ts +3 -0
  143. package/dist/rules/intersection-observer.d.ts.map +1 -0
  144. package/dist/rules/intersection-observer.js +36 -0
  145. package/dist/rules/intersection-observer.js.map +1 -0
  146. package/dist/rules/lazy-loading.d.ts.map +1 -1
  147. package/dist/rules/lazy-loading.js +4 -0
  148. package/dist/rules/lazy-loading.js.map +1 -1
  149. package/dist/rules/line-clamp.d.ts +3 -0
  150. package/dist/rules/line-clamp.d.ts.map +1 -0
  151. package/dist/rules/line-clamp.js +39 -0
  152. package/dist/rules/line-clamp.js.map +1 -0
  153. package/dist/rules/masonry.d.ts.map +1 -1
  154. package/dist/rules/masonry.js +3 -0
  155. package/dist/rules/masonry.js.map +1 -1
  156. package/dist/rules/natural-sort.d.ts +3 -0
  157. package/dist/rules/natural-sort.d.ts.map +1 -0
  158. package/dist/rules/natural-sort.js +41 -0
  159. package/dist/rules/natural-sort.js.map +1 -0
  160. package/dist/rules/number-format.d.ts +3 -0
  161. package/dist/rules/number-format.d.ts.map +1 -0
  162. package/dist/rules/number-format.js +27 -0
  163. package/dist/rules/number-format.js.map +1 -0
  164. package/dist/rules/page-visibility.d.ts +3 -0
  165. package/dist/rules/page-visibility.d.ts.map +1 -0
  166. package/dist/rules/page-visibility.js +29 -0
  167. package/dist/rules/page-visibility.js.map +1 -0
  168. package/dist/rules/popover.d.ts.map +1 -1
  169. package/dist/rules/popover.js +10 -1
  170. package/dist/rules/popover.js.map +1 -1
  171. package/dist/rules/random-uuid.d.ts +3 -0
  172. package/dist/rules/random-uuid.d.ts.map +1 -0
  173. package/dist/rules/random-uuid.js +31 -0
  174. package/dist/rules/random-uuid.js.map +1 -0
  175. package/dist/rules/relative-time.d.ts +3 -0
  176. package/dist/rules/relative-time.d.ts.map +1 -0
  177. package/dist/rules/relative-time.js +24 -0
  178. package/dist/rules/relative-time.js.map +1 -0
  179. package/dist/rules/resizable-panels.d.ts.map +1 -1
  180. package/dist/rules/resizable-panels.js +4 -2
  181. package/dist/rules/resizable-panels.js.map +1 -1
  182. package/dist/rules/resize-observer.d.ts +3 -0
  183. package/dist/rules/resize-observer.d.ts.map +1 -0
  184. package/dist/rules/resize-observer.js +28 -0
  185. package/dist/rules/resize-observer.js.map +1 -0
  186. package/dist/rules/screen-wake-lock.d.ts +3 -0
  187. package/dist/rules/screen-wake-lock.d.ts.map +1 -0
  188. package/dist/rules/screen-wake-lock.js +25 -0
  189. package/dist/rules/screen-wake-lock.js.map +1 -0
  190. package/dist/rules/scroll-animations.d.ts.map +1 -1
  191. package/dist/rules/scroll-animations.js +9 -1
  192. package/dist/rules/scroll-animations.js.map +1 -1
  193. package/dist/rules/scroll-lock.d.ts.map +1 -1
  194. package/dist/rules/scroll-lock.js +8 -7
  195. package/dist/rules/scroll-lock.js.map +1 -1
  196. package/dist/rules/scrollbars.d.ts.map +1 -1
  197. package/dist/rules/scrollbars.js +8 -0
  198. package/dist/rules/scrollbars.js.map +1 -1
  199. package/dist/rules/select.d.ts.map +1 -1
  200. package/dist/rules/select.js +17 -1
  201. package/dist/rules/select.js.map +1 -1
  202. package/dist/rules/server-sent-events.d.ts +3 -0
  203. package/dist/rules/server-sent-events.d.ts.map +1 -0
  204. package/dist/rules/server-sent-events.js +38 -0
  205. package/dist/rules/server-sent-events.js.map +1 -0
  206. package/dist/rules/smooth-scroll.d.ts.map +1 -1
  207. package/dist/rules/smooth-scroll.js +3 -0
  208. package/dist/rules/smooth-scroll.js.map +1 -1
  209. package/dist/rules/speech-recognition.d.ts +3 -0
  210. package/dist/rules/speech-recognition.d.ts.map +1 -0
  211. package/dist/rules/speech-recognition.js +36 -0
  212. package/dist/rules/speech-recognition.js.map +1 -0
  213. package/dist/rules/speech-synthesis.d.ts +3 -0
  214. package/dist/rules/speech-synthesis.d.ts.map +1 -0
  215. package/dist/rules/speech-synthesis.js +25 -0
  216. package/dist/rules/speech-synthesis.js.map +1 -0
  217. package/dist/rules/sticky.d.ts.map +1 -1
  218. package/dist/rules/sticky.js +4 -0
  219. package/dist/rules/sticky.js.map +1 -1
  220. package/dist/rules/structured-clone.d.ts +3 -0
  221. package/dist/rules/structured-clone.d.ts.map +1 -0
  222. package/dist/rules/structured-clone.js +32 -0
  223. package/dist/rules/structured-clone.js.map +1 -0
  224. package/dist/rules/text-box-trim.d.ts.map +1 -1
  225. package/dist/rules/text-box-trim.js +3 -1
  226. package/dist/rules/text-box-trim.js.map +1 -1
  227. package/dist/rules/text-wrap-balance.d.ts.map +1 -1
  228. package/dist/rules/text-wrap-balance.js +2 -0
  229. package/dist/rules/text-wrap-balance.js.map +1 -1
  230. package/dist/rules/url-search-params.d.ts +3 -0
  231. package/dist/rules/url-search-params.d.ts.map +1 -0
  232. package/dist/rules/url-search-params.js +42 -0
  233. package/dist/rules/url-search-params.js.map +1 -0
  234. package/dist/rules/view-transitions.d.ts.map +1 -1
  235. package/dist/rules/view-transitions.js +9 -0
  236. package/dist/rules/view-transitions.js.map +1 -1
  237. package/dist/rules/web-bluetooth.d.ts +3 -0
  238. package/dist/rules/web-bluetooth.d.ts.map +1 -0
  239. package/dist/rules/web-bluetooth.js +26 -0
  240. package/dist/rules/web-bluetooth.js.map +1 -0
  241. package/dist/rules/web-crypto.d.ts +3 -0
  242. package/dist/rules/web-crypto.d.ts.map +1 -0
  243. package/dist/rules/web-crypto.js +32 -0
  244. package/dist/rules/web-crypto.js.map +1 -0
  245. package/dist/rules/web-share.d.ts +3 -0
  246. package/dist/rules/web-share.d.ts.map +1 -0
  247. package/dist/rules/web-share.js +28 -0
  248. package/dist/rules/web-share.js.map +1 -0
  249. package/dist/schema.d.ts +22 -0
  250. package/dist/schema.d.ts.map +1 -1
  251. package/dist/schema.js +64 -5
  252. package/dist/schema.js.map +1 -1
  253. package/dist/support.d.ts +11 -0
  254. package/dist/support.d.ts.map +1 -0
  255. package/dist/support.js +31 -0
  256. package/dist/support.js.map +1 -0
  257. package/package.json +2 -2
package/dist/schema.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { categorySchema } from "./categories.js";
2
3
  /**
3
4
  * Bumped whenever the shape of a rule changes in a way that breaks consumers.
4
5
  * Published alongside the catalog so downstream surfaces can refuse data they
@@ -19,7 +20,36 @@ export const baselineStatusSchema = z.enum([
19
20
  ]);
20
21
  const isoDate = z
21
22
  .string()
22
- .regex(/^\d{4}-\d{2}-\d{2}$/, "expected an ISO date, YYYY-MM-DD");
23
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "expected an ISO date, YYYY-MM-DD")
24
+ // Shape alone is not enough: "2026-99-99" matches the regex, and
25
+ // check-freshness then computes NaN days of age, which is never greater
26
+ // than the limit. A typo would make a hand-verified claim immortal.
27
+ //
28
+ // Checked arithmetically rather than with Date, because the purity test
29
+ // bans constructing one anywhere detect() can reach.
30
+ .refine((value) => {
31
+ const year = Number(value.slice(0, 4));
32
+ const month = Number(value.slice(5, 7));
33
+ const day = Number(value.slice(8, 10));
34
+ if (month < 1 || month > 12 || day < 1)
35
+ return false;
36
+ const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
37
+ const lengths = [
38
+ 31,
39
+ leap ? 29 : 28,
40
+ 31,
41
+ 30,
42
+ 31,
43
+ 30,
44
+ 31,
45
+ 31,
46
+ 30,
47
+ 31,
48
+ 30,
49
+ 31,
50
+ ];
51
+ return day <= lengths[month - 1];
52
+ }, "expected a real calendar date");
23
53
  const slug = z
24
54
  .string()
25
55
  .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "expected a lowercase kebab-case slug");
@@ -27,6 +57,10 @@ const slug = z
27
57
  const packageName = z
28
58
  .string()
29
59
  .regex(/^(?:@[a-z0-9][a-z0-9-._]*\/)?[a-z0-9][a-z0-9-._]*$/, "expected a lowercase npm package name");
60
+ /** Rendered as a link on every surface, so nothing but https gets in. */
61
+ const httpsUrl = z
62
+ .url()
63
+ .refine((value) => value.startsWith("https://"), "expected an https URL");
30
64
  /**
31
65
  * Escape hatch for features that web-features has no ID for yet. Carries the
32
66
  * date it was checked by hand so `scripts/check-freshness.ts` can fail CI once
@@ -44,6 +78,8 @@ export const ruleSchema = z
44
78
  id: slug,
45
79
  /** Short human label, e.g. "Carousels". */
46
80
  title: z.string().min(1),
81
+ /** Which entry in packages/catalog/src/categories.ts this rule belongs to. */
82
+ category: categorySchema,
47
83
  /** npm packages this rule can replace. Exact names, lowercase. */
48
84
  replaces: z.array(packageName).min(1),
49
85
  /**
@@ -54,18 +90,22 @@ export const ruleSchema = z
54
90
  * Call those out in `agent.unless` instead. Empty only when
55
91
  * `manualBaseline` is supplied.
56
92
  */
57
- featureIds: z.array(z.string().min(1)),
93
+ featureIds: z
94
+ .array(z
95
+ .string()
96
+ .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "expected a lowercase web-features ID"))
97
+ .refine((ids) => new Set(ids).size === ids.length, "a feature may only be listed once"),
58
98
  /** The native approach, one line. */
59
99
  native: z.string().min(1),
60
100
  human: z.object({
61
101
  /** 2 to 4 sentences of prose. */
62
102
  explainer: z.string().min(1),
63
- /** Copy-pasteable CSS or HTML. */
103
+ /** Copy-pasteable CSS, HTML, or JavaScript. */
64
104
  snippet: z.string().min(1),
65
105
  /** A live demo or a post that walks through it. */
66
- demoUrl: z.url().optional(),
106
+ demoUrl: httpsUrl.optional(),
67
107
  /** The MDN reference page for the native feature. */
68
- mdnUrl: z.url().optional(),
108
+ mdnUrl: httpsUrl.optional(),
69
109
  }),
70
110
  /** Terse projection for LLM surfaces. Budget roughly 200 tokens. */
71
111
  agent: z.object({
@@ -81,6 +121,15 @@ export const ruleSchema = z
81
121
  .min(1, "every rule must state when the dependency is still correct"),
82
122
  snippet: z.string().min(1),
83
123
  }),
124
+ /**
125
+ * IDs of GoogleChrome/modern-web-guidance guides that cover the
126
+ * implementation in depth. Their guides are keyed by use case, ours by
127
+ * package name, so this is the hand-off from "which dependency can go" to
128
+ * "how to build the thing properly". IDs only: the category and the URL
129
+ * are resolved from the committed snapshot in guides.ts, so a guide that
130
+ * is renamed upstream fails a test instead of shipping as a dead link.
131
+ */
132
+ guides: z.array(slug).optional(),
84
133
  manualBaseline: manualBaselineSchema.optional(),
85
134
  })
86
135
  .superRefine((rule, ctx) => {
@@ -91,6 +140,16 @@ export const ruleSchema = z
91
140
  message: "a rule needs at least one web-features ID, or an explicit manualBaseline with a verifiedOn date",
92
141
  });
93
142
  }
143
+ // resolveBaseline() only consults manualBaseline when featureIds is empty,
144
+ // so carrying both silently discards the hand-verified override while
145
+ // check-freshness keeps ageing its verifiedOn date.
146
+ if (rule.featureIds.length > 0 && rule.manualBaseline) {
147
+ ctx.addIssue({
148
+ code: "custom",
149
+ path: ["manualBaseline"],
150
+ message: "a manualBaseline is only read when featureIds is empty. Drop one or the other.",
151
+ });
152
+ }
94
153
  });
95
154
  export const catalogSchema = z.array(ruleSchema).superRefine((rules, ctx) => {
96
155
  const seenIds = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { supportClaims } from "./generated/support-claims.ts";
2
+ /**
3
+ * Replaces every token with its version. An unknown token is left visible
4
+ * rather than silently blanked: a `{{...}}` on screen is obviously broken,
5
+ * where an empty string reads as finished prose. A test asserts none survive.
6
+ */
7
+ export declare function resolveSupportClaims(text: string): string;
8
+ /** True when a string still carries an unresolved token. Used by the tests. */
9
+ export declare function hasUnresolvedClaim(text: string): boolean;
10
+ export { supportClaims };
11
+ //# sourceMappingURL=support.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAgB9D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { supportClaims } from "./generated/support-claims.js";
2
+ /**
3
+ * Interpolates the browser versions a rule's prose cites.
4
+ *
5
+ * Rules write `{{safari:api.Crypto.randomUUID}}`, never `15.4`. The number
6
+ * comes from web-features or from MDN's browser-compat-data at build time and
7
+ * is committed as a snapshot, so a version cannot be guessed, cannot go stale
8
+ * without the diff showing it, and cannot be typed wrong in the first place.
9
+ *
10
+ * Pure, like everything else the surfaces share.
11
+ */
12
+ /** `{{browser:key}}`, where key is a web-features ID or a BCD path. */
13
+ const CLAIM_TOKEN = /\{\{([a-z_]+):([A-Za-z0-9_.-]+)\}\}/g;
14
+ /**
15
+ * Replaces every token with its version. An unknown token is left visible
16
+ * rather than silently blanked: a `{{...}}` on screen is obviously broken,
17
+ * where an empty string reads as finished prose. A test asserts none survive.
18
+ */
19
+ export function resolveSupportClaims(text) {
20
+ return text.replace(CLAIM_TOKEN, (token, browser, key) => supportClaims.claims[`${browser}:${key}`] ?? token);
21
+ }
22
+ /** True when a string still carries an unresolved token. Used by the tests. */
23
+ export function hasUnresolvedClaim(text) {
24
+ for (const [, browser, key] of text.matchAll(CLAIM_TOKEN)) {
25
+ if (supportClaims.claims[`${browser}:${key}`] === undefined)
26
+ return true;
27
+ }
28
+ return false;
29
+ }
30
+ export { supportClaims };
31
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D;;;;;;;;;GASG;AAEH,uEAAuE;AACvE,MAAM,WAAW,GAAG,sCAAsC,CAAC;AAE3D;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,OAAO,CACjB,WAAW,EACX,CAAC,KAAK,EAAE,OAAe,EAAE,GAAW,EAAE,EAAE,CACtC,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,IAAI,KAAK,CACrD,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,KAAK,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1D,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@jomae/catalog",
3
- "version": "0.3.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
- "description": "The rule catalog behind youmightnotneed. Maps npm packages to the modern CSS and HTML that replaces them.",
5
+ "description": "The rule catalog behind youmightnotneed. Maps npm packages to the CSS, HTML, or Web API that replaces them.",
6
6
  "license": "MIT",
7
7
  "author": "Johannes Maendle",
8
8
  "homepage": "https://youmightnotneed-web.vercel.app",