-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathupdate-vscode-package-json.js
More file actions
124 lines (102 loc) · 4.05 KB
/
update-vscode-package-json.js
File metadata and controls
124 lines (102 loc) · 4.05 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
120
121
122
123
124
const _ = require('lodash');
const fs = require('fs');
const path = require('path');
const dateformat = require('dateformat');
const outFolder = path.join(process.cwd(), 'out');
const fileName = process.argv[2] || 'extension';
const { crossPlatformPath, Helpers } = require('tnp-core/lib');
const { Project } = require('tnp/lib');
const { HelpersTaon } = require('tnp-helpers/lib');
console.log('Update package.json vscode plugin metadata...');
const params = require('minimist')(process.argv);
if (params.watch) {
const chokidar = require('chokidar');
chokidar.watch([`${outFolder}/**/*.js`]).on('all', (event, path) => {
console.log(`${dateformat(new Date(), 'HH:MM:ss')} updating package.json`);
updatePackageJson();
});
} else {
updatePackageJson();
}
function updatePackageJson() {
const pathToConfig = path.join(process.cwd(), 'out', fileName);
const proj = Project.ins.nearestTo(crossPlatformPath([process.cwd(),'..']));
proj.taonJson.saveToDisk('update vscode package.json');
proj.taonJson.resources.forEach(r => {
const pathToFileOrFolder = proj.pathFor(r);
const dest = crossPlatformPath([process.cwd(), r]);
if(!Helpers.exists(pathToFileOrFolder)){
throw `Resource ${r} not found at ${pathToFileOrFolder}`;
}
if(Helpers.isFolder(pathToFileOrFolder)){
HelpersTaon.copy(pathToFileOrFolder, dest);
} else {
HelpersTaon.copyFile(pathToFileOrFolder, dest);
}
} );
console.log(`Using project: ${proj?.name} at ${proj?.location}`);
delete require.cache[require.resolve(pathToConfig)]; // clear cache in watch mode
const extModule = require(pathToConfig).default;
// const commandsList = extModule.commands || [];
const pkgjsonpath = path.join(process.cwd(), 'package.json');
const pkgjson = JSON.parse(fs.readFileSync(pkgjsonpath, 'utf8'));
pkgjson.contributes = proj.taonJson.overridePackageJsonManager.contributes || {};
pkgjson.contributes.commands = (pkgjson.contributes.commands || []).concat(extModule?.commands || []).map( (c) => {
return {
title: c.title,
command: c.command,
icon: c.icon,
group: c.group,
}
} );
pkgjson.contributes.submenus = pkgjson.contributes.submenus || [];
pkgjson.contributes.menus = pkgjson.contributes.menus || {};
pkgjson.contributes.menus["explorer/context"] = pkgjson.contributes.menus["explorer/context"] || [];
pkgjson.contributes.menus["editor/title/context"] = pkgjson.contributes.menus["editor/title/context"] || [];
const commandsList = pkgjson.contributes.commands
console.log(
'Commands:',
commandsList.map(t => `${t.group}: ${t.title}`).sort((a, b) => a.localeCompare(b))
);
const visibleCommands = commandsList.filter(c => !c.hideContextMenu);
// split standalone vs grouped
const standalone = visibleCommands.filter(c => c.group === null);
const grouped = visibleCommands.filter(c => c.group);
const groups = _.uniq(grouped.map(c => c.group));
// Define submenus for grouped commands
pkgjson.contributes.submenus = groups.map(group => ({
id: `${_.kebabCase(group)}.submenu`,
label: group
}));
// Add standalone commands directly (no submenu)
for (const c of standalone) {
pkgjson.contributes.menus["explorer/context"].push({
command: c.command,
group: "navigation"
});
pkgjson.contributes.menus["editor/title/context"].push({
command: c.command,
group: "navigation"
});
}
// Attach submenu triggers for grouped commands
for (const group of groups) {
const submenuId = `${_.kebabCase(group)}.submenu`;
pkgjson.contributes.menus["explorer/context"].push({
submenu: submenuId,
group: "navigation"
});
pkgjson.contributes.menus["editor/title/context"].push({
submenu: submenuId,
group: "navigation"
});
// Put group commands inside submenu
pkgjson.contributes.menus[submenuId] = grouped
.filter(c => c.group === group)
.map(c => ({
command: c.command
}));
}
fs.writeFileSync(pkgjsonpath, JSON.stringify(pkgjson, null, 2), 'utf8');
console.log('Done update package.json');
}