@haneeshsai/cartd 0.1.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.
@@ -0,0 +1,197 @@
1
+ import { WebSocketServer, WebSocket } from 'ws';
2
+ import { z } from 'zod';
3
+ import { search } from './searcher.js';
4
+ import { patch } from './patcher.js';
5
+ const MIN_TEXT_LENGTH = 3;
6
+ // ── Zod schemas ────────────────────────────────────────────────────────
7
+ const RectSchema = z.object({
8
+ x: z.number(), y: z.number(), width: z.number(), height: z.number(),
9
+ top: z.number(), left: z.number(), bottom: z.number(), right: z.number(),
10
+ });
11
+ const ElementClickedSchema = z.object({
12
+ type: z.literal('element-clicked'),
13
+ payload: z.object({
14
+ tagName: z.string(),
15
+ type: z.enum(['text', 'image', 'color']),
16
+ textContent: z.string().optional(),
17
+ src: z.string().optional(),
18
+ computedColor: z.string().optional(),
19
+ computedBg: z.string().optional(),
20
+ className: z.string().optional(),
21
+ cartdId: z.string().optional(),
22
+ rect: RectSchema,
23
+ }),
24
+ });
25
+ const MatchSchema = z.object({
26
+ file: z.string(),
27
+ line: z.number(),
28
+ colStart: z.number(),
29
+ colEnd: z.number(),
30
+ tagName: z.string(),
31
+ });
32
+ const ChangeSchema = z.object({
33
+ type: z.literal('change'),
34
+ payload: z.object({
35
+ cartdId: z.string().optional(),
36
+ match: MatchSchema,
37
+ type: z.enum(['text', 'image', 'color']),
38
+ newValue: z.string().min(1),
39
+ }),
40
+ });
41
+ const RelayInboundSchema = z.discriminatedUnion('type', [
42
+ ChangeSchema,
43
+ z.object({ type: z.literal('ping'), token: z.string() }),
44
+ ]);
45
+ export function startSidecar(opts) {
46
+ const { config, cwd, token, httpServer } = opts;
47
+ let relayWs = null;
48
+ let injectedWs = null;
49
+ let relayRetryDelay = 1000;
50
+ let relayRetryTimer = null;
51
+ let destroyed = false;
52
+ // ── WebSocket server for the injected browser script ──────────────
53
+ const wss = new WebSocketServer({ server: httpServer, path: '/inject' });
54
+ wss.on('connection', (ws) => {
55
+ injectedWs = ws;
56
+ ws.on('message', (raw) => {
57
+ let msg;
58
+ try {
59
+ msg = JSON.parse(raw.toString());
60
+ }
61
+ catch {
62
+ return;
63
+ }
64
+ if (msg.type === 'element-clicked') {
65
+ const parsed = ElementClickedSchema.safeParse(msg);
66
+ if (!parsed.success)
67
+ return;
68
+ handleElementClicked(parsed.data.payload, ws);
69
+ return;
70
+ }
71
+ if (msg.type === 'change') {
72
+ const parsed = ChangeSchema.safeParse(msg);
73
+ if (!parsed.success)
74
+ return;
75
+ applyChange(parsed.data.payload, ws);
76
+ return;
77
+ }
78
+ });
79
+ ws.on('close', () => { if (injectedWs === ws)
80
+ injectedWs = null; });
81
+ });
82
+ // ── Element clicked: search source files, reply to browser ────────
83
+ function handleElementClicked(payload, browserWs) {
84
+ const currentValue = payload.type === 'image' ? (payload.src ?? '') :
85
+ payload.type === 'color' ? (payload.computedColor ?? '') :
86
+ (payload.textContent ?? '');
87
+ // Element already has an ID — skip search, go straight to edit
88
+ if (payload.cartdId) {
89
+ send(browserWs, {
90
+ type: 'search-result',
91
+ matches: [{ file: '__known__', line: 0, colStart: 0, colEnd: 0, tagName: payload.tagName, cartdId: payload.cartdId }],
92
+ editType: payload.type,
93
+ currentValue,
94
+ });
95
+ return;
96
+ }
97
+ // Guard: don't search on empty / very short text — too many false matches
98
+ if (payload.type === 'text' && currentValue.length < MIN_TEXT_LENGTH)
99
+ return;
100
+ const matches = search({
101
+ type: payload.type,
102
+ textContent: payload.textContent,
103
+ src: payload.src,
104
+ computedColor: payload.computedColor,
105
+ className: payload.className,
106
+ tagName: payload.tagName,
107
+ }, config.scanDirs, cwd, config.ignore);
108
+ if (matches.length === 0) {
109
+ const msg = payload.type === 'image'
110
+ ? 'Image source not found in source files (may be loaded dynamically from API).'
111
+ : 'Not found in source files.';
112
+ send(browserWs, { type: 'error', message: msg });
113
+ return;
114
+ }
115
+ // Send all matches back — browser handles disambiguation UI
116
+ send(browserWs, {
117
+ type: 'search-result',
118
+ matches,
119
+ editType: payload.type,
120
+ currentValue,
121
+ });
122
+ // Also forward to relay if connected (for remote editor UI)
123
+ sendToRelay({ type: 'search-result', token, payload: { matches, editType: payload.type, currentValue } });
124
+ }
125
+ // ── Apply a change: patch the file, notify browser ─────────────────
126
+ function applyChange(payload, browserWs) {
127
+ const { match, type, newValue, cartdId } = payload;
128
+ try {
129
+ const result = patch(match, { match, type, newValue, cartdId });
130
+ send(browserWs, { type: 'patch-success', cartdId: result.cartdId });
131
+ sendToRelay({ type: 'patch-success', token, payload: { cartdId: result.cartdId } });
132
+ }
133
+ catch (err) {
134
+ send(browserWs, { type: 'error', message: String(err) });
135
+ }
136
+ }
137
+ // ── Relay connection (bridge to cartd.io/editor) ───────────────────
138
+ function connectRelay() {
139
+ if (destroyed)
140
+ return;
141
+ relayWs = new WebSocket(`${config.relay}?token=${token}`);
142
+ relayWs.on('open', () => {
143
+ relayRetryDelay = 1000;
144
+ opts.onReady?.();
145
+ const ping = setInterval(() => {
146
+ if (relayWs?.readyState === WebSocket.OPEN) {
147
+ relayWs.send(JSON.stringify({ type: 'ping', token }));
148
+ }
149
+ else {
150
+ clearInterval(ping);
151
+ }
152
+ }, 25000);
153
+ });
154
+ relayWs.on('message', (raw) => {
155
+ let msg;
156
+ try {
157
+ msg = JSON.parse(raw.toString());
158
+ }
159
+ catch {
160
+ return;
161
+ }
162
+ const parsed = RelayInboundSchema.safeParse(msg);
163
+ if (!parsed.success)
164
+ return;
165
+ if (parsed.data.type === 'change' && injectedWs) {
166
+ applyChange(parsed.data.payload, injectedWs);
167
+ }
168
+ });
169
+ relayWs.on('close', () => {
170
+ relayWs = null;
171
+ if (destroyed)
172
+ return;
173
+ relayRetryTimer = setTimeout(() => {
174
+ relayRetryDelay = Math.min(relayRetryDelay * 2, 30000);
175
+ connectRelay();
176
+ }, relayRetryDelay);
177
+ });
178
+ relayWs.on('error', () => { });
179
+ }
180
+ function send(ws, msg) {
181
+ if (ws.readyState === WebSocket.OPEN)
182
+ ws.send(JSON.stringify(msg));
183
+ }
184
+ function sendToRelay(msg) {
185
+ if (relayWs?.readyState === WebSocket.OPEN)
186
+ relayWs.send(JSON.stringify(msg));
187
+ }
188
+ connectRelay();
189
+ return () => {
190
+ destroyed = true;
191
+ if (relayRetryTimer)
192
+ clearTimeout(relayRetryTimer);
193
+ relayWs?.close();
194
+ wss.close();
195
+ };
196
+ }
197
+ //# sourceMappingURL=sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../src/sidecar.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@haneeshsai/cartd",
3
+ "version": "0.1.0",
4
+ "description": "Visual editor CLI for cartd storefronts — click any element to edit it in source",
5
+ "keywords": ["cartd", "visual-editor", "headless", "ecommerce", "cli", "devtools"],
6
+ "license": "MIT",
7
+ "bin": {
8
+ "cartd": "./bin/cartd.mjs"
9
+ },
10
+ "files": [
11
+ "bin/cartd.mjs",
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "npm run build:injected && tsc -p tsconfig.json",
16
+ "build:injected": "esbuild src/injected.ts --bundle --platform=browser --format=iife --minify --outfile=src/injected.bundle.js && node -e \"const s=require('fs').readFileSync('src/injected.bundle.js','utf8');require('fs').writeFileSync('src/injected-content.ts','// AUTO-GENERATED — do not edit\\nexport const INJECTED_SCRIPT = '+JSON.stringify(s)+'\\n')\"",
17
+ "prepublishOnly": "npm run build",
18
+ "dev": "tsc -p tsconfig.json --watch",
19
+ "lint": "tsc --noEmit"
20
+ },
21
+ "type": "module",
22
+ "dependencies": {
23
+ "@babel/generator": "^7.24.0",
24
+ "@babel/parser": "^7.24.0",
25
+ "@babel/traverse": "^7.24.0",
26
+ "@babel/types": "^7.24.0",
27
+ "chalk": "^5.3.0",
28
+ "commander": "^12.0.0",
29
+ "esbuild": "^0.21.0",
30
+ "execa": "^9.0.0",
31
+ "http-proxy": "^1.18.1",
32
+ "node-html-parser": "^6.1.13",
33
+ "ora": "^8.0.1",
34
+ "uuid": "^10.0.0",
35
+ "ws": "^8.17.0",
36
+ "zod": "^3.23.0"
37
+ },
38
+ "devDependencies": {
39
+ "@ecom-baas/types": "*",
40
+ "@types/babel__generator": "^7.6.8",
41
+ "@types/babel__traverse": "^7.20.6",
42
+ "@types/http-proxy": "^1.17.14",
43
+ "@types/node": "^20.0.0",
44
+ "@types/uuid": "^10.0.0",
45
+ "@types/ws": "^8.5.10",
46
+ "typescript": "^5.4.0"
47
+ },
48
+ "engines": {
49
+ "node": ">=18.0.0"
50
+ }
51
+ }