Repository navigation
Expand file tree
/
Copy pathnodeModulesCompare.ts
More file actions
119 lines (102 loc) · 3.55 KB
/
Copy pathnodeModulesCompare.ts
File metadata and controls
119 lines (102 loc) · 3.55 KB
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
import path from 'path';
import { createJsonFile } from './lib/createJsonFile.js';
import { getInputFileContent } from './lib/getInputFileContent.js';
import { getModules } from './lib/getModules.js';
import { getNodeModuleCollectionDiff } from './lib/getNodeModuleCollectionDiff.js';
import { getNodeModules } from './lib/getNodeModules.js';
import type {
NodeModulesCompareInputPayload,
NodeModuleCollection,
NodeModulesCompareResult,
} from './types';
export const nodeModulesCompare = async ({
input,
inputFile,
inputFileWithChanges,
inputWithChanges,
outputDirectory,
shouldOmitNodeModuleData,
}: {
/** The input payload (if not using `inputFile`) */
input?: NodeModulesCompareInputPayload[];
/** The input file path relative to current working directory (if not using `input` param) */
inputFile?: string;
/** The input file with changes path relative to current working directory (if not using `inputWithChanges` param) */
inputFileWithChanges?: string;
/** The input with changes payload (if not using `inputFileWithChanges`) */
inputWithChanges?: NodeModulesCompareInputPayload[];
/** The output directory path relative to current working directory. If `undefined`, file will not be output */
outputDirectory?: string;
/** If `true` node module data will be ommitted from the resulting dataset */
shouldOmitNodeModuleData?: boolean;
}): Promise<NodeModulesCompareResult> => {
// validate input
if (!input && !inputFile) {
throw new Error('Either `input` or `inputFile` must be provided');
}
const currentWorkingDirectoryPath = process.cwd();
let inputResults: NodeModulesCompareInputPayload[] | undefined = input;
if (!inputResults && inputFile) {
const inputFileJsonContent = await getInputFileContent({
inputFile,
});
inputResults = inputFileJsonContent.results;
}
if (!inputResults) {
throw new Error(
`There was a problem finding the input. Check that the input or input file is formatted correctly`,
);
}
const modules = getModules({
inputResults,
onlyNodeModules: true,
});
const nodeModules = getNodeModules({
modules,
});
let nodeModulesWithChanges: NodeModuleCollection | undefined;
if (inputWithChanges || inputFileWithChanges) {
let inputResultsWithChanges: NodeModulesCompareInputPayload[] | undefined =
inputWithChanges;
if (!inputResultsWithChanges && inputFileWithChanges) {
const inputFileJsonContentWithChanges = await getInputFileContent({
inputFile: inputFileWithChanges,
});
inputResultsWithChanges = inputFileJsonContentWithChanges.results;
}
if (inputResultsWithChanges) {
const modulesWithChanges = getModules({
inputResults: inputResultsWithChanges,
onlyNodeModules: true,
});
nodeModulesWithChanges = getNodeModules({
modules: modulesWithChanges,
});
}
}
const result: NodeModulesCompareResult = {
diff: !nodeModulesWithChanges
? undefined
: getNodeModuleCollectionDiff(nodeModules, nodeModulesWithChanges),
};
if (!shouldOmitNodeModuleData) {
result.nodeModules = nodeModules;
result.nodeModulesWithChanges = nodeModulesWithChanges;
}
let resultFilePath: string | undefined;
if (outputDirectory) {
const outputDirectoryPath = path.resolve(
currentWorkingDirectoryPath,
outputDirectory,
);
resultFilePath = `${outputDirectoryPath}/comparison-${Date.now()}.json`;
createJsonFile({
content: result,
outputPath: resultFilePath,
});
}
return {
...result,
resultFilePath,
};
};