@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,182 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { extname } from 'node:path';
3
+ import * as parser from '@babel/parser';
4
+ import _traverse from '@babel/traverse';
5
+ import _generate from '@babel/generator';
6
+ import * as t from '@babel/types';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ const traverse = (_traverse.default ?? _traverse);
9
+ const generate = (_generate.default ?? _generate);
10
+ export function patch(match, change) {
11
+ const ext = extname(match.file);
12
+ const cartdId = change.cartdId ?? uuidv4();
13
+ const src = readFileSync(match.file, 'utf-8');
14
+ if (ext === '.html' || ext === '.htm') {
15
+ const patched = patchHtml(src, match, change, cartdId);
16
+ writeFileSync(match.file, patched, 'utf-8');
17
+ return { cartdId };
18
+ }
19
+ const patched = patchJsx(src, match, change, cartdId);
20
+ writeFileSync(match.file, patched, 'utf-8');
21
+ return { cartdId };
22
+ }
23
+ // ── JSX patch ──────────────────────────────────────────────────────────
24
+ function patchJsx(src, match, change, cartdId) {
25
+ const ast = parser.parse(src, {
26
+ sourceType: 'module',
27
+ plugins: ['jsx', 'typescript', 'decorators-legacy'],
28
+ errorRecovery: true,
29
+ });
30
+ let patched = false;
31
+ traverse(ast, {
32
+ JSXText(path) {
33
+ if (patched)
34
+ return;
35
+ const loc = path.node.loc;
36
+ if (!loc)
37
+ return;
38
+ if (loc.start.line !== match.line)
39
+ return;
40
+ if (change.type === 'text') {
41
+ // Preserve surrounding whitespace
42
+ const leading = path.node.value.match(/^\s*/)?.[0] ?? '';
43
+ const trailing = path.node.value.match(/\s*$/)?.[0] ?? '';
44
+ path.node.value = `${leading}${change.newValue}${trailing}`;
45
+ addCartdId(path, cartdId);
46
+ patched = true;
47
+ }
48
+ },
49
+ StringLiteral(path) {
50
+ if (patched)
51
+ return;
52
+ if (!t.isObjectProperty(path.parent) || path.parent.value !== path.node)
53
+ return;
54
+ const loc = path.node.loc;
55
+ if (!loc || loc.start.line !== match.line || loc.start.column !== match.colStart)
56
+ return;
57
+ if (change.type === 'text') {
58
+ path.node.value = change.newValue;
59
+ patched = true;
60
+ }
61
+ else if (change.type === 'image') {
62
+ const cur = path.node.value;
63
+ // Keep the url() wrapper if it was there (backgroundImage style values)
64
+ path.node.value = cur.startsWith('url(') ? `url(${change.newValue})` : change.newValue;
65
+ addCartdId(path, cartdId);
66
+ patched = true;
67
+ }
68
+ },
69
+ JSXAttribute(path) {
70
+ if (patched)
71
+ return;
72
+ const loc = path.node.loc;
73
+ if (!loc)
74
+ return;
75
+ if (loc.start.line !== match.line)
76
+ return;
77
+ const attrName = t.isJSXIdentifier(path.node.name) ? path.node.name.name : '';
78
+ if (change.type === 'image' && attrName === 'src') {
79
+ path.node.value = t.stringLiteral(change.newValue);
80
+ addCartdId(path, cartdId);
81
+ patched = true;
82
+ return;
83
+ }
84
+ if (change.type === 'color') {
85
+ if (attrName === 'className' || attrName === 'class') {
86
+ const classes = extractStringValue(path.node.value);
87
+ if (classes) {
88
+ const updated = swapColorClass(classes, change.newValue);
89
+ path.node.value = t.stringLiteral(updated);
90
+ addCartdId(path, cartdId);
91
+ patched = true;
92
+ }
93
+ return;
94
+ }
95
+ if (attrName === 'style') {
96
+ // Replace hex in JSXExpressionContainer object
97
+ replaceColorInStyle(path, change.newValue);
98
+ addCartdId(path, cartdId);
99
+ patched = true;
100
+ }
101
+ }
102
+ },
103
+ });
104
+ // @babel/generator
105
+ const { code } = generate(ast, { retainLines: true, compact: false }, src);
106
+ return code;
107
+ }
108
+ function addCartdId(path, cartdId) {
109
+ // Walk up to the JSXOpeningElement and add/update data-cartd-id
110
+ let p = path;
111
+ while (p) {
112
+ if (t.isJSXOpeningElement(p.node)) {
113
+ const existing = p.node.attributes.find((a) => t.isJSXAttribute(a) && t.isJSXIdentifier(a.name, { name: 'data-cartd-id' }));
114
+ if (!existing) {
115
+ p.node.attributes.push(t.jsxAttribute(t.jsxIdentifier('data-cartd-id'), t.stringLiteral(cartdId)));
116
+ }
117
+ return;
118
+ }
119
+ // Also handle when path itself is inside a JSXElement
120
+ if (t.isJSXElement(p.node)) {
121
+ const opening = p.node.openingElement;
122
+ const existing = opening.attributes.find((a) => t.isJSXAttribute(a) && t.isJSXIdentifier(a.name, { name: 'data-cartd-id' }));
123
+ if (!existing) {
124
+ opening.attributes.push(t.jsxAttribute(t.jsxIdentifier('data-cartd-id'), t.stringLiteral(cartdId)));
125
+ }
126
+ return;
127
+ }
128
+ p = p.parentPath;
129
+ }
130
+ }
131
+ function extractStringValue(val) {
132
+ if (t.isStringLiteral(val))
133
+ return val.value;
134
+ if (t.isJSXExpressionContainer(val) && t.isStringLiteral(val.expression))
135
+ return val.expression.value;
136
+ return null;
137
+ }
138
+ function swapColorClass(classes, newColorClass) {
139
+ // e.g. newColorClass = 'bg-red-500', replace existing bg-* class
140
+ const prefix = newColorClass.match(/^(text|bg|border|fill|stroke|ring|shadow)-/)?.[0];
141
+ if (!prefix)
142
+ return `${classes} ${newColorClass}`.trim();
143
+ const replaced = classes.replace(new RegExp(`${prefix}[a-z0-9-]+`, 'g'), newColorClass);
144
+ // If no replacement happened, append
145
+ return replaced === classes ? `${classes} ${newColorClass}`.trim() : replaced;
146
+ }
147
+ function replaceColorInStyle(path, newColor) {
148
+ const val = path.node.value;
149
+ if (!t.isJSXExpressionContainer(val))
150
+ return;
151
+ const expr = val.expression;
152
+ if (!t.isObjectExpression(expr))
153
+ return;
154
+ for (const prop of expr.properties) {
155
+ if (!t.isObjectProperty(prop))
156
+ continue;
157
+ const key = t.isIdentifier(prop.key) ? prop.key.name : t.isStringLiteral(prop.key) ? prop.key.value : '';
158
+ if (!['color', 'backgroundColor', 'background', 'borderColor'].includes(key))
159
+ continue;
160
+ if (t.isStringLiteral(prop.value)) {
161
+ prop.value = t.stringLiteral(newColor);
162
+ }
163
+ }
164
+ }
165
+ // ── HTML patch ─────────────────────────────────────────────────────────
166
+ function patchHtml(src, match, change, cartdId) {
167
+ const lines = src.split('\n');
168
+ if (change.type === 'text') {
169
+ const line = lines[match.line - 1];
170
+ if (line) {
171
+ // Best-effort: replace the first occurrence of the old text on that line
172
+ lines[match.line - 1] = line.replace(/>([^<]+)</, `>${change.newValue}<`);
173
+ }
174
+ }
175
+ // Add data-cartd-id is tricky in plain text; use a regex on the line
176
+ const targetLine = lines[match.line - 1];
177
+ if (targetLine && !targetLine.includes('data-cartd-id')) {
178
+ lines[match.line - 1] = targetLine.replace(/<(\w+)/, `<$1 data-cartd-id="${cartdId}"`);
179
+ }
180
+ return lines.join('\n');
181
+ }
182
+ //# sourceMappingURL=patcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patcher.js","sourceRoot":"","sources":["../../src/patcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import http from 'node:http';
2
+ export declare function createProxy(targetPort: number): http.Server;
3
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAe5B,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CA2D3D"}
@@ -0,0 +1,68 @@
1
+ import http from 'node:http';
2
+ import httpProxy from 'http-proxy';
3
+ import { INJECTED_SCRIPT } from './injected-content.js';
4
+ function injectScript(html, script) {
5
+ const tag = `<script>\n${script}\n</script>`;
6
+ if (html.includes('</head>')) {
7
+ return html.replace('</head>', `${tag}\n</head>`);
8
+ }
9
+ if (html.includes('<body')) {
10
+ return html.replace('<body', `${tag}\n<body`);
11
+ }
12
+ return tag + html;
13
+ }
14
+ export function createProxy(targetPort) {
15
+ const proxy = httpProxy.createProxyServer({
16
+ target: `http://localhost:${targetPort}`,
17
+ selfHandleResponse: true,
18
+ });
19
+ proxy.on('proxyRes', (proxyRes, req, res) => {
20
+ const contentType = proxyRes.headers['content-type'] ?? '';
21
+ const isHtml = contentType.includes('text/html');
22
+ if (!isHtml) {
23
+ // Pass headers and body through unchanged
24
+ Object.entries(proxyRes.headers).forEach(([k, v]) => {
25
+ if (v !== undefined)
26
+ res.setHeader(k, v);
27
+ });
28
+ res.statusCode = proxyRes.statusCode ?? 200;
29
+ proxyRes.pipe(res);
30
+ return;
31
+ }
32
+ const chunks = [];
33
+ proxyRes.on('data', (chunk) => chunks.push(chunk));
34
+ proxyRes.on('end', () => {
35
+ const body = injectScript(Buffer.concat(chunks).toString('utf-8'), INJECTED_SCRIPT);
36
+ const buf = Buffer.from(body, 'utf-8');
37
+ const headers = { ...proxyRes.headers };
38
+ delete headers['content-encoding']; // we decoded it
39
+ headers['content-length'] = String(buf.byteLength);
40
+ Object.entries(headers).forEach(([k, v]) => {
41
+ if (v !== undefined)
42
+ res.setHeader(k, v);
43
+ });
44
+ res.statusCode = proxyRes.statusCode ?? 200;
45
+ res.end(buf);
46
+ });
47
+ });
48
+ proxy.on('error', (err, _req, res) => {
49
+ const serverRes = res;
50
+ if (!serverRes.headersSent) {
51
+ serverRes.writeHead(502, { 'content-type': 'text/plain' });
52
+ }
53
+ serverRes.end(`Cartd proxy error: ${err.message}`);
54
+ });
55
+ const server = http.createServer((req, res) => {
56
+ // WebSocket upgrade is handled by the sidecar — skip here
57
+ proxy.web(req, res);
58
+ });
59
+ // Forward WS upgrade to target dev server (HMR, etc.)
60
+ server.on('upgrade', (req, socket, head) => {
61
+ // cartd's own WS is on /inject — don't proxy that
62
+ if (req.url === '/inject')
63
+ return;
64
+ proxy.ws(req, socket, head);
65
+ });
66
+ return server;
67
+ }
68
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc;IAChD,MAAM,GAAG,GAAG,aAAa,MAAM,aAAa,CAAA;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,WAAW,CAAC,CAAA;IACnD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,iBAAiB,CAAC;QACxC,MAAM,EAAE,oBAAoB,UAAU,EAAE;QACxC,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAA;IAEF,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;QAEhD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,0CAA0C;YAC1C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAClD,IAAI,CAAC,KAAK,SAAS;oBAAG,GAA2B,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACnE,CAAC,CAAC,CACD;YAAC,GAA2B,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAA;YACrE,QAAQ,CAAC,IAAI,CAAC,GAA0B,CAAC,CAAA;YACzC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACtB,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAA;YACnF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAEtC,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;YACvC,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAA,CAAC,gBAAgB;YACnD,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YAElD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBACzC,IAAI,CAAC,KAAK,SAAS;oBAAG,GAA2B,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACnE,CAAC,CAAC,CACD;YAAC,GAA2B,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,CACpE;YAAC,GAA2B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,SAAS,GAAG,GAA0B,CAAA;QAC5C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAA;QAC5D,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,0DAA0D;QAC1D,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,sDAAsD;IACtD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACzC,kDAAkD;QAClD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;YAAE,OAAM;QACjC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SearchMatch } from '@ecom-baas/types';
2
+ export interface SearchPayload {
3
+ type: 'text' | 'image' | 'color';
4
+ textContent?: string;
5
+ src?: string;
6
+ computedColor?: string;
7
+ className?: string;
8
+ tagName: string;
9
+ }
10
+ export declare function search(payload: SearchPayload, scanDirs: string[], cwd: string, ignore: string[]): SearchMatch[];
11
+ //# sourceMappingURL=searcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.d.ts","sourceRoot":"","sources":["../../src/searcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAQnD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,MAAM,CACpB,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EAAE,GACf,WAAW,EAAE,CAiBf"}
@@ -0,0 +1,230 @@
1
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, extname } from 'node:path';
3
+ import * as parser from '@babel/parser';
4
+ import _traverse from '@babel/traverse';
5
+ import * as t from '@babel/types';
6
+ const traverse = (_traverse.default ?? _traverse);
7
+ const JSX_EXTS = new Set(['.tsx', '.jsx', '.ts', '.js']);
8
+ const HTML_EXTS = new Set(['.html', '.htm']);
9
+ export function search(payload, scanDirs, cwd, ignore) {
10
+ const files = collectFiles(scanDirs, cwd, ignore);
11
+ const results = [];
12
+ for (const file of files) {
13
+ const ext = extname(file);
14
+ let src;
15
+ try {
16
+ src = readFileSync(file, 'utf-8');
17
+ }
18
+ catch {
19
+ continue;
20
+ }
21
+ if (JSX_EXTS.has(ext)) {
22
+ results.push(...searchJsx(file, src, payload));
23
+ }
24
+ else if (HTML_EXTS.has(ext)) {
25
+ results.push(...searchHtml(file, src, payload));
26
+ }
27
+ }
28
+ return results;
29
+ }
30
+ // ── JSX search ────────────────────────────────────────────────────────
31
+ function searchJsx(file, src, payload) {
32
+ let ast;
33
+ try {
34
+ ast = parser.parse(src, {
35
+ sourceType: 'module',
36
+ plugins: ['jsx', 'typescript', 'decorators-legacy'],
37
+ errorRecovery: true,
38
+ });
39
+ }
40
+ catch {
41
+ return [];
42
+ }
43
+ const matches = [];
44
+ if (payload.type === 'text' && payload.textContent) {
45
+ const needle = payload.textContent.trim();
46
+ traverse(ast, {
47
+ JSXText(path) {
48
+ if (!path.node.loc)
49
+ return;
50
+ const nodeText = path.node.value.trim();
51
+ if (!nodeText || nodeText !== needle)
52
+ return;
53
+ const loc = path.node.loc;
54
+ matches.push({ file, line: loc.start.line, colStart: loc.start.column, colEnd: loc.end.column, tagName: getParentTagName(path) });
55
+ },
56
+ StringLiteral(path) {
57
+ if (!path.node.loc)
58
+ return;
59
+ if (path.node.value.trim() !== needle)
60
+ return;
61
+ const isAttr = isJsxAttrValue(path);
62
+ const isObjProp = t.isObjectProperty(path.parent) && path.parent.value === path.node;
63
+ if (!isAttr && !isObjProp)
64
+ return;
65
+ const loc = path.node.loc;
66
+ const objPropParent = isObjProp ? path.parent : null;
67
+ const tagName = objPropParent
68
+ ? (t.isIdentifier(objPropParent.key) ? objPropParent.key.name : 'prop')
69
+ : getParentTagName(path);
70
+ matches.push({ file, line: loc.start.line, colStart: loc.start.column, colEnd: loc.end.column, tagName });
71
+ },
72
+ });
73
+ }
74
+ if (payload.type === 'image' && payload.src) {
75
+ const imgSrc = payload.src;
76
+ const { srcPath, srcFilename } = normalizeSrc(imgSrc);
77
+ traverse(ast, {
78
+ StringLiteral(path) {
79
+ if (!path.node.loc)
80
+ return;
81
+ const val = path.node.value;
82
+ if (!val)
83
+ return;
84
+ const hit = val === imgSrc ||
85
+ val === srcPath ||
86
+ (srcFilename && (val === srcFilename || val.endsWith('/' + srcFilename) || srcPath.endsWith(val))) ||
87
+ // background-image: 'url(https://...)' — URL appears inside the string
88
+ (imgSrc.length > 20 && val.includes(imgSrc));
89
+ if (!hit)
90
+ return;
91
+ const loc = path.node.loc;
92
+ const parentNode = path.parentPath?.node;
93
+ const isInSrcAttr = t.isJSXAttribute(parentNode) &&
94
+ t.isJSXIdentifier(parentNode.name, { name: 'src' });
95
+ matches.push({ file, line: loc.start.line, colStart: loc.start.column, colEnd: loc.end.column, tagName: isInSrcAttr ? 'img' : 'div' });
96
+ },
97
+ });
98
+ }
99
+ if (payload.type === 'color') {
100
+ // Search for hex color in className string (Tailwind) or inline style value
101
+ const hexMatch = payload.computedColor ? rgbToHex(payload.computedColor) : null;
102
+ traverse(ast, {
103
+ JSXAttribute(path) {
104
+ const name = path.node.name;
105
+ const val = path.node.value;
106
+ if (!path.node.loc)
107
+ return;
108
+ // className / class with Tailwind color class
109
+ if (t.isJSXIdentifier(name, { name: 'className' }) ||
110
+ t.isJSXIdentifier(name, { name: 'class' })) {
111
+ const classes = extractStringValue(val);
112
+ if (classes && payload.className && hasColorClass(classes, payload.className)) {
113
+ const loc = path.node.loc;
114
+ matches.push({ file, line: loc.start.line, colStart: loc.start.column, colEnd: loc.end.column, tagName: payload.tagName });
115
+ }
116
+ }
117
+ // style={{ color: '#hex' }}
118
+ if (t.isJSXIdentifier(name, { name: 'style' }) && hexMatch) {
119
+ const styleStr = path.toString();
120
+ if (styleStr.includes(hexMatch)) {
121
+ const loc = path.node.loc;
122
+ matches.push({ file, line: loc.start.line, colStart: loc.start.column, colEnd: loc.end.column, tagName: payload.tagName });
123
+ }
124
+ }
125
+ },
126
+ });
127
+ }
128
+ return matches;
129
+ }
130
+ // ── HTML search ────────────────────────────────────────────────────────
131
+ function searchHtml(file, src, payload) {
132
+ const matches = [];
133
+ if (payload.type === 'text' && payload.textContent) {
134
+ const lines = src.split('\n');
135
+ lines.forEach((line, i) => {
136
+ if (line.includes(payload.textContent)) {
137
+ matches.push({ file, line: i + 1, colStart: line.indexOf(payload.textContent), colEnd: line.indexOf(payload.textContent) + payload.textContent.length, tagName: payload.tagName });
138
+ }
139
+ });
140
+ }
141
+ return matches;
142
+ }
143
+ // ── File collection ────────────────────────────────────────────────────
144
+ function collectFiles(scanDirs, cwd, ignore) {
145
+ const files = [];
146
+ const ignoreSet = new Set(ignore);
147
+ function walk(dir) {
148
+ let entries;
149
+ try {
150
+ entries = readdirSync(dir);
151
+ }
152
+ catch {
153
+ return;
154
+ }
155
+ for (const entry of entries) {
156
+ if (ignoreSet.has(entry))
157
+ continue;
158
+ const full = join(dir, entry);
159
+ let stat;
160
+ try {
161
+ stat = statSync(full);
162
+ }
163
+ catch {
164
+ continue;
165
+ }
166
+ if (stat.isDirectory()) {
167
+ walk(full);
168
+ }
169
+ else {
170
+ const ext = extname(entry);
171
+ if (JSX_EXTS.has(ext) || HTML_EXTS.has(ext))
172
+ files.push(full);
173
+ }
174
+ }
175
+ }
176
+ for (const dir of scanDirs) {
177
+ walk(join(cwd, dir));
178
+ }
179
+ return files;
180
+ }
181
+ // ── Helpers ───────────────────────────────────────────────────────────
182
+ function getParentTagName(path) {
183
+ let p = path.parentPath;
184
+ while (p) {
185
+ if (t.isJSXOpeningElement(p.node) && t.isJSXIdentifier(p.node.name)) {
186
+ return p.node.name.name.toLowerCase();
187
+ }
188
+ if (t.isJSXElement(p.node)) {
189
+ const opening = p.node.openingElement;
190
+ if (t.isJSXIdentifier(opening.name))
191
+ return opening.name.name.toLowerCase();
192
+ }
193
+ p = p.parentPath;
194
+ }
195
+ return 'unknown';
196
+ }
197
+ function isJsxAttrValue(path) {
198
+ return t.isJSXAttribute(path.parent);
199
+ }
200
+ function extractStringValue(val) {
201
+ if (t.isStringLiteral(val))
202
+ return val.value;
203
+ if (t.isJSXExpressionContainer(val) && t.isStringLiteral(val.expression))
204
+ return val.expression.value;
205
+ return null;
206
+ }
207
+ function hasColorClass(classes, userClassName) {
208
+ const colorPrefixes = ['text-', 'bg-', 'border-', 'fill-', 'stroke-', 'ring-', 'shadow-'];
209
+ const userColorClasses = userClassName.split(/\s+/).filter(c => colorPrefixes.some(p => c.includes(p)));
210
+ return userColorClasses.some(c => classes.includes(c));
211
+ }
212
+ function rgbToHex(rgb) {
213
+ const m = rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
214
+ if (!m)
215
+ return null;
216
+ return '#' + [m[1], m[2], m[3]].map(n => parseInt(n).toString(16).padStart(2, '0')).join('');
217
+ }
218
+ function normalizeSrc(src) {
219
+ try {
220
+ const url = new URL(src);
221
+ const srcPath = url.pathname;
222
+ const srcFilename = srcPath.split('/').pop() ?? '';
223
+ return { srcPath, srcFilename };
224
+ }
225
+ catch {
226
+ const srcFilename = src.split('/').pop() ?? '';
227
+ return { srcPath: src, srcFilename };
228
+ }
229
+ }
230
+ //# sourceMappingURL=searcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../src/searcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Server } from 'node:http';
2
+ import type { CartdConfig } from './config.js';
3
+ export interface SidecarOptions {
4
+ config: CartdConfig;
5
+ cwd: string;
6
+ token: string;
7
+ httpServer: Server;
8
+ onReady?: () => void;
9
+ }
10
+ export declare function startSidecar(opts: SidecarOptions): () => void;
11
+ //# sourceMappingURL=sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../src/sidecar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAIlC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAgD9C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,IAAI,CAwK7D"}