Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80606 views
1
/**
2
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
3
*
4
* This source code is licensed under the BSD-style license found in the
5
* LICENSE file in the root directory of this source tree. An additional grant
6
* of patent rights can be found in the PATENTS file in the same directory.
7
*/
8
var FileFinder = require('node-find-files');
9
var fs = require('fs');
10
var path = require('path');
11
12
var EXTRACT_DOCBLOCK_REGEX = /^\s*(\/\*\*?(?:.|\r?\n)*?\*\/)/;
13
var IS_JSHINT_DOCBLOCK = /\/\*\*?\s*jshint\s+[a-zA-Z0-9]+\s*:\s*[a-zA-Z0-9]+/;
14
15
var ROOT_DIR = path.resolve(__dirname, '..');
16
17
var EXAMPLES_DIR = path.join(ROOT_DIR, 'examples');
18
var COVERAGE_TEMPLATE_PATH = path.join(ROOT_DIR, 'src', 'coverageTemplate.js');
19
var NODE_MODULES_DIR = path.join(ROOT_DIR, 'node_modules');
20
var VENDOR_DIR = path.join(ROOT_DIR, 'vendor');
21
var WEBSITE_DIR = path.join(ROOT_DIR, 'website');
22
23
var LICENSE_HEADER = [
24
' * Copyright (c) 2014, Facebook, Inc. All rights reserved.',
25
' *',
26
' * This source code is licensed under the BSD-style license found in the',
27
' * LICENSE file in the root directory of this source tree. An additional ' +
28
'grant',
29
' * of patent rights can be found in the PATENTS file in the same directory.',
30
].join('\n');
31
32
function needsLicenseHeader(fileData) {
33
if (/^#!/.test(fileData)) {
34
fileData = fileData.split('\n');
35
fileData.shift();
36
fileData = fileData.join('\n');
37
}
38
return fileData.indexOf(LICENSE_HEADER) === -1;
39
}
40
41
function addLicenseHeader(fileData) {
42
var preamble = '';
43
var epilogue = '\n */'
44
45
if (/^#!/.test(fileData)) {
46
fileData = fileData.split('\n');
47
preamble += fileData.shift() + '\n';
48
fileData = fileData.join('\n');
49
}
50
51
preamble += '/**\n';
52
53
var startingDocblock = EXTRACT_DOCBLOCK_REGEX.exec(fileData);
54
if (startingDocblock && !IS_JSHINT_DOCBLOCK.test(startingDocblock)) {
55
startingDocblock = startingDocblock[0];
56
57
fileData = fileData.substr(startingDocblock.length);
58
59
// Strip of starting/ending tokens
60
var strippedDocblock =
61
startingDocblock
62
.replace(/^\/\*\*?\s*/, '')
63
.replace(/\s*\*\/$/, '');
64
65
if (strippedDocblock.trim().charAt(0) !== '*') {
66
strippedDocblock = '* ' + strippedDocblock.trim();
67
}
68
69
epilogue = '\n *\n ' + strippedDocblock + epilogue;
70
}
71
72
73
return preamble + LICENSE_HEADER + epilogue + '\n' + fileData;
74
}
75
76
function main() {
77
var finder = new FileFinder({
78
rootFolder: ROOT_DIR,
79
filterFunction: function(pathStr) {
80
return (
81
pathStr !== COVERAGE_TEMPLATE_PATH
82
&& pathStr.substr(0, EXAMPLES_DIR.length) !== EXAMPLES_DIR
83
&& pathStr.substr(0, NODE_MODULES_DIR.length) !== NODE_MODULES_DIR
84
&& pathStr.substr(0, VENDOR_DIR.length) !== VENDOR_DIR
85
&& pathStr.substr(0, WEBSITE_DIR.length) !== WEBSITE_DIR
86
&& path.extname(pathStr) === '.js'
87
);
88
}
89
});
90
91
finder.on('error', function(err) {
92
console.error('Error: ' + (err.stack || err.msg || err));
93
process.exit(1);
94
});
95
96
finder.on('match', function(pathStr) {
97
console.log('Reading ' + pathStr + '...');
98
fs.readFile(pathStr, 'utf8', function(err, fileData) {
99
if (err) {
100
throw err;
101
}
102
103
if (needsLicenseHeader(fileData)) {
104
console.log('Adding license header to ' + pathStr + '...');
105
addLicenseHeader(fileData);
106
fs.writeFile(pathStr, addLicenseHeader(fileData), function(err) {
107
if (err) {
108
throw err;
109
}
110
console.log('Successfully updated ' + pathStr + '!');
111
});
112
}
113
});
114
});
115
116
finder.startSearch();
117
}
118
119
if (require.main === module) {
120
main();
121
}
122
123