@@ -74,83 +74,66 @@ function checkDistFile(sourcePath: string, distPath: string): boolean {
7474 * successful, generates a `status` block.
7575 */
7676function toDist ( sourcePath : string ) : YAML . Document {
77- const yaml = YAML . parseDocument (
78- fs . readFileSync ( sourcePath , { encoding : "utf-8" } ) ,
79- ) ;
77+ const source = YAML . parse ( fs . readFileSync ( sourcePath , { encoding : "utf-8" } ) ) ;
8078 const { name : id } = path . parse ( sourcePath ) ;
8179
82- const taggedCompatFeatures = (
83- tagsToFeatures . get ( `web-features:${ id } ` ) ?? [ ]
84- ) . map ( ( f ) => `${ f . id } ` ) ;
85-
86- const overridden = {
87- compatFeatures : yaml . toJS ( ) . compat_features ,
88- status : yaml . toJS ( ) . status ,
89- } ;
90-
91- const generated = {
92- compatFeatures : taggedCompatFeatures . length
93- ? taggedCompatFeatures
94- : undefined ,
95- status : taggedCompatFeatures . length
96- ? computeBaseline ( {
97- compatKeys : taggedCompatFeatures as [ string , ...string [ ] ] ,
98- checkAncestors : false ,
99- } )
100- : undefined ,
101- statusByCompatFeaturesOverride : Array . isArray ( overridden . compatFeatures )
102- ? computeBaseline ( {
103- compatKeys : overridden . compatFeatures as [ string , ...string [ ] ] ,
104- checkAncestors : false ,
105- } )
106- : undefined ,
107- } ;
80+ // Collect tagged compat features. A `compat_features` list in the source
81+ // takes precedence, but can be removed if it matches the tagged features.
82+ const taggedCompatFeatures = ( tagsToFeatures . get ( `web-features:${ id } ` ) ?? [ ] )
83+ . map ( ( f ) => `${ f . id } ` )
84+ . sort ( ) ;
10885
109- warnOnNeedlessOverrides ( id , overridden , generated ) ;
86+ if ( source . compat_features ) {
87+ source . compat_features . sort ( ) ;
88+ if ( isDeepStrictEqual ( source . compat_features , taggedCompatFeatures ) ) {
89+ logger . warn (
90+ `${ id } : compat_features override matches tags in @mdn/browser-compat-data. Consider deleting this override.` ,
91+ ) ;
92+ }
93+ }
11094
111- const dist = new Document ( { } ) ;
112- insertHeaderComments ( dist , id ) ;
95+ // Compute the status. A `status` block in the source takes precedence, but
96+ // can be removed if it matches the computed status.
97+ let computedStatus = computeBaseline ( {
98+ compatKeys : source . compat_features ?? taggedCompatFeatures ,
99+ checkAncestors : false ,
100+ } ) ;
113101
114- if ( ! overridden . compatFeatures && generated . compatFeatures ) {
115- insertCompatFeatures ( dist , generated . compatFeatures ) ;
102+ if ( computedStatus . discouraged ) {
103+ logger . warn (
104+ `${ id } : contains at least one deprecated compat feature and can never be Baseline. Was this intentional?` ,
105+ ) ;
116106 }
117107
118- if ( ! overridden . status ) {
119- const status = generated . statusByCompatFeaturesOverride ?? generated . status ;
120- if ( status ) {
121- if ( status . discouraged ) {
122- logger . warn (
123- `${ id } : contains at least one deprecated compat feature and can never be Baseline. Was this intentional?` ,
124- ) ;
125- }
126- insertStatus ( dist , JSON . parse ( status . toJSON ( ) ) ) ;
108+ computedStatus = JSON . parse ( computedStatus . toJSON ( ) ) ;
109+
110+ if ( source . status ) {
111+ if ( isDeepStrictEqual ( source . status , computedStatus ) ) {
112+ logger . warn (
113+ `${ id } : status override matches computed status. Consider deleting this override.` ,
114+ ) ;
127115 }
128116 }
129117
130- return dist ;
131- }
132-
133- function insertCompatFeatures ( yaml : Document , compatFeatures : string [ ] ) {
134- yaml . set ( "compat_features" , compatFeatures ) ;
135- }
136-
137- function insertStatus ( yaml : Document , status ) {
138- // Create the status node and insert it just before "compat_features"
139- const statusNode = yaml . createPair ( "status" , status ) ;
140- assert ( YAML . isMap ( yaml . contents ) ) ;
141- const targetIndex = yaml . contents . items . findIndex (
142- ( item ) => item . key . toString ( ) === "compat_features" ,
143- ) ;
144- yaml . contents . items . splice ( targetIndex , 0 , statusNode as YAML . Pair < any , any > ) ;
145- }
118+ // Assemble and return the dist YAML.
119+ const dist = new Document ( { } ) ;
146120
147- function insertHeaderComments ( yaml : Document , id : string ) {
148- yaml . commentBefore = [
121+ dist . commentBefore = [
149122 `Generated from: ${ id } .yml` ,
150123 `Do not edit this file by hand. Edit the source file instead!` ,
151124 ]
152125 . map ( ( line ) => ` ${ line } ` )
153126 . join ( "\n" ) ;
127+
128+ if ( ! source . status ) {
129+ dist . set ( "status" , computedStatus ) ;
130+ }
131+
132+ if ( ! source . compat_features ) {
133+ dist . set ( "compat_features" , taggedCompatFeatures ) ;
134+ }
135+
136+ return dist ;
154137}
155138
156139const compat = new Compat ( ) ;
@@ -171,43 +154,6 @@ const tagsToFeatures: Map<string, Feature[]> = (() => {
171154 return map ;
172155} ) ( ) ;
173156
174- function warnOnNeedlessOverrides ( id , overridden , generated ) {
175- if ( overridden . compatFeatures ?. length && generated . compatFeatures ?. length ) {
176- if (
177- isDeepStrictEqual (
178- [ ...overridden . compatFeatures ] . sort ( ) ,
179- [ ...generated . compatFeatures ] . sort ( ) ,
180- )
181- ) {
182- logger . warn (
183- `${ id } : compat_features override matches tags in @mdn/browser-compat-data. Consider deleting this override.` ,
184- ) ;
185- }
186- }
187-
188- if (
189- overridden . status &&
190- generated . statusByCompatFeaturesOverride &&
191- isDeepStrictEqual (
192- overridden . status ,
193- generated . statusByCompatFeaturesOverride ,
194- )
195- ) {
196- logger . warn (
197- `${ id } : status override matches generated status from compat_features override. Consider deleting this override.` ,
198- ) ;
199- }
200- if (
201- overridden . status &&
202- generated . status &&
203- isDeepStrictEqual ( overridden . status , generated . status )
204- ) {
205- logger . warn (
206- `${ id } : status override matches generated status from tags. Consider deleting this override.` ,
207- ) ;
208- }
209- }
210-
211157function main ( ) {
212158 const filePaths = argv . paths . flatMap ( ( fileOrDirectory ) => {
213159 if ( fs . statSync ( fileOrDirectory ) . isDirectory ( ) ) {
0 commit comments