-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
124 lines (105 loc) · 3.17 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
module.exports = function (__dirname) {
return {
findProjectDir: function () {
return findProjectDir(__dirname);
},
postinstall: function () {
return postinstall(__dirname);
},
preuninstall: function () {
return preuninstall(__dirname);
}
};
};
var fs = require('fs');
var os = require('os');
var path = require('path');
var util = require('util');
var mkdirp = require('mkdirp');
var glob = require('glob');
function generateHookName(pkg, hook) {
// flatten scoped packages to names
return ((hook.name || pkg.name).replace(/@/ig, '').replace(/\//ig, '-')) + '.js';
}
function findProjectDir(pkgdir) {
if (process.env.INIT_CWD && _isNativeScriptAppRoot(process.env.INIT_CWD)) {
return process.env.INIT_CWD;
}
var candidateDir = pkgdir;
var oldCandidateDir = null;
while (true) {
candidateDir = path.dirname(candidateDir);
if (oldCandidateDir === candidateDir) {
return;
}
if (path.basename(candidateDir) === 'node_modules') {
continue;
}
if (_isNativeScriptAppRoot(candidateDir)) {
return candidateDir;
}
oldCandidateDir = candidateDir;
}
}
function _isNativeScriptAppRoot(dir) {
var isNativeScriptAppRoot = false;
var packageJsonFile = path.join(dir, 'package.json');
if (fs.existsSync(packageJsonFile)) {
var packageJsonContent = require(packageJsonFile);
isNativeScriptAppRoot = !!packageJsonContent.nativescript && !!packageJsonContent.nativescript.id;
}
return isNativeScriptAppRoot;
}
function forEachHook(pkgdir, callback) {
var pkg = require(path.join(pkgdir, 'package.json'));
var ns = pkg.nativescript;
if (!ns) {
throw Error('Not a NativeScript development module.');
}
var projectDir = findProjectDir(pkgdir);
if (!projectDir) {
return;
}
var hooksDir = path.join(projectDir, 'hooks');
if (ns.hooks) {
ns.hooks.forEach(function (hook) {
callback(hooksDir, pkg, hook);
});
}
}
function hookInstalled(hookDir, pkg, hook) {
var hookBaseName = pkg.name;
var hookGlob = path.join(hookDir, "*" + hookBaseName + "*");
var files = glob.sync(hookGlob);
return files.length > 0;
}
function postinstall(pkgdir) {
forEachHook(pkgdir, function (hooksDir, pkg, hook) {
var hookDir = path.join(hooksDir, hook.type);
if (!fs.existsSync(hookDir)) {
mkdirp.sync(hookDir);
}
if (hookInstalled(hookDir, pkg, hook)) {
console.log(`Hook already installed: ${pkg.name} at location: ${hookDir}`);
return;
}
var hookFileName = generateHookName(pkg, hook);
var hookPath = path.join(hookDir, hookFileName);
var trampoline = util.format('%srequire("%s/%s");', hook.inject ? 'module.exports = ' : '', pkg.name, hook.script);
fs.writeFileSync(hookPath, trampoline + os.EOL);
});
}
function preuninstall(pkgdir) {
forEachHook(pkgdir, function (hooksDir, pkg, hook) {
var hookDir = path.join(hooksDir, hook.type);
var hookFileName = generateHookName(pkg, hook);
var hookPath = path.join(hookDir, hookFileName);
try {
if (fs.existsSync(hookPath)) {
fs.unlinkSync(hookPath);
}
} catch (err) {
console.warn('@nativescript/hook: ' + err.toString());
}
});
}