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 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/preview/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ interface PreviewServerOptions {
2
+ manifestPath: string;
3
+ previewPath: string;
4
+ themeName: string;
5
+ port?: number;
6
+ }
7
+ export declare class PreviewServer {
8
+ private app;
9
+ private server;
10
+ private wss;
11
+ private watcher;
12
+ private options;
13
+ private currentPort;
14
+ constructor(options: PreviewServerOptions);
15
+ private setupExpress;
16
+ private setupWatcher;
17
+ private broadcastReload;
18
+ private setupWebSocket;
19
+ start(): Promise<number>;
20
+ stop(): Promise<void>;
21
+ getPort(): number;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/preview/server.ts"],"names":[],"mappings":"AASA,UAAU,oBAAoB;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,oBAAoB;IAUzC,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,cAAc;IAWhB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAuCxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B,OAAO,IAAI,MAAM;CAGlB"}
@@ -0,0 +1,166 @@
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.PreviewServer = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const ws_1 = require("ws");
9
+ const watcher_1 = require("./watcher");
10
+ const renderer_1 = require("./renderer");
11
+ const logger_1 = require("../utils/logger");
12
+ const paths_1 = require("../utils/paths");
13
+ const manifest_1 = require("../core/manifest");
14
+ class PreviewServer {
15
+ constructor(options) {
16
+ this.server = null;
17
+ this.wss = null;
18
+ this.options = options;
19
+ this.currentPort = options.port || 5173;
20
+ this.app = (0, express_1.default)();
21
+ this.watcher = new watcher_1.FileWatcher();
22
+ this.setupExpress();
23
+ this.setupWatcher();
24
+ }
25
+ setupExpress() {
26
+ this.app.use(express_1.default.static("public", { fallthrough: true }));
27
+ this.app.get("/", async (_req, res) => {
28
+ try {
29
+ const manifestExists_ = await (0, paths_1.manifestExists)(this.options.manifestPath);
30
+ if (!manifestExists_) {
31
+ res.status(404).send("manifest.json not found");
32
+ return;
33
+ }
34
+ const manifestData = await (0, paths_1.readManifest)(this.options.manifestPath);
35
+ const validation = (0, manifest_1.validateManifest)(manifestData);
36
+ if (!validation.success) {
37
+ const errorHtml = `<!DOCTYPE html>
38
+ <html>
39
+ <head>
40
+ <title>Theme Preview Error</title>
41
+ <style>
42
+ body { background-color: #1e1e1e; color: #d4d4d4; font-family: monospace; padding: 20px; }
43
+ .error { background-color: #6f1f1f; color: #c46e6e; padding: 15px; border-radius: 4px; }
44
+ h1 { color: #ff6b6b; margin-bottom: 15px; }
45
+ </style>
46
+ </head>
47
+ <body>
48
+ <h1>āš ļø Manifest Validation Error</h1>
49
+ <div class="error">
50
+ <p><strong>Fix the errors below and save manifest.json to reload:</strong></p>
51
+ <pre>${validation.errors
52
+ .map((e) => `${e.field}: ${e.message}`)
53
+ .join("\n")}</pre>
54
+ </div>
55
+ <script>
56
+ const ws = new WebSocket(\`ws://\${window.location.host}/ws\`);
57
+ ws.addEventListener('message', () => window.location.reload());
58
+ </script>
59
+ </body>
60
+ </html>`;
61
+ res.setHeader("Content-Type", "text/html");
62
+ res.send(errorHtml);
63
+ return;
64
+ }
65
+ const manifest = validation.data;
66
+ const html = (0, renderer_1.renderPreview)(manifest, this.options.themeName);
67
+ res.setHeader("Content-Type", "text/html");
68
+ res.send(html);
69
+ }
70
+ catch (error) {
71
+ res.status(500).send(`Error rendering preview: ${error instanceof Error ? error.message : String(error)}`);
72
+ }
73
+ });
74
+ }
75
+ setupWatcher() {
76
+ this.watcher.on("change", () => {
77
+ logger_1.logger.debug("Manifest changed, notifying clients...");
78
+ this.broadcastReload();
79
+ });
80
+ this.watcher.on("error", (error) => {
81
+ logger_1.logger.error(`Watcher error: ${error instanceof Error ? error.message : String(error)}`);
82
+ });
83
+ }
84
+ broadcastReload() {
85
+ if (this.wss) {
86
+ this.wss.clients.forEach((client) => {
87
+ if (client.readyState === ws_1.WebSocket.OPEN) {
88
+ client.send("reload");
89
+ }
90
+ });
91
+ }
92
+ }
93
+ setupWebSocket() {
94
+ this.wss = new ws_1.WebSocketServer({ server: this.server });
95
+ this.wss.on("connection", (ws) => {
96
+ logger_1.logger.debug("WebSocket client connected");
97
+ ws.on("error", (error) => {
98
+ logger_1.logger.debug(`WebSocket error: ${error.message}`);
99
+ });
100
+ });
101
+ }
102
+ async start() {
103
+ return new Promise((resolve, reject) => {
104
+ const maxAttempts = 10;
105
+ let attempts = 0;
106
+ const tryPort = (port) => {
107
+ if (attempts >= maxAttempts) {
108
+ reject(new Error(`Could not find available port after ${maxAttempts} attempts (tried ports ${this.currentPort}-${port - 1})`));
109
+ return;
110
+ }
111
+ attempts++;
112
+ this.server = this.app.listen(port, () => {
113
+ this.currentPort = port;
114
+ this.setupWebSocket();
115
+ this.watcher.watch(this.options.manifestPath);
116
+ if (port !== this.options.port) {
117
+ logger_1.logger.info(`Port ${this.options.port || 5173} in use, using port ${port} instead`);
118
+ }
119
+ logger_1.logger.success(`Preview server running at http://localhost:${port}`);
120
+ logger_1.logger.info(`Watching for changes in: ${this.options.manifestPath}`);
121
+ resolve(port);
122
+ });
123
+ this.server.on("error", (error) => {
124
+ if (error.code === "EADDRINUSE") {
125
+ logger_1.logger.debug(`Port ${port} in use, trying ${port + 1}`);
126
+ tryPort(port + 1);
127
+ }
128
+ else {
129
+ reject(error);
130
+ }
131
+ });
132
+ };
133
+ tryPort(this.currentPort);
134
+ });
135
+ }
136
+ async stop() {
137
+ return new Promise((resolve, reject) => {
138
+ this.watcher.close();
139
+ if (this.wss) {
140
+ this.wss.close(() => {
141
+ if (this.server) {
142
+ this.server.close(() => {
143
+ resolve();
144
+ });
145
+ }
146
+ else {
147
+ resolve();
148
+ }
149
+ });
150
+ }
151
+ else if (this.server) {
152
+ this.server.close(() => {
153
+ resolve();
154
+ });
155
+ }
156
+ else {
157
+ resolve();
158
+ }
159
+ });
160
+ }
161
+ getPort() {
162
+ return this.currentPort;
163
+ }
164
+ }
165
+ exports.PreviewServer = PreviewServer;
166
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/preview/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { EventEmitter } from "events";
2
+ export declare class FileWatcher extends EventEmitter {
3
+ private watcher;
4
+ private debounceTimer;
5
+ private readonly debounceMs;
6
+ watch(filePath: string): void;
7
+ close(): void;
8
+ }
9
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/preview/watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;IAElC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA2B7B,KAAK,IAAI,IAAI;CAQd"}
@@ -0,0 +1,81 @@
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.FileWatcher = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const events_1 = require("events");
39
+ const logger_1 = require("../utils/logger");
40
+ class FileWatcher extends events_1.EventEmitter {
41
+ constructor() {
42
+ super(...arguments);
43
+ this.watcher = null;
44
+ this.debounceTimer = null;
45
+ this.debounceMs = 150;
46
+ }
47
+ watch(filePath) {
48
+ if (this.watcher) {
49
+ this.watcher.close();
50
+ }
51
+ try {
52
+ this.watcher = fs.watch(filePath, (eventType) => {
53
+ if (eventType === "change") {
54
+ // Debounce rapid changes
55
+ if (this.debounceTimer) {
56
+ clearTimeout(this.debounceTimer);
57
+ }
58
+ this.debounceTimer = setTimeout(() => {
59
+ logger_1.logger.debug(`Manifest changed: ${filePath}`);
60
+ this.emit("change");
61
+ }, this.debounceMs);
62
+ }
63
+ });
64
+ logger_1.logger.debug(`Watching for changes: ${filePath}`);
65
+ }
66
+ catch (error) {
67
+ logger_1.logger.error(`Failed to watch file: ${error instanceof Error ? error.message : String(error)}`);
68
+ this.emit("error", error);
69
+ }
70
+ }
71
+ close() {
72
+ if (this.debounceTimer) {
73
+ clearTimeout(this.debounceTimer);
74
+ }
75
+ if (this.watcher) {
76
+ this.watcher.close();
77
+ }
78
+ }
79
+ }
80
+ exports.FileWatcher = FileWatcher;
81
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/preview/watcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,mCAAsC;AACtC,4CAAyC;AAEzC,MAAa,WAAY,SAAQ,qBAAY;IAA7C;;QACU,YAAO,GAAwB,IAAI,CAAC;QACpC,kBAAa,GAA0B,IAAI,CAAC;QACnC,eAAU,GAAG,GAAG,CAAC;IAqCpC,CAAC;IAnCC,KAAK,CAAC,QAAgB;QACpB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE;gBAC9C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,yBAAyB;oBACzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBACnC,CAAC;oBAED,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;wBACnC,eAAM,CAAC,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;wBAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACtB,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,eAAM,CAAC,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAxCD,kCAwCC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleNotepadPublish(themePackagePath: string, themeName: string, manifest: any): Promise<void>;
2
+ //# sourceMappingURL=notepad-plus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notepad-plus.d.ts","sourceRoot":"","sources":["../../src/publish/notepad-plus.ts"],"names":[],"mappings":"AAoDA,wBAAsB,oBAAoB,CACxC,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,GAAG,GACZ,OAAO,CAAC,IAAI,CAAC,CAmFf"}
@@ -0,0 +1,151 @@
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.handleNotepadPublish = handleNotepadPublish;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const logger_1 = require("../utils/logger");
40
+ function generateSubmissionChecklist(guide) {
41
+ const { xmlPath, themeName, author } = guide;
42
+ const fileName = path.basename(xmlPath);
43
+ return `
44
+ # Notepad++ Theme Submission Checklist
45
+
46
+ ## Pre-Submission
47
+ - [ ] Theme tested in Notepad++ (latest version)
48
+ - [ ] XML file is well-formed (no parsing errors)
49
+ - [ ] All color codes are valid hex format
50
+ - [ ] Theme name is unique and descriptive
51
+ - [ ] Author name is included in XML
52
+
53
+ ## GitHub Fork & PR Setup
54
+ - [ ] Forked https://github.com/notepad-plus-plus/nppPluginList
55
+ - [ ] Created new branch: \`add-${themeName.toLowerCase()}\`
56
+ - [ ] Copied ${fileName} to \`plugins/xml/\`
57
+ - [ ] Updated \`plugins/plugin.md\` with:
58
+ * Theme name and description
59
+ * Author: ${author}
60
+ * Download link (if applicable)
61
+ * Installation instructions
62
+
63
+ ## Pull Request
64
+ - [ ] PR title: "Add ${themeName} theme"
65
+ - [ ] PR description includes theme preview/screenshot
66
+ - [ ] Links to any external resources (blog post, etc.)
67
+ - [ ] Ready for review
68
+
69
+ ## Post-Submission
70
+ - [ ] Awaiting reviewer feedback
71
+ - [ ] Addressed any requested changes
72
+ - [ ] Theme merged and available in Plugin Manager
73
+
74
+ ## File Details
75
+ - **Location:** ${path.relative(process.cwd(), xmlPath)}
76
+ - **Size:** Check file is not empty
77
+ - **Format:** Valid Notepad++ XML UDL (User Defined Language)
78
+ `;
79
+ }
80
+ async function handleNotepadPublish(themePackagePath, themeName, manifest) {
81
+ logger_1.logger.title("Notepad++ Theme Submission Guide");
82
+ logger_1.logger.info("");
83
+ // Find XML file
84
+ const xmlFile = path.join(themePackagePath, `${themeName}.xml`);
85
+ try {
86
+ await fs.access(xmlFile);
87
+ }
88
+ catch {
89
+ throw new Error(`Notepad++ XML file not found: ${xmlFile}`);
90
+ }
91
+ // Validate XML
92
+ const xmlContent = await fs.readFile(xmlFile, "utf-8");
93
+ if (!xmlContent.includes("<NotepadPlus") && !xmlContent.includes("<UserLang")) {
94
+ throw new Error("Invalid Notepad++ XML format");
95
+ }
96
+ logger_1.logger.info("šŸ“ Notepad++ Plugin Manager Submission");
97
+ logger_1.logger.info("");
98
+ logger_1.logger.info("Unlike VS Code and Zed, Notepad++ themes are submitted via GitHub PR");
99
+ logger_1.logger.info("to the nppPluginList repository. This is a semi-manual process.\n");
100
+ // Display step-by-step instructions
101
+ logger_1.logger.info("STEP 1: Create GitHub Account");
102
+ logger_1.logger.info(" → Go to: https://github.com/notepad-plus-plus/nppPluginList");
103
+ logger_1.logger.info(" → Fork the repository to your GitHub account");
104
+ logger_1.logger.info("");
105
+ logger_1.logger.info("STEP 2: Clone & Create Branch");
106
+ logger_1.logger.info(" $ git clone https://github.com/YOUR_USERNAME/nppPluginList.git");
107
+ logger_1.logger.info(" $ cd nppPluginList");
108
+ logger_1.logger.info(` $ git checkout -b add-${themeName.toLowerCase()}`);
109
+ logger_1.logger.info("");
110
+ logger_1.logger.info("STEP 3: Add Theme File");
111
+ logger_1.logger.info(" Create directory if needed: plugins/xml/");
112
+ logger_1.logger.info(` $ cp ${path.relative(process.cwd(), xmlFile)} plugins/xml/`);
113
+ logger_1.logger.info("");
114
+ logger_1.logger.info("STEP 4: Update Plugin Registry");
115
+ logger_1.logger.info(" → Open: plugins/plugin.md");
116
+ logger_1.logger.info(" → Add your theme entry with:");
117
+ logger_1.logger.info(` - name: ${themeName}`);
118
+ logger_1.logger.info(` - author: ${manifest.author || "Your Name"}`);
119
+ logger_1.logger.info(` - version: ${manifest.version || "1.0.0"}`);
120
+ logger_1.logger.info(` - description: ${manifest.description || "A custom syntax theme"}`);
121
+ logger_1.logger.info("");
122
+ logger_1.logger.info("STEP 5: Commit & Push");
123
+ logger_1.logger.info(` $ git add plugins/xml/${themeName}.xml plugins/plugin.md`);
124
+ logger_1.logger.info(` $ git commit -m "Add ${themeName} theme"`);
125
+ logger_1.logger.info(" $ git push origin " + `add-${themeName.toLowerCase()}`);
126
+ logger_1.logger.info("");
127
+ logger_1.logger.info("STEP 6: Create Pull Request");
128
+ logger_1.logger.info(" → Go to: https://github.com/notepad-plus-plus/nppPluginList");
129
+ logger_1.logger.info(" → Click: 'Create Pull Request'");
130
+ logger_1.logger.info(` → Title: "Add ${themeName} theme"`);
131
+ logger_1.logger.info(" → Description: Include theme preview, features, and author credit");
132
+ logger_1.logger.info("");
133
+ logger_1.logger.info("Theme File Location:");
134
+ logger_1.logger.info(` ${path.relative(process.cwd(), xmlFile)}`);
135
+ logger_1.logger.info("");
136
+ // Generate and show checklist
137
+ const checklist = generateSubmissionChecklist({
138
+ xmlPath: xmlFile,
139
+ themeName,
140
+ author: manifest.author || "Unknown",
141
+ });
142
+ logger_1.logger.info("šŸ“‹ Submission Checklist:");
143
+ logger_1.logger.info(checklist);
144
+ logger_1.logger.info("šŸ”— Helpful Links:");
145
+ logger_1.logger.info(" Plugin Registry: https://github.com/notepad-plus-plus/nppPluginList");
146
+ logger_1.logger.info(" Notepad++ UDL Guide: https://notepad-plus-plus.org/docs/user-defined-language/");
147
+ logger_1.logger.info(" XML Format Reference: https://notepad-plus-plus.org/docs/plugins/plugin-admin/");
148
+ logger_1.logger.info("");
149
+ logger_1.logger.success("āœ“ Ready for manual submission!");
150
+ }
151
+ //# sourceMappingURL=notepad-plus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notepad-plus.js","sourceRoot":"","sources":["../../src/publish/notepad-plus.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,oDAuFC;AA3ID,gDAAkC;AAClC,2CAA6B;AAC7B,4CAAyC;AAQzC,SAAS,2BAA2B,CAAC,KAA6B;IAChE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO;;;;;;;;;;;;kCAYyB,SAAS,CAAC,WAAW,EAAE;eAC1C,QAAQ;;;cAGT,MAAM;;;;;uBAKG,SAAS;;;;;;;;;;;kBAWd,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC;;;CAGtD,CAAC;AACF,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,gBAAwB,EACxB,SAAiB,EACjB,QAAa;IAEb,eAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,gBAAgB;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,SAAS,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,eAAe;IACf,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,eAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,eAAM,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACpF,eAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAEjF,oCAAoC;IACpC,eAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7C,eAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC7E,eAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC9D,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7C,eAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAChF,eAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,eAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClE,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtC,eAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC1D,eAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5E,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9C,eAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC3C,eAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9C,eAAM,CAAC,IAAI,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;IACzC,eAAM,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;IAChE,eAAM,CAAC,IAAI,CAAC,mBAAmB,QAAQ,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;IAC9D,eAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,WAAW,IAAI,uBAAuB,EAAE,CAAC,CAAC;IACtF,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,eAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,wBAAwB,CAAC,CAAC;IAC1E,eAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,SAAS,CAAC,CAAC;IAC1D,eAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,OAAO,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvE,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC3C,eAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC7E,eAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,eAAM,CAAC,IAAI,CAAC,mBAAmB,SAAS,SAAS,CAAC,CAAC;IACnD,eAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACnF,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,eAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,8BAA8B;IAC9B,MAAM,SAAS,GAAG,2BAA2B,CAAC;QAC5C,OAAO,EAAE,OAAO;QAChB,SAAS;QACT,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,SAAS;KACrC,CAAC,CAAC;IAEH,eAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvB,eAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACjC,eAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACrF,eAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IAChG,eAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IAChG,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhB,eAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function handleVSCodePublish(themePackagePath: string, themeName: string): Promise<void>;
2
+ //# sourceMappingURL=vscode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.d.ts","sourceRoot":"","sources":["../../src/publish/vscode.ts"],"names":[],"mappings":"AA0EA,wBAAsB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDpG"}
@@ -0,0 +1,144 @@
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.handleVSCodePublish = handleVSCodePublish;
37
+ const child_process_1 = require("child_process");
38
+ const fs = __importStar(require("fs/promises"));
39
+ const path = __importStar(require("path"));
40
+ const readline = __importStar(require("readline"));
41
+ const logger_1 = require("../utils/logger");
42
+ async function promptForToken() {
43
+ const rl = readline.createInterface({
44
+ input: process.stdin,
45
+ output: process.stdout,
46
+ });
47
+ return new Promise((resolve) => {
48
+ rl.question("\nšŸ”‘ Enter your VS Code Personal Access Token (hidden): ", (token) => {
49
+ rl.close();
50
+ resolve(token.trim());
51
+ });
52
+ });
53
+ }
54
+ function checkVsceInstalled() {
55
+ try {
56
+ (0, child_process_1.execSync)("vsce --version", { stdio: "pipe" });
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ async function publishToVSCode(themePath, themeName, token) {
64
+ try {
65
+ logger_1.logger.info("šŸ“¦ Running vsce publish...");
66
+ const output = (0, child_process_1.execSync)(`vsce publish --token "${token}" --packagePath "${themePath}"`, {
67
+ cwd: path.dirname(themePath),
68
+ encoding: "utf-8",
69
+ });
70
+ logger_1.logger.success("āœ“ Published to VS Code Marketplace!");
71
+ const versionMatch = output.match(/(\d+\.\d+\.\d+)/);
72
+ const version = versionMatch ? versionMatch[1] : "1.0.0";
73
+ const publisherMatch = output.match(/Successfully published '([^']+)'/);
74
+ const publisherName = publisherMatch ? publisherMatch[1] : themeName;
75
+ const url = `https://marketplace.visualstudio.com/items?itemName=${publisherName}`;
76
+ return {
77
+ success: true,
78
+ publisherName,
79
+ version,
80
+ url,
81
+ };
82
+ }
83
+ catch (error) {
84
+ const errorMsg = error.stdout || error.message;
85
+ if (errorMsg.includes("Invalid Personal Access Token")) {
86
+ throw new Error("Invalid Personal Access Token. Check credentials and try again.");
87
+ }
88
+ if (errorMsg.includes("already published")) {
89
+ throw new Error("Version already published. Increment version in manifest or package.json");
90
+ }
91
+ throw new Error(`vsce publish failed: ${errorMsg}`);
92
+ }
93
+ }
94
+ async function handleVSCodePublish(themePackagePath, themeName) {
95
+ logger_1.logger.title("VS Code Marketplace Publishing");
96
+ logger_1.logger.info("");
97
+ // Check vsce installed
98
+ if (!checkVsceInstalled()) {
99
+ logger_1.logger.error("vsce not found. Install with:");
100
+ logger_1.logger.info(" npm install -g @vscode/vsce");
101
+ logger_1.logger.info("");
102
+ logger_1.logger.info("Or follow: https://github.com/microsoft/vscode-vsce#installation");
103
+ throw new Error("vsce CLI not installed");
104
+ }
105
+ // Check publisher name in package.json
106
+ try {
107
+ const packageJsonPath = path.join(process.cwd(), "package.json");
108
+ const pkg = JSON.parse(await fs.readFile(packageJsonPath, "utf-8"));
109
+ if (!pkg.publisher) {
110
+ logger_1.logger.warn("⚠ No publisher field in package.json");
111
+ logger_1.logger.info("Add to package.json:");
112
+ logger_1.logger.info(' "publisher": "your-publisher-name"');
113
+ throw new Error("Publisher not configured");
114
+ }
115
+ }
116
+ catch (error) {
117
+ if (error.message === "Publisher not configured")
118
+ throw error;
119
+ logger_1.logger.warn("Could not read package.json, continuing...");
120
+ }
121
+ // Find theme.json file
122
+ const themeFile = path.join(themePackagePath, `${themeName}.json`);
123
+ try {
124
+ await fs.access(themeFile);
125
+ }
126
+ catch {
127
+ throw new Error(`Theme file not found: ${themeFile}`);
128
+ }
129
+ logger_1.logger.info("ℹ About to publish to VS Code Marketplace");
130
+ logger_1.logger.info(` Theme: ${themeName}`);
131
+ logger_1.logger.info(` File: ${themeFile}`);
132
+ logger_1.logger.info("");
133
+ // Get token
134
+ const token = await promptForToken();
135
+ if (!token) {
136
+ throw new Error("Token required to publish");
137
+ }
138
+ // Publish
139
+ const result = await publishToVSCode(themeFile, themeName, token);
140
+ logger_1.logger.success("");
141
+ logger_1.logger.success(`Marketplace URL: ${result.url}`);
142
+ logger_1.logger.success(`Published version: ${result.version}`);
143
+ }
144
+ //# sourceMappingURL=vscode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../src/publish/vscode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function handleZedPublish(themePackagePath: string, themeName: string, manifest: any): Promise<void>;
2
+ //# sourceMappingURL=zed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zed.d.ts","sourceRoot":"","sources":["../../src/publish/zed.ts"],"names":[],"mappings":"AAgFA,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,GAAG,GACZ,OAAO,CAAC,IAAI,CAAC,CA8Cf"}