builder-doctor 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +21 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +111 -0
- package/dist/utils.js.map +1 -0
- package/package.json +27 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# builder-doctor
|
|
2
|
+
|
|
3
|
+
A CLI tool for Builder.io diagnostics.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g builder-doctor
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or run directly with npx:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx builder-doctor
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
or for additional details (like responses and headers):
|
|
18
|
+
```bash
|
|
19
|
+
npx builder-doctor --verbose
|
|
20
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const args = process.argv.slice(2);
|
|
6
|
+
const verbose = args.includes("--verbose");
|
|
7
|
+
async function main() {
|
|
8
|
+
try {
|
|
9
|
+
console.log(`Checking connectivity to Builder.io services...`);
|
|
10
|
+
await (0, utils_1.check)({
|
|
11
|
+
host: "firestore.googleapis.com",
|
|
12
|
+
url: "https://firestore.googleapis.com/",
|
|
13
|
+
verbose,
|
|
14
|
+
expectedStatus: 404,
|
|
15
|
+
expectedContent: "<span id=logo aria-label=Google>",
|
|
16
|
+
});
|
|
17
|
+
await (0, utils_1.check)({
|
|
18
|
+
host: "firebasestorage.googleapis.com",
|
|
19
|
+
url: "https://firebasestorage.googleapis.com/",
|
|
20
|
+
verbose,
|
|
21
|
+
expectedStatus: 404,
|
|
22
|
+
expectedContent: "<span id=logo aria-label=Google>",
|
|
23
|
+
});
|
|
24
|
+
await (0, utils_1.check)({
|
|
25
|
+
host: "builder.io",
|
|
26
|
+
url: "https://www.builder.io/",
|
|
27
|
+
verbose,
|
|
28
|
+
expectedStatus: 200,
|
|
29
|
+
expectedContent: "<body>",
|
|
30
|
+
});
|
|
31
|
+
await (0, utils_1.check)({
|
|
32
|
+
host: "builder.io app",
|
|
33
|
+
url: "https://builder.io/content",
|
|
34
|
+
verbose,
|
|
35
|
+
expectedStatus: 200,
|
|
36
|
+
expectedContent: "<body>",
|
|
37
|
+
});
|
|
38
|
+
await (0, utils_1.check)({
|
|
39
|
+
host: "*.builder.codes",
|
|
40
|
+
url: "https://stuff.builder.codes/",
|
|
41
|
+
verbose,
|
|
42
|
+
expectedStatus: 404,
|
|
43
|
+
expectedHeader: "server",
|
|
44
|
+
expectedHeaderValue: "Google Frontend",
|
|
45
|
+
});
|
|
46
|
+
await (0, utils_1.check)({
|
|
47
|
+
host: "*.builder.my",
|
|
48
|
+
url: "https://www.builder.my/",
|
|
49
|
+
verbose,
|
|
50
|
+
expectedStatus: 200,
|
|
51
|
+
expectedHeader: "x-powered-by",
|
|
52
|
+
expectedHeaderValue: "Next.js",
|
|
53
|
+
});
|
|
54
|
+
await (0, utils_1.check)({
|
|
55
|
+
host: "*.fly.dev",
|
|
56
|
+
url: "https://status.flyio.net/",
|
|
57
|
+
verbose,
|
|
58
|
+
expectedStatus: 200,
|
|
59
|
+
message: ' (Unknown status)'
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error("An error occurred:", error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
main();
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,mCAAqC;AAErC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAE/D,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,0BAA0B;YAChC,GAAG,EAAE,mCAAmC;YACxC,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,eAAe,EAAE,kCAAkC;SACpD,CAAC,CAAC;QAEH,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,gCAAgC;YACtC,GAAG,EAAE,yCAAyC;YAC9C,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,eAAe,EAAE,kCAAkC;SACpD,CAAC,CAAC;QAEH,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,YAAY;YAClB,GAAG,EAAE,yBAAyB;YAC9B,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,eAAe,EAAE,QAAQ;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,gBAAgB;YACtB,GAAG,EAAE,4BAA4B;YACjC,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,eAAe,EAAE,QAAQ;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,8BAA8B;YACnC,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,cAAc,EAAE,QAAQ;YACxB,mBAAmB,EAAE,iBAAiB;SACvC,CAAC,CAAC;QAEH,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,cAAc;YACpB,GAAG,EAAE,yBAAyB;YAC9B,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,cAAc,EAAE,cAAc;YAC9B,mBAAmB,EAAE,SAAS;SAC/B,CAAC,CAAC;QAEH,MAAM,IAAA,aAAK,EAAC;YACV,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,2BAA2B;YAChC,OAAO;YACP,cAAc,EAAE,GAAG;YACnB,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { IncomingHttpHeaders } from "http2";
|
|
2
|
+
export interface Response {
|
|
3
|
+
statusCode?: number;
|
|
4
|
+
statusMessage?: string;
|
|
5
|
+
body: string;
|
|
6
|
+
headers: IncomingHttpHeaders;
|
|
7
|
+
}
|
|
8
|
+
interface CheckOptions {
|
|
9
|
+
host: string;
|
|
10
|
+
url: string;
|
|
11
|
+
verbose: boolean;
|
|
12
|
+
expectedStatus: number;
|
|
13
|
+
expectedContent?: string;
|
|
14
|
+
expectedHeader?: string;
|
|
15
|
+
expectedHeaderValue?: string;
|
|
16
|
+
message?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function get(url: string): Promise<Response>;
|
|
19
|
+
export declare function check(options: CheckOptions): Promise<void>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,mBAAmB,CAAA;CAC7B;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CA0BxD;AAMD,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAC9C,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.get = get;
|
|
37
|
+
exports.check = check;
|
|
38
|
+
const https = __importStar(require("https"));
|
|
39
|
+
const http = __importStar(require("http"));
|
|
40
|
+
async function get(url) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const parsedUrl = new URL(url);
|
|
43
|
+
const client = parsedUrl.protocol === "https:" ? https : http;
|
|
44
|
+
client
|
|
45
|
+
.get(url, (res) => {
|
|
46
|
+
let data = "";
|
|
47
|
+
res.on("data", (chunk) => {
|
|
48
|
+
data += chunk;
|
|
49
|
+
});
|
|
50
|
+
res.on("end", () => {
|
|
51
|
+
resolve({
|
|
52
|
+
statusCode: res.statusCode || 0,
|
|
53
|
+
body: data,
|
|
54
|
+
statusMessage: res.statusMessage || "",
|
|
55
|
+
headers: res.headers
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
})
|
|
59
|
+
.on("error", (err) => {
|
|
60
|
+
reject(err);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const red = "\x1b[31m";
|
|
65
|
+
const green = "\x1b[32m";
|
|
66
|
+
const reset = "\x1b[0m";
|
|
67
|
+
async function check(options) {
|
|
68
|
+
let reason = '';
|
|
69
|
+
let details = '';
|
|
70
|
+
try {
|
|
71
|
+
const response = await get(options.url);
|
|
72
|
+
if (response.statusCode !== options.expectedStatus) {
|
|
73
|
+
reason = `The domain ${options.host} appears to be blocked. An unexpected status code was reported ${response.statusCode}. Check your network settings (eg VPN connection, network status, Wifi).`;
|
|
74
|
+
}
|
|
75
|
+
else if (options.expectedContent &&
|
|
76
|
+
response.body.indexOf(options.expectedContent) === -1) {
|
|
77
|
+
reason = `The domain ${options.host} appears to be blocked. An unexpected response was found. Check your network settings (eg VPN connection, network status, Wifi).`;
|
|
78
|
+
if (options.verbose) {
|
|
79
|
+
details = "Body" + response.body;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (options.expectedHeader &&
|
|
83
|
+
response.headers[options.expectedHeader] !== options.expectedHeaderValue) {
|
|
84
|
+
reason = `The domain ${options.host} appears to be blocked. An unexpected response header for "${options.expectedHeader}" was found. Check your network settings (eg VPN connection, network status, Wifi).`;
|
|
85
|
+
if (options.verbose) {
|
|
86
|
+
details = `Headers: ${JSON.stringify(response.headers)}`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (reason == "") {
|
|
90
|
+
console.log(`${green}✓${reset} ${options.host}${options.message ?? ''}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
let msg = `${err}`;
|
|
95
|
+
// Eg turn off Wifi
|
|
96
|
+
if (msg.includes(`Error: getaddrinfo`)) {
|
|
97
|
+
reason = `You may not have internet connectivity or the domain ${options.host} is not accessible.`;
|
|
98
|
+
}
|
|
99
|
+
// Not a known error then report back the actual error
|
|
100
|
+
if (reason == "") {
|
|
101
|
+
reason = msg;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (reason !== "") {
|
|
105
|
+
console.log(`${options.host} ${red}Failed${reset}: ${reason}`);
|
|
106
|
+
}
|
|
107
|
+
if (details !== '') {
|
|
108
|
+
console.log(details);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "builder-doctor",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A CLI tool for Builder.io diagnostics",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"builder-doctor": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"prepublishOnly": "npm run build"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"builder",
|
|
15
|
+
"cli",
|
|
16
|
+
"doctor"
|
|
17
|
+
],
|
|
18
|
+
"author": "Damian Tarnawsky (Builder.io)",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^20.0.0",
|
|
22
|
+
"typescript": "^5.0.0"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
]
|
|
27
|
+
}
|