@dxworks/depinder 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,7 +64,7 @@ function getParentLockFile(packageFile, maxDepth = 5) {
64
64
  const parser = {
65
65
  parseDependencyTree: parseLockFile,
66
66
  };
67
- function recursivelyTransformDeps(tree, result) {
67
+ function recursivelyTransformTreeDeps(tree, result) {
68
68
  var _a;
69
69
  const rootId = `${tree.name}@${tree.version}`;
70
70
  Object.values((_a = tree.dependencies) !== null && _a !== void 0 ? _a : {}).forEach(dep => {
@@ -89,28 +89,121 @@ function recursivelyTransformDeps(tree, result) {
89
89
  logging_1.log.warn(`Invalid version! ${e}`);
90
90
  }
91
91
  }
92
- recursivelyTransformDeps(dep, result);
92
+ recursivelyTransformTreeDeps(dep, result);
93
93
  });
94
94
  }
95
- function transformDeps(tree, root) {
95
+ function transformGraphDepsFlat(rootId, dependencies, result) {
96
+ dependencies.forEach(dependency => {
97
+ const lastAt = dependency.nodeId.lastIndexOf('@');
98
+ const name = dependency.nodeId.slice(0, lastAt);
99
+ const version = dependency.nodeId.slice(lastAt + 1);
100
+ const id = `${name}@${version}`;
101
+ const cachedVersion = result.get(id);
102
+ if (cachedVersion) {
103
+ cachedVersion.requestedBy = [rootId, ...cachedVersion.requestedBy];
104
+ }
105
+ else {
106
+ try {
107
+ const semver = new semver_1.SemVer(version !== null && version !== void 0 ? version : '', true);
108
+ result.set(id, {
109
+ id,
110
+ version: version,
111
+ name: name,
112
+ semver: semver,
113
+ requestedBy: [rootId],
114
+ });
115
+ }
116
+ catch (e) {
117
+ logging_1.log.warn(`Invalid version! ${e}`);
118
+ }
119
+ }
120
+ dependency.deps.forEach((transitiveDep) => {
121
+ const lastAt = transitiveDep.nodeId.lastIndexOf('@');
122
+ const name = transitiveDep.nodeId.slice(0, lastAt);
123
+ const version = transitiveDep.nodeId.slice(lastAt + 1);
124
+ const id = `${name}@${version}`;
125
+ const cachedVersion = result.get(id);
126
+ if (cachedVersion) {
127
+ cachedVersion.requestedBy = [dependency.nodeId, ...cachedVersion.requestedBy];
128
+ }
129
+ else {
130
+ try {
131
+ const semver = new semver_1.SemVer(version !== null && version !== void 0 ? version : '', true);
132
+ result.set(id, {
133
+ id,
134
+ version: version,
135
+ name: name,
136
+ semver: semver,
137
+ requestedBy: [dependency.nodeId],
138
+ });
139
+ }
140
+ catch (e) {
141
+ logging_1.log.warn(`Invalid version! ${e}`);
142
+ }
143
+ }
144
+ });
145
+ });
146
+ }
147
+ function transformTreeDeps(tree, root) {
96
148
  logging_1.log.info(`Starting recursive transformation for ${root}`);
97
149
  const result = new Map();
98
- recursivelyTransformDeps(tree, result);
150
+ recursivelyTransformTreeDeps(tree, result);
151
+ logging_1.log.info(`End recursive transformation for ${root}.`);
152
+ return result;
153
+ }
154
+ function transformGraphDeps(depGraphNodes, root) {
155
+ logging_1.log.info(`Starting recursive transformation for ${root}`);
156
+ const result = new Map();
157
+ transformGraphDepsFlat(depGraphNodes[0].pkgId, depGraphNodes, result);
99
158
  logging_1.log.info(`End recursive transformation for ${root}.`);
100
159
  return result;
101
160
  }
102
161
  async function parseLockFile({ root, manifestFile, lockFile }) {
103
- var _a, _b;
104
- // const lockFileVersion = getLockfileVersionFromFile(lockFile)
105
- // log.info(`parsing ${path.resolve(root, lockFile)}`)
106
- const result = await (0, snyk_nodejs_lockfile_parser_1.buildDepTreeFromFiles)(root, manifestFile !== null && manifestFile !== void 0 ? manifestFile : 'package.json', lockFile !== null && lockFile !== void 0 ? lockFile : '', true, false);
107
- const manifestJSON = JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(root, manifestFile !== null && manifestFile !== void 0 ? manifestFile : 'package.json'), 'utf8'));
108
- return {
109
- path: path_1.default.resolve(root, manifestFile !== null && manifestFile !== void 0 ? manifestFile : 'package.json'),
110
- name: (_a = result.name) !== null && _a !== void 0 ? _a : manifestJSON.name,
111
- version: (_b = result.version) !== null && _b !== void 0 ? _b : manifestJSON.version,
112
- dependencies: Object.fromEntries(transformDeps(result, root)),
113
- };
162
+ var _a, _b, _c, _d;
163
+ const manifestFilePath = path_1.default.resolve(root, manifestFile !== null && manifestFile !== void 0 ? manifestFile : 'package.json');
164
+ const lockFilePath = path_1.default.resolve(root, lockFile);
165
+ const lockFileVersion = (0, snyk_nodejs_lockfile_parser_1.getLockfileVersionFromFile)(lockFilePath);
166
+ switch (lockFileVersion) {
167
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.YarnLockV1:
168
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.YarnLockV2:
169
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.NpmLockV1: {
170
+ const result = await (0, snyk_nodejs_lockfile_parser_1.buildDepTreeFromFiles)(root, manifestFile !== null && manifestFile !== void 0 ? manifestFile : 'package.json', lockFile !== null && lockFile !== void 0 ? lockFile : '', true, false);
171
+ const manifestJSON = JSON.parse(fs_1.default.readFileSync(manifestFilePath, 'utf8'));
172
+ return {
173
+ path: manifestFilePath,
174
+ name: (_a = result.name) !== null && _a !== void 0 ? _a : manifestJSON.name,
175
+ version: (_b = result.version) !== null && _b !== void 0 ? _b : manifestJSON.version,
176
+ dependencies: Object.fromEntries(transformTreeDeps(result, root)),
177
+ };
178
+ }
179
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.NpmLockV2:
180
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.NpmLockV3: {
181
+ // const oldResult = await buildDepTreeFromFiles(root, manifestFile ?? 'package.json', lockFile ?? '', true, false)
182
+ const manifestFileContent = fs_1.default.readFileSync(manifestFilePath, 'utf8');
183
+ const lockFileContent = fs_1.default.readFileSync(lockFilePath, 'utf8');
184
+ const result = await (0, snyk_nodejs_lockfile_parser_1.parseNpmLockV2Project)(manifestFileContent, lockFileContent, {
185
+ includeDevDeps: true,
186
+ strictOutOfSync: false,
187
+ includeOptionalDeps: false,
188
+ pruneCycles: true,
189
+ includePeerDeps: false,
190
+ pruneNpmStrictOutOfSync: false
191
+ });
192
+ const manifestJSON = JSON.parse(fs_1.default.readFileSync(manifestFilePath, 'utf8'));
193
+ return {
194
+ path: manifestFilePath,
195
+ name: (_c = result.rootPkg.name) !== null && _c !== void 0 ? _c : manifestJSON.name,
196
+ version: (_d = result.rootPkg.version) !== null && _d !== void 0 ? _d : manifestJSON.version,
197
+ dependencies: Object.fromEntries(transformGraphDeps(result.toJSON().graph.nodes, root)),
198
+ };
199
+ }
200
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.PnpmLockV5:
201
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.PnpmLockV6:
202
+ case snyk_nodejs_lockfile_parser_1.NodeLockfileVersion.PnpmLockV9:
203
+ default: {
204
+ throw new Error(`Lockfile version ${lockFileVersion} is not supported by Depinder. Please use npm v1 / v2 / v3 or yarn v1 / v2`);
205
+ }
206
+ }
114
207
  }
115
208
  async function retrieveFromNpm(libraryName) {
116
209
  const response = await (0, npm_registry_fetch_1.json)(libraryName);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/javascript/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/javascript/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  export declare const npm: {
3
4
  install: typeof install;
4
5
  npmCommand: typeof npmCommand;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Interface for path mapping configuration
3
+ */
4
+ export interface PathMapping {
5
+ extractedPath: string;
6
+ actualPath: string;
7
+ }
8
+ /**
9
+ * Map of extracted paths to actual paths
10
+ */
11
+ export type PathMappings = Map<string, string>;
12
+ /**
13
+ * Interface representing a parsed project path
14
+ */
15
+ export interface ProjectPathInfo {
16
+ projectPath: string;
17
+ verifiedPath: string;
18
+ projectPathExists?: boolean;
19
+ }
20
+ /**
21
+ * Create path mappings from mapping data
22
+ * @param mappings Array of path mapping objects
23
+ * @returns Map of extracted paths to actual paths
24
+ */
25
+ export declare function createPathMappings(mappings: PathMapping[]): PathMappings;
26
+ /**
27
+ * Verify if a project path exists on the file system
28
+ * @param projectPath The extracted project path
29
+ * @param basePath Base directory to check against
30
+ * @param pathMappings Optional path mappings to use for verification
31
+ * @returns Verified path information
32
+ */
33
+ export declare function verifyProjectPath(projectPath: string, basePath: string, pathMappings?: PathMappings): ProjectPathInfo;
34
+ /**
35
+ * Extract project information from a dependency path based on origin type
36
+ * @param dependencyPath The path from the Black Duck report
37
+ * @param originName The origin name (e.g., npmjs, maven, nuget, pypi, sbt)
38
+ * @param basePath Optional base path to verify against
39
+ * @returns Object containing project path and verified path information
40
+ */
41
+ export declare function extractProjectInfo(dependencyPath: string, originName: string, basePath?: string, pathMappings?: PathMappings): ProjectPathInfo;
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.extractProjectInfo = exports.verifyProjectPath = exports.createPathMappings = void 0;
27
+ /**
28
+ * Project mapping utilities for extracting project information from dependency paths
29
+ */
30
+ const fs = __importStar(require("fs"));
31
+ const path = __importStar(require("path"));
32
+ const END_DELIMITERS = [
33
+ '-yarn',
34
+ '-npm',
35
+ 'node_modules',
36
+ '-pip',
37
+ '-maven',
38
+ '-gradle',
39
+ '-nuget',
40
+ '-sbt',
41
+ '-cargo',
42
+ '-rubygems',
43
+ '-packagist',
44
+ '-cocoapods',
45
+ '-swift',
46
+ '-xcode',
47
+ '-go_mod',
48
+ '-setuptools',
49
+ '-pnpm',
50
+ '-uv'
51
+ ];
52
+ // Special case pattern for monorepo
53
+ const MONOREPO_PATTERN = /packages[\\/]([^\\/]+)[\\/]local[\\/]([^\\/]+)[\\/]-yarn/;
54
+ /**
55
+ * Check if a segment contains a version-like pattern
56
+ * @param segment Path segment to check
57
+ * @returns True if the segment looks like a version
58
+ */
59
+ function isVersionSegment(segment) {
60
+ return /^\d+\.\d+\.\d+(?:[-.][A-Za-z0-9]+)*-?$/i.test(segment) ||
61
+ /^REPLACE_BY_CI$/i.test(segment) ||
62
+ segment.toLowerCase() === 'unspecified';
63
+ }
64
+ /**
65
+ * Check if a segment contains a file that should be excluded
66
+ * @param segment Path segment to check
67
+ * @returns True if the segment contains a file to exclude
68
+ */
69
+ function isFileSegment(segment) {
70
+ return segment.toLowerCase().endsWith('.csproj') ||
71
+ segment.toLowerCase().endsWith('.props') ||
72
+ segment.toLowerCase() === 'pom.xml';
73
+ }
74
+ /**
75
+ * Check if a segment is an organization/company prefix that should be skipped
76
+ * @param segment Path segment to check
77
+ * @returns True if the segment looks like an organization prefix
78
+ */
79
+ function isOrganizationPrefix(segment) {
80
+ // Common organization prefixes like com.company, org.apache, etc.
81
+ return /^(com|org|net|edu|gov)\.[a-zA-Z0-9.-]+$/.test(segment);
82
+ }
83
+ /**
84
+ * Resolves a path with relative segments (.., .)
85
+ * @param pathSegments Array of path segments to resolve
86
+ * @returns Array of resolved path segments
87
+ */
88
+ function resolveRelativePath(pathSegments) {
89
+ const result = [];
90
+ let skipCount = 0;
91
+ for (const segment of pathSegments) {
92
+ if (segment === '..') {
93
+ skipCount++;
94
+ }
95
+ else if (segment !== '.' && segment !== '') {
96
+ if (skipCount > 0) {
97
+ // This segment is skipped because of a '..'
98
+ skipCount--;
99
+ }
100
+ else {
101
+ result.push(segment);
102
+ }
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ /**
108
+ * Standardizes a path by normalizing slashes, colons, and removing leading/trailing slashes
109
+ * @param inputPath Path to standardize
110
+ * @returns Standardized path
111
+ */
112
+ function standardizePath(inputPath) {
113
+ if (!inputPath) {
114
+ return '';
115
+ }
116
+ let normalizedPath = inputPath.replace(/\\/g, '/');
117
+ normalizedPath = normalizedPath.replace(/:/g, '/');
118
+ if (normalizedPath.startsWith('/')) {
119
+ normalizedPath = normalizedPath.substring(1);
120
+ }
121
+ if (normalizedPath.endsWith('/')) {
122
+ normalizedPath = normalizedPath.substring(0, normalizedPath.length - 1);
123
+ }
124
+ return normalizedPath;
125
+ }
126
+ /**
127
+ * Check if a path matches the monorepo pattern and extract the project path
128
+ * @param path Normalized path to check
129
+ * @returns Project path if monorepo pattern matches, null otherwise
130
+ */
131
+ function handleMonorepoPattern(path) {
132
+ const matches = path.match(MONOREPO_PATTERN);
133
+ if (matches) {
134
+ return `${matches[2]}/packages/${matches[1]}`;
135
+ }
136
+ return null;
137
+ }
138
+ /**
139
+ * Parse project path from dependency path
140
+ * @param dependencyPath The path from the Black Duck report
141
+ * @returns Extracted project path
142
+ */
143
+ function parseProjectPath(dependencyPath) {
144
+ if (!dependencyPath) {
145
+ return '';
146
+ }
147
+ try {
148
+ const normalizedPath = standardizePath(dependencyPath);
149
+ const monorepoPath = handleMonorepoPattern(normalizedPath);
150
+ if (monorepoPath) {
151
+ return monorepoPath;
152
+ }
153
+ const segments = normalizedPath.split('/');
154
+ let endDelimiterIndex = getEndDelimiterIndex(segments);
155
+ if (endDelimiterIndex === -1) {
156
+ throw new Error(`No end delimiter found in path: ${normalizedPath}`);
157
+ }
158
+ let projectSegments = segments.slice(0, endDelimiterIndex);
159
+ if (projectSegments.length > 0 && isVersionSegment(projectSegments[projectSegments.length - 1])) {
160
+ projectSegments.pop(); // Remove the version segment
161
+ }
162
+ if (projectSegments.length > 0 && isFileSegment(projectSegments[projectSegments.length - 1])) {
163
+ projectSegments.pop(); // Remove the last segment if it's a file segment
164
+ }
165
+ let startIndex = getStartDelimiterIndex(projectSegments);
166
+ if (startIndex !== -1) {
167
+ projectSegments = projectSegments.slice(startIndex + 1);
168
+ }
169
+ const resolvedSegments = resolveRelativePath(projectSegments);
170
+ return resolvedSegments.join('/');
171
+ }
172
+ catch (error) {
173
+ console.error(`Error parsing path: ${error}`);
174
+ throw error;
175
+ }
176
+ }
177
+ function getStartDelimiterIndex(projectSegments) {
178
+ let startIndex = -1;
179
+ for (let i = 0; i < projectSegments.length; i++) {
180
+ if (isVersionSegment(projectSegments[i])) {
181
+ startIndex = i;
182
+ break; // Stop after finding a version segment
183
+ }
184
+ else if (isOrganizationPrefix(projectSegments[i])) {
185
+ startIndex = i;
186
+ // Continue looking for version segments after organization prefix
187
+ }
188
+ }
189
+ return startIndex;
190
+ }
191
+ function getEndDelimiterIndex(segments) {
192
+ let endDelimiterIndex = -1;
193
+ for (let i = 0; i < segments.length; i++) {
194
+ const lowerSegment = segments[i].toLowerCase();
195
+ if (END_DELIMITERS.some(delimiter => lowerSegment === delimiter)) {
196
+ endDelimiterIndex = i;
197
+ break;
198
+ }
199
+ }
200
+ return endDelimiterIndex;
201
+ }
202
+ /**
203
+ * Create path mappings from mapping data
204
+ * @param mappings Array of path mapping objects
205
+ * @returns Map of extracted paths to actual paths
206
+ */
207
+ function createPathMappings(mappings) {
208
+ const pathMappings = new Map();
209
+ for (const mapping of mappings) {
210
+ if (mapping.extractedPath && mapping.actualPath) {
211
+ pathMappings.set(mapping.extractedPath, mapping.actualPath);
212
+ }
213
+ }
214
+ return pathMappings;
215
+ }
216
+ exports.createPathMappings = createPathMappings;
217
+ /**
218
+ * Verify if a project path exists on the file system
219
+ * @param projectPath The extracted project path
220
+ * @param basePath Base directory to check against
221
+ * @param pathMappings Optional path mappings to use for verification
222
+ * @returns Verified path information
223
+ */
224
+ function verifyProjectPath(projectPath, basePath, pathMappings) {
225
+ if (!projectPath || !basePath) {
226
+ return { projectPath, verifiedPath: '', projectPathExists: false };
227
+ }
228
+ try {
229
+ const fullPath = path.join(basePath, projectPath);
230
+ const originalExists = fs.existsSync(fullPath);
231
+ if (originalExists) {
232
+ return {
233
+ projectPath,
234
+ verifiedPath: projectPath,
235
+ projectPathExists: true
236
+ };
237
+ }
238
+ if (pathMappings && pathMappings.has(projectPath)) {
239
+ const mappedPath = pathMappings.get(projectPath);
240
+ const mappedFullPath = path.join(basePath, mappedPath);
241
+ const mappedExists = fs.existsSync(mappedFullPath);
242
+ return {
243
+ projectPath,
244
+ verifiedPath: mappedExists ? mappedPath : '',
245
+ projectPathExists: originalExists
246
+ };
247
+ }
248
+ // Try without the first path segment
249
+ const segments = projectPath.split('/');
250
+ if (segments.length > 1) {
251
+ const pathWithoutFirstSegment = segments.slice(1).join('/');
252
+ const modifiedFullPath = path.join(basePath, pathWithoutFirstSegment);
253
+ const modifiedExists = fs.existsSync(modifiedFullPath);
254
+ if (modifiedExists) {
255
+ return {
256
+ projectPath,
257
+ verifiedPath: pathWithoutFirstSegment,
258
+ projectPathExists: false
259
+ };
260
+ }
261
+ }
262
+ // No mapping found or modified path doesn't exist
263
+ return {
264
+ projectPath,
265
+ verifiedPath: '',
266
+ projectPathExists: false
267
+ };
268
+ }
269
+ catch (error) {
270
+ console.error(`Error verifying project path: ${error}`);
271
+ return { projectPath, verifiedPath: '', projectPathExists: false };
272
+ }
273
+ }
274
+ exports.verifyProjectPath = verifyProjectPath;
275
+ /**
276
+ * Extract project information from a dependency path based on origin type
277
+ * @param dependencyPath The path from the Black Duck report
278
+ * @param originName The origin name (e.g., npmjs, maven, nuget, pypi, sbt)
279
+ * @param basePath Optional base path to verify against
280
+ * @returns Object containing project path and verified path information
281
+ */
282
+ function extractProjectInfo(dependencyPath, originName, basePath, pathMappings) {
283
+ if (!dependencyPath) {
284
+ return { projectPath: '', verifiedPath: '', projectPathExists: false };
285
+ }
286
+ try {
287
+ const projectPath = parseProjectPath(dependencyPath);
288
+ // Verify the path if basePath is provided
289
+ if (basePath) {
290
+ return verifyProjectPath(projectPath, basePath, pathMappings);
291
+ }
292
+ // Otherwise return unverified path with empty verifiedPath
293
+ return { projectPath, verifiedPath: '', projectPathExists: undefined };
294
+ }
295
+ catch (error) {
296
+ console.error(`Error extracting project info: ${error}`);
297
+ throw error;
298
+ }
299
+ }
300
+ exports.extractProjectInfo = extractProjectInfo;
301
+ //# sourceMappingURL=projectMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectMapping.js","sourceRoot":"","sources":["../../src/utils/projectMapping.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxworks/depinder",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "dxworks",
@@ -59,12 +59,13 @@
59
59
  "puppeteer": "18.0.1",
60
60
  "semver": "^7.3.5",
61
61
  "snyk-gradle-plugin": "^3.25.2",
62
- "snyk-nodejs-lockfile-parser": "^1.52.1",
62
+ "snyk-nodejs-lockfile-parser": "^1.60.1",
63
63
  "spdx-correct": "^3.1.1",
64
64
  "spdx-license-ids": "^3.0.10",
65
65
  "tmp": "^0.2.1",
66
66
  "toml": "^3.0.0",
67
- "winston": "^3.11.0"
67
+ "winston": "^3.11.0",
68
+ "xml2js": "^0.6.2"
68
69
  },
69
70
  "devDependencies": {
70
71
  "@types/cli-progress": "^3.9.2",
@@ -80,6 +81,7 @@
80
81
  "@types/string-template": "^1.0.2",
81
82
  "@types/tmp": "^0.2.3",
82
83
  "@types/ws": "^8.5.4",
84
+ "@types/xml2js": "^0.4.14",
83
85
  "@typescript-eslint/eslint-plugin": "^4.32.0",
84
86
  "@typescript-eslint/parser": "^4.32.0",
85
87
  "copyfiles": "^2.4.1",
@@ -94,9 +96,6 @@
94
96
  "ts-node": "^10.2.1",
95
97
  "typescript": "^4.4.3"
96
98
  },
97
- "publishConfig": {
98
- "registry": "https://npm.pkg.github.com"
99
- },
100
99
  "dxw": {
101
100
  "commands": [
102
101
  {