1
1
'use strict' ;
2
2
3
+ const { strictEqual } = require ( 'assert' ) ;
3
4
const fs = require ( 'fs' ) ;
4
5
const path = require ( 'path' ) ;
5
6
const marked = require ( 'marked' ) ;
@@ -8,52 +9,36 @@ const rootDir = path.resolve(__dirname, '..', '..');
8
9
const doc = path . resolve ( rootDir , 'doc' , 'api' , 'addons.md' ) ;
9
10
const verifyDir = path . resolve ( rootDir , 'test' , 'addons' ) ;
10
11
11
- const contents = fs . readFileSync ( doc ) . toString ( ) ;
12
-
13
- const tokens = marked . lexer ( contents ) ;
14
12
let id = 0 ;
15
-
16
13
let currentHeader ;
14
+
17
15
const addons = { } ;
18
- tokens . forEach ( ( token ) => {
19
- if ( token . type === 'heading' && token . text ) {
20
- currentHeader = token . text ;
16
+ const content = fs . readFileSync ( doc , 'utf8' ) ;
17
+ for ( const { text, type } of marked . lexer ( content ) ) {
18
+ if ( type === 'heading' && text ) {
19
+ currentHeader = text ;
21
20
addons [ currentHeader ] = {
22
21
files : { }
23
22
} ;
24
23
}
25
- if ( token . type === 'code' ) {
26
- var match = token . text . match ( / ^ \/ \/ \s + ( .* \. (?: c c | h | j s ) ) [ \r \n ] / ) ;
24
+ if ( type === 'code' ) {
25
+ const match = text . match ( / ^ \/ \/ \s + ( .* \. (?: c c | h | j s ) ) [ \r \n ] / ) ;
27
26
if ( match !== null ) {
28
- addons [ currentHeader ] . files [ match [ 1 ] ] = token . text ;
27
+ addons [ currentHeader ] . files [ match [ 1 ] ] = text ;
29
28
}
30
29
}
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 ; } ) ;
37
30
}
38
31
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
- }
32
+ for ( const header in addons ) {
33
+ let { files } = addons [ header ] ;
48
34
49
- function verifyFiles ( files , blockName , onprogress , ondone ) {
50
35
// must have a .cc and a .js to be a valid test
51
36
if ( ! Object . keys ( files ) . some ( ( name ) => / \. c c $ / . test ( name ) ) ||
52
37
! Object . keys ( files ) . some ( ( name ) => / \. j s $ / . test ( name ) ) ) {
53
- return ;
38
+ continue ;
54
39
}
55
40
56
- blockName = blockName
41
+ const blockName = header
57
42
. toLowerCase ( )
58
43
. replace ( / \s / g, '_' )
59
44
. replace ( / [ ^ a - z \d _ ] / g, '' ) ;
@@ -62,29 +47,17 @@ function verifyFiles(files, blockName, onprogress, ondone) {
62
47
`${ ( ++ id < 10 ? '0' : '' ) + id } _${ blockName } `
63
48
) ;
64
49
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
- } ;
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 ) } ;
80
53
} ) ;
81
54
82
55
files . push ( {
83
56
path : path . resolve ( dir , 'binding.gyp' ) ,
84
57
content : JSON . stringify ( {
85
58
targets : [
86
59
{
87
- target_name : 'addon ' ,
60
+ target_name : 'binding ' ,
88
61
defines : [ 'V8_DEPRECATION_WARNINGS=1' ] ,
89
62
sources : files . map ( function ( file ) {
90
63
return file . name ;
@@ -94,22 +67,34 @@ ${files[name].replace(
94
67
} )
95
68
} ) ;
96
69
97
- fs . mkdir ( dir , function ( ) {
98
- // Ignore errors
70
+ try {
71
+ fs . mkdirSync ( dir ) ;
72
+ } catch ( e ) {
73
+ strictEqual ( e . code , 'EEXIST' ) ;
74
+ }
99
75
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 ) ;
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
+ }
106
83
107
- if ( onprogress )
108
- onprogress ( file . path ) ;
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
+ }
109
91
110
- if ( -- waiting === 0 )
111
- done ( ) ;
112
- } ) ;
113
- } ) ;
114
- } ) ;
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
+ ` ;
115
100
}
0 commit comments