@stonedeck/cli 0.7.2 → 0.7.3

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/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { processStoneDeck } from '@stonedeck/core';
3
3
  import { HtmlPlugin } from '@stonedeck/html-plugin';
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
+ import * as http from 'http';
6
7
  import { createRequire } from 'module';
7
8
  const require = createRequire(import.meta.url);
8
9
  const pkg = require('../package.json');
@@ -101,8 +102,10 @@ async function handleExport(args, legacy = false) {
101
102
  }
102
103
  const htmlPlugin = new HtmlPlugin();
103
104
  const offline = !args.includes('--no-offline');
105
+ const portIdx = args.indexOf('--live-reload-port');
106
+ const liveReloadPort = portIdx !== -1 ? parseInt(args[portIdx + 1]) : undefined;
104
107
  console.log(`🌐 Generating HTML: ${path.basename(outputPath)}...`);
105
- await htmlPlugin.generate(ir, outputPath, { offline });
108
+ await htmlPlugin.generate(ir, outputPath, { offline, liveReloadPort });
106
109
  console.log('āœ… Done!');
107
110
  }
108
111
  catch (e) {
@@ -120,6 +123,56 @@ async function handlePreview(args) {
120
123
  const isWatch = args.includes('--watch') || args.includes('-w');
121
124
  // Default preview is always HTML
122
125
  const outputPath = inputPath.replace(/\.md$/, '.preview.html');
126
+ // Live Reload Server State
127
+ let sseClients = [];
128
+ let lrPort = 3000;
129
+ const startLiveReloadServer = async () => {
130
+ return new Promise((resolve) => {
131
+ const server = http.createServer((req, res) => {
132
+ const url = new URL(req.url || '/', `http://localhost:${lrPort}`);
133
+ if (url.pathname === '/live-reload') {
134
+ res.writeHead(200, {
135
+ 'Content-Type': 'text/event-stream',
136
+ 'Cache-Control': 'no-cache',
137
+ 'Connection': 'keep-alive',
138
+ 'Access-Control-Allow-Origin': '*'
139
+ });
140
+ res.write('data: connected\n\n');
141
+ sseClients.push(res);
142
+ req.on('close', () => {
143
+ sseClients = sseClients.filter(c => c !== res);
144
+ });
145
+ }
146
+ else if (url.pathname === '/' || url.pathname === '/index.html') {
147
+ if (fs.existsSync(outputPath)) {
148
+ res.writeHead(200, { 'Content-Type': 'text/html' });
149
+ res.end(fs.readFileSync(outputPath));
150
+ }
151
+ else {
152
+ res.writeHead(404);
153
+ res.end('Preview not generated yet. Please wait...');
154
+ }
155
+ }
156
+ else {
157
+ res.writeHead(404);
158
+ res.end();
159
+ }
160
+ });
161
+ server.on('error', (e) => {
162
+ if (e.code === 'EADDRINUSE') {
163
+ lrPort++;
164
+ server.listen(lrPort);
165
+ }
166
+ });
167
+ server.listen(lrPort, () => {
168
+ resolve(lrPort);
169
+ });
170
+ });
171
+ };
172
+ if (isWatch) {
173
+ lrPort = await startLiveReloadServer();
174
+ console.log(`šŸ“” Live Reload server started on port ${lrPort}`);
175
+ }
123
176
  const run = async () => {
124
177
  try {
125
178
  console.log(`\nšŸ”„ ${isWatch ? 'Updating' : 'Generating'} preview...`);
@@ -127,8 +180,18 @@ async function handlePreview(args) {
127
180
  const exportArgs = [args[0], '--output', outputPath, ...args.filter(a => a !== args[0] && a !== '--watch' && a !== '-w')];
128
181
  if (!exportArgs.includes('--no-offline'))
129
182
  exportArgs.push('--no-offline');
183
+ if (isWatch) {
184
+ exportArgs.push('--live-reload-port', lrPort.toString());
185
+ }
130
186
  await handleExport(exportArgs, false);
131
- console.log(`šŸ‘€ Preview available at: ${outputPath}`);
187
+ // Notify clients
188
+ sseClients.forEach(client => client.write('data: reload\n\n'));
189
+ if (isWatch) {
190
+ console.log(`šŸ‘€ Preview available at: http://localhost:${lrPort}`);
191
+ }
192
+ else {
193
+ console.log(`šŸ‘€ Preview available at: file://${outputPath}`);
194
+ }
132
195
  }
133
196
  catch (e) {
134
197
  const message = e instanceof Error ? e.message : String(e);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stonedeck/cli",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "stonedeck": "./dist/index.js"
@@ -27,4 +27,4 @@
27
27
  "@types/node": "^20.0.0",
28
28
  "tsx": "^4.7.0"
29
29
  }
30
- }
30
+ }
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ import { processStoneDeck } from '@stonedeck/core';
3
3
  import { HtmlPlugin } from '@stonedeck/html-plugin';
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
+ import * as http from 'http';
6
7
  import { createRequire } from 'module';
7
8
 
8
9
  const require = createRequire(import.meta.url);
@@ -115,8 +116,11 @@ async function handleExport(args: string[], legacy = false) {
115
116
  const htmlPlugin = new HtmlPlugin();
116
117
  const offline = !args.includes('--no-offline');
117
118
 
119
+ const portIdx = args.indexOf('--live-reload-port');
120
+ const liveReloadPort = portIdx !== -1 ? parseInt(args[portIdx + 1]!) : undefined;
121
+
118
122
  console.log(`🌐 Generating HTML: ${path.basename(outputPath)}...`);
119
- await htmlPlugin.generate(ir, outputPath, { offline });
123
+ await htmlPlugin.generate(ir, outputPath, { offline, liveReloadPort });
120
124
 
121
125
  console.log('āœ… Done!');
122
126
  } catch (e: unknown) {
@@ -138,15 +142,78 @@ async function handlePreview(args: string[]) {
138
142
  // Default preview is always HTML
139
143
  const outputPath = inputPath.replace(/\.md$/, '.preview.html');
140
144
 
145
+ // Live Reload Server State
146
+ let sseClients: http.ServerResponse[] = [];
147
+ let lrPort = 3000;
148
+
149
+ const startLiveReloadServer = async () => {
150
+ return new Promise<number>((resolve) => {
151
+ const server = http.createServer((req, res) => {
152
+ const url = new URL(req.url || '/', `http://localhost:${lrPort}`);
153
+ if (url.pathname === '/live-reload') {
154
+ res.writeHead(200, {
155
+ 'Content-Type': 'text/event-stream',
156
+ 'Cache-Control': 'no-cache',
157
+ 'Connection': 'keep-alive',
158
+ 'Access-Control-Allow-Origin': '*'
159
+ });
160
+ res.write('data: connected\n\n');
161
+ sseClients.push(res);
162
+ req.on('close', () => {
163
+ sseClients = sseClients.filter(c => c !== res);
164
+ });
165
+ } else if (url.pathname === '/' || url.pathname === '/index.html') {
166
+ if (fs.existsSync(outputPath)) {
167
+ res.writeHead(200, { 'Content-Type': 'text/html' });
168
+ res.end(fs.readFileSync(outputPath));
169
+ } else {
170
+ res.writeHead(404);
171
+ res.end('Preview not generated yet. Please wait...');
172
+ }
173
+ } else {
174
+ res.writeHead(404);
175
+ res.end();
176
+ }
177
+ });
178
+
179
+ server.on('error', (e: any) => {
180
+ if (e.code === 'EADDRINUSE') {
181
+ lrPort++;
182
+ server.listen(lrPort);
183
+ }
184
+ });
185
+
186
+ server.listen(lrPort, () => {
187
+ resolve(lrPort);
188
+ });
189
+ });
190
+ };
191
+
192
+ if (isWatch) {
193
+ lrPort = await startLiveReloadServer();
194
+ console.log(`šŸ“” Live Reload server started on port ${lrPort}`);
195
+ }
196
+
141
197
  const run = async () => {
142
198
  try {
143
199
  console.log(`\nšŸ”„ ${isWatch ? 'Updating' : 'Generating'} preview...`);
144
200
  // Preview defaults to no-offline for speed
145
201
  const exportArgs = [args[0]!, '--output', outputPath, ...args.filter(a => a !== args[0] && a !== '--watch' && a !== '-w')];
146
202
  if (!exportArgs.includes('--no-offline')) exportArgs.push('--no-offline');
203
+ if (isWatch) {
204
+ exportArgs.push('--live-reload-port', lrPort.toString());
205
+ }
147
206
 
148
207
  await handleExport(exportArgs, false);
149
- console.log(`šŸ‘€ Preview available at: ${outputPath}`);
208
+
209
+ // Notify clients
210
+ sseClients.forEach(client => client.write('data: reload\n\n'));
211
+
212
+ if (isWatch) {
213
+ console.log(`šŸ‘€ Preview available at: http://localhost:${lrPort}`);
214
+ } else {
215
+ console.log(`šŸ‘€ Preview available at: file://${outputPath}`);
216
+ }
150
217
  } catch (e: unknown) {
151
218
  const message = e instanceof Error ? e.message : String(e);
152
219
  console.error(`āŒ Preview update failed: ${message}`);