themebooth 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.
Files changed (89) hide show
  1. package/README.md +172 -0
  2. package/dist/bin/themebooth.d.ts +3 -0
  3. package/dist/bin/themebooth.d.ts.map +1 -0
  4. package/dist/bin/themebooth.js +103 -0
  5. package/dist/bin/themebooth.js.map +1 -0
  6. package/dist/cli/init.d.ts +2 -0
  7. package/dist/cli/init.d.ts.map +1 -0
  8. package/dist/cli/init.js +433 -0
  9. package/dist/cli/init.js.map +1 -0
  10. package/dist/cli/package.d.ts +2 -0
  11. package/dist/cli/package.d.ts.map +1 -0
  12. package/dist/cli/package.js +194 -0
  13. package/dist/cli/package.js.map +1 -0
  14. package/dist/cli/preview.d.ts +2 -0
  15. package/dist/cli/preview.d.ts.map +1 -0
  16. package/dist/cli/preview.js +93 -0
  17. package/dist/cli/preview.js.map +1 -0
  18. package/dist/cli/publish.d.ts +2 -0
  19. package/dist/cli/publish.d.ts.map +1 -0
  20. package/dist/cli/publish.js +126 -0
  21. package/dist/cli/publish.js.map +1 -0
  22. package/dist/core/manifest.d.ts +44 -0
  23. package/dist/core/manifest.d.ts.map +1 -0
  24. package/dist/core/manifest.js +101 -0
  25. package/dist/core/manifest.js.map +1 -0
  26. package/dist/core/transpiler.d.ts +13 -0
  27. package/dist/core/transpiler.d.ts.map +1 -0
  28. package/dist/core/transpiler.js +139 -0
  29. package/dist/core/transpiler.js.map +1 -0
  30. package/dist/core/variables.d.ts +33 -0
  31. package/dist/core/variables.d.ts.map +1 -0
  32. package/dist/core/variables.js +155 -0
  33. package/dist/core/variables.js.map +1 -0
  34. package/dist/exporters/notepad-plus.d.ts +3 -0
  35. package/dist/exporters/notepad-plus.d.ts.map +1 -0
  36. package/dist/exporters/notepad-plus.js +90 -0
  37. package/dist/exporters/notepad-plus.js.map +1 -0
  38. package/dist/exporters/vscode.d.ts +11 -0
  39. package/dist/exporters/vscode.d.ts.map +1 -0
  40. package/dist/exporters/vscode.js +34 -0
  41. package/dist/exporters/vscode.js.map +1 -0
  42. package/dist/exporters/zed.d.ts +12 -0
  43. package/dist/exporters/zed.d.ts.map +1 -0
  44. package/dist/exporters/zed.js +48 -0
  45. package/dist/exporters/zed.js.map +1 -0
  46. package/dist/preview/renderer.d.ts +3 -0
  47. package/dist/preview/renderer.d.ts.map +1 -0
  48. package/dist/preview/renderer.js +257 -0
  49. package/dist/preview/renderer.js.map +1 -0
  50. package/dist/preview/server.d.ts +24 -0
  51. package/dist/preview/server.d.ts.map +1 -0
  52. package/dist/preview/server.js +166 -0
  53. package/dist/preview/server.js.map +1 -0
  54. package/dist/preview/watcher.d.ts +9 -0
  55. package/dist/preview/watcher.d.ts.map +1 -0
  56. package/dist/preview/watcher.js +81 -0
  57. package/dist/preview/watcher.js.map +1 -0
  58. package/dist/publish/notepad-plus.d.ts +2 -0
  59. package/dist/publish/notepad-plus.d.ts.map +1 -0
  60. package/dist/publish/notepad-plus.js +151 -0
  61. package/dist/publish/notepad-plus.js.map +1 -0
  62. package/dist/publish/vscode.d.ts +2 -0
  63. package/dist/publish/vscode.d.ts.map +1 -0
  64. package/dist/publish/vscode.js +144 -0
  65. package/dist/publish/vscode.js.map +1 -0
  66. package/dist/publish/zed.d.ts +2 -0
  67. package/dist/publish/zed.d.ts.map +1 -0
  68. package/dist/publish/zed.js +137 -0
  69. package/dist/publish/zed.js.map +1 -0
  70. package/dist/templates/presets/dark.json +53 -0
  71. package/dist/templates/presets/high-contrast.json +54 -0
  72. package/dist/templates/presets/light.json +53 -0
  73. package/dist/utils/logger.d.ts +18 -0
  74. package/dist/utils/logger.d.ts.map +1 -0
  75. package/dist/utils/logger.js +56 -0
  76. package/dist/utils/logger.js.map +1 -0
  77. package/dist/utils/paths.d.ts +32 -0
  78. package/dist/utils/paths.d.ts.map +1 -0
  79. package/dist/utils/paths.js +111 -0
  80. package/dist/utils/paths.js.map +1 -0
  81. package/dist/utils/schema.d.ts +17 -0
  82. package/dist/utils/schema.d.ts.map +1 -0
  83. package/dist/utils/schema.js +80 -0
  84. package/dist/utils/schema.js.map +1 -0
  85. package/dist/utils/validation.d.ts +59 -0
  86. package/dist/utils/validation.d.ts.map +1 -0
  87. package/dist/utils/validation.js +323 -0
  88. package/dist/utils/validation.js.map +1 -0
  89. package/package.json +59 -0
@@ -0,0 +1,59 @@
1
+ import { Manifest } from "../core/manifest";
2
+ export interface ValidationResult {
3
+ isValid: boolean;
4
+ manifest?: Manifest;
5
+ errors: ValidationMessage[];
6
+ warnings: ValidationMessage[];
7
+ }
8
+ export interface ValidationMessage {
9
+ severity: "error" | "warning";
10
+ field: string;
11
+ message: string;
12
+ suggestion?: string;
13
+ line?: number;
14
+ column?: number;
15
+ }
16
+ /**
17
+ * Parse JSON with line/column information on error
18
+ */
19
+ export declare function parseManifestJSON(content: string): {
20
+ success: true;
21
+ data: any;
22
+ } | {
23
+ success: false;
24
+ error: ValidationMessage;
25
+ };
26
+ /**
27
+ * Comprehensive manifest validation including variables
28
+ */
29
+ export declare function validateManifestComprehensive(manifestPath: string): Promise<ValidationResult>;
30
+ /**
31
+ * Validate generated theme file format
32
+ */
33
+ export declare function validateExportedTheme(filePath: string, platform: "vscode" | "zed"): Promise<{
34
+ isValid: boolean;
35
+ error?: string;
36
+ }>;
37
+ /**
38
+ * Validate XML well-formedness for Notepad++
39
+ */
40
+ export declare function validateNotepadPlusPlusXML(filePath: string): Promise<{
41
+ isValid: boolean;
42
+ error?: string;
43
+ }>;
44
+ /**
45
+ * Check if directory already exists and provide guidance
46
+ */
47
+ export declare function checkDirectoryExists(dirPath: string): Promise<{
48
+ exists: boolean;
49
+ isEmpty: boolean;
50
+ }>;
51
+ /**
52
+ * Check if a port is available
53
+ */
54
+ export declare function isPortAvailable(port: number): Promise<boolean>;
55
+ /**
56
+ * Find next available port
57
+ */
58
+ export declare function findAvailablePort(startPort: number, maxAttempts?: number): Promise<number>;
59
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAoB,MAAM,kBAAkB,CAAC;AAG9D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CA+C9H;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4EnG;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GAAG,KAAK,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC/C;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmChH;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAW1G;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAQpG"}
@@ -0,0 +1,323 @@
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.parseManifestJSON = parseManifestJSON;
37
+ exports.validateManifestComprehensive = validateManifestComprehensive;
38
+ exports.validateExportedTheme = validateExportedTheme;
39
+ exports.validateNotepadPlusPlusXML = validateNotepadPlusPlusXML;
40
+ exports.checkDirectoryExists = checkDirectoryExists;
41
+ exports.isPortAvailable = isPortAvailable;
42
+ exports.findAvailablePort = findAvailablePort;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const manifest_1 = require("../core/manifest");
45
+ const variables_1 = require("../core/variables");
46
+ /**
47
+ * Parse JSON with line/column information on error
48
+ */
49
+ function parseManifestJSON(content) {
50
+ try {
51
+ const data = JSON.parse(content);
52
+ return { success: true, data };
53
+ }
54
+ catch (error) {
55
+ if (error instanceof SyntaxError) {
56
+ const lines = content.split("\n");
57
+ let line = 1;
58
+ let column = 1;
59
+ let position = 0;
60
+ // Try to extract line/column from SyntaxError message
61
+ const match = error.message.match(/position (\d+)/);
62
+ if (match) {
63
+ position = parseInt(match[1], 10);
64
+ for (let i = 0; i < position && i < content.length; i++) {
65
+ if (content[i] === "\n") {
66
+ line++;
67
+ column = 1;
68
+ }
69
+ else {
70
+ column++;
71
+ }
72
+ }
73
+ }
74
+ return {
75
+ success: false,
76
+ error: {
77
+ severity: "error",
78
+ field: "manifest.json",
79
+ message: `JSON parsing error: ${error.message}`,
80
+ suggestion: "Check your JSON syntax - common issues: trailing comma, missing quotes, mismatched braces",
81
+ line,
82
+ column,
83
+ },
84
+ };
85
+ }
86
+ return {
87
+ success: false,
88
+ error: {
89
+ severity: "error",
90
+ field: "manifest.json",
91
+ message: `Failed to parse manifest: ${error instanceof Error ? error.message : String(error)}`,
92
+ },
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * Comprehensive manifest validation including variables
98
+ */
99
+ async function validateManifestComprehensive(manifestPath) {
100
+ const errors = [];
101
+ const warnings = [];
102
+ let manifest;
103
+ // Read file
104
+ try {
105
+ const content = await fs.readFile(manifestPath, "utf-8");
106
+ // Parse JSON
107
+ const parseResult = parseManifestJSON(content);
108
+ if (!parseResult.success) {
109
+ errors.push(parseResult.error);
110
+ return { isValid: false, errors, warnings };
111
+ }
112
+ // Validate against schema
113
+ const schemaValidation = (0, manifest_1.validateManifest)(parseResult.data);
114
+ if (!schemaValidation.success) {
115
+ for (const err of schemaValidation.errors) {
116
+ errors.push({
117
+ severity: "error",
118
+ field: err.field,
119
+ message: err.message,
120
+ suggestion: getSuggestionForError(err.field, err.message),
121
+ });
122
+ }
123
+ }
124
+ else {
125
+ manifest = schemaValidation.data;
126
+ // Additional variable validation
127
+ const varErrors = (0, variables_1.validateVariableReferences)(manifest);
128
+ for (const err of varErrors) {
129
+ errors.push({
130
+ severity: "error",
131
+ field: err.location,
132
+ message: err.message,
133
+ suggestion: `Define variable $${err.variable} in the "variables" section`,
134
+ });
135
+ }
136
+ // Check for unused variables (warning)
137
+ const usedVars = new Set();
138
+ for (const color of Object.values(manifest.colors || {})) {
139
+ extractVariableNames(String(color)).forEach((v) => usedVars.add(v));
140
+ }
141
+ for (const token of Object.values(manifest.tokens || {})) {
142
+ for (const val of Object.values(token)) {
143
+ extractVariableNames(String(val)).forEach((v) => usedVars.add(v));
144
+ }
145
+ }
146
+ for (const varName of Object.keys(manifest.variables || {})) {
147
+ if (!usedVars.has(varName)) {
148
+ warnings.push({
149
+ severity: "warning",
150
+ field: `variables.${varName}`,
151
+ message: `Unused variable $${varName}`,
152
+ });
153
+ }
154
+ }
155
+ }
156
+ }
157
+ catch (error) {
158
+ errors.push({
159
+ severity: "error",
160
+ field: "manifest.json",
161
+ message: `Failed to read manifest: ${error instanceof Error ? error.message : String(error)}`,
162
+ });
163
+ }
164
+ return {
165
+ isValid: errors.length === 0,
166
+ manifest,
167
+ errors,
168
+ warnings,
169
+ };
170
+ }
171
+ /**
172
+ * Validate generated theme file format
173
+ */
174
+ async function validateExportedTheme(filePath, platform) {
175
+ try {
176
+ const content = await fs.readFile(filePath, "utf-8");
177
+ const data = JSON.parse(content);
178
+ if (platform === "vscode") {
179
+ // Basic VS Code theme structure check
180
+ if (!data.name || typeof data.name !== "string") {
181
+ return { isValid: false, error: "VS Code theme missing 'name' field" };
182
+ }
183
+ if (!data.colors || typeof data.colors !== "object") {
184
+ return { isValid: false, error: "VS Code theme missing 'colors' object" };
185
+ }
186
+ if (!Array.isArray(data.tokenColors)) {
187
+ return { isValid: false, error: "VS Code theme 'tokenColors' must be an array" };
188
+ }
189
+ }
190
+ else if (platform === "zed") {
191
+ // Basic Zed theme structure check
192
+ if (!data.name || typeof data.name !== "string") {
193
+ return { isValid: false, error: "Zed theme missing 'name' field" };
194
+ }
195
+ if (!data.appearance || !["light", "dark"].includes(data.appearance)) {
196
+ return { isValid: false, error: "Zed theme must have 'appearance' as 'light' or 'dark'" };
197
+ }
198
+ }
199
+ return { isValid: true };
200
+ }
201
+ catch (error) {
202
+ return {
203
+ isValid: false,
204
+ error: `Failed to validate exported theme: ${error instanceof Error ? error.message : String(error)}`,
205
+ };
206
+ }
207
+ }
208
+ /**
209
+ * Validate XML well-formedness for Notepad++
210
+ */
211
+ async function validateNotepadPlusPlusXML(filePath) {
212
+ try {
213
+ const content = await fs.readFile(filePath, "utf-8");
214
+ // Check for required Notepad++ elements
215
+ if (!content.includes("<NotepadPlus>") || !content.includes("</NotepadPlus>")) {
216
+ return { isValid: false, error: "Missing <NotepadPlus> root element" };
217
+ }
218
+ // Check XML declaration
219
+ if (!content.includes("<?xml")) {
220
+ return { isValid: false, error: "Missing XML declaration" };
221
+ }
222
+ // Basic bracket matching
223
+ let bracketDepth = 0;
224
+ for (const char of content) {
225
+ if (char === "<")
226
+ bracketDepth++;
227
+ if (char === ">")
228
+ bracketDepth--;
229
+ if (bracketDepth < 0) {
230
+ return { isValid: false, error: "Mismatched XML brackets" };
231
+ }
232
+ }
233
+ if (bracketDepth !== 0) {
234
+ return { isValid: false, error: "Unclosed XML tags" };
235
+ }
236
+ return { isValid: true };
237
+ }
238
+ catch (error) {
239
+ return {
240
+ isValid: false,
241
+ error: `Failed to validate Notepad++ XML: ${error instanceof Error ? error.message : String(error)}`,
242
+ };
243
+ }
244
+ }
245
+ /**
246
+ * Check if directory already exists and provide guidance
247
+ */
248
+ async function checkDirectoryExists(dirPath) {
249
+ try {
250
+ const stat = await fs.stat(dirPath);
251
+ if (stat.isDirectory()) {
252
+ const files = await fs.readdir(dirPath);
253
+ return { exists: true, isEmpty: files.length === 0 };
254
+ }
255
+ return { exists: false, isEmpty: false };
256
+ }
257
+ catch {
258
+ return { exists: false, isEmpty: false };
259
+ }
260
+ }
261
+ /**
262
+ * Check if a port is available
263
+ */
264
+ async function isPortAvailable(port) {
265
+ return new Promise((resolve) => {
266
+ const server = require("net").createServer();
267
+ server.once("error", () => {
268
+ resolve(false);
269
+ });
270
+ server.once("listening", () => {
271
+ server.close();
272
+ resolve(true);
273
+ });
274
+ server.listen(port, "localhost");
275
+ });
276
+ }
277
+ /**
278
+ * Find next available port
279
+ */
280
+ async function findAvailablePort(startPort, maxAttempts = 10) {
281
+ for (let i = 0; i < maxAttempts; i++) {
282
+ const port = startPort + i;
283
+ if (await isPortAvailable(port)) {
284
+ return port;
285
+ }
286
+ }
287
+ throw new Error(`Could not find available port after ${maxAttempts} attempts starting from ${startPort}`);
288
+ }
289
+ // Helper functions
290
+ function extractVariableNames(value) {
291
+ const names = [];
292
+ const regex = /\$(\w+)/g;
293
+ let match;
294
+ while ((match = regex.exec(value)) !== null) {
295
+ names.push(match[1]);
296
+ }
297
+ return names;
298
+ }
299
+ function getSuggestionForError(field, message) {
300
+ if (field === "name") {
301
+ return "Provide a descriptive theme name (e.g., 'My Dark Theme')";
302
+ }
303
+ if (field === "author") {
304
+ return "Add your name or organization as the author";
305
+ }
306
+ if (field === "version") {
307
+ return "Use semantic versioning format: MAJOR.MINOR.PATCH (e.g., 1.0.0)";
308
+ }
309
+ if (message.includes("hex color")) {
310
+ return "Use hex color format: #RRGGBB (6 digits) or #RGB (3 digits) or $variableName";
311
+ }
312
+ if (message.includes("token properties")) {
313
+ return "Valid token properties: foreground, background, fontStyle, fontWeight, opacity";
314
+ }
315
+ if (message.includes("Circular")) {
316
+ return "Check your variable definitions - they form a circular reference chain";
317
+ }
318
+ if (message.includes("Undefined")) {
319
+ return "Define the variable in the 'variables' section before using it";
320
+ }
321
+ return undefined;
322
+ }
323
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "themebooth",
3
+ "version": "0.1.0",
4
+ "description": "Create syntax themes once, publish to VS Code, Notepad++, and Zed",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "themebooth": "dist/bin/themebooth.js"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/kittender/themebooth.git"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "homepage": "https://github.com/kittender/themebooth",
17
+ "bugs": {
18
+ "url": "https://github.com/kittender/themebooth/issues"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc && mkdir -p dist/templates/presets && cp -r src/templates/presets/*.json dist/templates/presets/",
22
+ "test": "node test.js",
23
+ "dev": "tsc --watch",
24
+ "prepublishOnly": "npm run build && npm run test",
25
+ "postinstall": "node -e \"console.log('\\n✅ themebooth installed! Run: themebooth init my-theme\\n')\""
26
+ },
27
+ "keywords": [
28
+ "syntax",
29
+ "highlighting",
30
+ "highlight",
31
+ "theme",
32
+ "develop",
33
+ "grammar",
34
+ "code",
35
+ "colors",
36
+ "color"
37
+ ],
38
+ "author": "Melina Donati ☆ =^._.^= ∫",
39
+ "license": "MIT",
40
+ "dependencies": {
41
+ "chalk": "^5.3.0",
42
+ "chokidar": "^3.5.3",
43
+ "color": "^4.2.3",
44
+ "commander": "^11.1.0",
45
+ "express": "^4.18.2",
46
+ "ws": "^8.14.2",
47
+ "zod": "^3.22.4"
48
+ },
49
+ "devDependencies": {
50
+ "@types/color": "^3.0.6",
51
+ "@types/express": "^4.17.21",
52
+ "@types/jest": "^30.0.0",
53
+ "@types/node": "^20.10.6",
54
+ "@types/ws": "^8.18.1",
55
+ "jest": "^30.3.0",
56
+ "ts-jest": "^29.4.9",
57
+ "typescript": "^5.3.3"
58
+ }
59
+ }