1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const parseXML = require("xml2js");
|
4 | const _isEmpty = require("lodash.isempty");
|
5 | const _set = require("lodash.set");
|
6 | const _uniq = require("lodash.uniq");
|
7 | const errors_1 = require("../errors");
|
8 | var DepType;
|
9 | (function (DepType) {
|
10 | DepType["prod"] = "prod";
|
11 | DepType["dev"] = "dev";
|
12 | })(DepType = exports.DepType || (exports.DepType = {}));
|
13 | var 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 = {}));
|
20 | function 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 | }
|
42 | exports.getDependencyTreeFromProjectJson = getDependencyTreeFromProjectJson;
|
43 | function 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 | }
|
52 | async 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 | }
|
72 | exports.getDependencyTreeFromPackagesConfig = getDependencyTreeFromPackagesConfig;
|
73 | function 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 | }
|
85 | async 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 |
|
95 |
|
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 | }
|
108 | exports.getDependencyTreeFromProjectFile = getDependencyTreeFromProjectFile;
|
109 | async 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 | }
|
124 | exports.getDependenciesFromPackageReference = getDependenciesFromPackageReference;
|
125 | function 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 |
|
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 | }
|
153 | function 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 |
|
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 | }
|
172 | function 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 |
|
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 | }
|
188 | function 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 | }
|
198 | async 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 | }
|
209 | exports.parseXmlFile = parseXmlFile;
|
210 | function 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 | }
|
224 | exports.getPropertiesMap = getPropertiesMap;
|
225 | function 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 |
|
241 | if (propertyList.TargetFrameworks) {
|
242 | for (const item of propertyList.TargetFrameworks) {
|
243 | targetFrameworksResult = [
|
244 | ...targetFrameworksResult,
|
245 | ...getTargetFrameworks(item),
|
246 | ];
|
247 | }
|
248 | }
|
249 |
|
250 |
|
251 |
|
252 | if (propertyList.TargetFrameworkVersion) {
|
253 | targetFrameworksResult.push(`.NETFramework,Version=${propertyList.TargetFrameworkVersion[0]}`);
|
254 | }
|
255 |
|
256 | if (propertyList.TargetFramework) {
|
257 | targetFrameworksResult = [
|
258 | ...targetFrameworksResult,
|
259 | ...propertyList.TargetFramework,
|
260 | ];
|
261 | }
|
262 | return _uniq(targetFrameworksResult);
|
263 | }
|
264 | exports.getTargetFrameworksFromProjectFile = getTargetFrameworksFromProjectFile;
|
265 | function getTargetFrameworks(item) {
|
266 | if (typeof item === 'object' && item.hasOwnProperty('_')) {
|
267 | item = item._;
|
268 | }
|
269 | return item.split(';').filter((x) => !_isEmpty(x));
|
270 | }
|
271 | function 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 | }
|
286 | exports.getTargetFrameworksFromProjectConfig = getTargetFrameworksFromProjectConfig;
|
287 | function 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 | }
|
291 | exports.getTargetFrameworksFromProjectJson = getTargetFrameworksFromProjectJson;
|
292 | function 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 | }
|
296 | exports.getTargetFrameworksFromProjectAssetsJson = getTargetFrameworksFromProjectAssetsJson;
|
297 |
|
\ | No newline at end of file |