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 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
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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
+ }