UNPKG

6.33 kBJavaScriptView Raw
1var fs = require('fs');
2var cwd = process.cwd();
3var packageJson = require(cwd + '/package.json');
4var logger = require('./logger');
5var Version = require('@jenkins-cd/js-modules/js/Version');
6
7exports.getDependency = function(depName) {
8 function findDep(onDepMap) {
9 if (onDepMap) {
10 return onDepMap[depName];
11 }
12 return undefined;
13 }
14
15 var version = findDep(packageJson.dependencies);
16 if (version) {
17 return {
18 type: 'runtime',
19 version: version
20 };
21 } else {
22 version = findDep(packageJson.devDependencies);
23 if (version) {
24 return {
25 type: 'dev',
26 version: version
27 };
28 } else {
29 version = findDep(packageJson.peerDependencies);
30 if (version) {
31 return {
32 type: 'peer',
33 version: version
34 };
35 }
36 // TODO: bundled and optional deps?
37 }
38 }
39
40 return undefined;
41};
42
43exports.hasJenkinsJsModulesDep = function() {
44 return (exports.getDependency('@jenkins-cd/js-modules') !== undefined);
45};
46
47exports.exitOnMissingDependency = function(depName, message) {
48 if (!message) {
49 message = 'Missing required NPM dependency.';
50 }
51 logger.logError(message + '\n\t- You must install the ' + depName + ' NPM package i.e. "npm install --save ' + depName + '" (use "--save-dev" to add as a devDependency)');
52 process.exit(1);
53};
54
55exports.warnOnMissingDependency = function(depName, message) {
56 if (exports.getDependency(depName)) {
57 // It's there.
58 return;
59 }
60 if (!message) {
61 message = 'Missing NPM dependency "' + depName + '" (may be required).';
62 }
63 logger.logWarn(message + '\n\t- To install the ' + depName + ' NPM package, run "npm install --save ' + depName + '" (use "--save-dev" to add as a devDependency)');
64};
65
66exports.assertHasJenkinsJsModulesDependency = function(message) {
67 if(!exports.hasJenkinsJsModulesDep()) {
68 exports.exitOnMissingDependency('@jenkins-cd/js-modules', message);
69 }
70};
71
72exports.processExternalizedDependencies = function(builder) {
73 if (packageJson.jenkinscd) {
74 var imports = packageJson.jenkinscd.import;
75
76 if (!imports && packageJson.jenkinscd.extDependencies) {
77 imports = packageJson.jenkinscd.extDependencies;
78 logger.logWarn('DEPRECATED use of jenkinscd.extDependencies in package.json. Change to jenkinscd.import.');
79 }
80
81 if (imports) {
82 for (var i = 0; i < imports.length; i++) {
83 var theImport = imports[i];
84 if (typeof theImport === 'object') {
85 builder.import(theImport.name, theImport);
86 } else {
87 builder.import(theImport);
88 }
89 }
90 }
91 var exports = packageJson.jenkinscd.export;
92 if (exports) {
93 for (var i = 0; i < exports.length; i++) {
94 builder.export(exports[i]);
95 }
96 }
97 }
98};
99
100/**
101 * Get the externalized package metadata for the named NPM dependency.
102 * @param depPackageName The NPM dependency package name.
103 */
104exports.externalizedVersionMetadata = function(depPackageName) {
105 var packageJsonFile = cwd + '/node_modules/' + depPackageName + '/package.json';
106
107 if (!fs.existsSync(packageJsonFile)) {
108 return undefined;
109 }
110
111 var packageJson = require(packageJsonFile);
112
113 var metadata = {};
114 metadata.packageName = depPackageName;
115 metadata.installedVersion = new Version(packageJson.version);
116 metadata.depVersion = new Version(exports.getDependency(depPackageName).version);
117 metadata.normalizedPackageName = exports.normalizePackageName(depPackageName);
118 metadata.jsModuleNames = mmpModuleNames(metadata.normalizedPackageName, metadata.installedVersion);
119 metadata.importAs = function (scope) {
120 var scopedName;
121 if (scope) {
122 scopedName = metadata.jsModuleNames[scope];
123 if (!scopedName) {
124 throw new Error('Unknown scope "' + scope + '".');
125 }
126 } else {
127 scopedName = metadata.jsModuleNames.nameFor(metadata.depVersion);
128 }
129
130 return metadata.normalizedPackageName + ':' + scopedName;
131 };
132
133 return metadata;
134};
135
136/**
137 * Normalize an NPM package name by removing all non alpha numerics and replacing
138 * with hyphens.
139 * @param packageName The NPM package name.
140 * @returns The normalized NPM package name.
141 */
142exports.normalizePackageName = function(packageName) {
143 packageName = packageName.replace(/[^\w.]/g, "-"); // replace non alphanumerics.
144 if (packageName.charAt(0) === '-') {
145 packageName = packageName.substring(1);
146 }
147 return packageName;
148};
149
150/**
151 * Create major, minor and patch (version) module names that can
152 * then be used in the .js generation and module exporting.
153 * @param normalizedPackageName The normalized NPM package name.
154 * @param fullVersion The full version of the installed NPM package.
155 */
156function mmpModuleNames(normalizedPackageName, fullVersion) {
157 return {
158 any: normalizedPackageName + '@any',
159 major: normalizedPackageName + '@' + fullVersion.major + '.x',
160 minor: normalizedPackageName + '@' + fullVersion.major + '.' + fullVersion.minor + '.x',
161 patch: normalizedPackageName + '@' + fullVersion.major + '.' + fullVersion.minor + '.' + fullVersion.patch,
162 nameFor: function (depVersion) {
163 if (depVersion.minor === 'x') {
164 return this.major;
165 } else if (depVersion.patch === 'x') {
166 return this.minor;
167 } else {
168 return this.patch;
169 }
170 },
171 filenameFor: function (depVersion) {
172 if (depVersion.minor === 'x') {
173 return normalizedPackageName + '-' + fullVersion.major + '-x';
174 } else if (depVersion.patch === 'x') {
175 return normalizedPackageName + '-' + fullVersion.major + '-' + fullVersion.minor + '-x';
176 } else {
177 return normalizedPackageName + '-' + fullVersion.major + '-' + fullVersion.minor + '-' + fullVersion.patch;
178 }
179 }
180 };
181}
\No newline at end of file