@teardown/cli 1.2.20 → 1.2.22

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.
Files changed (65) hide show
  1. package/bin/teardown.js +3 -0
  2. package/dist/commands/dev/dev.d.ts +22 -0
  3. package/dist/commands/dev/dev.js +55 -0
  4. package/dist/commands/dev/types.d.ts +64 -0
  5. package/dist/commands/dev/types.js +2 -0
  6. package/dist/index.js +11 -32
  7. package/dist/modules/dev/dev-menu/keyboard-handler.d.ts +20 -0
  8. package/dist/modules/dev/dev-menu/keyboard-handler.js +126 -0
  9. package/dist/modules/dev/dev-menu/open-debugger-keyboard-handler.d.ts +18 -0
  10. package/dist/modules/dev/dev-menu/open-debugger-keyboard-handler.js +105 -0
  11. package/dist/modules/dev/dev-server/dev-server-checker.d.ts +22 -0
  12. package/dist/modules/dev/dev-server/dev-server-checker.js +72 -0
  13. package/dist/modules/dev/dev-server/dev-server.d.ts +68 -0
  14. package/dist/modules/dev/dev-server/dev-server.js +220 -0
  15. package/dist/modules/dev/dev-server/plugins/devtools.plugin.d.ts +10 -0
  16. package/dist/modules/dev/dev-server/plugins/devtools.plugin.js +50 -0
  17. package/dist/modules/dev/dev-server/plugins/favicon.plugin.d.ts +1 -0
  18. package/dist/modules/dev/dev-server/plugins/favicon.plugin.js +19 -0
  19. package/dist/modules/dev/dev-server/plugins/multipart.plugin.d.ts +1 -0
  20. package/dist/modules/dev/dev-server/plugins/multipart.plugin.js +62 -0
  21. package/dist/modules/dev/dev-server/plugins/symbolicate/index.d.ts +2 -0
  22. package/dist/modules/dev/dev-server/plugins/symbolicate/index.js +18 -0
  23. package/dist/modules/dev/dev-server/plugins/symbolicate/sybmolicatePlugin.d.ts +1 -0
  24. package/dist/modules/dev/dev-server/plugins/symbolicate/sybmolicatePlugin.js +24 -0
  25. package/dist/modules/dev/dev-server/plugins/symbolicate/types.d.ts +64 -0
  26. package/dist/modules/dev/dev-server/plugins/symbolicate/types.js +2 -0
  27. package/dist/modules/dev/dev-server/plugins/types.d.ts +11 -0
  28. package/dist/modules/dev/dev-server/plugins/types.js +2 -0
  29. package/dist/modules/dev/dev-server/plugins/wss/index.d.ts +3 -0
  30. package/dist/modules/dev/dev-server/plugins/wss/index.js +19 -0
  31. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.d.ts +32 -0
  32. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.js +61 -0
  33. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-debugger.server.d.ts +63 -0
  34. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-debugger.server.js +128 -0
  35. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-dev-client.server.d.ts +32 -0
  36. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-dev-client.server.js +75 -0
  37. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.d.ts +75 -0
  38. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.js +190 -0
  39. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.d.ts +44 -0
  40. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.js +112 -0
  41. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.d.ts +139 -0
  42. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.js +352 -0
  43. package/dist/modules/dev/dev-server/plugins/wss/types.d.ts +6 -0
  44. package/dist/modules/dev/dev-server/plugins/wss/types.js +2 -0
  45. package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.d.ts +32 -0
  46. package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.js +59 -0
  47. package/dist/modules/dev/dev-server/plugins/wss/web-socket-server-adapter.d.ts +13 -0
  48. package/dist/modules/dev/dev-server/plugins/wss/web-socket-server-adapter.js +26 -0
  49. package/dist/modules/dev/dev-server/plugins/wss/web-socket-server.d.ts +39 -0
  50. package/dist/modules/dev/dev-server/plugins/wss/web-socket-server.js +46 -0
  51. package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.d.ts +46 -0
  52. package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.js +57 -0
  53. package/dist/modules/dev/dev-server/types.d.ts +27 -0
  54. package/dist/modules/dev/dev-server/types.js +17 -0
  55. package/dist/modules/dev/terminal/base.terminal.reporter.d.ts +25 -0
  56. package/dist/modules/dev/terminal/base.terminal.reporter.js +78 -0
  57. package/dist/modules/dev/terminal/terminal.reporter.d.ts +12 -0
  58. package/dist/modules/dev/terminal/terminal.reporter.js +71 -0
  59. package/dist/modules/dev/types.d.ts +20 -0
  60. package/dist/modules/dev/types.js +2 -0
  61. package/dist/modules/dev/utils/log.d.ts +23 -0
  62. package/dist/modules/dev/utils/log.js +73 -0
  63. package/package.json +40 -17
  64. /package/dist/{init-teardown.d.ts → commands/init/init-teardown.d.ts} +0 -0
  65. /package/dist/{init-teardown.js → commands/init/init-teardown.js} +0 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+
3
+ require("../dist/index.js");
@@ -0,0 +1,22 @@
1
+ import { Command } from "commander";
2
+ export interface DevServerOptions {
3
+ projectRoot: string;
4
+ port: number;
5
+ host: string;
6
+ config: string;
7
+ entryFile: string;
8
+ resetCache: boolean;
9
+ watchFolders?: string[];
10
+ assetPlugins?: string[];
11
+ sourceExts?: string[];
12
+ maxWorkers?: number;
13
+ transformer?: string;
14
+ https?: boolean;
15
+ key?: string;
16
+ cert?: string;
17
+ interactive?: boolean;
18
+ }
19
+ export declare class DevServerCommand {
20
+ createCommand(): Command;
21
+ private action;
22
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DevServerCommand = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const commander_1 = require("commander");
9
+ const dev_server_1 = require("../../modules/dev/dev-server/dev-server");
10
+ class DevServerCommand {
11
+ createCommand() {
12
+ const command = new commander_1.Command("dev")
13
+ .description("Start the development server")
14
+ .option("-p, --port <number>", "Port to start the server on", "8081")
15
+ .option("-h, --host <string>", "Host to listen on", "127.0.0.1")
16
+ .option("--project-root <path>", "Path to project root", process.cwd())
17
+ .option("--watch-folders <list>", "Specify additional folders to watch", (val) => val.split(",").map((folder) => node_path_1.default.resolve(folder)))
18
+ .option("--asset-plugins <list>", "Specify additional asset plugins", (val) => val.split(","))
19
+ .option("--source-exts <list>", "Specify additional source extensions", (val) => val.split(","))
20
+ .option("--max-workers <number>", "Maximum number of workers for transformation", (val) => Number(val))
21
+ .option("--transformer <string>", "Specify a custom transformer")
22
+ .option("--entry-file <path>", "Path to entry file", "index.js")
23
+ .option("--reset-cache", "Reset the metro cache", false)
24
+ .option("--https", "Enable HTTPS connections")
25
+ .option("--key <path>", "Path to SSL key")
26
+ .option("--cert <path>", "Path to SSL certificate")
27
+ .option("--config <path>", "Path to config file", (val) => node_path_1.default.resolve(val))
28
+ .option("--no-interactive", "Disable interactive mode");
29
+ command.action(this.action);
30
+ return command;
31
+ }
32
+ async action(options) {
33
+ try {
34
+ const server = new dev_server_1.DevServer({
35
+ projectRoot: options.projectRoot,
36
+ host: options.host,
37
+ port: options.port,
38
+ logRequests: true,
39
+ https: options.https
40
+ ? {
41
+ key: options.key ?? "",
42
+ cert: options.cert ?? "",
43
+ }
44
+ : undefined,
45
+ });
46
+ await server.initialize();
47
+ await server.start();
48
+ }
49
+ catch (error) {
50
+ console.error("Failed to start development server:", error);
51
+ throw error;
52
+ }
53
+ }
54
+ }
55
+ exports.DevServerCommand = DevServerCommand;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Raw React Native stack frame.
3
+ */
4
+ export interface ReactNativeStackFrame {
5
+ lineNumber: number | null;
6
+ column: number | null;
7
+ file: string | null;
8
+ methodName: string;
9
+ }
10
+ /**
11
+ * React Native stack frame used as input when processing by {@link Symbolicator}.
12
+ */
13
+ export interface InputStackFrame extends ReactNativeStackFrame {
14
+ file: string;
15
+ }
16
+ /**
17
+ * Final symbolicated stack frame.
18
+ */
19
+ export interface StackFrame extends InputStackFrame {
20
+ collapse: boolean;
21
+ }
22
+ /**
23
+ * Represents [@babel/core-frame](https://babeljs.io/docs/en/babel-code-frame).
24
+ */
25
+ export interface CodeFrame {
26
+ content: string;
27
+ location: {
28
+ row: number;
29
+ column: number;
30
+ };
31
+ fileName: string;
32
+ }
33
+ /**
34
+ * Represents results of running {@link process} method on {@link Symbolicator} instance.
35
+ */
36
+ export interface SymbolicatorResults {
37
+ codeFrame: CodeFrame | null;
38
+ stack: StackFrame[];
39
+ }
40
+ /**
41
+ * Delegate with implementation for symbolication functions.
42
+ */
43
+ export interface SymbolicatorDelegate {
44
+ /**
45
+ * Get source code of file in the URL.
46
+ *
47
+ * @param fileUrl A full URL pointing to a file.
48
+ */
49
+ getSource: (fileUrl: string) => Promise<string | Buffer>;
50
+ /**
51
+ * Get source map for the file in the URL.
52
+ *
53
+ * @param fileUrl A full (usually `http:`) URL pointing to a compiled file.
54
+ * The URL points to a file for which to return source map, not to the source map file itself,
55
+ * e.g: `http://localhost:8081/index.bundle?platform=ios`.
56
+ */
57
+ getSourceMap: (fileUrl: string) => Promise<string | Buffer>;
58
+ /**
59
+ * Check if given stack frame should be included in the new symbolicated stack.
60
+ *
61
+ * @param frame Stack frame to check.
62
+ */
63
+ shouldIncludeFrame: (frame: StackFrame) => boolean;
64
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/dist/index.js CHANGED
@@ -1,41 +1,20 @@
1
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 (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  const commander_1 = require("commander");
4
+ const dev_1 = require("./commands/dev/dev");
27
5
  const program = new commander_1.Command();
28
6
  program
29
7
  .name("Teardown CLI")
30
8
  .description("CLI to use the Teardown")
31
9
  .version("0.0.1");
32
- program
33
- .command("init")
34
- .description("Initialize Teardown in the current project")
35
- .action(async () => {
36
- const project = await Promise.resolve().then(() => __importStar(require("./init-teardown")));
37
- await new project.InitTeardown({
38
- projectName: "example ",
39
- }).init();
40
- });
10
+ // program
11
+ // .command("init")
12
+ // .description("Initialize Teardown in the current project")
13
+ // .action(async () => {
14
+ // const project = await import("./commands/init/init-teardown");
15
+ // await new project.InitTeardown({
16
+ // projectName: "example ",
17
+ // }).init();
18
+ // });
19
+ program.addCommand(new dev_1.DevServerCommand().createCommand());
41
20
  program.parse();
@@ -0,0 +1,20 @@
1
+ import type { DevServer } from "../dev-server/dev-server";
2
+ export declare class KeyboardHandlerManager {
3
+ readonly devServer: DevServer;
4
+ private static readonly CTRL_C;
5
+ private static readonly CTRL_D;
6
+ private static readonly RELOAD_TIMEOUT;
7
+ private readonly openDebuggerKeyboardHandler;
8
+ private previousCallTimestamp;
9
+ constructor(devServer: DevServer);
10
+ initialize(): void;
11
+ private isTTYSupported;
12
+ private setupKeyboardHandlers;
13
+ private handleKeyPress;
14
+ private handleReload;
15
+ private handleDevMenu;
16
+ private handleOpenDebugger;
17
+ private handleExit;
18
+ private setRawMode;
19
+ private printAvailableCommands;
20
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KeyboardHandlerManager = void 0;
7
+ const node_readline_1 = __importDefault(require("node:readline"));
8
+ const node_tty_1 = require("node:tty");
9
+ // @ts-ignore
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const open_debugger_keyboard_handler_1 = __importDefault(require("./open-debugger-keyboard-handler"));
12
+ class KeyboardHandlerManager {
13
+ devServer;
14
+ static CTRL_C = "\u0003";
15
+ static CTRL_D = "\u0004";
16
+ static RELOAD_TIMEOUT = 500;
17
+ openDebuggerKeyboardHandler;
18
+ previousCallTimestamp = 0;
19
+ constructor(devServer) {
20
+ this.devServer = devServer;
21
+ this.openDebuggerKeyboardHandler = new open_debugger_keyboard_handler_1.default({
22
+ reporter: this.devServer.terminalReporter,
23
+ devServerUrl: this.devServer.getDevServerUrl(),
24
+ });
25
+ }
26
+ initialize() {
27
+ if (!this.isTTYSupported()) {
28
+ this.devServer.terminalReporter.update({
29
+ type: "client_log",
30
+ level: "info",
31
+ data: ["Interactive mode is not supported in this environment"],
32
+ });
33
+ return;
34
+ }
35
+ this.setupKeyboardHandlers();
36
+ this.printAvailableCommands();
37
+ }
38
+ isTTYSupported() {
39
+ return process.stdin.isTTY === true;
40
+ }
41
+ setupKeyboardHandlers() {
42
+ node_readline_1.default.emitKeypressEvents(process.stdin);
43
+ this.setRawMode(true);
44
+ process.stdin.on("keypress", (str, key) => {
45
+ this.handleKeyPress(key);
46
+ });
47
+ }
48
+ handleKeyPress(key) {
49
+ if (this.openDebuggerKeyboardHandler.maybeHandleTargetSelection(key.name)) {
50
+ return;
51
+ }
52
+ switch (key.sequence) {
53
+ case "r":
54
+ this.handleReload();
55
+ break;
56
+ case "d":
57
+ this.handleDevMenu();
58
+ break;
59
+ case "j":
60
+ void this.handleOpenDebugger();
61
+ break;
62
+ case KeyboardHandlerManager.CTRL_C:
63
+ case KeyboardHandlerManager.CTRL_D:
64
+ this.handleExit();
65
+ break;
66
+ }
67
+ }
68
+ handleReload() {
69
+ const currentCallTimestamp = new Date().getTime();
70
+ if (currentCallTimestamp - this.previousCallTimestamp >
71
+ KeyboardHandlerManager.RELOAD_TIMEOUT) {
72
+ this.previousCallTimestamp = currentCallTimestamp;
73
+ this.devServer.terminalReporter.update({
74
+ type: "client_log",
75
+ level: "info",
76
+ data: ["Reloading connected app(s)..."],
77
+ });
78
+ this.devServer.messageServer.broadcast("reload");
79
+ }
80
+ }
81
+ handleDevMenu() {
82
+ this.devServer.terminalReporter.update({
83
+ type: "client_log",
84
+ level: "info",
85
+ data: ["Opening Dev Menu..."],
86
+ });
87
+ this.devServer.messageServer.broadcast("devMenu");
88
+ }
89
+ async handleOpenDebugger() {
90
+ await this.openDebuggerKeyboardHandler.handleOpenDebugger();
91
+ }
92
+ handleExit() {
93
+ this.openDebuggerKeyboardHandler.dismiss();
94
+ this.devServer.terminalReporter.update({
95
+ type: "client_log",
96
+ level: "info",
97
+ data: ["Stopping server"],
98
+ });
99
+ this.setRawMode(false);
100
+ process.stdin.pause();
101
+ process.emit("SIGINT");
102
+ process.exit();
103
+ }
104
+ setRawMode(enable) {
105
+ invariant(process.stdin instanceof node_tty_1.ReadStream, "process.stdin must be a readable stream to modify raw mode");
106
+ process.stdin.setRawMode(enable);
107
+ }
108
+ printAvailableCommands() {
109
+ this.devServer.terminalReporter.update({
110
+ type: "client_log",
111
+ level: "info",
112
+ data: [
113
+ "Key commands available:",
114
+ `${chalk_1.default.bold.inverse(" r ")} - reload app(s)`,
115
+ `${chalk_1.default.bold.inverse(" d ")} - open Dev Menu`,
116
+ `${chalk_1.default.bold.inverse(" j ")} - open DevTools`,
117
+ ],
118
+ });
119
+ }
120
+ }
121
+ exports.KeyboardHandlerManager = KeyboardHandlerManager;
122
+ const invariant = (condition, message) => {
123
+ if (!condition) {
124
+ throw new Error(message);
125
+ }
126
+ };
@@ -0,0 +1,18 @@
1
+ import type { TeardownTerminalReporter } from "../terminal/terminal.reporter";
2
+ interface OpenDebuggerConfig {
3
+ reporter: TeardownTerminalReporter;
4
+ devServerUrl: string;
5
+ }
6
+ export default class OpenDebuggerKeyboardHandler {
7
+ private readonly reporter;
8
+ private readonly devServerUrl;
9
+ private isTargetSelectionActive;
10
+ private targets;
11
+ constructor(config: OpenDebuggerConfig);
12
+ handleOpenDebugger(): Promise<void>;
13
+ maybeHandleTargetSelection(key: string): boolean;
14
+ dismiss(): void;
15
+ private openTarget;
16
+ private showTargetSelection;
17
+ }
18
+ export {};
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // @ts-ignore
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const open_1 = __importDefault(require("open"));
9
+ class OpenDebuggerKeyboardHandler {
10
+ reporter;
11
+ devServerUrl;
12
+ isTargetSelectionActive = false;
13
+ targets = [];
14
+ constructor(config) {
15
+ this.reporter = config.reporter;
16
+ this.devServerUrl = config.devServerUrl;
17
+ }
18
+ async handleOpenDebugger() {
19
+ try {
20
+ const response = await fetch(`${this.devServerUrl}/json`);
21
+ const pages = await response.json();
22
+ this.targets = pages.map((page) => ({
23
+ name: page.title,
24
+ url: page.devtoolsFrontendUrl,
25
+ }));
26
+ if (this.targets.length === 0) {
27
+ this.reporter.update({
28
+ type: "client_log",
29
+ level: "info",
30
+ data: ["No available debugging targets"],
31
+ });
32
+ return;
33
+ }
34
+ if (this.targets.length === 1) {
35
+ await this.openTarget(this.targets[0]);
36
+ return;
37
+ }
38
+ this.showTargetSelection();
39
+ }
40
+ catch (error) {
41
+ this.reporter.update({
42
+ type: "client_log",
43
+ level: "warn",
44
+ data: [
45
+ `Failed to open debugger: ${error instanceof Error ? error.message : String(error)}`,
46
+ ],
47
+ });
48
+ }
49
+ }
50
+ maybeHandleTargetSelection(key) {
51
+ if (!this.isTargetSelectionActive) {
52
+ return false;
53
+ }
54
+ const targetIndex = Number.parseInt(key, 10) - 1;
55
+ if (targetIndex >= 0 && targetIndex < this.targets.length) {
56
+ void this.openTarget(this.targets[targetIndex]);
57
+ this.dismiss();
58
+ return true;
59
+ }
60
+ if (key === "escape") {
61
+ this.dismiss();
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ dismiss() {
67
+ this.isTargetSelectionActive = false;
68
+ this.targets = [];
69
+ }
70
+ async openTarget(target) {
71
+ try {
72
+ console.log("openTarget", target.url);
73
+ await (0, open_1.default)(target.url);
74
+ this.reporter.update({
75
+ type: "client_log",
76
+ level: "info",
77
+ data: [`Opening debugger for: ${target.name}`],
78
+ });
79
+ }
80
+ catch (error) {
81
+ this.reporter.update({
82
+ type: "client_log",
83
+ // @ts-ignore
84
+ level: "error",
85
+ data: [
86
+ `Failed to open debugger: ${error instanceof Error ? error.message : String(error)}`,
87
+ ],
88
+ });
89
+ }
90
+ }
91
+ showTargetSelection() {
92
+ this.isTargetSelectionActive = true;
93
+ const targetList = this.targets
94
+ .map((target, i) => ` ${chalk_1.default.bold.inverse(` ${i + 1} `)} ${target.name}`)
95
+ .join("\n");
96
+ this.reporter.update({
97
+ type: "client_log",
98
+ level: "info",
99
+ data: [
100
+ `Select a target to debug:\n${targetList}\n\n ${chalk_1.default.bold.inverse(" ESC ")} to cancel\n`,
101
+ ],
102
+ });
103
+ }
104
+ }
105
+ exports.default = OpenDebuggerKeyboardHandler;
@@ -0,0 +1,22 @@
1
+ export declare enum DevServerStatusResultEnum {
2
+ PACKAGER_STATUS_RUNNING = "packager-status:running"
3
+ }
4
+ export declare enum DevServerStatusEnum {
5
+ NOT_RUNNING = "not_running",
6
+ MATCHED_SERVER_RUNNING = "matched_server_running",
7
+ PORT_TAKEN = "port_taken",
8
+ UNKNOWN = "unknown"
9
+ }
10
+ export type DevServerOptions = {
11
+ host: string;
12
+ port: number;
13
+ projectRoot: string;
14
+ devServerStatusPath?: string;
15
+ };
16
+ export declare class DevServerChecker {
17
+ readonly options: DevServerOptions;
18
+ constructor(options: DevServerOptions);
19
+ private getUrl;
20
+ getServerStatus(): Promise<DevServerStatusEnum>;
21
+ private isPortInUse;
22
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DevServerChecker = exports.DevServerStatusEnum = exports.DevServerStatusResultEnum = void 0;
7
+ const bun_1 = require("bun");
8
+ const node_net_1 = __importDefault(require("node:net"));
9
+ var DevServerStatusResultEnum;
10
+ (function (DevServerStatusResultEnum) {
11
+ DevServerStatusResultEnum["PACKAGER_STATUS_RUNNING"] = "packager-status:running";
12
+ })(DevServerStatusResultEnum || (exports.DevServerStatusResultEnum = DevServerStatusResultEnum = {}));
13
+ var DevServerStatusEnum;
14
+ (function (DevServerStatusEnum) {
15
+ DevServerStatusEnum["NOT_RUNNING"] = "not_running";
16
+ DevServerStatusEnum["MATCHED_SERVER_RUNNING"] = "matched_server_running";
17
+ DevServerStatusEnum["PORT_TAKEN"] = "port_taken";
18
+ DevServerStatusEnum["UNKNOWN"] = "unknown";
19
+ })(DevServerStatusEnum || (exports.DevServerStatusEnum = DevServerStatusEnum = {}));
20
+ class DevServerChecker {
21
+ options;
22
+ constructor(options) {
23
+ this.options = options;
24
+ }
25
+ getUrl() {
26
+ const devServerStatusPath = this.options.devServerStatusPath ?? "/status";
27
+ return `${this.options.host}:${this.options.port}${devServerStatusPath}`;
28
+ }
29
+ async getServerStatus() {
30
+ try {
31
+ if (!(await this.isPortInUse(this.options.host, this.options.port))) {
32
+ return DevServerStatusEnum.NOT_RUNNING;
33
+ }
34
+ const statusResponse = await (0, bun_1.fetch)(this.getUrl());
35
+ const body = await statusResponse.text();
36
+ if (body !== DevServerStatusResultEnum.PACKAGER_STATUS_RUNNING) {
37
+ return DevServerStatusEnum.PORT_TAKEN;
38
+ }
39
+ const projectRoot = statusResponse.headers.get("X-React-Native-Project-Root");
40
+ if (projectRoot !== this.options.projectRoot) {
41
+ return DevServerStatusEnum.PORT_TAKEN;
42
+ }
43
+ return DevServerStatusEnum.MATCHED_SERVER_RUNNING;
44
+ }
45
+ catch (error) {
46
+ console.error(error);
47
+ return DevServerStatusEnum.UNKNOWN;
48
+ }
49
+ }
50
+ async isPortInUse(hostname, port) {
51
+ return new Promise((resolve) => {
52
+ const server = node_net_1.default.createServer();
53
+ server.once("error", (e) => {
54
+ console.log("Server error:", e);
55
+ server.close();
56
+ if (e.code === "EADDRINUSE") {
57
+ resolve(true);
58
+ }
59
+ else {
60
+ // For any other errors, assume port is not in use
61
+ resolve(false);
62
+ }
63
+ });
64
+ server.once("listening", () => {
65
+ server.close();
66
+ resolve(false);
67
+ });
68
+ server.listen(port, hostname);
69
+ });
70
+ }
71
+ }
72
+ exports.DevServerChecker = DevServerChecker;
@@ -0,0 +1,68 @@
1
+ import { type FastifyInstance } from "fastify";
2
+ import type { TerminalReportableEvent } from "metro/src/lib/TerminalReporter";
3
+ import { TeardownTerminalReporter } from "../terminal/terminal.reporter";
4
+ import { WebSocketEventsServer } from "./plugins/wss/servers/web-socket-events.server";
5
+ import { WebSocketMessageServer } from "./plugins/wss/servers/web-socket-message.server";
6
+ import { KeyboardHandlerManager } from "../dev-menu/keyboard-handler";
7
+ export type DevServerOptions = {
8
+ projectRoot: string;
9
+ host: string;
10
+ port: number;
11
+ logRequests: boolean;
12
+ https?: {
13
+ key: string;
14
+ cert: string;
15
+ };
16
+ };
17
+ export declare class DevServer {
18
+ readonly config: DevServerOptions;
19
+ terminalReporter: TeardownTerminalReporter;
20
+ private instance;
21
+ messageServer: WebSocketMessageServer;
22
+ eventsServer: WebSocketEventsServer;
23
+ keyboardHandler: KeyboardHandlerManager;
24
+ constructor(config: DevServerOptions);
25
+ getDevServerUrl(): string;
26
+ onInitializeDone(): void;
27
+ reportMetroEvent(event: TerminalReportableEvent): void;
28
+ private onBundleBuilt;
29
+ private onMessage;
30
+ private onClientConnected;
31
+ private loadMetroConfig;
32
+ private _metroConfig;
33
+ private getMetroConfig;
34
+ private registerPlugins;
35
+ private registerHooks;
36
+ private registerRoutes;
37
+ initialize(): Promise<void>;
38
+ start(): Promise<void>;
39
+ stop(): Promise<void>;
40
+ getInstance(): FastifyInstance;
41
+ }
42
+ type Log = {
43
+ level: number;
44
+ time: number;
45
+ pid: number;
46
+ hostname: string;
47
+ msg: string;
48
+ } & Record<string, any>;
49
+ export interface Reporter {
50
+ process(log: LogEntry): void;
51
+ flush(): void;
52
+ stop(): void;
53
+ }
54
+ /** Log message type. */
55
+ export type LogType = "debug" | "info" | "warn" | "error" | "success" | "progress";
56
+ /**
57
+ * Represent log message with all necessary data.
58
+ *
59
+ * @internal
60
+ */
61
+ export interface LogEntry {
62
+ timestamp: number;
63
+ type: LogType;
64
+ issuer: string;
65
+ message: Array<string | number | boolean | Object>;
66
+ }
67
+ export declare function makeLogEntryFromFastifyLog(data: Log): LogEntry;
68
+ export {};