@jomae/catalog 0.4.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 (236) hide show
  1. package/README.md +20 -2
  2. package/dist/baseline.d.ts +25 -0
  3. package/dist/baseline.d.ts.map +1 -1
  4. package/dist/baseline.js +25 -1
  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/generated/baseline-history.d.ts +21 -0
  15. package/dist/generated/baseline-history.d.ts.map +1 -0
  16. package/dist/generated/baseline-history.js +20 -0
  17. package/dist/generated/baseline-history.js.map +1 -0
  18. package/dist/generated/baseline.d.ts +10 -0
  19. package/dist/generated/baseline.d.ts.map +1 -1
  20. package/dist/generated/baseline.js +250 -67
  21. package/dist/generated/baseline.js.map +1 -1
  22. package/dist/generated/guides.d.ts +16 -0
  23. package/dist/generated/guides.d.ts.map +1 -0
  24. package/dist/generated/guides.js +153 -0
  25. package/dist/generated/guides.js.map +1 -0
  26. package/dist/generated/sizes.d.ts.map +1 -1
  27. package/dist/generated/sizes.js +280 -55
  28. package/dist/generated/sizes.js.map +1 -1
  29. package/dist/generated/support-claims.d.ts +15 -0
  30. package/dist/generated/support-claims.d.ts.map +1 -0
  31. package/dist/generated/support-claims.js +69 -0
  32. package/dist/generated/support-claims.js.map +1 -0
  33. package/dist/guides.d.ts +46 -0
  34. package/dist/guides.d.ts.map +1 -0
  35. package/dist/guides.js +55 -0
  36. package/dist/guides.js.map +1 -0
  37. package/dist/history.d.ts +11 -0
  38. package/dist/history.d.ts.map +1 -0
  39. package/dist/history.js +14 -0
  40. package/dist/history.js.map +1 -0
  41. package/dist/index.d.ts +5 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +5 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/rules/abort-controller.d.ts.map +1 -1
  46. package/dist/rules/abort-controller.js +2 -1
  47. package/dist/rules/abort-controller.js.map +1 -1
  48. package/dist/rules/accordion.d.ts.map +1 -1
  49. package/dist/rules/accordion.js +3 -0
  50. package/dist/rules/accordion.js.map +1 -1
  51. package/dist/rules/array-grouping.d.ts +3 -0
  52. package/dist/rules/array-grouping.d.ts.map +1 -0
  53. package/dist/rules/array-grouping.js +29 -0
  54. package/dist/rules/array-grouping.js.map +1 -0
  55. package/dist/rules/aspect-ratio.d.ts.map +1 -1
  56. package/dist/rules/aspect-ratio.js +1 -0
  57. package/dist/rules/aspect-ratio.js.map +1 -1
  58. package/dist/rules/base64.d.ts +3 -0
  59. package/dist/rules/base64.d.ts.map +1 -0
  60. package/dist/rules/base64.js +41 -0
  61. package/dist/rules/base64.js.map +1 -0
  62. package/dist/rules/broadcast-channel.d.ts.map +1 -1
  63. package/dist/rules/broadcast-channel.js +1 -0
  64. package/dist/rules/broadcast-channel.js.map +1 -1
  65. package/dist/rules/carousel.d.ts.map +1 -1
  66. package/dist/rules/carousel.js +7 -0
  67. package/dist/rules/carousel.js.map +1 -1
  68. package/dist/rules/clipboard.d.ts.map +1 -1
  69. package/dist/rules/clipboard.js +4 -1
  70. package/dist/rules/clipboard.js.map +1 -1
  71. package/dist/rules/color-functions.d.ts.map +1 -1
  72. package/dist/rules/color-functions.js +1 -0
  73. package/dist/rules/color-functions.js.map +1 -1
  74. package/dist/rules/compression-streams.d.ts.map +1 -1
  75. package/dist/rules/compression-streams.js +2 -1
  76. package/dist/rules/compression-streams.js.map +1 -1
  77. package/dist/rules/container-queries.d.ts.map +1 -1
  78. package/dist/rules/container-queries.js +2 -0
  79. package/dist/rules/container-queries.js.map +1 -1
  80. package/dist/rules/content-visibility.d.ts.map +1 -1
  81. package/dist/rules/content-visibility.js +3 -1
  82. package/dist/rules/content-visibility.js.map +1 -1
  83. package/dist/rules/custom-highlight.d.ts +3 -0
  84. package/dist/rules/custom-highlight.d.ts.map +1 -0
  85. package/dist/rules/custom-highlight.js +39 -0
  86. package/dist/rules/custom-highlight.js.map +1 -0
  87. package/dist/rules/date-time-input.d.ts.map +1 -1
  88. package/dist/rules/date-time-input.js +2 -0
  89. package/dist/rules/date-time-input.js.map +1 -1
  90. package/dist/rules/dialog.d.ts.map +1 -1
  91. package/dist/rules/dialog.js +8 -0
  92. package/dist/rules/dialog.js.map +1 -1
  93. package/dist/rules/discrete-transitions.d.ts.map +1 -1
  94. package/dist/rules/discrete-transitions.js +6 -0
  95. package/dist/rules/discrete-transitions.js.map +1 -1
  96. package/dist/rules/drag-and-drop.d.ts.map +1 -1
  97. package/dist/rules/drag-and-drop.js +26 -8
  98. package/dist/rules/drag-and-drop.js.map +1 -1
  99. package/dist/rules/duration-format.d.ts +3 -0
  100. package/dist/rules/duration-format.d.ts.map +1 -0
  101. package/dist/rules/duration-format.js +37 -0
  102. package/dist/rules/duration-format.js.map +1 -0
  103. package/dist/rules/event-target.d.ts +3 -0
  104. package/dist/rules/event-target.d.ts.map +1 -0
  105. package/dist/rules/event-target.js +51 -0
  106. package/dist/rules/event-target.js.map +1 -0
  107. package/dist/rules/fetch.d.ts +3 -0
  108. package/dist/rules/fetch.d.ts.map +1 -0
  109. package/dist/rules/fetch.js +46 -0
  110. package/dist/rules/fetch.js.map +1 -0
  111. package/dist/rules/field-sizing.d.ts.map +1 -1
  112. package/dist/rules/field-sizing.js +3 -1
  113. package/dist/rules/field-sizing.js.map +1 -1
  114. package/dist/rules/fluid-type.d.ts.map +1 -1
  115. package/dist/rules/fluid-type.js +3 -1
  116. package/dist/rules/fluid-type.js.map +1 -1
  117. package/dist/rules/focus-visible.d.ts.map +1 -1
  118. package/dist/rules/focus-visible.js +1 -0
  119. package/dist/rules/focus-visible.js.map +1 -1
  120. package/dist/rules/fullscreen.d.ts.map +1 -1
  121. package/dist/rules/fullscreen.js +2 -1
  122. package/dist/rules/fullscreen.js.map +1 -1
  123. package/dist/rules/height-animation.d.ts.map +1 -1
  124. package/dist/rules/height-animation.js +2 -0
  125. package/dist/rules/height-animation.js.map +1 -1
  126. package/dist/rules/index.d.ts.map +1 -1
  127. package/dist/rules/index.js +64 -3
  128. package/dist/rules/index.js.map +1 -1
  129. package/dist/rules/inert.d.ts +3 -0
  130. package/dist/rules/inert.d.ts.map +1 -0
  131. package/dist/rules/inert.js +37 -0
  132. package/dist/rules/inert.js.map +1 -0
  133. package/dist/rules/intersection-observer.d.ts.map +1 -1
  134. package/dist/rules/intersection-observer.js +2 -0
  135. package/dist/rules/intersection-observer.js.map +1 -1
  136. package/dist/rules/lazy-loading.d.ts.map +1 -1
  137. package/dist/rules/lazy-loading.js +2 -0
  138. package/dist/rules/lazy-loading.js.map +1 -1
  139. package/dist/rules/line-clamp.d.ts.map +1 -1
  140. package/dist/rules/line-clamp.js +2 -1
  141. package/dist/rules/line-clamp.js.map +1 -1
  142. package/dist/rules/masonry.d.ts.map +1 -1
  143. package/dist/rules/masonry.js +1 -0
  144. package/dist/rules/masonry.js.map +1 -1
  145. package/dist/rules/natural-sort.d.ts +3 -0
  146. package/dist/rules/natural-sort.d.ts.map +1 -0
  147. package/dist/rules/natural-sort.js +41 -0
  148. package/dist/rules/natural-sort.js.map +1 -0
  149. package/dist/rules/number-format.d.ts.map +1 -1
  150. package/dist/rules/number-format.js +3 -1
  151. package/dist/rules/number-format.js.map +1 -1
  152. package/dist/rules/page-visibility.d.ts.map +1 -1
  153. package/dist/rules/page-visibility.js +5 -0
  154. package/dist/rules/page-visibility.js.map +1 -1
  155. package/dist/rules/popover.d.ts.map +1 -1
  156. package/dist/rules/popover.js +8 -1
  157. package/dist/rules/popover.js.map +1 -1
  158. package/dist/rules/random-uuid.d.ts +3 -0
  159. package/dist/rules/random-uuid.d.ts.map +1 -0
  160. package/dist/rules/random-uuid.js +31 -0
  161. package/dist/rules/random-uuid.js.map +1 -0
  162. package/dist/rules/relative-time.d.ts.map +1 -1
  163. package/dist/rules/relative-time.js +1 -0
  164. package/dist/rules/relative-time.js.map +1 -1
  165. package/dist/rules/resizable-panels.d.ts.map +1 -1
  166. package/dist/rules/resizable-panels.js +4 -7
  167. package/dist/rules/resizable-panels.js.map +1 -1
  168. package/dist/rules/resize-observer.d.ts.map +1 -1
  169. package/dist/rules/resize-observer.js +2 -1
  170. package/dist/rules/resize-observer.js.map +1 -1
  171. package/dist/rules/screen-wake-lock.d.ts.map +1 -1
  172. package/dist/rules/screen-wake-lock.js +3 -1
  173. package/dist/rules/screen-wake-lock.js.map +1 -1
  174. package/dist/rules/scroll-animations.d.ts.map +1 -1
  175. package/dist/rules/scroll-animations.js +9 -1
  176. package/dist/rules/scroll-animations.js.map +1 -1
  177. package/dist/rules/scroll-lock.d.ts.map +1 -1
  178. package/dist/rules/scroll-lock.js +8 -7
  179. package/dist/rules/scroll-lock.js.map +1 -1
  180. package/dist/rules/scrollbars.d.ts.map +1 -1
  181. package/dist/rules/scrollbars.js +5 -0
  182. package/dist/rules/scrollbars.js.map +1 -1
  183. package/dist/rules/select.d.ts.map +1 -1
  184. package/dist/rules/select.js +7 -0
  185. package/dist/rules/select.js.map +1 -1
  186. package/dist/rules/server-sent-events.d.ts +3 -0
  187. package/dist/rules/server-sent-events.d.ts.map +1 -0
  188. package/dist/rules/server-sent-events.js +38 -0
  189. package/dist/rules/server-sent-events.js.map +1 -0
  190. package/dist/rules/smooth-scroll.d.ts.map +1 -1
  191. package/dist/rules/smooth-scroll.js +2 -0
  192. package/dist/rules/smooth-scroll.js.map +1 -1
  193. package/dist/rules/speech-recognition.d.ts.map +1 -1
  194. package/dist/rules/speech-recognition.js +19 -10
  195. package/dist/rules/speech-recognition.js.map +1 -1
  196. package/dist/rules/speech-synthesis.d.ts.map +1 -1
  197. package/dist/rules/speech-synthesis.js +3 -0
  198. package/dist/rules/speech-synthesis.js.map +1 -1
  199. package/dist/rules/sticky.d.ts.map +1 -1
  200. package/dist/rules/sticky.js +2 -0
  201. package/dist/rules/sticky.js.map +1 -1
  202. package/dist/rules/structured-clone.d.ts.map +1 -1
  203. package/dist/rules/structured-clone.js +13 -2
  204. package/dist/rules/structured-clone.js.map +1 -1
  205. package/dist/rules/text-box-trim.d.ts.map +1 -1
  206. package/dist/rules/text-box-trim.js +3 -1
  207. package/dist/rules/text-box-trim.js.map +1 -1
  208. package/dist/rules/text-wrap-balance.d.ts.map +1 -1
  209. package/dist/rules/text-wrap-balance.js +2 -0
  210. package/dist/rules/text-wrap-balance.js.map +1 -1
  211. package/dist/rules/url-search-params.d.ts +3 -0
  212. package/dist/rules/url-search-params.d.ts.map +1 -0
  213. package/dist/rules/url-search-params.js +42 -0
  214. package/dist/rules/url-search-params.js.map +1 -0
  215. package/dist/rules/view-transitions.d.ts.map +1 -1
  216. package/dist/rules/view-transitions.js +9 -0
  217. package/dist/rules/view-transitions.js.map +1 -1
  218. package/dist/rules/web-bluetooth.d.ts.map +1 -1
  219. package/dist/rules/web-bluetooth.js +1 -0
  220. package/dist/rules/web-bluetooth.js.map +1 -1
  221. package/dist/rules/web-crypto.d.ts +3 -0
  222. package/dist/rules/web-crypto.d.ts.map +1 -0
  223. package/dist/rules/web-crypto.js +32 -0
  224. package/dist/rules/web-crypto.js.map +1 -0
  225. package/dist/rules/web-share.d.ts.map +1 -1
  226. package/dist/rules/web-share.js +1 -0
  227. package/dist/rules/web-share.js.map +1 -1
  228. package/dist/schema.d.ts +22 -0
  229. package/dist/schema.d.ts.map +1 -1
  230. package/dist/schema.js +63 -4
  231. package/dist/schema.js.map +1 -1
  232. package/dist/support.d.ts +11 -0
  233. package/dist/support.d.ts.map +1 -0
  234. package/dist/support.js +31 -0
  235. package/dist/support.js.map +1 -0
  236. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"web-bluetooth.d.ts","sourceRoot":"","sources":["../../src/rules/web-bluetooth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IA0B1B,CAAC"}
1
+ {"version":3,"file":"web-bluetooth.d.ts","sourceRoot":"","sources":["../../src/rules/web-bluetooth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,YAAY,EAAE,IA2B1B,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export const webBluetooth = {
2
2
  id: "web-bluetooth",
3
3
  title: "Bluetooth device access",
4
+ category: "device-apis",
4
5
  replaces: ["@capacitor-community/bluetooth-le", "cordova-plugin-ble-central"],
5
6
  featureIds: ["web-bluetooth"],
6
7
  native: "navigator.bluetooth.requestDevice()",
@@ -1 +1 @@
1
- {"version":3,"file":"web-bluetooth.js","sourceRoot":"","sources":["../../src/rules/web-bluetooth.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,CAAC,mCAAmC,EAAE,4BAA4B,CAAC;IAC7E,UAAU,EAAE,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,qCAAqC;IAC7C,KAAK,EAAE;QACL,SAAS,EACP,4jBAA4jB;QAC9jB,OAAO,EAAE;;;4CAG+B;QACxC,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,sEAAsE;QAC5E,MAAM,EAAE;YACN,uJAAuJ;YACvJ,wHAAwH;YACxH,sJAAsJ;SACvJ;QACD,OAAO,EACL,sEAAsE;KACzE;CACF,CAAC"}
1
+ {"version":3,"file":"web-bluetooth.js","sourceRoot":"","sources":["../../src/rules/web-bluetooth.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,EAAE,EAAE,eAAe;IACnB,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,mCAAmC,EAAE,4BAA4B,CAAC;IAC7E,UAAU,EAAE,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,qCAAqC;IAC7C,KAAK,EAAE;QACL,SAAS,EACP,4jBAA4jB;QAC9jB,OAAO,EAAE;;;4CAG+B;QACxC,MAAM,EACJ,oEAAoE;KACvE;IACD,KAAK,EAAE;QACL,IAAI,EAAE,sEAAsE;QAC5E,MAAM,EAAE;YACN,uJAAuJ;YACvJ,wHAAwH;YACxH,sJAAsJ;SACvJ;QACD,OAAO,EACL,sEAAsE;KACzE;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "../schema.ts";
2
+ export declare const webCrypto: Rule;
3
+ //# sourceMappingURL=web-crypto.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,32 @@
1
+ export const webCrypto = {
2
+ id: "web-crypto",
3
+ title: "Hashing and encryption",
4
+ category: "async-data",
5
+ replaces: ["crypto-js", "js-sha256", "crypto-hash"],
6
+ featureIds: ["web-cryptography"],
7
+ native: "crypto.subtle",
8
+ human: {
9
+ explainer: "crypto-js ships its own implementations of SHA-256, AES and HMAC as JavaScript, which is both a large download and slower than the same primitives compiled into the browser. crypto.subtle exposes those primitives natively, with key material held as CryptoKey objects the page cannot read out unless you mark them extractable. The API is asynchronous and takes bytes rather than strings, so a call site grows a TextEncoder and an await.",
10
+ snippet: `async function sha256(text) {
11
+ const bytes = new TextEncoder().encode(text);
12
+ const digest = await crypto.subtle.digest("SHA-256", bytes);
13
+ return [...new Uint8Array(digest)]
14
+ .map((b) => b.toString(16).padStart(2, "0"))
15
+ .join("");
16
+ }`,
17
+ mdnUrl: "https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto",
18
+ },
19
+ agent: {
20
+ when: "hashing, signing, or encrypting with SHA-2, HMAC, AES or RSA",
21
+ unless: [
22
+ "You need MD5, SHA-1 signing, or another legacy algorithm. crypto.subtle leaves those out deliberately, so a format that requires one keeps its library.",
23
+ "The call has to be synchronous. Everything on crypto.subtle returns a promise, which changes any function that hashes inside a render pass or a sort comparator.",
24
+ "The code runs on plain http somewhere other than localhost. crypto.subtle is undefined outside a secure context.",
25
+ "You interoperate with crypto-js output that uses its own defaults, such as its OpenSSL-style key derivation for AES, where matching the format by hand is the harder job.",
26
+ "You need password hashing. Neither the library nor crypto.subtle gives you bcrypt, scrypt or Argon2, and PBKDF2 is the only stretching primitive here.",
27
+ ],
28
+ snippet: `const bytes = new TextEncoder().encode(text);
29
+ const digest = await crypto.subtle.digest("SHA-256", bytes);`,
30
+ },
31
+ };
32
+ //# sourceMappingURL=web-crypto.js.map
@@ -0,0 +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 +1 @@
1
- {"version":3,"file":"web-share.d.ts","sourceRoot":"","sources":["../../src/rules/web-share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IA2BtB,CAAC"}
1
+ {"version":3,"file":"web-share.d.ts","sourceRoot":"","sources":["../../src/rules/web-share.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEzC,eAAO,MAAM,QAAQ,EAAE,IA4BtB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export const webShare = {
2
2
  id: "web-share",
3
3
  title: "Sharing to other apps",
4
+ category: "device-apis",
4
5
  replaces: ["react-share", "vue-social-sharing", "ngx-sharebuttons"],
5
6
  featureIds: ["share"],
6
7
  native: "navigator.share()",
@@ -1 +1 @@
1
- {"version":3,"file":"web-share.js","sourceRoot":"","sources":["../../src/rules/web-share.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,CAAC,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,CAAC;IACnE,UAAU,EAAE,CAAC,OAAO,CAAC;IACrB,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,kSAAkS;QACpS,OAAO,EAAE;;;;;EAKX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0FAA0F;QAChG,MAAM,EAAE;YACN,kLAAkL;YAClL,yFAAyF;YACzF,+JAA+J;SAChK;QACD,OAAO,EACL,uEAAuE;KAC1E;CACF,CAAC"}
1
+ {"version":3,"file":"web-share.js","sourceRoot":"","sources":["../../src/rules/web-share.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,EAAE,EAAE,WAAW;IACf,KAAK,EAAE,uBAAuB;IAC9B,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,CAAC,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,CAAC;IACnE,UAAU,EAAE,CAAC,OAAO,CAAC;IACrB,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE;QACL,SAAS,EACP,kSAAkS;QACpS,OAAO,EAAE;;;;;EAKX;QACE,MAAM,EAAE,kEAAkE;KAC3E;IACD,KAAK,EAAE;QACL,IAAI,EAAE,0FAA0F;QAChG,MAAM,EAAE;YACN,kLAAkL;YAClL,yFAAyF;YACzF,+JAA+J;SAChK;QACD,OAAO,EACL,uEAAuE;KAC1E;CACF,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -36,6 +36,16 @@ export type ManualBaseline = z.infer<typeof manualBaselineSchema>;
36
36
  export declare const ruleSchema: z.ZodObject<{
37
37
  id: z.ZodString;
38
38
  title: z.ZodString;
39
+ category: z.ZodEnum<{
40
+ animation: "animation";
41
+ "async-data": "async-data";
42
+ "device-apis": "device-apis";
43
+ formatting: "formatting";
44
+ forms: "forms";
45
+ layout: "layout";
46
+ scrolling: "scrolling";
47
+ typography: "typography";
48
+ }>;
39
49
  replaces: z.ZodArray<z.ZodString>;
40
50
  featureIds: z.ZodArray<z.ZodString>;
41
51
  native: z.ZodString;
@@ -50,6 +60,7 @@ export declare const ruleSchema: z.ZodObject<{
50
60
  unless: z.ZodArray<z.ZodString>;
51
61
  snippet: z.ZodString;
52
62
  }, z.core.$strip>;
63
+ guides: z.ZodOptional<z.ZodArray<z.ZodString>>;
53
64
  manualBaseline: z.ZodOptional<z.ZodObject<{
54
65
  status: z.ZodEnum<{
55
66
  limited: "limited";
@@ -64,6 +75,16 @@ export type Rule = z.infer<typeof ruleSchema>;
64
75
  export declare const catalogSchema: z.ZodArray<z.ZodObject<{
65
76
  id: z.ZodString;
66
77
  title: z.ZodString;
78
+ category: z.ZodEnum<{
79
+ animation: "animation";
80
+ "async-data": "async-data";
81
+ "device-apis": "device-apis";
82
+ formatting: "formatting";
83
+ forms: "forms";
84
+ layout: "layout";
85
+ scrolling: "scrolling";
86
+ typography: "typography";
87
+ }>;
67
88
  replaces: z.ZodArray<z.ZodString>;
68
89
  featureIds: z.ZodArray<z.ZodString>;
69
90
  native: z.ZodString;
@@ -78,6 +99,7 @@ export declare const catalogSchema: z.ZodArray<z.ZodObject<{
78
99
  unless: z.ZodArray<z.ZodString>;
79
100
  snippet: z.ZodString;
80
101
  }, z.core.$strip>;
102
+ guides: z.ZodOptional<z.ZodArray<z.ZodString>>;
81
103
  manualBaseline: z.ZodOptional<z.ZodObject<{
82
104
  status: z.ZodEnum<{
83
105
  limited: "limited";
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;EAK/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAkBlE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;iBAK/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4DnB,CAAC;AAEL,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2BxB,CAAC;AAEH,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,CAEnD"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AACH,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;EAK/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAmDlE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;iBAK/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+FnB,CAAC;AAEL,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2BxB,CAAC;AAEH,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,CAEnD"}
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,7 +90,11 @@ 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({
@@ -63,9 +103,9 @@ export const ruleSchema = z
63
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@jomae/catalog",
3
- "version": "0.4.0",
3
+ "version": "0.6.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",