1
1
'use strict' ;
2
2
3
- const { strictEqual } = require ( 'assert' ) ;
4
3
const fs = require ( 'fs' ) ;
5
4
const path = require ( 'path' ) ;
6
5
const marked = require ( 'marked' ) ;
@@ -9,36 +8,52 @@ const rootDir = path.resolve(__dirname, '..', '..');
9
8
const doc = path . resolve ( rootDir , 'doc' , 'api' , 'addons.md' ) ;
10
9
const verifyDir = path . resolve ( rootDir , 'test' , 'addons' ) ;
11
10
11
+ const contents = fs . readFileSync ( doc ) . toString ( ) ;
12
+
13
+ const tokens = marked . lexer ( contents ) ;
12
14
let id = 0 ;
13
- let currentHeader ;
14
15
16
+ let currentHeader ;
15
17
const addons = { } ;
16
- const content = fs . readFileSync ( doc , 'utf8' ) ;
17
- for ( const { text, type } of marked . lexer ( content ) ) {
18
- if ( type === 'heading' && text ) {
19
- currentHeader = text ;
18
+ tokens . forEach ( ( token ) => {
19
+ if ( token . type === 'heading' && token . text ) {
20
+ currentHeader = token . text ;
20
21
addons [ currentHeader ] = {
21
22
files : { }
22
23
} ;
23
24
}
24
- if ( type === 'code' ) {
25
- const match = text . match ( / ^ \/ \/ \s + ( .* \. (?: c c | h | j s ) ) [ \r \n ] / ) ;
25
+ if ( token . type === 'code' ) {
26
+ var match = token . text . match ( / ^ \/ \/ \s + ( .* \. (?: c c | h | j s ) ) [ \r \n ] / ) ;
26
27
if ( match !== null ) {
27
- addons [ currentHeader ] . files [ match [ 1 ] ] = text ;
28
+ addons [ currentHeader ] . files [ match [ 1 ] ] = token . text ;
28
29
}
29
30
}
31
+ } ) ;
32
+ for ( var header in addons ) {
33
+ verifyFiles ( addons [ header ] . files ,
34
+ header ,
35
+ console . log . bind ( null , 'wrote' ) ,
36
+ function ( err ) { if ( err ) throw err ; } ) ;
30
37
}
31
38
32
- for ( const header in addons ) {
33
- let { files } = addons [ header ] ;
39
+ function once ( fn ) {
40
+ var once = false ;
41
+ return function ( ) {
42
+ if ( once )
43
+ return ;
44
+ once = true ;
45
+ fn . apply ( this , arguments ) ;
46
+ } ;
47
+ }
34
48
49
+ function verifyFiles ( files , blockName , onprogress , ondone ) {
35
50
// must have a .cc and a .js to be a valid test
36
51
if ( ! Object . keys ( files ) . some ( ( name ) => / \. c c $ / . test ( name ) ) ||
37
52
! Object . keys ( files ) . some ( ( name ) => / \. j s $ / . test ( name ) ) ) {
38
- continue ;
53
+ return ;
39
54
}
40
55
41
- const blockName = header
56
+ blockName = blockName
42
57
. toLowerCase ( )
43
58
. replace ( / \s / g, '_' )
44
59
. replace ( / [ ^ a - z \d _ ] / g, '' ) ;
@@ -47,17 +62,29 @@ for (const header in addons) {
47
62
`${ ( ++ id < 10 ? '0' : '' ) + id } _${ blockName } `
48
63
) ;
49
64
50
- files = Object . entries ( files ) . map ( ( [ name , content ] ) => {
51
- if ( name === 'test.js' ) content = boilerplate ( name , content ) ;
52
- return { name, content, path : path . resolve ( dir , name ) } ;
65
+ files = Object . keys ( files ) . map ( function ( name ) {
66
+ if ( name === 'test.js' ) {
67
+ files [ name ] = `'use strict';
68
+ const common = require('../../common');
69
+ ${ files [ name ] . replace (
70
+ "'./build/Release/addon'" ,
71
+ // eslint-disable-next-line no-template-curly-in-string
72
+ '`./build/${common.buildType}/addon`' ) }
73
+ ` ;
74
+ }
75
+ return {
76
+ path : path . resolve ( dir , name ) ,
77
+ name : name ,
78
+ content : files [ name ]
79
+ } ;
53
80
} ) ;
54
81
55
82
files . push ( {
56
83
path : path . resolve ( dir , 'binding.gyp' ) ,
57
84
content : JSON . stringify ( {
58
85
targets : [
59
86
{
60
- target_name : 'binding ' ,
87
+ target_name : 'addon ' ,
61
88
defines : [ 'V8_DEPRECATION_WARNINGS=1' ] ,
62
89
sources : files . map ( function ( file ) {
63
90
return file . name ;
@@ -67,34 +94,22 @@ for (const header in addons) {
67
94
} )
68
95
} ) ;
69
96
70
- try {
71
- fs . mkdirSync ( dir ) ;
72
- } catch ( e ) {
73
- strictEqual ( e . code , 'EEXIST' ) ;
74
- }
97
+ fs . mkdir ( dir , function ( ) {
98
+ // Ignore errors
75
99
76
- for ( const file of files ) {
77
- let content ;
78
- try {
79
- content = fs . readFileSync ( file . path , 'utf8' ) ;
80
- } catch ( e ) {
81
- strictEqual ( e . code , 'ENOENT' ) ;
82
- }
100
+ const done = once ( ondone ) ;
101
+ var waiting = files . length ;
102
+ files . forEach ( function ( file ) {
103
+ fs . writeFile ( file . path , file . content , function ( err ) {
104
+ if ( err )
105
+ return done ( err ) ;
83
106
84
- // Only update when file content has changed to prevent unneeded rebuilds.
85
- if ( content !== file . content ) {
86
- fs . writeFileSync ( file . path , file . content ) ;
87
- console . log ( 'wrote' , file . path ) ;
88
- }
89
- }
90
- }
107
+ if ( onprogress )
108
+ onprogress ( file . path ) ;
91
109
92
- function boilerplate ( name , content ) {
93
- return `'use strict';
94
- const common = require('../../common');
95
- ${ content . replace (
96
- "'./build/Release/binding'" ,
97
- // eslint-disable-next-line no-template-curly-in-string
98
- '`./build/${common.buildType}/binding`' ) }
99
- ` ;
110
+ if ( -- waiting === 0 )
111
+ done ( ) ;
112
+ } ) ;
113
+ } ) ;
114
+ } ) ;
100
115
}
0 commit comments