@linktr.ee/linkapp 0.0.21 → 0.0.23

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 (115) hide show
  1. package/dev-server/README.md +5 -5
  2. package/dev-server/components/SettingsPreview.tsx +330 -0
  3. package/dev-server/components/ui/dialog.tsx +6 -3
  4. package/dev-server/env.d.ts +8 -0
  5. package/dev-server/featured/main.tsx +48 -43
  6. package/dev-server/featured.html +21 -35
  7. package/dev-server/index.html +8 -1
  8. package/dev-server/lib/utils.ts +6 -0
  9. package/dev-server/package-lock.json +245 -287
  10. package/dev-server/package.json +7 -4
  11. package/dev-server/postcss/tailwind-source-fallback.js +94 -0
  12. package/dev-server/postcss.config.mjs +30 -0
  13. package/dev-server/preview/Preview.tsx +182 -381
  14. package/dev-server/preview/preview.css +22 -34
  15. package/dev-server/public/apple-touch-icon.png +0 -0
  16. package/dev-server/public/favicon-96x96.png +0 -0
  17. package/dev-server/public/favicon.ico +0 -0
  18. package/dev-server/public/favicon.svg +6 -0
  19. package/dev-server/public/site.webmanifest +21 -0
  20. package/dev-server/public/web-app-manifest-192x192.png +0 -0
  21. package/dev-server/public/web-app-manifest-512x512.png +0 -0
  22. package/dev-server/rsbuild.config.ts +45 -0
  23. package/dev-server/shared/theme-presets.ts +315 -0
  24. package/dev-server/shared/theme-utils.ts +38 -0
  25. package/dev-server/sheet/main.tsx +44 -0
  26. package/dev-server/sheet.html +56 -0
  27. package/dist/commands/add.d.ts.map +1 -1
  28. package/dist/commands/add.js +20 -12
  29. package/dist/commands/add.js.map +1 -1
  30. package/dist/commands/build.d.ts.map +1 -1
  31. package/dist/commands/build.js +55 -36
  32. package/dist/commands/build.js.map +1 -1
  33. package/dist/commands/deploy.d.ts.map +1 -1
  34. package/dist/commands/deploy.js +74 -59
  35. package/dist/commands/deploy.js.map +1 -1
  36. package/dist/commands/dev.d.ts.map +1 -1
  37. package/dist/commands/dev.js +564 -43
  38. package/dist/commands/dev.js.map +1 -1
  39. package/dist/commands/login.d.ts.map +1 -1
  40. package/dist/commands/login.js +19 -9
  41. package/dist/commands/login.js.map +1 -1
  42. package/dist/commands/logout.d.ts.map +1 -1
  43. package/dist/commands/logout.js +9 -4
  44. package/dist/commands/logout.js.map +1 -1
  45. package/dist/commands/test-url-match-rules.d.ts.map +1 -1
  46. package/dist/commands/test-url-match-rules.js +24 -13
  47. package/dist/commands/test-url-match-rules.js.map +1 -1
  48. package/dist/components/index.d.ts +0 -1
  49. package/dist/components/index.d.ts.map +1 -1
  50. package/dist/components/index.js +2 -1
  51. package/dist/components/index.js.map +1 -1
  52. package/dist/lib/auth/device-flow.d.ts +1 -6
  53. package/dist/lib/auth/device-flow.d.ts.map +1 -1
  54. package/dist/lib/auth/device-flow.js +3 -9
  55. package/dist/lib/auth/device-flow.js.map +1 -1
  56. package/dist/lib/auth/token-storage.d.ts +0 -5
  57. package/dist/lib/auth/token-storage.d.ts.map +1 -1
  58. package/dist/lib/auth/token-storage.js +16 -14
  59. package/dist/lib/auth/token-storage.js.map +1 -1
  60. package/dist/lib/build/detect-layouts.d.ts +1 -1
  61. package/dist/lib/build/detect-layouts.d.ts.map +1 -1
  62. package/dist/lib/build/detect-layouts.js +8 -7
  63. package/dist/lib/build/detect-layouts.js.map +1 -1
  64. package/dist/lib/deploy/generate-manifest-files.js +1 -1
  65. package/dist/lib/deploy/generate-manifest-files.js.map +1 -1
  66. package/dist/lib/deploy/pack-project.js +2 -2
  67. package/dist/lib/deploy/pack-project.js.map +1 -1
  68. package/dist/lib/deploy/test-url-match-rules.d.ts +2 -1
  69. package/dist/lib/deploy/test-url-match-rules.d.ts.map +1 -1
  70. package/dist/lib/deploy/test-url-match-rules.js +1 -1
  71. package/dist/lib/deploy/test-url-match-rules.js.map +1 -1
  72. package/dist/lib/deploy/upload.d.ts.map +1 -1
  73. package/dist/lib/deploy/upload.js +7 -3
  74. package/dist/lib/deploy/upload.js.map +1 -1
  75. package/dist/lib/deploy/validation.d.ts.map +1 -1
  76. package/dist/lib/deploy/validation.js +8 -5
  77. package/dist/lib/deploy/validation.js.map +1 -1
  78. package/dist/lib/rsbuild/config-factory.d.ts +24 -0
  79. package/dist/lib/rsbuild/config-factory.d.ts.map +1 -0
  80. package/dist/lib/rsbuild/config-factory.js +135 -0
  81. package/dist/lib/rsbuild/config-factory.js.map +1 -0
  82. package/dist/lib/rsbuild/plugins/asset-versioning.d.ts +11 -0
  83. package/dist/lib/rsbuild/plugins/asset-versioning.d.ts.map +1 -0
  84. package/dist/lib/rsbuild/plugins/asset-versioning.js +62 -0
  85. package/dist/lib/rsbuild/plugins/asset-versioning.js.map +1 -0
  86. package/dist/lib/rsbuild/plugins/copy-public.d.ts +11 -0
  87. package/dist/lib/rsbuild/plugins/copy-public.d.ts.map +1 -0
  88. package/dist/lib/rsbuild/plugins/copy-public.js +32 -0
  89. package/dist/lib/rsbuild/plugins/copy-public.js.map +1 -0
  90. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.d.ts +12 -0
  91. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.d.ts.map +1 -0
  92. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js +60 -0
  93. package/dist/lib/rsbuild/postcss/tailwind-source-fallback.js.map +1 -0
  94. package/dist/lib/utils/setup-runtime.d.ts.map +1 -1
  95. package/dist/lib/utils/setup-runtime.js +78 -17
  96. package/dist/lib/utils/setup-runtime.js.map +1 -1
  97. package/dist/lib/vite/config-factory.d.ts.map +1 -1
  98. package/dist/lib/vite/config-factory.js +8 -3
  99. package/dist/lib/vite/config-factory.js.map +1 -1
  100. package/dist/lib/vite/plugins/copy-public.d.ts +12 -0
  101. package/dist/lib/vite/plugins/copy-public.d.ts.map +1 -0
  102. package/dist/lib/vite/plugins/copy-public.js +31 -0
  103. package/dist/lib/vite/plugins/copy-public.js.map +1 -0
  104. package/dist/schema/config.schema.d.ts +121 -32
  105. package/dist/schema/config.schema.d.ts.map +1 -1
  106. package/dist/schema/config.schema.js +28 -17
  107. package/dist/schema/config.schema.js.map +1 -1
  108. package/dist/types.d.ts +6 -57
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/types.js.map +1 -1
  111. package/package.json +7 -4
  112. package/runtime/index.html +19 -36
  113. package/dev-server/classic/main.tsx +0 -62
  114. package/dev-server/classic.html +0 -70
  115. package/dev-server/vite.config.ts +0 -29
@@ -1,77 +1,598 @@
1
1
  import pc from 'picocolors';
2
- import { createServer as createViteServer } from 'vite';
3
- import { dirname, resolve } from 'node:path';
2
+ import { createRsbuild, logger } from '@rsbuild/core';
3
+ import { pluginReact } from '@rsbuild/plugin-react';
4
+ import { dirname, resolve, join, extname, relative, sep } from 'node:path';
4
5
  import { fileURLToPath } from 'node:url';
5
- import { validateLayouts } from '../lib/build/detect-layouts.js';
6
+ import { validateLayouts, detectLayouts } from '../lib/build/detect-layouts.js';
6
7
  import { loadConfig } from '../lib/config/load-config.js';
8
+ import { detect } from 'detect-port';
9
+ import { existsSync, readFileSync, statSync, writeFileSync, mkdirSync } from 'node:fs';
10
+ import chokidar from 'chokidar';
11
+ const writeLine = (message = '') => {
12
+ process.stdout.write(`${message}\n`);
13
+ };
7
14
  const __filename = fileURLToPath(import.meta.url);
8
15
  const __dirname = dirname(__filename);
16
+ /**
17
+ * Creates an Rsbuild plugin that watches linkapp.config.ts for changes
18
+ * and triggers a full page reload when the config is updated
19
+ */
20
+ function createConfigWatcherPlugin(userProjectPath) {
21
+ const configCandidates = [
22
+ join(userProjectPath, 'linkapp.config.ts'),
23
+ join(userProjectPath, '.config', 'linkapp.config.ts'),
24
+ ];
25
+ const handleConfigReload = (server) => {
26
+ writeLine(pc.cyan(' ○ linkapp.config.ts changed, reloading...'));
27
+ try {
28
+ loadConfig(userProjectPath);
29
+ server.sockWrite('static-changed');
30
+ writeLine(pc.green(' ✓ Config reloaded'));
31
+ }
32
+ catch (error) {
33
+ writeLine(pc.red(' ✗ Failed to reload config'));
34
+ writeLine(pc.dim(` ${error instanceof Error ? error.message : error}`));
35
+ }
36
+ };
37
+ return {
38
+ name: 'linkapp-config-watcher',
39
+ setup(api) {
40
+ let watchers = [];
41
+ const pendingTimers = new Map();
42
+ const disposeWatchers = async () => {
43
+ for (const watcher of watchers) {
44
+ try {
45
+ await watcher.close();
46
+ }
47
+ catch (error) {
48
+ writeLine(pc.red(' ✗ Failed to close config watcher'));
49
+ writeLine(pc.dim(` ${error instanceof Error ? error.message : error}`));
50
+ }
51
+ }
52
+ watchers = [];
53
+ for (const timeout of pendingTimers.values()) {
54
+ clearTimeout(timeout);
55
+ }
56
+ pendingTimers.clear();
57
+ };
58
+ api.onBeforeStartDevServer(async ({ server }) => {
59
+ await disposeWatchers();
60
+ const filesToWatch = configCandidates.filter((candidatePath) => existsSync(candidatePath));
61
+ if (filesToWatch.length === 0) {
62
+ return;
63
+ }
64
+ const scheduleReload = (targetPath) => {
65
+ const normalizedPath = targetPath.toString();
66
+ const existingTimeout = pendingTimers.get(normalizedPath);
67
+ if (existingTimeout) {
68
+ clearTimeout(existingTimeout);
69
+ }
70
+ const timeout = setTimeout(() => {
71
+ pendingTimers.delete(normalizedPath);
72
+ handleConfigReload(server);
73
+ }, 120);
74
+ pendingTimers.set(normalizedPath, timeout);
75
+ };
76
+ try {
77
+ const watcher = chokidar.watch(filesToWatch, {
78
+ ignoreInitial: true,
79
+ awaitWriteFinish: {
80
+ stabilityThreshold: 200,
81
+ pollInterval: 50,
82
+ },
83
+ });
84
+ watcher.on('all', (event, changedPath) => {
85
+ if (!changedPath) {
86
+ return;
87
+ }
88
+ const normalizedChangedPath = changedPath.toString();
89
+ if (!configCandidates.includes(normalizedChangedPath)) {
90
+ return;
91
+ }
92
+ switch (event) {
93
+ case 'add':
94
+ case 'change':
95
+ case 'unlink':
96
+ scheduleReload(normalizedChangedPath);
97
+ break;
98
+ default:
99
+ break;
100
+ }
101
+ });
102
+ watcher.on('error', (error) => {
103
+ writeLine(pc.red(' ✗ Config watcher encountered an error'));
104
+ writeLine(pc.dim(` ${error instanceof Error ? error.message : error}`));
105
+ });
106
+ watchers.push(watcher);
107
+ }
108
+ catch (error) {
109
+ writeLine(pc.red(' ✗ Failed to watch config file'));
110
+ writeLine(pc.dim(` ${error instanceof Error ? error.message : error}`));
111
+ }
112
+ return async () => {
113
+ await disposeWatchers();
114
+ };
115
+ });
116
+ api.onCloseDevServer(async () => {
117
+ await disposeWatchers();
118
+ });
119
+ },
120
+ };
121
+ }
122
+ /**
123
+ * Creates middleware to serve static assets from the user's public directory
124
+ * while matching the legacy Vite dev server behavior.
125
+ */
126
+ function createPublicDirPlugin(userPublicDir) {
127
+ const contentTypes = {
128
+ css: 'text/css',
129
+ gif: 'image/gif',
130
+ html: 'text/html',
131
+ ico: 'image/x-icon',
132
+ jpeg: 'image/jpeg',
133
+ jpg: 'image/jpeg',
134
+ js: 'application/javascript',
135
+ json: 'application/json',
136
+ png: 'image/png',
137
+ svg: 'image/svg+xml',
138
+ txt: 'text/plain',
139
+ webp: 'image/webp',
140
+ };
141
+ return {
142
+ name: 'linkapp:public-dir',
143
+ setup(api) {
144
+ api.onBeforeStartDevServer(async ({ server }) => {
145
+ if (!existsSync(userPublicDir)) {
146
+ return;
147
+ }
148
+ const publicDirRoot = resolve(userPublicDir);
149
+ server.middlewares.use((req, res, next) => {
150
+ if (!req.url) {
151
+ next();
152
+ return;
153
+ }
154
+ const method = req.method ?? 'GET';
155
+ if (method !== 'GET' && method !== 'HEAD') {
156
+ next();
157
+ return;
158
+ }
159
+ const [rawPath] = req.url.split('?');
160
+ if (!rawPath || rawPath === '/' || rawPath === '') {
161
+ next();
162
+ return;
163
+ }
164
+ let decodedPath;
165
+ try {
166
+ decodedPath = decodeURIComponent(rawPath);
167
+ }
168
+ catch {
169
+ next();
170
+ return;
171
+ }
172
+ const normalizedPath = decodedPath.startsWith('/') ? decodedPath : `/${decodedPath}`;
173
+ const targetPath = resolve(publicDirRoot, `.${normalizedPath}`);
174
+ const relativePath = relative(publicDirRoot, targetPath);
175
+ if (relativePath.startsWith('..') ||
176
+ relativePath.includes(`..${sep}`) ||
177
+ targetPath === publicDirRoot) {
178
+ next();
179
+ return;
180
+ }
181
+ let stats;
182
+ try {
183
+ stats = statSync(targetPath);
184
+ }
185
+ catch {
186
+ next();
187
+ return;
188
+ }
189
+ if (!stats.isFile()) {
190
+ next();
191
+ return;
192
+ }
193
+ const extension = extname(targetPath).slice(1).toLowerCase();
194
+ const contentType = (extension && contentTypes[extension]) || 'application/octet-stream';
195
+ res.setHeader('Content-Type', contentType);
196
+ res.setHeader('Cache-Control', 'no-cache');
197
+ if (method === 'HEAD') {
198
+ res.end();
199
+ return;
200
+ }
201
+ try {
202
+ const content = readFileSync(targetPath);
203
+ res.end(content);
204
+ }
205
+ catch (error) {
206
+ next(error);
207
+ }
208
+ });
209
+ });
210
+ },
211
+ };
212
+ }
213
+ /**
214
+ * Generates the sheet entry point dynamically
215
+ */
216
+ function generateSheetEntryPoint(devServerPath) {
217
+ // Use absolute paths to shared theme files in the dev-server directory
218
+ const themePresetsPath = resolve(devServerPath, 'shared/theme-presets');
219
+ const themeUtilsPath = resolve(devServerPath, 'shared/theme-utils');
220
+ return `import Sheet from "@/app/sheet";
221
+ import { StrictMode } from "react";
222
+ import { createRoot } from "react-dom/client";
223
+ import "@/app/globals.css";
224
+ import { THEME_PRESETS } from "${themePresetsPath}";
225
+ import { getThemeFromUrl, mergeThemeProps } from "${themeUtilsPath}";
226
+
227
+ // Declare global window property for theme application
228
+ declare global {
229
+ interface Window {
230
+ __linkapp_applyTheme?: (variables: Record<string, string>) => void
231
+ }
232
+ }
233
+
234
+ // Preview props injected by dev server via Vite define
235
+ declare const __PREVIEW_PROPS__: Record<string, unknown>;
236
+
237
+ // Extract just the variables from THEME_PRESETS for theme lookups
238
+ const THEME_VARS = Object.fromEntries(
239
+ Object.entries(THEME_PRESETS).map(([key, { variables }]) => [key, variables])
240
+ );
241
+
242
+ // Get theme variables from URL
243
+ const themeVariables = getThemeFromUrl(THEME_VARS);
244
+
245
+ // Merge with preview props
246
+ const previewProps = __PREVIEW_PROPS__ || {};
247
+ const mergedProps = mergeThemeProps(themeVariables, previewProps);
248
+
249
+ // Apply theme CSS variables on mount
250
+ if (themeVariables && window.__linkapp_applyTheme) {
251
+ window.__linkapp_applyTheme(themeVariables);
252
+ }
253
+
254
+ const rootElement = document.getElementById("root");
255
+ if (!rootElement) {
256
+ throw new Error("Root element not found");
257
+ }
258
+
259
+ createRoot(rootElement).render(
260
+ <StrictMode>
261
+ <Sheet {...mergedProps} />
262
+ </StrictMode>,
263
+ );
264
+ `;
265
+ }
266
+ /**
267
+ * Generates the featured entry point dynamically based on available layouts
268
+ */
269
+ function generateFeaturedEntryPoint(devServerPath, hasFeaturedCarousel) {
270
+ // Use absolute paths to shared theme files in the dev-server directory
271
+ const themePresetsPath = resolve(devServerPath, 'shared/theme-presets');
272
+ const themeUtilsPath = resolve(devServerPath, 'shared/theme-utils');
273
+ const featuredCarouselImport = hasFeaturedCarousel
274
+ ? `import FeaturedCarousel from "@/app/featured-carousel";`
275
+ : '';
276
+ const componentSelection = hasFeaturedCarousel
277
+ ? `// Select the appropriate component based on groupLayoutOption parameter
278
+ const LayoutComponent = (groupLayoutOptionParam === 'carousel' && FeaturedCarousel)
279
+ ? FeaturedCarousel
280
+ : Featured;
281
+
282
+ console.log('[Featured Dev Server] Rendering:', {
283
+ groupLayoutOption: groupLayoutOptionParam,
284
+ component: groupLayoutOptionParam === 'carousel' && FeaturedCarousel ? 'FeaturedCarousel' : 'Featured',
285
+ hasFeaturedCarousel: true,
286
+ });`
287
+ : `// Only Featured layout is available
288
+ const LayoutComponent = Featured;
289
+
290
+ console.log('[Featured Dev Server] Rendering:', {
291
+ groupLayoutOption: groupLayoutOptionParam,
292
+ component: 'Featured',
293
+ hasFeaturedCarousel: false,
294
+ });`;
295
+ return `import Featured from "@/app/featured";
296
+ ${featuredCarouselImport}
297
+ import { StrictMode } from "react";
298
+ import { createRoot } from "react-dom/client";
299
+ import "@/app/globals.css";
300
+ import { THEME_PRESETS } from "${themePresetsPath}";
301
+ import { getThemeFromUrl, mergeThemeProps } from "${themeUtilsPath}";
302
+
303
+ // Declare global window property for theme application
304
+ declare global {
305
+ interface Window {
306
+ __linkapp_applyTheme?: (variables: Record<string, string>) => void
307
+ }
308
+ }
309
+
310
+ // Preview props injected by dev server via Vite define
311
+ declare const __PREVIEW_PROPS__: Record<string, unknown>;
312
+
313
+ // Extract just the variables from THEME_PRESETS for theme lookups
314
+ const THEME_VARS = Object.fromEntries(
315
+ Object.entries(THEME_PRESETS).map(([key, { variables }]) => [key, variables])
316
+ );
317
+
318
+ // Get theme variables and groupLayoutOption from URL
319
+ const params = new URLSearchParams(window.location.search);
320
+ const groupLayoutOptionParam = params.get('groupLayoutOption');
321
+ const themeVariables = getThemeFromUrl(THEME_VARS);
322
+
323
+ // Merge with preview props and add groupLayoutOption
324
+ const previewProps = __PREVIEW_PROPS__ || {};
325
+ const mergedProps = mergeThemeProps(themeVariables, previewProps, {
326
+ groupLayoutOption: groupLayoutOptionParam || undefined,
327
+ });
328
+
329
+ // Apply theme CSS variables on mount
330
+ if (themeVariables && window.__linkapp_applyTheme) {
331
+ window.__linkapp_applyTheme(themeVariables);
332
+ }
333
+
334
+ const rootElement = document.getElementById("root");
335
+ if (!rootElement) {
336
+ throw new Error("Root element not found");
337
+ }
338
+
339
+ ${componentSelection}
340
+
341
+ createRoot(rootElement).render(
342
+ <StrictMode>
343
+ <LayoutComponent {...mergedProps} />
344
+ </StrictMode>,
345
+ );
346
+ `;
347
+ }
9
348
  export async function devCommand(options) {
10
349
  const userProjectPath = process.cwd();
350
+ process.env.LINKAPP_USER_PROJECT_PATH = userProjectPath;
351
+ // Suppress Rsbuild's built-in logging messages
352
+ logger.override({
353
+ start: () => { }, // Suppress "start build started..." messages
354
+ ready: () => { }, // Suppress "ready built in..." messages
355
+ });
11
356
  try {
12
357
  const startTime = Date.now();
13
358
  // Validate layouts exist
14
359
  const validation = validateLayouts(userProjectPath);
15
360
  if (!validation.valid) {
16
- console.log(pc.red('✗ Invalid project structure'));
361
+ writeLine(pc.red('✗ Invalid project structure'));
17
362
  for (const error of validation.errors) {
18
- console.log(pc.red(` ${error}`));
363
+ writeLine(pc.red(` ${error}`));
19
364
  }
20
365
  process.exit(1);
21
366
  }
22
- // Load config and extract preview_props
367
+ // Get dev server path (needed for generating entry points and later for Rsbuild config)
368
+ const devServerPath = resolve(__dirname, '../../dev-server');
369
+ // Detect available layouts for dynamic entry generation
370
+ const layoutDetection = detectLayouts(userProjectPath);
371
+ const hasFeaturedCarousel = layoutDetection.layouts.some(l => l.name === 'featured-carousel');
372
+ // Generate dynamic entry points in .linkapp directory
373
+ const linkappDir = join(userProjectPath, '.linkapp');
374
+ if (!existsSync(linkappDir)) {
375
+ mkdirSync(linkappDir, { recursive: true });
376
+ }
377
+ const sheetEntryPath = join(linkappDir, 'dev-sheet-main.tsx');
378
+ const featuredEntryPath = join(linkappDir, 'dev-featured-main.tsx');
379
+ writeFileSync(sheetEntryPath, generateSheetEntryPoint(devServerPath), 'utf-8');
380
+ writeFileSync(featuredEntryPath, generateFeaturedEntryPoint(devServerPath, hasFeaturedCarousel), 'utf-8');
381
+ // Load config and extract preview_props and settings
23
382
  let previewProps = {};
383
+ let settingsConfig = {};
24
384
  try {
25
385
  const config = loadConfig(userProjectPath);
26
386
  previewProps = config.preview_props || {};
387
+ settingsConfig = config.settings || {};
27
388
  }
28
389
  catch (error) {
29
- console.log(pc.yellow('⚠ Warning: Could not load config, using default preview props'));
30
- console.log(pc.dim(` ${error instanceof Error ? error.message : error}`));
390
+ writeLine(pc.yellow('⚠ Warning: Could not load config, using default preview props'));
391
+ writeLine(pc.dim(` ${error instanceof Error ? error.message : error}`));
31
392
  }
32
- const port = options.port || 3000;
33
- const devServerPath = resolve(__dirname, '../../dev-server');
34
- // Create Vite server - inject preview props directly via define
35
- const viteServer = await createViteServer({
36
- configFile: resolve(devServerPath, 'vite.config.ts'),
37
- root: devServerPath,
38
- resolve: {
39
- alias: {
40
- '@': userProjectPath,
393
+ const requestedPort = options.port || 3000;
394
+ const availablePort = await detect(requestedPort);
395
+ // Show warning if the requested port was occupied
396
+ if (requestedPort !== availablePort) {
397
+ writeLine(pc.yellow(` ⚠ Port ${requestedPort} is in use, using ${availablePort} instead`));
398
+ writeLine();
399
+ }
400
+ const port = availablePort;
401
+ const userPublicDir = join(userProjectPath, 'public');
402
+ const printReadyMessage = (readyTime, urls) => {
403
+ writeLine();
404
+ writeLine(pc.bold(pc.cyan(' LinkApp')) + pc.dim(' ready'));
405
+ writeLine();
406
+ if (urls.length > 0) {
407
+ writeLine(` ${pc.green('➜')} ${pc.bold('Local:')} ${pc.cyan(urls[0])}`);
408
+ }
409
+ writeLine();
410
+ writeLine(pc.green(` ✓ Ready in ${readyTime}s`));
411
+ };
412
+ const setupKeyboardShortcuts = (handlers) => {
413
+ if (!process.stdin.isTTY) {
414
+ return () => { };
415
+ }
416
+ const handleData = (data) => {
417
+ if (data === '\u0003') {
418
+ void handlers.exit();
419
+ return;
420
+ }
421
+ const key = data.trim().toLowerCase();
422
+ if (key === '') {
423
+ return;
424
+ }
425
+ switch (key) {
426
+ case 'r':
427
+ void handlers.restart();
428
+ break;
429
+ case 'u':
430
+ handlers.showUrls();
431
+ break;
432
+ case 'c':
433
+ handlers.clear();
434
+ break;
435
+ case 'q':
436
+ void handlers.exit();
437
+ break;
438
+ default:
439
+ break;
440
+ }
441
+ };
442
+ process.stdin.setRawMode(true);
443
+ process.stdin.resume();
444
+ process.stdin.setEncoding('utf8');
445
+ process.stdin.on('data', handleData);
446
+ return () => {
447
+ process.stdin.off('data', handleData);
448
+ if (process.stdin.isTTY) {
449
+ process.stdin.setRawMode(false);
450
+ }
451
+ process.stdin.pause();
452
+ };
453
+ };
454
+ // Create Rsbuild server - inject preview props directly via define
455
+ const rsbuild = await createRsbuild({
456
+ rsbuildConfig: {
457
+ dev: {
458
+ progressBar: false,
459
+ },
460
+ plugins: [
461
+ pluginReact(),
462
+ createConfigWatcherPlugin(userProjectPath),
463
+ createPublicDirPlugin(userPublicDir),
464
+ ],
465
+ source: {
466
+ entry: {
467
+ index: resolve(devServerPath, 'preview/main.tsx'),
468
+ sheet: sheetEntryPath,
469
+ featured: featuredEntryPath,
470
+ },
471
+ define: {
472
+ __PREVIEW_PROPS__: JSON.stringify(previewProps),
473
+ __SETTINGS_CONFIG__: JSON.stringify(settingsConfig),
474
+ },
475
+ },
476
+ resolve: {
477
+ alias: {
478
+ '@': userProjectPath,
479
+ },
480
+ dedupe: ['react', 'react-dom'],
481
+ },
482
+ html: {
483
+ template({ entryName }) {
484
+ const templates = {
485
+ index: resolve(devServerPath, 'index.html'),
486
+ sheet: resolve(devServerPath, 'sheet.html'),
487
+ featured: resolve(devServerPath, 'featured.html'),
488
+ };
489
+ return templates[entryName] || resolve(devServerPath, 'index.html');
490
+ },
491
+ },
492
+ server: {
493
+ port,
494
+ host: 'localhost',
495
+ open: false,
496
+ strictPort: false,
497
+ printUrls: false,
498
+ publicDir: {
499
+ name: userPublicDir,
500
+ watch: true,
501
+ },
502
+ },
503
+ tools: {
504
+ postcss: (opts) => {
505
+ // Load PostCSS config from dev-server directory
506
+ opts.postcssOptions = {
507
+ ...opts.postcssOptions,
508
+ config: resolve(devServerPath, 'postcss.config.mjs'),
509
+ };
510
+ return opts;
511
+ },
41
512
  },
42
- // Dedupe React to avoid "Invalid hook call" errors from multiple React instances
43
- dedupe: ['react', 'react-dom'],
44
- },
45
- define: {
46
- __PREVIEW_PROPS__: JSON.stringify(previewProps),
47
- },
48
- server: {
49
- port,
50
- host: 'localhost',
51
- open: false,
52
- strictPort: false,
53
513
  },
54
- logLevel: 'error',
55
514
  });
56
- await viteServer.listen();
57
- const readyTime = ((Date.now() - startTime) / 1000).toFixed(1);
58
- console.log(pc.bold(pc.cyan(' LinkApp')) + pc.dim(' ready'));
59
- console.log();
60
- console.log(pc.green(' ➜') + pc.bold(' Local: ') + pc.cyan(`http://localhost:${port}`));
61
- console.log();
62
- viteServer.bindCLIShortcuts({ print: true });
63
- console.log(pc.dim(` ✓ Ready in ${readyTime}s`));
64
- // Handle Ctrl+C
65
- process.on('SIGINT', async () => {
66
- console.log('\n');
67
- await viteServer.close();
68
- process.exit(0);
515
+ let currentServer;
516
+ let cleanupShortcuts;
517
+ let isRestarting = false;
518
+ let isShuttingDown = false;
519
+ let currentUrls = [];
520
+ let lastReadyTime = '';
521
+ const startServer = async (startedAt) => {
522
+ const result = await rsbuild.startDevServer();
523
+ currentServer = result;
524
+ currentUrls = result.urls;
525
+ lastReadyTime = ((Date.now() - startedAt) / 1000).toFixed(1);
526
+ printReadyMessage(lastReadyTime, currentUrls);
527
+ };
528
+ const restartServer = async () => {
529
+ if (isShuttingDown || isRestarting || !currentServer) {
530
+ return;
531
+ }
532
+ isRestarting = true;
533
+ writeLine();
534
+ writeLine(pc.cyan(' ↻ Restarting dev server...'));
535
+ try {
536
+ await currentServer.server.close();
537
+ const restartStart = Date.now();
538
+ await startServer(restartStart);
539
+ }
540
+ catch (error) {
541
+ currentServer = undefined;
542
+ writeLine(pc.red('✗ Failed to restart dev server'));
543
+ writeLine(pc.dim(` ${error instanceof Error ? error.message : error}`));
544
+ }
545
+ finally {
546
+ isRestarting = false;
547
+ }
548
+ };
549
+ const showUrls = () => {
550
+ writeLine();
551
+ if (currentUrls.length > 0) {
552
+ writeLine(` ${pc.green('➜')} ${pc.bold('Local:')} ${pc.cyan(currentUrls[0])}`);
553
+ }
554
+ writeLine();
555
+ };
556
+ const clearConsole = () => {
557
+ console.clear();
558
+ if (lastReadyTime) {
559
+ printReadyMessage(lastReadyTime, currentUrls);
560
+ }
561
+ };
562
+ const shutdown = async () => {
563
+ if (isShuttingDown) {
564
+ return;
565
+ }
566
+ isShuttingDown = true;
567
+ cleanupShortcuts?.();
568
+ try {
569
+ if (currentServer) {
570
+ await currentServer.server.close();
571
+ }
572
+ }
573
+ catch (closeError) {
574
+ writeLine(pc.red('✗ Error while closing dev server'));
575
+ writeLine(pc.dim(` ${closeError instanceof Error ? closeError.message : closeError}`));
576
+ }
577
+ finally {
578
+ process.exit(0);
579
+ }
580
+ };
581
+ await startServer(startTime);
582
+ cleanupShortcuts = setupKeyboardShortcuts({
583
+ restart: restartServer,
584
+ showUrls,
585
+ clear: clearConsole,
586
+ exit: shutdown,
587
+ });
588
+ process.on('SIGINT', () => {
589
+ void shutdown();
69
590
  });
70
591
  // Keep alive
71
592
  await new Promise(() => { });
72
593
  }
73
594
  catch (error) {
74
- console.log(pc.red('✗ Failed to start server'));
595
+ writeLine(pc.red('✗ Failed to start server'));
75
596
  console.error(pc.red('✗ Error:'), error);
76
597
  process.exit(1);
77
598
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}