Skip to content

Commit 930850d

Browse files
committed
Improved Output Messages and Signal Handling
1 parent 7412e5b commit 930850d

File tree

4 files changed

+133
-97
lines changed

4 files changed

+133
-97
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Therefore, I've created this repo to solve the problem, I've patched postman fil
1111
Tested on Postman versions from *`8.1.0`* to *`10.10.9`*
1212

1313
# Install
14-
* Install [node.js](https://nodejs.org/en/download/)
14+
* Install [node.js](https://nodejs.org/en/download/) >= v14
1515
* Clone this repo `git clone https://github.com/3omar-mostafa/Postman-Scratchpad-Banner-Fix.git`
1616
* `cd Postman-Scratchpad-Banner-Fix`
1717
* Run ***`npm install`*** to install dependencies

fix.js

Lines changed: 21 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,25 @@
11
#!/usr/bin/env node
2-
3-
let fs = require('fs');
4-
let path = require('path');
5-
let os = require('os')
6-
let espree = require('espree');
72
let colors = require('chalk'); // print colored text into console
8-
let asar = require('@electron/asar');
9-
let replace = require("replace");
10-
let { args } = require('./parse_args');
11-
let { findNestedObject, replaceRangeInString, printDebug } = require("./utils");
12-
13-
/**
14-
* Get Relevant Files to process, these files are javascript files containing `getWorkingInScratchpadBanner` function,
15-
* or asar archives
16-
* @param postmanDirectory Postman Directory to search in
17-
* @returns Array of strings containing found file paths
18-
*/
19-
function getRelevantFilePaths(postmanDirectory) {
20-
let searchResults = replace({
21-
regex: "getWorkingInScratchpadBanner",
22-
include: "*.js,app.asar",
23-
paths: [postmanDirectory],
24-
recursive: true,
25-
silent: true,
26-
});
27-
return searchResults.map(obj => obj.path);
28-
}
29-
30-
31-
function injectCode(rawFileData, searchQuery, replaceString) {
32-
// We need to reparse the data after each manipulation because we have changed their position
33-
let parsedJS = espree.parse(rawFileData, { range: true, ecmaVersion: 2022 });
34-
let parsedObject = findNestedObject(parsedJS, searchQuery);
35-
let range = parsedObject.range;
36-
37-
printDebug(rawFileData.substring(range[0], range[1]), replaceString);
38-
rawFileData = replaceRangeInString(rawFileData, range[0], range[1], replaceString);
39-
return rawFileData;
40-
}
41-
42-
43-
async function fixPostmanScratchpadBanner(requester_js_path) {
44-
console.log(colors.yellow(`[INFO] Processing ${requester_js_path}`));
45-
try {
46-
47-
let data = String(await fs.readFileSync(requester_js_path));
48-
49-
let getWorkingInScratchpadBanner = {
50-
query: {
51-
type: 'MethodDefinition',
52-
key: { name: "getWorkingInScratchpadBanner" }
53-
},
54-
replaceString: "getWorkingInScratchpadBanner() { this.closeBanner(); }"
55-
};
56-
57-
data = injectCode(data, getWorkingInScratchpadBanner.query, getWorkingInScratchpadBanner.replaceString);
58-
59-
console.log(colors.yellow(`[INFO] Saving the file into ${requester_js_path}`));
60-
await fs.writeFileSync(requester_js_path, data);
61-
62-
} catch (e) {
63-
if (args.verbose) {
64-
console.log(colors.red(`------------------------------------------------`));
65-
console.log(colors.red(`[ERROR] Error Processing ${requester_js_path}`));
66-
console.log(colors.red(`[ERROR] ${e.stack}`));
67-
console.log(colors.red(`------------------------------------------------`));
68-
}
69-
}
70-
71-
console.log(colors.yellow(`------------------------------------------------`));
72-
}
73-
74-
75-
// Main function
76-
(async function () {
77-
78-
let postmanDirectory = args.postman_dir;
79-
80-
for (let filepath of getRelevantFilePaths(postmanDirectory)) {
81-
if (filepath.toLowerCase().endsWith("app.asar")) {
82-
let app_asar = filepath;
83-
let tmpDir = path.join(os.tmpdir(), "postman_app.asar_extracted");
84-
asar.extractAll(app_asar, tmpDir);
85-
console.log(colors.yellow(`[INFO] Extracted ${app_asar} into ${tmpDir}`));
86-
87-
for (let filepath of getRelevantFilePaths(tmpDir)) {
88-
await fixPostmanScratchpadBanner(filepath);
89-
}
90-
91-
await asar.createPackage(tmpDir, app_asar);
92-
console.log(colors.yellow(`[INFO] Archived ${tmpDir} back into ${app_asar}`));
93-
await fs.rmSync(tmpDir, { recursive: true });
94-
95-
} else {
96-
await fixPostmanScratchpadBanner(filepath);
97-
}
3+
let fs = require('fs');
4+
let workers = require('worker_threads');
5+
let process = require('process');
6+
7+
let worker = new workers.Worker('./worker.js', { argv: process.argv });
8+
let asar_extraction_dir;
9+
10+
worker.on('message', (asar_dir) => {
11+
asar_extraction_dir = asar_dir;
12+
});
13+
14+
process.on('SIGINT', async () => {
15+
console.log(colors.yellow(`[INFO] Detected Ctrl+C, Exiting after cleaning resources`));
16+
if (asar_extraction_dir) {
17+
try {
18+
await fs.rmSync(asar_extraction_dir, { recursive: true, force: true });
19+
} catch { }
20+
finally {
21+
console.log(colors.yellow(`[INFO] Deleted ${colors.bold(asar_extraction_dir)}`));
22+
process.exit();
9823
}
9924
}
100-
)()
25+
});

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
"version": "2.0.0",
44
"description": "Remove Scratchpad Banner from Postman 8.x.x, 9.x.x, 10.x.x",
55
"main": "fix.js",
6+
"engines": {
7+
"node": ">=14.4.0"
8+
},
69
"repository": {
710
"type": "git",
811
"url": "git+https://github.com/3omar-mostafa/Postman-Scratchpad-Banner-Fix.git"

worker.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#!/usr/bin/env node
2+
3+
let fs = require('fs');
4+
let path = require('path');
5+
let os = require('os');
6+
let espree = require('espree');
7+
let colors = require('chalk'); // print colored text into console
8+
let asar = require('@electron/asar');
9+
let replace = require("replace");
10+
let workers = require('worker_threads');
11+
let { args } = require('./parse_args');
12+
let { findNestedObject, replaceRangeInString, printDebug } = require("./utils");
13+
14+
/**
15+
* Get Relevant Files to process, these files are javascript files containing `getWorkingInScratchpadBanner` function,
16+
* or asar archives
17+
* @param postmanDirectory Postman Directory to search in
18+
* @returns Array of strings containing found file paths
19+
*/
20+
function getRelevantFilePaths(postmanDirectory) {
21+
let searchResults = replace({
22+
regex: "getWorkingInScratchpadBanner",
23+
include: "*.js,app.asar",
24+
paths: [postmanDirectory],
25+
recursive: true,
26+
silent: true,
27+
});
28+
return searchResults.map(obj => obj.path);
29+
}
30+
31+
32+
function injectCode(rawFileData, searchQuery, replaceString) {
33+
// We need to reparse the data after each manipulation because we have changed their position
34+
let parsedJS = espree.parse(rawFileData, { range: true, ecmaVersion: 2022 });
35+
let parsedObject = findNestedObject(parsedJS, searchQuery);
36+
let range = parsedObject.range;
37+
38+
printDebug(rawFileData.substring(range[0], range[1]), replaceString);
39+
rawFileData = replaceRangeInString(rawFileData, range[0], range[1], replaceString);
40+
return rawFileData;
41+
}
42+
43+
44+
async function fixPostmanScratchpadBanner(requester_js_path) {
45+
console.log(colors.yellow(`[INFO] Processing ${colors.bold(requester_js_path)}`));
46+
try {
47+
48+
let data = String(await fs.readFileSync(requester_js_path));
49+
50+
let getWorkingInScratchpadBanner = {
51+
query: {
52+
type: 'MethodDefinition',
53+
key: { name: "getWorkingInScratchpadBanner" }
54+
},
55+
replaceString: "getWorkingInScratchpadBanner() { this.closeBanner(); }"
56+
};
57+
58+
data = injectCode(data, getWorkingInScratchpadBanner.query, getWorkingInScratchpadBanner.replaceString);
59+
60+
console.log(colors.yellow(`[INFO] Saving the file into ${colors.bold(requester_js_path)}`));
61+
await fs.writeFileSync(requester_js_path, data);
62+
63+
} catch (e) {
64+
if (args.verbose) {
65+
console.log(colors.red(`------------------------------------------------`));
66+
console.log(colors.red(`[ERROR] Error Processing ${colors.bold(requester_js_path)}`));
67+
console.log(colors.red(`[ERROR] ${e.stack}`));
68+
console.log(colors.red(`------------------------------------------------`));
69+
}
70+
}
71+
72+
console.log(colors.yellow(`------------------------------------------------`));
73+
}
74+
75+
// Main function
76+
(async function () {
77+
78+
let postmanDirectory = args.postman_dir;
79+
80+
for (let filepath of getRelevantFilePaths(postmanDirectory)) {
81+
if (filepath.toLowerCase().endsWith("app.asar")) {
82+
let app_asar = filepath;
83+
let tmpDir = path.join(os.tmpdir(), "postman_app.asar_extracted");
84+
workers.parentPort.postMessage(tmpDir);
85+
86+
if (fs.existsSync(tmpDir)) {
87+
console.log(colors.yellow(`[INFO] Temp Dir '${colors.bold(tmpDir)}' already exists, IT WILL BE DELETED`));
88+
await fs.rmSync(tmpDir, { recursive: true, force: true });
89+
console.log(colors.yellow(`[INFO] Successfully Deleted ${colors.blue(tmpDir)}`));
90+
}
91+
console.log(colors.yellow(`[INFO] Extracting ${colors.bold(app_asar)} ...`));
92+
asar.extractAll(app_asar, tmpDir);
93+
console.log(colors.yellow(`[INFO] Extracted ${colors.bold(app_asar)} into ${colors.bold(tmpDir)}`));
94+
95+
console.log(colors.yellow(`------------------------------------------------`));
96+
for (let filepath of getRelevantFilePaths(tmpDir)) {
97+
await fixPostmanScratchpadBanner(filepath);
98+
}
99+
100+
await asar.createPackage(tmpDir, app_asar);
101+
console.log(colors.yellow(`[INFO] Archived ${colors.bold(tmpDir)} back into ${colors.bold(app_asar)}`));
102+
103+
} else {
104+
await fixPostmanScratchpadBanner(filepath);
105+
}
106+
}
107+
}
108+
)()

0 commit comments

Comments
 (0)