-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathextensionsDataGenerator.js
112 lines (93 loc) · 3.03 KB
/
extensionsDataGenerator.js
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
"use strict";
const fs = require("fs");
const path = require("path");
const os = require("os");
const ERRORS = {
IS_EMPTY_EXTENSIONS_DATA: "IS_EMPTY_EXTENSIONS_DATA",
IS_WRONG_NAME_FORMAT: "IS_WRONG_EXTENSION_NAME_FORMAT",
IS_EMPTY_DEFAULT_EXTENSIONS_JSON_PATH:
"IS_EMPTY_DEFAULT_EXTENSIONS_JSON_PATH",
};
const defaultExtensionsJsonPathByOS = () => {
const platform = os.platform();
const pathByPlatform = {
win32: path.join(
process.env.HOME ?? process.env.USERPROFILE ?? process.env.HOMEPATH,
".vscode",
"extensions",
"extensions.json"
),
linux: path.join(
process.env.HOME,
".vscode",
"extensions",
"extensions.json"
),
darwin: path.join(
process.env.HOME,
".vscode",
"extensions",
"extensions.json"
),
};
const extensionsJsonPath = pathByPlatform[platform];
if (!extensionsJsonPath) {
throw new Error(ERRORS.IS_EMPTY_DEFAULT_EXTENSIONS_JSON_PATH);
}
return extensionsJsonPath;
};
const createExportFolder = (exportPath) => {
if (!fs.existsSync(exportPath)) fs.mkdirSync(exportPath);
};
const createExtensionsDataJson = (extensionsData, exportPath) => {
fs.writeFileSync(
path.join(exportPath, `${new Date()}_extensions_data.json`),
JSON.stringify(extensionsData)
);
};
const exportExtensionsDataJson = (extensionsData, exportPath) => {
if (extensionsData.length < 1)
throw new Error(ERRORS.IS_EMPTY_EXTENSIONS_DATA);
createExportFolder(exportPath);
createExtensionsDataJson(extensionsData, exportPath);
};
const getExtensionsMetaData = (extensionsJsonPath) => {
const extensionsMetaDataJsonString = fs.readFileSync(
extensionsJsonPath,
"utf8"
);
return JSON.parse(extensionsMetaDataJsonString);
};
const getExtensionsData = (extensionsMetaData) => {
return extensionsMetaData
.map((extensionMetaData) => {
const extensionFullName = extensionMetaData.identifier.id;
const extensionFullNameSplit = extensionFullName.split(".");
// ex: streetsidesoftware.code-spell-checker -> ["streetsidesoftware", "code-spell-checker"]
if (extensionFullNameSplit.length < 2) {
return ERRORS.IS_WRONG_NAME_FORMAT;
}
return {
extensionName: extensionFullNameSplit[1],
extensionVersion: extensionMetaData.version,
extensionInstalledTimestamp:
extensionMetaData.metadata.installedTimestamp,
};
})
.filter((extensionData) => extensionData !== ERRORS.IS_WRONG_NAME_FORMAT);
};
const extensionsDataGenerator = ({
origin = false,
exportPath = undefined,
extensionsJsonPath = undefined,
} = {}) => {
const _exportPath = exportPath ?? path.join(__dirname, "outputs");
const _extensionsJsonPath =
extensionsJsonPath ?? defaultExtensionsJsonPathByOS();
const extensionsMetaData = getExtensionsMetaData(_extensionsJsonPath);
const extensionsData = origin
? extensionsMetaData
: getExtensionsData(extensionsMetaData);
exportExtensionsDataJson(extensionsData, _exportPath);
};
module.exports = extensionsDataGenerator;