UNPKG

13 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const parseXML = require("xml2js");
4const _isEmpty = require("lodash.isempty");
5const _set = require("lodash.set");
6const _uniq = require("lodash.uniq");
7const errors_1 = require("../errors");
8var DepType;
9(function (DepType) {
10 DepType["prod"] = "prod";
11 DepType["dev"] = "dev";
12})(DepType = exports.DepType || (exports.DepType = {}));
13var ProjectJsonDepType;
14(function (ProjectJsonDepType) {
15 ProjectJsonDepType["build"] = "build";
16 ProjectJsonDepType["project"] = "project";
17 ProjectJsonDepType["platform"] = "platform";
18 ProjectJsonDepType["default"] = "default";
19})(ProjectJsonDepType = exports.ProjectJsonDepType || (exports.ProjectJsonDepType = {}));
20function getDependencyTreeFromProjectJson(manifestFile, includeDev = false) {
21 const depTree = {
22 dependencies: {},
23 hasDevDependencies: false,
24 name: '',
25 version: '',
26 };
27 for (const depName in manifestFile.dependencies) {
28 if (!manifestFile.dependencies.hasOwnProperty(depName)) {
29 continue;
30 }
31 const depValue = manifestFile.dependencies[depName];
32 const version = depValue.version || depValue;
33 const isDev = depValue.type === 'build';
34 depTree.hasDevDependencies = depTree.hasDevDependencies || isDev;
35 if (isDev && !includeDev) {
36 continue;
37 }
38 depTree.dependencies[depName] = buildSubTreeFromProjectJson(depName, version, isDev);
39 }
40 return depTree;
41}
42exports.getDependencyTreeFromProjectJson = getDependencyTreeFromProjectJson;
43function buildSubTreeFromProjectJson(name, version, isDev) {
44 const depSubTree = {
45 depType: isDev ? DepType.dev : DepType.prod,
46 dependencies: {},
47 name,
48 version,
49 };
50 return depSubTree;
51}
52async function getDependencyTreeFromPackagesConfig(manifestFile, includeDev = false) {
53 var _a, _b, _c;
54 const depTree = {
55 dependencies: {},
56 hasDevDependencies: false,
57 name: '',
58 version: '',
59 };
60 const packageList = (_c = (_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.packages) === null || _b === void 0 ? void 0 : _b.package, (_c !== null && _c !== void 0 ? _c : []));
61 for (const dep of packageList) {
62 const depName = dep.$.id;
63 const isDev = !!dep.$.developmentDependency;
64 depTree.hasDevDependencies = depTree.hasDevDependencies || isDev;
65 if (isDev && !includeDev) {
66 continue;
67 }
68 depTree.dependencies[depName] = buildSubTreeFromPackagesConfig(dep, isDev);
69 }
70 return depTree;
71}
72exports.getDependencyTreeFromPackagesConfig = getDependencyTreeFromPackagesConfig;
73function buildSubTreeFromPackagesConfig(dep, isDev) {
74 const depSubTree = {
75 depType: isDev ? DepType.dev : DepType.prod,
76 dependencies: {},
77 name: dep.$.id,
78 version: dep.$.version,
79 };
80 if (dep.$.targetFramework) {
81 depSubTree.targetFrameworks = [dep.$.targetFramework];
82 }
83 return depSubTree;
84}
85async function getDependencyTreeFromProjectFile(manifestFile, includeDev = false, propsMap = {}) {
86 var _a, _b, _c, _d, _e;
87 const nameProperty = (_c = (_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.Project) === null || _b === void 0 ? void 0 : _b.PropertyGroup, (_c !== null && _c !== void 0 ? _c : []))
88 .filter((propertyGroup) => typeof propertyGroup !== 'string')
89 .find((propertyGroup) => {
90 return 'PackageId' in propertyGroup || 'AssemblyName' in propertyGroup;
91 }) || {};
92 const name = ((_d = nameProperty.PackageId) === null || _d === void 0 ? void 0 : _d[0]) || ((_e = nameProperty.AssemblyName) === null || _e === void 0 ? void 0 : _e[0]) || '';
93 const packageReferenceDeps = await getDependenciesFromPackageReference(manifestFile, includeDev, propsMap);
94 // order matters, the order deps are parsed in needs to be preserved and first seen kept
95 // so applying the packageReferenceDeps last to override the second parsed
96 const depTree = {
97 dependencies: Object.assign({}, packageReferenceDeps.dependencies),
98 hasDevDependencies: packageReferenceDeps.hasDevDependencies,
99 name,
100 version: '',
101 };
102 if (packageReferenceDeps.dependenciesWithUnknownVersions) {
103 depTree.dependenciesWithUnknownVersions =
104 packageReferenceDeps.dependenciesWithUnknownVersions;
105 }
106 return depTree;
107}
108exports.getDependencyTreeFromProjectFile = getDependencyTreeFromProjectFile;
109async function getDependenciesFromPackageReference(manifestFile, includeDev = false, propsMap) {
110 var _a, _b, _c;
111 let dependenciesResult = {
112 dependencies: {},
113 hasDevDependencies: false,
114 };
115 const packageGroups = (_c = (_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.Project) === null || _b === void 0 ? void 0 : _b.ItemGroup, (_c !== null && _c !== void 0 ? _c : [])).filter((itemGroup) => typeof itemGroup === 'object' && 'PackageReference' in itemGroup);
116 if (!packageGroups.length) {
117 return dependenciesResult;
118 }
119 for (const packageList of packageGroups) {
120 dependenciesResult = processItemGroupForPackageReference(packageList, manifestFile, includeDev, dependenciesResult, propsMap);
121 }
122 return dependenciesResult;
123}
124exports.getDependenciesFromPackageReference = getDependenciesFromPackageReference;
125function processItemGroupForPackageReference(packageList, manifestFile, includeDev, dependenciesResult, propsMap) {
126 var _a, _b, _c;
127 const targetFrameworks = (_c = (_b = (_a = packageList) === null || _a === void 0 ? void 0 : _a.$) === null || _b === void 0 ? void 0 : _b.Condition, (_c !== null && _c !== void 0 ? _c : false)) ? getConditionalFrameworks(packageList.$.Condition)
128 : [];
129 for (const dep of packageList.PackageReference) {
130 const depName = dep.$.Include;
131 if (!depName) {
132 // PackageReference Update is not yet supported
133 continue;
134 }
135 const isDev = !!dep.$.developmentDependency;
136 dependenciesResult.hasDevDependencies =
137 dependenciesResult.hasDevDependencies || isDev;
138 if (isDev && !includeDev) {
139 continue;
140 }
141 const subDep = buildSubTreeFromPackageReference(dep, isDev, manifestFile, targetFrameworks, propsMap);
142 if (subDep.withoutVersion) {
143 dependenciesResult.dependenciesWithUnknownVersions =
144 dependenciesResult.dependenciesWithUnknownVersions || [];
145 dependenciesResult.dependenciesWithUnknownVersions.push(subDep.name);
146 }
147 else {
148 dependenciesResult.dependencies[depName] = subDep;
149 }
150 }
151 return dependenciesResult;
152}
153function buildSubTreeFromPackageReference(dep, isDev, manifestFile, targetFrameworks, propsMap) {
154 const version = extractDependencyVersion(dep, manifestFile, propsMap) || '';
155 if (!_isEmpty(version)) {
156 const depSubTree = {
157 depType: isDev ? DepType.dev : DepType.prod,
158 dependencies: {},
159 name: dep.$.Include,
160 // Version could be in attributes or as child node.
161 version,
162 };
163 if (targetFrameworks.length) {
164 depSubTree.targetFrameworks = targetFrameworks;
165 }
166 return depSubTree;
167 }
168 else {
169 return { name: dep.$.Include, withoutVersion: true };
170 }
171}
172function extractDependencyVersion(dep, manifestFile, propsMap) {
173 var _a, _b, _c, _d, _e;
174 const VARS_MATCHER = /^\$\((.*?)\)/;
175 let version = ((_b = (_a = dep) === null || _a === void 0 ? void 0 : _a.$) === null || _b === void 0 ? void 0 : _b.Version) || ((_c = dep) === null || _c === void 0 ? void 0 : _c.Version);
176 if (Array.isArray(version)) {
177 version = version[0];
178 }
179 const variableVersion = version && version.match(VARS_MATCHER);
180 if (!variableVersion) {
181 return version;
182 }
183 // version is a variable, extract it from manifest or props lookup
184 const propertyName = variableVersion[1];
185 const propertyMap = Object.assign(Object.assign({}, propsMap), getPropertiesMap(manifestFile));
186 return _e = (_d = propertyMap) === null || _d === void 0 ? void 0 : _d[propertyName], (_e !== null && _e !== void 0 ? _e : null);
187}
188function getConditionalFrameworks(condition) {
189 const regexp = /\(TargetFramework\)'\s?==\s? '((\w|\d|\.)*)'/g;
190 const frameworks = [];
191 let match = regexp.exec(condition);
192 while (match !== null) {
193 frameworks.push(match[1]);
194 match = regexp.exec(condition);
195 }
196 return frameworks;
197}
198async function parseXmlFile(manifestFileContents) {
199 return new Promise((resolve, reject) => {
200 parseXML.parseString(manifestFileContents, (err, result) => {
201 if (err) {
202 const e = new errors_1.InvalidUserInputError('xml file parsing failed');
203 return reject(e);
204 }
205 return resolve(result);
206 });
207 });
208}
209exports.parseXmlFile = parseXmlFile;
210function getPropertiesMap(propsContents) {
211 var _a, _b, _c;
212 const projectPropertyGroup = (_c = (_b = (_a = propsContents) === null || _a === void 0 ? void 0 : _a.Project) === null || _b === void 0 ? void 0 : _b.PropertyGroup, (_c !== null && _c !== void 0 ? _c : []));
213 const props = {};
214 if (!projectPropertyGroup.length) {
215 return props;
216 }
217 for (const group of projectPropertyGroup) {
218 for (const key of Object.keys(group)) {
219 _set(props, key, group[key][0]);
220 }
221 }
222 return props;
223}
224exports.getPropertiesMap = getPropertiesMap;
225function getTargetFrameworksFromProjectFile(manifestFile) {
226 var _a, _b, _c;
227 let targetFrameworksResult = [];
228 const projectPropertyGroup = (_c = (_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.Project) === null || _b === void 0 ? void 0 : _b.PropertyGroup, (_c !== null && _c !== void 0 ? _c : []));
229 if (!projectPropertyGroup) {
230 return targetFrameworksResult;
231 }
232 const propertyList = projectPropertyGroup.find((propertyGroup) => {
233 return ('TargetFramework' in propertyGroup ||
234 'TargetFrameworks' in propertyGroup ||
235 'TargetFrameworkVersion' in propertyGroup);
236 }) || {};
237 if (_isEmpty(propertyList)) {
238 return targetFrameworksResult;
239 }
240 // TargetFrameworks is expected to be a list ; separated
241 if (propertyList.TargetFrameworks) {
242 for (const item of propertyList.TargetFrameworks) {
243 targetFrameworksResult = [
244 ...targetFrameworksResult,
245 ...getTargetFrameworks(item),
246 ];
247 }
248 }
249 // TargetFrameworkVersion is expected to be a string containing only one item
250 // TargetFrameworkVersion also implies .NETFramework, for convenience
251 // return longer version
252 if (propertyList.TargetFrameworkVersion) {
253 targetFrameworksResult.push(`.NETFramework,Version=${propertyList.TargetFrameworkVersion[0]}`);
254 }
255 // TargetFrameworks is expected to be a string
256 if (propertyList.TargetFramework) {
257 targetFrameworksResult = [
258 ...targetFrameworksResult,
259 ...propertyList.TargetFramework,
260 ];
261 }
262 return _uniq(targetFrameworksResult);
263}
264exports.getTargetFrameworksFromProjectFile = getTargetFrameworksFromProjectFile;
265function getTargetFrameworks(item) {
266 if (typeof item === 'object' && item.hasOwnProperty('_')) {
267 item = item._;
268 }
269 return item.split(';').filter((x) => !_isEmpty(x));
270}
271function getTargetFrameworksFromProjectConfig(manifestFile) {
272 var _a, _b, _c;
273 const targetFrameworksResult = [];
274 const packages = (_c = (_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.packages) === null || _b === void 0 ? void 0 : _b.package, (_c !== null && _c !== void 0 ? _c : []));
275 for (const item of packages) {
276 const targetFramework = item.$.targetFramework;
277 if (!targetFramework) {
278 continue;
279 }
280 if (!targetFrameworksResult.includes(targetFramework)) {
281 targetFrameworksResult.push(targetFramework);
282 }
283 }
284 return targetFrameworksResult;
285}
286exports.getTargetFrameworksFromProjectConfig = getTargetFrameworksFromProjectConfig;
287function getTargetFrameworksFromProjectJson(manifestFile) {
288 var _a, _b;
289 return Object.keys((_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.frameworks, (_b !== null && _b !== void 0 ? _b : {})));
290}
291exports.getTargetFrameworksFromProjectJson = getTargetFrameworksFromProjectJson;
292function getTargetFrameworksFromProjectAssetsJson(manifestFile) {
293 var _a, _b;
294 return Object.keys((_b = (_a = manifestFile) === null || _a === void 0 ? void 0 : _a.targets, (_b !== null && _b !== void 0 ? _b : {})));
295}
296exports.getTargetFrameworksFromProjectAssetsJson = getTargetFrameworksFromProjectAssetsJson;
297//# sourceMappingURL=index.js.map
\No newline at end of file