9
9
* Convert the IANA definitions from CSV to local.
10
10
*/
11
11
12
- var co = require ( 'co' )
13
12
var got = require ( 'got' )
14
13
var parser = require ( 'csv-parse' )
15
14
var toArray = require ( 'stream-to-array' )
@@ -34,30 +33,18 @@ var INTENDED_USAGE_REGEXP = /^\s*(?:(?:\d{1,2}\.|o)\s+)?Intended\s+Usage\s*:\s*(
34
33
var MIME_SUBTYPE_LINE_REGEXP = / ^ [ ^ : \s - ] * \s * (?: M I M E ) ? (?: [ M m ] e d i a ) ? (?: [ S s ] u b ? t y p e | S U B ? T Y P E ) (?: (?: [ N n ] a m e | N A M E ) ) ? \s * : \s + (?: [ A - Z a - z ] + [ T t ] r e e \s + (?: - ? ) ? | (?: [ a - z ] + ) + - ) ? ( [ 0 - 9 A - Z a - z ] [ 0 - 9 A - Z a - z _ . + - ] * ) (?: \s | $ ) / m
35
34
var MIME_TYPE_HAS_CHARSET_PARAMETER_REGEXP = / p a r a m e t e r s \s * : [ ^ . ] * \b c h a r s e t \b / im
36
35
37
- co ( function * ( ) {
38
- var gens = yield [
39
- get ( 'application' , { extensions : / (?: \/ (?: c w l | e c m a s c r i p t | e x p r e s s | f d f | g z i p | (?: l d | m a n i f e s t ) \+ j s o n | n - q u a d s | n - t r i p l e s | p g p - .+ | t r i g | v n d \. (?: a g e | a p p l e \. .+ | d b f | m a p b o x - v e c t o r - t i l e | r a r ) ) | x f d f | \+ x m l ) $ / } ) ,
40
- get ( 'audio' , { extensions : / \/ (?: a a c | m o b i l e - x m f ) $ / } ) ,
41
- get ( 'font' , { extensions : true } ) ,
42
- get ( 'image' , { extensions : true } ) ,
43
- get ( 'message' , { extensions : true } ) ,
44
- get ( 'model' , { extensions : true } ) ,
45
- get ( 'multipart' ) ,
46
- get ( 'text' , { extensions : / \/ (?: j a v a s c r i p t | m a r k d o w n | s p d x | t u r t l e | v n d \. f a m i l y s e a r c h \. g e d c o m | v t t ) $ / } ) ,
47
- get ( 'video' , { extensions : / \/ i s o \. s e g m e n t $ / } )
48
- ]
49
-
50
- // flatten generators
51
- gens = gens . reduce ( concat , [ ] )
52
-
53
- // get results in groups
54
- var results = [ ]
55
- while ( gens . length !== 0 ) {
56
- results . push ( yield gens . splice ( 0 , 10 ) )
57
- }
58
-
59
- // flatten results
60
- results = results . reduce ( concat , [ ] )
36
+ ; ( async function ( ) {
37
+ const results = Array . prototype . concat . apply ( [ ] , [
38
+ await get ( 'application' , { extensions : / (?: \/ (?: c w l | e c m a s c r i p t | e x p r e s s | f d f | g z i p | (?: l d | m a n i f e s t ) \+ j s o n | n - q u a d s | n - t r i p l e s | p g p - .+ | t r i g | v n d \. (?: a g e | a p p l e \. .+ | d b f | m a p b o x - v e c t o r - t i l e | r a r ) ) | x f d f | \+ x m l ) $ / } ) ,
39
+ await get ( 'audio' , { extensions : / \/ (?: a a c | m o b i l e - x m f ) $ / } ) ,
40
+ await get ( 'font' , { extensions : true } ) ,
41
+ await get ( 'image' , { extensions : true } ) ,
42
+ await get ( 'message' , { extensions : true } ) ,
43
+ await get ( 'model' , { extensions : true } ) ,
44
+ await get ( 'multipart' ) ,
45
+ await get ( 'text' , { extensions : / \/ (?: j a v a s c r i p t | m a r k d o w n | s p d x | t u r t l e | v n d \. f a m i l y s e a r c h \. g e d c o m | v t t ) $ / } ) ,
46
+ await get ( 'video' , { extensions : / \/ i s o \. s e g m e n t $ / } )
47
+ ] )
61
48
62
49
// gather extension frequency
63
50
var exts = Object . create ( null )
@@ -98,69 +85,65 @@ co(function * () {
98
85
} )
99
86
100
87
writedb ( 'src/iana-types.json' , json )
101
- } ) . then ( )
88
+ } ( ) )
102
89
103
- function addTemplateData ( data , options ) {
90
+ async function addTemplateData ( data , options ) {
104
91
var opts = options || { }
105
92
106
93
if ( ! data . template ) {
107
- return data
94
+ return
108
95
}
109
96
110
- return function * get ( ) {
111
- var res = yield got ( 'https://www.iana.org/assignments/media-types/' + data . template )
112
- var ref = data . type + '/' + data . name
113
- var rfc = getRfcReferences ( data . reference ) [ 0 ]
97
+ let res = await got ( 'https://www.iana.org/assignments/media-types/' + data . template )
98
+ var ref = data . type + '/' + data . name
99
+ var rfc = getRfcReferences ( data . reference ) [ 0 ]
114
100
115
- if ( res . statusCode === 404 && data . template !== ref ) {
116
- console . log ( 'template ' + data . template + ' not found, retry as ' + ref )
117
- data . template = ref
118
- res = yield got ( 'https://www.iana.org/assignments/media-types/' + ref )
101
+ if ( res . statusCode === 404 && data . template !== ref ) {
102
+ console . log ( 'template ' + data . template + ' not found, retry as ' + ref )
103
+ data . template = ref
104
+ res = await got ( 'https://www.iana.org/assignments/media-types/' + ref )
119
105
120
- // replace the guessed mime
121
- if ( res . statusCode === 200 ) {
122
- data . mime = data . template
123
- }
106
+ // replace the guessed mime
107
+ if ( res . statusCode === 200 ) {
108
+ data . mime = data . template
124
109
}
110
+ }
125
111
126
- if ( res . statusCode === 404 && rfc !== undefined ) {
127
- console . log ( 'template ' + data . template + ' not found, fetch ' + rfc )
128
- res = yield got ( 'https://tools.ietf.org/rfc/' + rfc . toLowerCase ( ) + '.txt' )
129
- }
112
+ if ( res . statusCode === 404 && rfc !== undefined ) {
113
+ console . log ( 'template ' + data . template + ' not found, fetch ' + rfc )
114
+ res = await got ( 'https://tools.ietf.org/rfc/' + rfc . toLowerCase ( ) + '.txt' )
115
+ }
130
116
131
- if ( res . statusCode === 404 ) {
132
- console . log ( 'template ' + data . template + ' not found' )
133
- return data
134
- }
117
+ if ( res . statusCode === 404 ) {
118
+ console . log ( 'template ' + data . template + ' not found' )
119
+ return
120
+ }
135
121
136
- if ( res . statusCode !== 200 ) {
137
- throw new Error ( 'got status code ' + res . statusCode + ' from template ' + data . template )
138
- }
122
+ if ( res . statusCode !== 200 ) {
123
+ throw new Error ( 'got status code ' + res . statusCode + ' from template ' + data . template )
124
+ }
139
125
140
- var body = getTemplateBody ( res . body )
141
- var mime = extractTemplateMime ( body )
126
+ var body = getTemplateBody ( res . body )
127
+ var mime = extractTemplateMime ( body )
142
128
143
- // add the template as a source
144
- addSource ( data , res . url )
129
+ // add the template as a source
130
+ addSource ( data , res . url )
145
131
146
- if ( mimeEql ( mime , data . mime ) ) {
147
- // use extracted mime
148
- data . mime = mime
132
+ if ( mimeEql ( mime , data . mime ) ) {
133
+ // use extracted mime
134
+ data . mime = mime
149
135
150
- // use extracted charset
151
- data . charset = extractTemplateCharset ( body )
136
+ // use extracted charset
137
+ data . charset = extractTemplateCharset ( body )
152
138
153
- // use extracted usage
154
- data . usage = extractIntendedUsage ( body )
139
+ // use extracted usage
140
+ data . usage = extractIntendedUsage ( body )
155
141
156
- // use extracted extensions
157
- if ( data . usage === 'common' && opts . extensions &&
158
- ( opts . extensions === true || opts . extensions . test ( data . mime ) ) ) {
159
- data . extensions = extractTemplateExtensions ( body )
160
- }
142
+ // use extracted extensions
143
+ if ( data . usage === 'common' && opts . extensions &&
144
+ ( opts . extensions === true || opts . extensions . test ( data . mime ) ) ) {
145
+ data . extensions = extractTemplateExtensions ( body )
161
146
}
162
-
163
- return data
164
147
}
165
148
}
166
149
@@ -229,29 +212,30 @@ function extractTemplateExtensions (body) {
229
212
: exts
230
213
}
231
214
232
- function * get ( type , options ) {
233
- var res = yield got ( 'https://www.iana.org/assignments/media-types/' + encodeURIComponent ( type ) + '.csv' )
215
+ async function get ( type , options ) {
216
+ const res = await got ( 'https://www.iana.org/assignments/media-types/' + encodeURIComponent ( type ) + '.csv' )
234
217
235
218
if ( res . statusCode !== 200 ) {
236
219
throw new Error ( 'got status code ' + res . statusCode + ' from ' + type )
237
220
}
238
221
239
- var mimes = yield toArray ( parser ( res . body ) )
222
+ const mimes = await toArray ( parser ( res . body ) )
240
223
var headers = mimes . shift ( ) . map ( normalizeHeader )
241
224
var reduceRows = generateRowMapper ( headers )
225
+ const results = [ ]
242
226
var templates = Object . create ( null )
243
227
244
- return mimes . map ( function ( row ) {
228
+ for ( const row of mimes ) {
245
229
var data = row . reduce ( reduceRows , { type : type } )
246
230
247
231
if ( data . template ) {
248
232
if ( data . template === type + '/example' ) {
249
- return
233
+ continue
250
234
}
251
235
252
236
if ( templates [ data . template ] ) {
253
237
// duplicate entry
254
- return
238
+ continue
255
239
}
256
240
257
241
templates [ data . template ] = true
@@ -270,8 +254,12 @@ function * get (type, options) {
270
254
addSource ( data , url )
271
255
} )
272
256
273
- return addTemplateData ( data , options )
274
- } )
257
+ await addTemplateData ( data , options )
258
+
259
+ results . push ( data )
260
+ }
261
+
262
+ return results
275
263
}
276
264
277
265
function getTemplateBody ( body ) {
@@ -323,10 +311,6 @@ function appendToLine (line, str) {
323
311
return trimmed + append
324
312
}
325
313
326
- function concat ( a , b ) {
327
- return a . concat ( b . filter ( Boolean ) )
328
- }
329
-
330
314
function generateRowMapper ( headers ) {
331
315
return function reduceRows ( obj , val , index ) {
332
316
if ( val !== '' ) {
0 commit comments