-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmanifest.js
143 lines (118 loc) · 4.37 KB
/
manifest.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const fs = require('fs');
// ensure __dirname/manifests exists
const { execSync } = require('child_process');
const restore = process.argv.includes('--restore');
const backup = process.argv.includes('--backup');
const formatFlag = process.argv.includes('--format');
if( restore ){
console.log( "Restoring development package.json" );
// get latest backup
const files = fs.readdirSync(__dirname + '/manifests');
const latest = files.sort().reverse()[0];
const filepath = `${__dirname}/manifests/${latest}`;
// restore the package.json via copy
fs.copyFileSync(filepath, __dirname + '/../package.json');
execSync('npm install', {
cwd: __dirname + '/..',
stdio: 'inherit'
});
} else {
console.log( "Backing up package.json" );
if (!fs.existsSync(__dirname + '/manifests')) {
fs.mkdirSync(__dirname + '/manifests');
}
// get date string for backup
let date = new Date();
date = date.toISOString().replace(/:/g, '.').replace('T', '.').replace('-', '.').replace('Z', '');
// backup the package.json via copy
const filepath = `${__dirname}/manifests/package.${date}.bak.json`;
fs.copyFileSync(__dirname + '/../package.json', filepath);
// exit early if only backing up
if( backup )
return;
const {
alignJSON: format,
splitCommaDelimited: split
} = require('./indent.json.js');
let package = require(__dirname + '/../package.json');
const formatted = format(package);
const lastKeyword = package.keywords[package.keywords.length - 1];
// get all lines after "keywords" and before (but including) last keyword
let lines = formatted.split('\n');
const keywordStart = lines.findIndex( line => line.includes('"keywords":') ) + 1;
const keywordEnd = lines.findIndex( (line, i) => i > keywordStart && line.includes(lastKeyword) );
lines = lines.map(
(line, i) => {
if( i >= keywordStart && i <= keywordEnd ){
values = split(line);
values = values.map( value => {
let padding = /^ */.exec(value)[0];
value = value
.trim()
.toLowerCase()
.replace(/ /g, '-');
return padding + value;
})
line = values.join(',');
}
return line;
}
);
const kwCorrected = lines.join('\n');
const addEmptyLineBefore = [
"homepage",
"main",
"scripts",
"make:node",
"build",
"build:web",
"prebuild",
"postbuild",
"test",
"prepack",
"manifest:prepare",
"predevinstall",
"predevuninstall",
"prepublishOnly",
"docs",
"devDependencies"
].map( key => `"${key}":` );
lines = kwCorrected.split('\n');
for( let i = 0; i < lines.length; i++ ){
const line = lines[i];
const hasEmptyLineBefore = addEmptyLineBefore.some( key => line.includes(key) );
if( hasEmptyLineBefore ){
lines.splice(i, 0, '');
i++;
}
}
const finalDevFormat = lines.join('\n');
fs.writeFileSync(__dirname + '/../package.json', finalDevFormat);
// exit early if only formatting
if( formatFlag )
return;
package = JSON.parse(finalDevFormat);
console.log( "Cleaning up package.json for packing/publishing" );
delete package.devDependencies["live-server"];
delete package.scripts["make:test"];
delete package.scripts["build:test"];
delete package.scripts["prebuild:test"];
delete package.scripts["test"];
delete package.scripts["test:serve"];
delete package.scripts["test:pub"];
delete package.scripts["make:docs"];
delete package.scripts["docs"];
delete package.scripts["predocs"];
delete package.scripts["postdocs"];
delete package.scripts["docs:pub"];
delete package.scripts["predocs:pub"];
delete package.scripts["premake:docusaurus"]
delete package.scripts["make:docusaurus"]
delete package.scripts["postmake:docusaurus"]
const published = JSON.stringify(package, null, 2);
fs.writeFileSync(__dirname + '/../package.json', published);
execSync('npm install', {
cwd: __dirname + '/..',
stdio: 'inherit'
})
}