reffy 20.0.13 → 20.0.15

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 (78) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +151 -151
  3. package/index.js +29 -29
  4. package/package.json +5 -5
  5. package/reffy.js +324 -324
  6. package/schemas/browserlib/extract-algorithms.json +52 -52
  7. package/schemas/browserlib/extract-cssdfn.json +108 -108
  8. package/schemas/browserlib/extract-dfns.json +90 -90
  9. package/schemas/browserlib/extract-elements.json +17 -17
  10. package/schemas/browserlib/extract-events.json +31 -31
  11. package/schemas/browserlib/extract-headings.json +19 -19
  12. package/schemas/browserlib/extract-ids.json +7 -7
  13. package/schemas/browserlib/extract-links.json +12 -12
  14. package/schemas/browserlib/extract-refs.json +12 -12
  15. package/schemas/common.json +876 -876
  16. package/schemas/files/extracts/algorithms.json +12 -12
  17. package/schemas/files/extracts/css.json +16 -16
  18. package/schemas/files/extracts/dfns.json +12 -12
  19. package/schemas/files/extracts/elements.json +12 -12
  20. package/schemas/files/extracts/events.json +12 -12
  21. package/schemas/files/extracts/headings.json +12 -12
  22. package/schemas/files/extracts/ids.json +12 -12
  23. package/schemas/files/extracts/links.json +12 -12
  24. package/schemas/files/extracts/refs.json +12 -12
  25. package/schemas/files/index.json +59 -59
  26. package/schemas/postprocessing/events.json +50 -50
  27. package/schemas/postprocessing/idlnames-parsed.json +27 -27
  28. package/schemas/postprocessing/idlnames.json +17 -17
  29. package/schemas/postprocessing/idlparsed.json +67 -67
  30. package/src/browserlib/clone-and-clean.mjs +24 -24
  31. package/src/browserlib/create-outline.mjs +353 -353
  32. package/src/browserlib/extract-algorithms.mjs +723 -723
  33. package/src/browserlib/extract-cddl.mjs +125 -125
  34. package/src/browserlib/extract-dfns.mjs +1093 -1093
  35. package/src/browserlib/extract-headings.mjs +76 -76
  36. package/src/browserlib/extract-ids.mjs +28 -28
  37. package/src/browserlib/extract-links.mjs +45 -45
  38. package/src/browserlib/extract-references.mjs +308 -308
  39. package/src/browserlib/extract-webidl.mjs +89 -89
  40. package/src/browserlib/get-absolute-url.mjs +29 -29
  41. package/src/browserlib/get-code-elements.mjs +20 -20
  42. package/src/browserlib/get-generator.mjs +26 -26
  43. package/src/browserlib/get-lastmodified-date.mjs +13 -13
  44. package/src/browserlib/get-revision.mjs +12 -12
  45. package/src/browserlib/get-title.mjs +14 -14
  46. package/src/browserlib/informative-selector.mjs +24 -24
  47. package/src/browserlib/map-ids-to-headings.mjs +173 -173
  48. package/src/browserlib/reffy.json +85 -85
  49. package/src/browserlib/trim-spaces.mjs +35 -35
  50. package/src/cli/check-missing-dfns.js +587 -587
  51. package/src/cli/merge-crawl-results.js +132 -132
  52. package/src/cli/parse-webidl.js +447 -447
  53. package/src/lib/css-grammar-parse-tree.schema.json +109 -109
  54. package/src/lib/css-grammar-parser.js +440 -440
  55. package/src/lib/fetch.js +51 -51
  56. package/src/lib/markdown-report.js +360 -360
  57. package/src/lib/mock-server.js +218 -218
  58. package/src/lib/post-processor.js +322 -322
  59. package/src/lib/throttled-queue.js +129 -129
  60. package/src/postprocessing/annotate-links.js +41 -41
  61. package/src/postprocessing/csscomplete.js +48 -48
  62. package/src/postprocessing/idlnames.js +391 -391
  63. package/src/postprocessing/idlparsed.js +179 -179
  64. package/src/postprocessing/patch-dfns.js +51 -51
  65. package/src/specs/missing-css-rules.json +197 -197
  66. package/src/specs/spec-equivalents.json +149 -149
  67. package/src/browserlib/extract-editors.mjs~ +0 -14
  68. package/src/browserlib/extract-events.mjs~ +0 -3
  69. package/src/browserlib/generate-es-dfn-report.sh~ +0 -4
  70. package/src/browserlib/get-revision.mjs~ +0 -7
  71. package/src/cli/csstree-grammar-check.js +0 -28
  72. package/src/cli/csstree-grammar-check.js~ +0 -10
  73. package/src/cli/csstree-grammar-parser.js +0 -11
  74. package/src/cli/csstree-grammar-parser.js~ +0 -1
  75. package/src/cli/extract-editors.js~ +0 -38
  76. package/src/cli/process-specs.js~ +0 -28
  77. package/src/postprocessing/annotate-links.js~ +0 -8
  78. package/src/postprocessing/events.js~ +0 -245
@@ -1,245 +0,0 @@
1
- /**
2
- * Post-processing module that consolidates events extracts into one extract
3
- * per event.
4
- */
5
-
6
- import { isLatestLevelThatPasses, getInterfaceTreeInfo } from '../lib/util.js';
7
-
8
- export default {
9
- dependsOn: ['events'],
10
- input: 'crawl',
11
- property: 'events',
12
-
13
- run: async function(crawl, options) {
14
- // Collect list of mixin interfaces
15
- const mixins = {};
16
- const parsedInterfaces = [];
17
- crawl.results.forEach(s => {
18
- if (s.idlparsed) {
19
- if (s.idlparsed.idlNames) {
20
- Object.values(s.idlparsed.idlNames).forEach(dfn => {
21
- if (dfn.type === 'interface' && !dfn.partial) {
22
- parsedInterfaces.push(dfn);
23
- }
24
- });
25
- }
26
- if (s.idlparsed.idlExtendedNames) {
27
- Object.keys(s.idlparsed.idlExtendedNames).forEach(n => {
28
- s.idlparsed.idlExtendedNames[n].forEach(f => {
29
- if (f.type === 'includes') {
30
- if (!mixins[f.includes]) mixins[f.includes] = [];
31
- mixins[f.includes].push(n);
32
- }
33
- });
34
- });
35
- }
36
- }
37
- });
38
- console.error(mixins);
39
- // Only consider latest spec in a series to avoid fake duplicates
40
- const results = crawl.results.filter(spec =>
41
- (spec.seriesComposition !== 'delta' && isLatestLevelThatPasses(spec, crawl.results, s => s.events)) ||
42
- (spec.seriesComposition === 'delta' && spec.events));
43
-
44
- // Update events in place
45
- const events = results.map(spec => spec.events.map(e => Object.assign({ spec: spec }, e))).flat();
46
- for (const event of events) {
47
- expandMixinTargets(event, mixins);
48
- setBubblingPerTarget(event, parsedInterfaces);
49
- }
50
-
51
- // Consolidate events extended in other specs
52
- const eventsToDrop = events
53
- .filter(event => event.isExtension)
54
- .map(event => {
55
- const err = extendEvent(event, events);
56
- if (err) {
57
- // Event could not be extended, let's keep extension event
58
- console.warn(err);
59
- return null;
60
- }
61
- else {
62
- // Event successfully extended, extension can be dropped
63
- return event;
64
- }
65
- })
66
- .filter(event => !!event);
67
-
68
- // Before we clean and sort the result, we'll consolidate events that
69
- // don't always bubble. We'll call them... "babbling" events. Such events
70
- // should remain exceptions to the rule, and will likely be artificially
71
- // created through some patching mechanism (in Webref typically) because
72
- // the events extraction logic does not (yet?) support this scenario.
73
- return events
74
- .filter(event => !eventsToDrop.includes(event))
75
- .filter(event => consolidateBabblingEvent(event, events))
76
- .map(event => {
77
- cleanTargetInterfaces(event, parsedInterfaces);
78
- delete event.spec;
79
- return event;
80
- })
81
- .sort((event1, event2) =>
82
- event1.type.localeCompare(event2.type, 'en-US') ||
83
- (!event2.interface ? -1 : 0) ||
84
- (!event1.interface ? 1 : 0) ||
85
- event1.interface.localeCompare(event2.interface, 'en-US') ||
86
- (!event2.href ? -1 : 0) ||
87
- (!event1.href ? 1 : 0) ||
88
- event1.href.localeCompare(event2.href, 'en-US'));
89
- }
90
- };
91
-
92
-
93
- function expandMixinTargets(event, mixins) {
94
- const expandedTargets = event.targets?.map(i => mixins[i] || i)?.flat();
95
- // This assumes a mixin matches more than one interface
96
- if (expandedTargets && expandedTargets.length !== event.targets?.length) {
97
- event.targets = expandedTargets;
98
- return true;
99
- }
100
- return false;
101
- }
102
-
103
-
104
- function setBubblingPerTarget(event, parsedInterfaces) {
105
- // If an event targets a non root interface in a tree, we can assume that
106
- // bubbles is false (ideally, we should check the existence of the event
107
- // handler on the root interface, but there is no easy way to get a
108
- // consolidated IDL view of the root at the moment)
109
- if (!event.targets) return;
110
- const updatedTargets = [];
111
- const treeInterfaces = [];
112
- for (let iface of event.targets) {
113
- const treeInfo = getInterfaceTreeInfo(iface, parsedInterfaces);
114
- if (!treeInfo) {
115
- updatedTargets.push({target: iface});
116
- continue;
117
- }
118
- const { tree, depth, bubblingPath } = treeInfo;
119
- if (depth === 0) {
120
- // bubbling doesn't matter on the root interface
121
- updatedTargets.push({target: iface});
122
- } else {
123
- treeInterfaces.push({ iface, bubblingPath });
124
- }
125
- }
126
- if (!event.hasOwnProperty('bubbles') && treeInterfaces.length > 0) {
127
- event.bubbles = false;
128
- }
129
- for (let { iface, bubblingPath } of treeInterfaces) {
130
- updatedTargets.push(Object.assign(
131
- { target: iface, bubbles: event.bubbles },
132
- event.bubbles ? { bubblingPath } : {}
133
- ));
134
- }
135
- event.targets = updatedTargets;
136
- delete event.bubbles;
137
- }
138
-
139
-
140
- /**
141
- * Filter the list of target interfaces to remove those that don't need to
142
- * appear explicitly because they are de facto already covered by another entry
143
- * in the list.
144
- *
145
- * Two reasons to drop a target interface t from the list:
146
- * 1. There exists another target interface o with similar bubbling properties
147
- * for the event and t inherits from o. If event fires at o, it can de facto
148
- * fire at t.
149
- * 2. There exists another target interface o such that t and o belong to the
150
- * same bubbling tree, o is at a deeper level than t in the bubbling tree, and
151
- * event bubbles when it fires at o. Event will de facto fire at t through
152
- * bubbling when that happens.
153
- */
154
- function cleanTargetInterfaces(event, parsedInterfaces) {
155
- // Helper function that returns true if the iface interface inherits from the
156
- // base interface
157
- function inheritsFrom(iface, base) {
158
- while (iface) {
159
- if (iface === base) {
160
- return true;
161
- }
162
- iface = parsedInterfaces.find(i => i.name === iface)?.inheritance;
163
- }
164
- return false;
165
- }
166
-
167
- if (!event.targets) {
168
- return;
169
- }
170
-
171
- event.targets = event.targets
172
- .filter(({ target, bubbles }) =>
173
- // Drop if an ancestor in the inheritance chain is already there
174
- !event.targets.find(({ target: other, bubbles: otherBubbles}) =>
175
- target !== other &&
176
- bubbles === otherBubbles &&
177
- inheritsFrom(target, other)))
178
- .filter(({ target, bubbles }) => {
179
- // Drop if a deeper bubbling target interface in the tree is already there
180
- const targetTreeInfo = getInterfaceTreeInfo(target, parsedInterfaces);
181
- return !targetTreeInfo ||
182
- !event.targets.find(({ target: other, bubbles: otherBubbles }) => {
183
- if (other === target) {
184
- return false;
185
- }
186
- const otherTreeInfo = getInterfaceTreeInfo(other, parsedInterfaces);
187
- return otherTreeInfo?.tree === targetTreeInfo.tree &&
188
- otherBubbles && otherTreeInfo.depth > targetTreeInfo.depth;
189
- });
190
- });
191
- }
192
-
193
-
194
- function extendEvent(event, events) {
195
- const extendedEvent =
196
- events.find(e => !e.isExtension && e.href === event.href) ||
197
- events.find(e => !e.isExtension && event.href.startsWith(e.spec.crawled) && e.type === event.type);
198
- if (!extendedEvent) {
199
- // make this a fatal error
200
- return `Found extended event with link ${event.href} in ${event.spec.shortname}, but did not find a matching original event`;
201
- }
202
- if (extendedEvent.interface && event.interface && extendedEvent.interface !== event.interface) {
203
- return `Found extended event with link ${event.href} in ${event.spec.shortname} set to use interface ${event.interface}, different from original event interface ${extendedEvent.interface} in ${extendedEvent.spec.shortname}`;
204
- }
205
- // Document potential additional targets
206
- const newTargets = event.targets?.filter(t => !extendedEvent.targets?.find(tt => tt.target === t.target));
207
- if (newTargets) {
208
- extendedEvent.targets = (extendedEvent.targets || []).concat(newTargets);
209
- }
210
- // Document the fact that the event has been extended
211
- if (!extendedEvent.extendedIn) {
212
- extendedEvent.extendedIn = [];
213
- }
214
- extendedEvent.extendedIn.push(Object.assign(
215
- { spec: event.spec.series.shortname },
216
- event.src?.href ? { href: event.src?.href } : {}));
217
- }
218
-
219
-
220
- /**
221
- * Consolidate events that got duplicated in the extract because they bubble
222
- * or don't bubble depending on the target interface.
223
- *
224
- * We'll say that these events "babble" because they don't seem to know whether
225
- * they bubble or not.
226
- */
227
- function consolidateBabblingEvent(event, events) {
228
- if (event.mergedIntoAnotherEvent) {
229
- return null;
230
- }
231
- const newTargets = events
232
- .filter(e =>
233
- e !== event && !e.isExtension && !e.mergedIntoAnotherEvent &&
234
- e.href && e.href === event.href && e.cancelable === event.cancelable)
235
- .map(e => {
236
- // Flag the event as merged so that we can filter it out afterwards
237
- e.mergedIntoAnotherEvent = true;
238
- return e.targets;
239
- })
240
- .flat();
241
- if (newTargets.length > 0) {
242
- event.targets = (event.targets || []).concat(newTargets);
243
- }
244
- return event;
245
- }