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.
- package/README.md +172 -0
- package/dist/bin/themebooth.d.ts +3 -0
- package/dist/bin/themebooth.d.ts.map +1 -0
- package/dist/bin/themebooth.js +103 -0
- package/dist/bin/themebooth.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +433 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/package.d.ts +2 -0
- package/dist/cli/package.d.ts.map +1 -0
- package/dist/cli/package.js +194 -0
- package/dist/cli/package.js.map +1 -0
- package/dist/cli/preview.d.ts +2 -0
- package/dist/cli/preview.d.ts.map +1 -0
- package/dist/cli/preview.js +93 -0
- package/dist/cli/preview.js.map +1 -0
- package/dist/cli/publish.d.ts +2 -0
- package/dist/cli/publish.d.ts.map +1 -0
- package/dist/cli/publish.js +126 -0
- package/dist/cli/publish.js.map +1 -0
- package/dist/core/manifest.d.ts +44 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +101 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/transpiler.d.ts +13 -0
- package/dist/core/transpiler.d.ts.map +1 -0
- package/dist/core/transpiler.js +139 -0
- package/dist/core/transpiler.js.map +1 -0
- package/dist/core/variables.d.ts +33 -0
- package/dist/core/variables.d.ts.map +1 -0
- package/dist/core/variables.js +155 -0
- package/dist/core/variables.js.map +1 -0
- package/dist/exporters/notepad-plus.d.ts +3 -0
- package/dist/exporters/notepad-plus.d.ts.map +1 -0
- package/dist/exporters/notepad-plus.js +90 -0
- package/dist/exporters/notepad-plus.js.map +1 -0
- package/dist/exporters/vscode.d.ts +11 -0
- package/dist/exporters/vscode.d.ts.map +1 -0
- package/dist/exporters/vscode.js +34 -0
- package/dist/exporters/vscode.js.map +1 -0
- package/dist/exporters/zed.d.ts +12 -0
- package/dist/exporters/zed.d.ts.map +1 -0
- package/dist/exporters/zed.js +48 -0
- package/dist/exporters/zed.js.map +1 -0
- package/dist/preview/renderer.d.ts +3 -0
- package/dist/preview/renderer.d.ts.map +1 -0
- package/dist/preview/renderer.js +257 -0
- package/dist/preview/renderer.js.map +1 -0
- package/dist/preview/server.d.ts +24 -0
- package/dist/preview/server.d.ts.map +1 -0
- package/dist/preview/server.js +166 -0
- package/dist/preview/server.js.map +1 -0
- package/dist/preview/watcher.d.ts +9 -0
- package/dist/preview/watcher.d.ts.map +1 -0
- package/dist/preview/watcher.js +81 -0
- package/dist/preview/watcher.js.map +1 -0
- package/dist/publish/notepad-plus.d.ts +2 -0
- package/dist/publish/notepad-plus.d.ts.map +1 -0
- package/dist/publish/notepad-plus.js +151 -0
- package/dist/publish/notepad-plus.js.map +1 -0
- package/dist/publish/vscode.d.ts +2 -0
- package/dist/publish/vscode.d.ts.map +1 -0
- package/dist/publish/vscode.js +144 -0
- package/dist/publish/vscode.js.map +1 -0
- package/dist/publish/zed.d.ts +2 -0
- package/dist/publish/zed.d.ts.map +1 -0
- package/dist/publish/zed.js +137 -0
- package/dist/publish/zed.js.map +1 -0
- package/dist/templates/presets/dark.json +53 -0
- package/dist/templates/presets/high-contrast.json +54 -0
- package/dist/templates/presets/light.json +53 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +32 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +111 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/schema.d.ts +17 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +80 -0
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/validation.d.ts +59 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +323 -0
- package/dist/utils/validation.js.map +1 -0
- 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
|
+
}
|