@teardown/cli 1.2.34 → 1.2.35

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 (40) hide show
  1. package/dist/commands/dev/dev.js +55 -0
  2. package/dist/commands/init/init-teardown.js +26 -0
  3. package/dist/index.js +20 -0
  4. package/dist/modules/dev/dev-menu/keyboard-handler.js +138 -0
  5. package/dist/modules/dev/dev-menu/open-debugger-keyboard-handler.js +105 -0
  6. package/dist/modules/dev/dev-server/cdp/cdp.adapter.js +12 -0
  7. package/dist/modules/dev/dev-server/cdp/index.js +18 -0
  8. package/dist/modules/dev/dev-server/cdp/types.js +2 -0
  9. package/dist/modules/dev/dev-server/dev-server-checker.js +72 -0
  10. package/dist/modules/dev/dev-server/dev-server.js +269 -0
  11. package/dist/modules/dev/dev-server/inspector/device.event-reporter.js +165 -0
  12. package/dist/modules/dev/dev-server/inspector/device.js +577 -0
  13. package/dist/modules/dev/dev-server/inspector/inspector.js +204 -0
  14. package/dist/modules/dev/dev-server/inspector/types.js +2 -0
  15. package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.js +61 -0
  16. package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.js +64 -0
  17. package/dist/modules/dev/dev-server/plugins/devtools.plugin.js +50 -0
  18. package/dist/modules/dev/dev-server/plugins/favicon.plugin.js +19 -0
  19. package/dist/modules/dev/dev-server/plugins/multipart.plugin.js +62 -0
  20. package/dist/modules/dev/dev-server/plugins/systrace.plugin.js +28 -0
  21. package/dist/modules/dev/dev-server/plugins/types.js +2 -0
  22. package/dist/modules/dev/dev-server/plugins/wss/index.js +19 -0
  23. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.js +66 -0
  24. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-debugger.server.js +128 -0
  25. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-dev-client.server.js +75 -0
  26. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.js +198 -0
  27. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.js +120 -0
  28. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.js +357 -0
  29. package/dist/modules/dev/dev-server/plugins/wss/types.js +2 -0
  30. package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.js +57 -0
  31. package/dist/modules/dev/dev-server/plugins/wss/web-socket-server-adapter.js +26 -0
  32. package/dist/modules/dev/dev-server/plugins/wss/web-socket-server.js +46 -0
  33. package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.js +55 -0
  34. package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.js +36 -0
  35. package/dist/modules/dev/dev-server/sybmolicate/types.js +2 -0
  36. package/dist/modules/dev/terminal/base.terminal.reporter.js +78 -0
  37. package/dist/modules/dev/terminal/terminal.reporter.js +76 -0
  38. package/dist/modules/dev/types.js +2 -0
  39. package/dist/modules/dev/utils/log.js +73 -0
  40. package/package.json +1 -1
@@ -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,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InitTeardown = void 0;
4
+ const bun_1 = require("bun");
5
+ class InitTeardown {
6
+ options;
7
+ constructor(options) {
8
+ this.options = options;
9
+ }
10
+ async init() {
11
+ console.log("Initializing Teardown...");
12
+ const projectLocation = await this.getProjectLocation();
13
+ console.log(projectLocation);
14
+ }
15
+ async getProjectLocation() {
16
+ try {
17
+ const projectLocation = await (0, bun_1.$) `pwd`;
18
+ return projectLocation.text().trim();
19
+ }
20
+ catch (error) {
21
+ console.error("Error getting project location:", error);
22
+ throw error;
23
+ }
24
+ }
25
+ }
26
+ exports.InitTeardown = InitTeardown;
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const commander_1 = require("commander");
4
+ const dev_1 = require("./commands/dev/dev");
5
+ const program = new commander_1.Command();
6
+ program
7
+ .name("Teardown CLI")
8
+ .description("CLI to use the Teardown")
9
+ .version("0.0.1");
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());
20
+ program.parse();
@@ -0,0 +1,138 @@
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
+ async 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
+ isRawModeSupported() {
105
+ return process.stdin instanceof node_tty_1.ReadStream;
106
+ }
107
+ setRawMode(enable) {
108
+ if (!this.isRawModeSupported()) {
109
+ return;
110
+ }
111
+ process.stdin.setRawMode(enable);
112
+ }
113
+ printAvailableCommands() {
114
+ if (!this.isRawModeSupported()) {
115
+ return;
116
+ }
117
+ this.devServer.terminalReporter.update({
118
+ type: "client_log",
119
+ level: "info",
120
+ data: [
121
+ "Key commands available:",
122
+ "\n",
123
+ "\n",
124
+ `${chalk_1.default.bold.inverse(" r ")} - reload app(s)`,
125
+ "\n",
126
+ `${chalk_1.default.bold.inverse(" d ")} - open Dev Menu`,
127
+ // "\n",
128
+ // `${chalk.bold.inverse(" j ")} - open DevTools`,
129
+ ],
130
+ });
131
+ }
132
+ }
133
+ exports.KeyboardHandlerManager = KeyboardHandlerManager;
134
+ const invariant = (condition, message) => {
135
+ if (!condition) {
136
+ throw new Error(message);
137
+ }
138
+ };
@@ -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,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CDPAdapter = void 0;
4
+ // import type { DevServer } from "devtools-protocol";
5
+ class CDPAdapter {
6
+ instance;
7
+ constructor(instance) {
8
+ this.instance = instance;
9
+ }
10
+ enable() { }
11
+ }
12
+ exports.CDPAdapter = CDPAdapter;
@@ -0,0 +1,18 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cdp.adapter"), exports);
18
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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;