@nextop-os/ui-system 0.0.14 → 0.0.16

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.
@@ -0,0 +1,578 @@
1
+ // src/plugins/vite.ts
2
+ import { createHash } from "crypto";
3
+ import { readFileSync } from "fs";
4
+ import { createRequire } from "module";
5
+ import {
6
+ lstat,
7
+ mkdir,
8
+ readdir,
9
+ readFile,
10
+ realpath,
11
+ rm,
12
+ writeFile
13
+ } from "fs/promises";
14
+ import path from "path";
15
+ import { fileURLToPath } from "url";
16
+ import { WebSocket } from "ws";
17
+ var defaultServerUrl = "http://127.0.0.1:4100";
18
+ var defaultCacheDir = ".nextop-ui-system-dev";
19
+ var cacheMarkerFileName = ".nextop-ui-system-dev-cache";
20
+ var packageName = "@nextop-os/ui-system";
21
+ var packageRequire = createRequire(import.meta.url);
22
+ var stableEntrypoints = [
23
+ ".",
24
+ "./components",
25
+ "./icons",
26
+ "./styles.css",
27
+ "./utils"
28
+ ];
29
+ var packageDependencyAliases = [
30
+ "class-variance-authority",
31
+ "clsx",
32
+ "lucide-react",
33
+ "radix-ui",
34
+ "react-resizable-panels",
35
+ "tailwind-merge"
36
+ ];
37
+ var packageStyleDependencyAliases = ["tw-animate-css"];
38
+ var packageDependencyAliasSet = new Set(packageDependencyAliases);
39
+ var packageStyleDependencyAliasSet = new Set(
40
+ packageStyleDependencyAliases
41
+ );
42
+ function nextopUISystemDev(options = {}) {
43
+ const serverUrl = normalizeServerUrl(options.serverUrl ?? defaultServerUrl);
44
+ const cacheDir = options.cacheDir ?? defaultCacheDir;
45
+ let syncState = null;
46
+ return {
47
+ name: "nextop-ui-system-dev",
48
+ async config(config, env) {
49
+ if (env.command !== "serve") {
50
+ syncState = null;
51
+ return {};
52
+ }
53
+ if (!await probeHealth(serverUrl)) {
54
+ syncState = null;
55
+ return {};
56
+ }
57
+ const projectRoot = path.resolve(config.root ?? process.cwd());
58
+ const cacheState = await prepareCacheRoot(projectRoot, cacheDir);
59
+ const manifest = await fetchJson(
60
+ serverUrl,
61
+ "/manifest"
62
+ );
63
+ validateManifest(manifest);
64
+ await syncFiles(serverUrl, cacheState);
65
+ await fetchComponentsMetadata(serverUrl);
66
+ syncState = { ...cacheState, serverUrl };
67
+ return {
68
+ resolve: {
69
+ alias: stableEntrypoints.map((entrypoint) => ({
70
+ find: entrypointAlias(entrypoint),
71
+ replacement: path.join(
72
+ cacheState.cacheRoot,
73
+ manifest.entrypoints[entrypoint]
74
+ )
75
+ })).concat(
76
+ packageStyleDependencyAliases.map((dependencyName) => ({
77
+ find: dependencyAlias(dependencyName),
78
+ replacement: dependencyName,
79
+ customResolver: (_source, importer) => isCacheImporter(syncState, importer) ? resolvePackageStyleDependency(dependencyName) : null
80
+ }))
81
+ )
82
+ }
83
+ };
84
+ },
85
+ async resolveId(source, importer) {
86
+ if (syncState === null || !isCacheImporter(syncState, importer)) {
87
+ return null;
88
+ }
89
+ if (packageDependencyAliasSet.has(source)) {
90
+ return packageRequire.resolve(source);
91
+ }
92
+ if (packageStyleDependencyAliasSet.has(source)) {
93
+ const resolved = await this.resolve(source, packageContextImporter(), {
94
+ skipSelf: true
95
+ });
96
+ return resolved?.id ?? null;
97
+ }
98
+ return null;
99
+ },
100
+ configureServer(server) {
101
+ if (syncState === null) {
102
+ return;
103
+ }
104
+ subscribeToEvents(server, syncState);
105
+ }
106
+ };
107
+ }
108
+ async function probeHealth(serverUrl) {
109
+ try {
110
+ const response = await fetch(new URL("/health", serverUrl));
111
+ if (!response.ok) {
112
+ return false;
113
+ }
114
+ const payload = await response.json();
115
+ return payload.packageName === packageName;
116
+ } catch {
117
+ return false;
118
+ }
119
+ }
120
+ async function syncFiles(serverUrl, cacheState) {
121
+ const files = await fetchJson(serverUrl, "/files");
122
+ if (!Array.isArray(files)) {
123
+ throw new Error("@nextop-os/ui-system dev server returned invalid files list");
124
+ }
125
+ const syncPaths = /* @__PURE__ */ new Set();
126
+ await Promise.all(
127
+ files.map(async (file) => {
128
+ validateSyncFile(file);
129
+ syncPaths.add(file.path);
130
+ const destination = resolveCacheFile(cacheState.cacheRoot, file.path);
131
+ await prepareCacheFileTarget(cacheState, destination);
132
+ const currentHash = await readCachedHash(destination);
133
+ if (currentHash === file.hash) {
134
+ return;
135
+ }
136
+ const bytes = await fetchFile(serverUrl, file.path);
137
+ const downloadedHash = hashBytes(bytes);
138
+ if (downloadedHash !== file.hash) {
139
+ throw new Error(
140
+ `Hash mismatch while syncing @nextop-os/ui-system file: ${file.path}`
141
+ );
142
+ }
143
+ await writeFile(destination, bytes);
144
+ })
145
+ );
146
+ await removeStaleCacheFiles(cacheState, syncPaths);
147
+ }
148
+ async function syncChangedFile(server, state, event) {
149
+ validateEventPath(event.path);
150
+ const destination = resolveCacheFile(state.cacheRoot, event.path);
151
+ await prepareCacheFileTarget(state, destination);
152
+ const bytes = await fetchFile(state.serverUrl, event.path);
153
+ const downloadedHash = hashBytes(bytes);
154
+ if (downloadedHash !== event.hash) {
155
+ throw new Error(
156
+ `Hash mismatch while syncing @nextop-os/ui-system file: ${event.path}`
157
+ );
158
+ }
159
+ await writeFile(destination, bytes);
160
+ invalidateFile(server, destination);
161
+ }
162
+ async function removeDeletedFile(server, state, event) {
163
+ validateEventPath(event.path);
164
+ const destination = resolveCacheFile(state.cacheRoot, event.path);
165
+ invalidateFile(server, destination);
166
+ await removeCacheFile(state, destination);
167
+ }
168
+ function subscribeToEvents(server, state) {
169
+ let closed = false;
170
+ let reconnectTimer = null;
171
+ let websocket = null;
172
+ const close = () => {
173
+ closed = true;
174
+ if (reconnectTimer !== null) {
175
+ clearTimeout(reconnectTimer);
176
+ reconnectTimer = null;
177
+ }
178
+ websocket?.close();
179
+ websocket = null;
180
+ };
181
+ const reconnect = () => {
182
+ if (closed || reconnectTimer !== null) {
183
+ return;
184
+ }
185
+ reconnectTimer = setTimeout(() => {
186
+ reconnectTimer = null;
187
+ connect();
188
+ }, 1e3);
189
+ };
190
+ const connect = () => {
191
+ if (closed) {
192
+ return;
193
+ }
194
+ websocket = new WebSocket(eventUrl(state.serverUrl));
195
+ websocket.on("message", (message) => {
196
+ void handleEventMessage(server, state, message).catch(() => {
197
+ });
198
+ });
199
+ websocket.on("close", reconnect);
200
+ websocket.on("error", () => {
201
+ websocket?.close();
202
+ });
203
+ };
204
+ connect();
205
+ server.httpServer?.once("close", close);
206
+ }
207
+ async function handleEventMessage(server, state, message) {
208
+ const event = parseEvent(message);
209
+ if (event === null) {
210
+ return;
211
+ }
212
+ if (event.type === "fileChanged") {
213
+ await syncChangedFile(server, state, event);
214
+ return;
215
+ }
216
+ if (event.type === "fileDeleted") {
217
+ await removeDeletedFile(server, state, event);
218
+ }
219
+ }
220
+ function parseEvent(message) {
221
+ try {
222
+ const event = JSON.parse(rawMessageToString(message));
223
+ if (!isDevEvent(event)) {
224
+ return null;
225
+ }
226
+ return event;
227
+ } catch {
228
+ return null;
229
+ }
230
+ }
231
+ function rawMessageToString(message) {
232
+ if (Buffer.isBuffer(message)) {
233
+ return message.toString("utf8");
234
+ }
235
+ if (Array.isArray(message)) {
236
+ return Buffer.concat(message).toString("utf8");
237
+ }
238
+ return Buffer.from(message).toString("utf8");
239
+ }
240
+ function isDevEvent(event) {
241
+ if (event === null || typeof event !== "object") {
242
+ return false;
243
+ }
244
+ if (event.type === "fileChanged") {
245
+ return typeof event.path === "string" && typeof event.hash === "string";
246
+ }
247
+ if (event.type === "fileDeleted") {
248
+ return typeof event.path === "string";
249
+ }
250
+ return event.type === "manifestChanged" || event.type === "componentsChanged";
251
+ }
252
+ function invalidateFile(server, filePath) {
253
+ const modules = server.moduleGraph.getModulesByFile(filePath);
254
+ if (modules === void 0) {
255
+ return;
256
+ }
257
+ for (const moduleNode of modules) {
258
+ server.moduleGraph.invalidateModule(moduleNode);
259
+ }
260
+ }
261
+ async function fetchComponentsMetadata(serverUrl) {
262
+ try {
263
+ await fetchJson(serverUrl, "/components");
264
+ } catch {
265
+ }
266
+ }
267
+ async function fetchJson(serverUrl, endpoint) {
268
+ const response = await fetch(new URL(endpoint, serverUrl));
269
+ if (!response.ok) {
270
+ throw new Error(
271
+ `@nextop-os/ui-system dev server ${endpoint} failed with ${response.status}`
272
+ );
273
+ }
274
+ return await response.json();
275
+ }
276
+ async function fetchFile(serverUrl, syncPath) {
277
+ const response = await fetch(
278
+ new URL(`/files/${encodeSyncPath(syncPath)}`, serverUrl)
279
+ );
280
+ if (!response.ok) {
281
+ throw new Error(
282
+ `@nextop-os/ui-system dev server file fetch failed for ${syncPath}`
283
+ );
284
+ }
285
+ return Buffer.from(await response.arrayBuffer());
286
+ }
287
+ async function readCachedHash(filePath) {
288
+ try {
289
+ return hashBytes(await readFile(filePath));
290
+ } catch {
291
+ return null;
292
+ }
293
+ }
294
+ function validateManifest(manifest) {
295
+ if (manifest === null || typeof manifest !== "object" || manifest.packageName !== packageName || typeof manifest.entrypoints !== "object" || manifest.entrypoints === null) {
296
+ throw new Error("@nextop-os/ui-system dev server returned invalid manifest");
297
+ }
298
+ for (const entrypoint of stableEntrypoints) {
299
+ const syncPath = manifest.entrypoints[entrypoint];
300
+ if (typeof syncPath !== "string" || normalizeSyncPath(syncPath) === null) {
301
+ throw new Error(
302
+ `@nextop-os/ui-system dev server manifest is missing ${entrypoint}`
303
+ );
304
+ }
305
+ }
306
+ }
307
+ function validateSyncFile(file) {
308
+ if (file === null || typeof file !== "object" || typeof file.path !== "string" || typeof file.hash !== "string" || typeof file.size !== "number" || normalizeSyncPath(file.path) === null) {
309
+ throw new Error("@nextop-os/ui-system dev server returned invalid file entry");
310
+ }
311
+ }
312
+ function validateEventPath(syncPath) {
313
+ if (normalizeSyncPath(syncPath) === null) {
314
+ throw new Error(
315
+ `Refusing unsafe @nextop-os/ui-system event path: ${syncPath}`
316
+ );
317
+ }
318
+ }
319
+ async function prepareCacheRoot(projectRoot, cacheDir) {
320
+ const cacheRoot = resolveCacheRoot(projectRoot, cacheDir);
321
+ await ensureNoSymlinkAncestors(projectRoot, path.dirname(cacheRoot));
322
+ await mkdir(cacheRoot, { recursive: true });
323
+ await ensureNoSymlinkAncestors(projectRoot, cacheRoot);
324
+ const cacheStat = await lstat(cacheRoot);
325
+ if (!cacheStat.isDirectory() || cacheStat.isSymbolicLink()) {
326
+ throw new Error("@nextop-os/ui-system dev cacheDir must be a real directory");
327
+ }
328
+ const realProjectRoot = await realpath(projectRoot);
329
+ const realCacheRoot = await realpath(cacheRoot);
330
+ if (!isPathInside(realProjectRoot, realCacheRoot)) {
331
+ throw new Error(
332
+ "@nextop-os/ui-system dev cacheDir must resolve inside the Vite project root"
333
+ );
334
+ }
335
+ await ensureOwnedCacheRoot(cacheRoot);
336
+ return { cacheRoot, realCacheRoot };
337
+ }
338
+ function resolveCacheRoot(projectRoot, cacheDir) {
339
+ const cacheRoot = path.resolve(projectRoot, cacheDir);
340
+ const relative = path.relative(projectRoot, cacheRoot);
341
+ if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative)) {
342
+ throw new Error(
343
+ "@nextop-os/ui-system dev cacheDir must resolve inside the Vite project root"
344
+ );
345
+ }
346
+ return cacheRoot;
347
+ }
348
+ async function prepareCacheFileTarget(cacheState, destination) {
349
+ const parent = path.dirname(destination);
350
+ await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);
351
+ await mkdir(parent, { recursive: true });
352
+ await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);
353
+ const realParent = await realpath(parent);
354
+ if (!isPathInside(cacheState.realCacheRoot, realParent)) {
355
+ throw new Error(
356
+ "@nextop-os/ui-system dev cache file resolved outside cacheDir"
357
+ );
358
+ }
359
+ await rejectExistingSymlink(destination);
360
+ }
361
+ async function removeCacheFile(cacheState, destination) {
362
+ const parent = path.dirname(destination);
363
+ await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);
364
+ const realParent = await realpath(parent).catch(() => null);
365
+ if (realParent === null || !isPathInside(cacheState.realCacheRoot, realParent)) {
366
+ throw new Error(
367
+ "@nextop-os/ui-system dev cache file resolved outside cacheDir"
368
+ );
369
+ }
370
+ await rejectExistingSymlink(destination);
371
+ await rm(destination, { force: true });
372
+ }
373
+ async function removeStaleCacheFiles(cacheState, authoritativePaths) {
374
+ await ensureOwnedCacheRoot(cacheState.cacheRoot);
375
+ const cachedFiles = await listCacheFiles(cacheState.cacheRoot);
376
+ await Promise.all(
377
+ cachedFiles.map(async (cachedFile) => {
378
+ if (authoritativePaths.has(cachedFile)) {
379
+ return;
380
+ }
381
+ await removeCacheFile(
382
+ cacheState,
383
+ resolveCacheFile(cacheState.cacheRoot, cachedFile)
384
+ );
385
+ })
386
+ );
387
+ }
388
+ async function listCacheFiles(directory, prefix = "") {
389
+ const entries = await readdir(directory, { withFileTypes: true });
390
+ const paths = await Promise.all(
391
+ entries.map(async (entry) => {
392
+ const syncPath = prefix === "" ? entry.name : `${prefix}/${entry.name}`;
393
+ const absolutePath = path.join(directory, entry.name);
394
+ if (syncPath === cacheMarkerFileName) {
395
+ return [];
396
+ }
397
+ if (entry.isSymbolicLink()) {
398
+ throw new Error(
399
+ `Refusing symlink in @nextop-os/ui-system dev cache: ${syncPath}`
400
+ );
401
+ }
402
+ if (entry.isDirectory()) {
403
+ return listCacheFiles(absolutePath, syncPath);
404
+ }
405
+ return entry.isFile() ? [syncPath] : [];
406
+ })
407
+ );
408
+ return paths.flat();
409
+ }
410
+ async function ensureOwnedCacheRoot(cacheRoot) {
411
+ const markerPath = path.join(cacheRoot, cacheMarkerFileName);
412
+ try {
413
+ const markerStat = await lstat(markerPath);
414
+ if (markerStat.isSymbolicLink() || !markerStat.isFile()) {
415
+ throw new Error(
416
+ "@nextop-os/ui-system dev cacheDir contains an unsafe ownership marker"
417
+ );
418
+ }
419
+ return;
420
+ } catch (error) {
421
+ if (!isNotFoundError(error)) {
422
+ throw error;
423
+ }
424
+ }
425
+ const entries = await readdir(cacheRoot);
426
+ if (entries.length > 0) {
427
+ throw new Error(
428
+ "@nextop-os/ui-system dev cacheDir must be empty or contain a Nextop UI cache marker before stale cleanup"
429
+ );
430
+ }
431
+ await writeFile(
432
+ markerPath,
433
+ JSON.stringify({ packageName, cache: "ui-system-dev" }, null, 2)
434
+ );
435
+ }
436
+ function resolveCacheFile(cacheRoot, syncPath) {
437
+ const normalized = normalizeSyncPath(syncPath);
438
+ if (normalized === null) {
439
+ throw new Error(
440
+ `Refusing to sync unsafe @nextop-os/ui-system path: ${syncPath}`
441
+ );
442
+ }
443
+ const destination = path.resolve(cacheRoot, normalized);
444
+ const relative = path.relative(cacheRoot, destination);
445
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
446
+ throw new Error(`Refusing to sync @nextop-os/ui-system path: ${syncPath}`);
447
+ }
448
+ return destination;
449
+ }
450
+ async function ensureNoSymlinkAncestors(root, target) {
451
+ const relative = path.relative(root, target);
452
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
453
+ throw new Error("@nextop-os/ui-system dev cache path escaped cacheDir");
454
+ }
455
+ const segments = relative === "" ? [] : relative.split(path.sep);
456
+ let current = root;
457
+ for (const segment of segments) {
458
+ current = path.join(current, segment);
459
+ try {
460
+ const stat = await lstat(current);
461
+ if (stat.isSymbolicLink()) {
462
+ throw new Error(
463
+ `Refusing symlink in @nextop-os/ui-system dev cache path: ${current}`
464
+ );
465
+ }
466
+ } catch (error) {
467
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
468
+ return;
469
+ }
470
+ throw error;
471
+ }
472
+ }
473
+ }
474
+ async function rejectExistingSymlink(filePath) {
475
+ try {
476
+ const stat = await lstat(filePath);
477
+ if (stat.isSymbolicLink() || !stat.isFile()) {
478
+ throw new Error(
479
+ `Refusing unsafe @nextop-os/ui-system cache file: ${filePath}`
480
+ );
481
+ }
482
+ } catch (error) {
483
+ if (isNotFoundError(error)) {
484
+ return;
485
+ }
486
+ throw error;
487
+ }
488
+ }
489
+ function isNotFoundError(error) {
490
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
491
+ }
492
+ function isPathInside(root, target) {
493
+ const relative = path.relative(root, target);
494
+ return relative === "" || !relative.startsWith("..") && !path.isAbsolute(relative);
495
+ }
496
+ function normalizeSyncPath(input) {
497
+ if (input.includes("\0")) {
498
+ return null;
499
+ }
500
+ const slashPath = input.replaceAll("\\", "/").replace(/^\/+/, "");
501
+ const normalized = path.posix.normalize(slashPath);
502
+ if (normalized === "." || normalized.startsWith("../") || normalized.split("/").includes("..")) {
503
+ return null;
504
+ }
505
+ return normalized;
506
+ }
507
+ function encodeSyncPath(syncPath) {
508
+ return syncPath.split("/").map(encodeURIComponent).join("/");
509
+ }
510
+ function hashBytes(bytes) {
511
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
512
+ }
513
+ function normalizeServerUrl(serverUrl) {
514
+ return new URL(serverUrl);
515
+ }
516
+ function eventUrl(serverUrl) {
517
+ const url = new URL("/events", serverUrl);
518
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
519
+ return url.href;
520
+ }
521
+ function entrypointAlias(entrypoint) {
522
+ const specifier = entrypoint === "." ? packageName : `${packageName}${entrypoint.slice(1)}`;
523
+ return new RegExp(`^${escapeRegExp(specifier)}$`);
524
+ }
525
+ function isCacheImporter(state, importer) {
526
+ if (state === null || importer === void 0) {
527
+ return false;
528
+ }
529
+ const importerPath = stripViteIdQuery(importer);
530
+ if (!path.isAbsolute(importerPath)) {
531
+ return false;
532
+ }
533
+ return isPathInside(state.cacheRoot, path.resolve(importerPath));
534
+ }
535
+ function stripViteIdQuery(id) {
536
+ const [pathWithoutQuery = ""] = id.split("?", 1);
537
+ return pathWithoutQuery;
538
+ }
539
+ function packageContextImporter() {
540
+ return fileURLToPath(new URL("../styles/index.css", import.meta.url));
541
+ }
542
+ function resolvePackageStyleDependency(dependencyName) {
543
+ const packageDirectory = findDependencyPackageDirectory(dependencyName);
544
+ const manifest = JSON.parse(
545
+ readFileSync(path.join(packageDirectory, "package.json"), "utf8")
546
+ );
547
+ const styleExport = manifest.exports?.["."]?.style;
548
+ if (typeof styleExport !== "string") {
549
+ throw new Error(`${dependencyName} does not expose a style export`);
550
+ }
551
+ return path.join(packageDirectory, styleExport);
552
+ }
553
+ function findDependencyPackageDirectory(dependencyName) {
554
+ const searchPaths = packageRequire.resolve.paths(dependencyName) ?? [];
555
+ for (const searchPath of searchPaths) {
556
+ const packageDirectory = path.join(searchPath, dependencyName);
557
+ try {
558
+ const manifest = JSON.parse(
559
+ readFileSync(path.join(packageDirectory, "package.json"), "utf8")
560
+ );
561
+ if (manifest.name === dependencyName) {
562
+ return packageDirectory;
563
+ }
564
+ } catch {
565
+ }
566
+ }
567
+ throw new Error(`Could not resolve ${dependencyName} from ${packageName}`);
568
+ }
569
+ function dependencyAlias(dependencyName) {
570
+ return new RegExp(`^${escapeRegExp(dependencyName)}$`);
571
+ }
572
+ function escapeRegExp(input) {
573
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
574
+ }
575
+ export {
576
+ nextopUISystemDev
577
+ };
578
+ //# sourceMappingURL=dev-vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugins/vite.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport {\n lstat,\n mkdir,\n readdir,\n readFile,\n realpath,\n rm,\n writeFile\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { WebSocket } from \"ws\";\n\nimport type {\n UISystemDevEvent,\n UISystemDevFile,\n UISystemDevManifest\n} from \"../dev-server/protocol.js\";\n\nexport type NextopUISystemDevOptions = {\n serverUrl?: string;\n cacheDir?: string;\n};\n\nconst defaultServerUrl = \"http://127.0.0.1:4100\";\nconst defaultCacheDir = \".nextop-ui-system-dev\";\nconst cacheMarkerFileName = \".nextop-ui-system-dev-cache\";\nconst packageName = \"@nextop-os/ui-system\";\nconst packageRequire = createRequire(import.meta.url);\nconst stableEntrypoints = [\n \".\",\n \"./components\",\n \"./icons\",\n \"./styles.css\",\n \"./utils\"\n] as const;\nconst packageDependencyAliases = [\n \"class-variance-authority\",\n \"clsx\",\n \"lucide-react\",\n \"radix-ui\",\n \"react-resizable-panels\",\n \"tailwind-merge\"\n] as const;\nconst packageStyleDependencyAliases = [\"tw-animate-css\"] as const;\nconst packageDependencyAliasSet = new Set<string>(packageDependencyAliases);\nconst packageStyleDependencyAliasSet = new Set<string>(\n packageStyleDependencyAliases\n);\n\ntype StableEntrypoint = (typeof stableEntrypoints)[number];\ntype DevSyncState = {\n cacheRoot: string;\n realCacheRoot: string;\n serverUrl: URL;\n};\n\nexport function nextopUISystemDev(\n options: NextopUISystemDevOptions = {}\n): Plugin {\n const serverUrl = normalizeServerUrl(options.serverUrl ?? defaultServerUrl);\n const cacheDir = options.cacheDir ?? defaultCacheDir;\n let syncState: DevSyncState | null = null;\n\n return {\n name: \"nextop-ui-system-dev\",\n async config(config, env) {\n if (env.command !== \"serve\") {\n syncState = null;\n return {};\n }\n\n if (!(await probeHealth(serverUrl))) {\n syncState = null;\n return {};\n }\n\n const projectRoot = path.resolve(config.root ?? process.cwd());\n const cacheState = await prepareCacheRoot(projectRoot, cacheDir);\n const manifest = await fetchJson<UISystemDevManifest>(\n serverUrl,\n \"/manifest\"\n );\n\n validateManifest(manifest);\n await syncFiles(serverUrl, cacheState);\n await fetchComponentsMetadata(serverUrl);\n syncState = { ...cacheState, serverUrl };\n\n return {\n resolve: {\n alias: stableEntrypoints\n .map((entrypoint) => ({\n find: entrypointAlias(entrypoint),\n replacement: path.join(\n cacheState.cacheRoot,\n manifest.entrypoints[entrypoint]\n )\n }))\n .concat(\n packageStyleDependencyAliases.map((dependencyName) => ({\n find: dependencyAlias(dependencyName),\n replacement: dependencyName,\n customResolver: (\n _source: string,\n importer: string | undefined\n ) =>\n isCacheImporter(syncState, importer)\n ? resolvePackageStyleDependency(dependencyName)\n : null\n }))\n )\n }\n };\n },\n async resolveId(source, importer) {\n if (syncState === null || !isCacheImporter(syncState, importer)) {\n return null;\n }\n\n if (packageDependencyAliasSet.has(source)) {\n return packageRequire.resolve(source);\n }\n\n if (packageStyleDependencyAliasSet.has(source)) {\n const resolved = await this.resolve(source, packageContextImporter(), {\n skipSelf: true\n });\n\n return resolved?.id ?? null;\n }\n\n return null;\n },\n configureServer(server) {\n if (syncState === null) {\n return;\n }\n\n subscribeToEvents(server, syncState);\n }\n };\n}\n\nasync function probeHealth(serverUrl: URL): Promise<boolean> {\n try {\n const response = await fetch(new URL(\"/health\", serverUrl));\n\n if (!response.ok) {\n return false;\n }\n\n const payload = (await response.json()) as { packageName?: unknown };\n\n return payload.packageName === packageName;\n } catch {\n return false;\n }\n}\n\nasync function syncFiles(\n serverUrl: URL,\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">\n): Promise<void> {\n const files = await fetchJson<UISystemDevFile[]>(serverUrl, \"/files\");\n\n if (!Array.isArray(files)) {\n throw new Error(\"@nextop-os/ui-system dev server returned invalid files list\");\n }\n\n const syncPaths = new Set<string>();\n\n await Promise.all(\n files.map(async (file) => {\n validateSyncFile(file);\n syncPaths.add(file.path);\n\n const destination = resolveCacheFile(cacheState.cacheRoot, file.path);\n await prepareCacheFileTarget(cacheState, destination);\n\n const currentHash = await readCachedHash(destination);\n\n if (currentHash === file.hash) {\n return;\n }\n\n const bytes = await fetchFile(serverUrl, file.path);\n const downloadedHash = hashBytes(bytes);\n\n if (downloadedHash !== file.hash) {\n throw new Error(\n `Hash mismatch while syncing @nextop-os/ui-system file: ${file.path}`\n );\n }\n\n await writeFile(destination, bytes);\n })\n );\n\n await removeStaleCacheFiles(cacheState, syncPaths);\n}\n\nasync function syncChangedFile(\n server: ViteDevServer,\n state: DevSyncState,\n event: Extract<UISystemDevEvent, { type: \"fileChanged\" }>\n): Promise<void> {\n validateEventPath(event.path);\n\n const destination = resolveCacheFile(state.cacheRoot, event.path);\n await prepareCacheFileTarget(state, destination);\n\n const bytes = await fetchFile(state.serverUrl, event.path);\n const downloadedHash = hashBytes(bytes);\n\n if (downloadedHash !== event.hash) {\n throw new Error(\n `Hash mismatch while syncing @nextop-os/ui-system file: ${event.path}`\n );\n }\n\n await writeFile(destination, bytes);\n invalidateFile(server, destination);\n}\n\nasync function removeDeletedFile(\n server: ViteDevServer,\n state: DevSyncState,\n event: Extract<UISystemDevEvent, { type: \"fileDeleted\" }>\n): Promise<void> {\n validateEventPath(event.path);\n\n const destination = resolveCacheFile(state.cacheRoot, event.path);\n\n invalidateFile(server, destination);\n await removeCacheFile(state, destination);\n}\n\nfunction subscribeToEvents(server: ViteDevServer, state: DevSyncState): void {\n let closed = false;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let websocket: WebSocket | null = null;\n\n const close = (): void => {\n closed = true;\n\n if (reconnectTimer !== null) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n\n websocket?.close();\n websocket = null;\n };\n\n const reconnect = (): void => {\n if (closed || reconnectTimer !== null) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n connect();\n }, 1000);\n };\n\n const connect = (): void => {\n if (closed) {\n return;\n }\n\n websocket = new WebSocket(eventUrl(state.serverUrl));\n\n websocket.on(\"message\", (message) => {\n void handleEventMessage(server, state, message).catch(() => {\n // Event sync is best-effort; the initial HTTP sync remains authoritative.\n });\n });\n\n websocket.on(\"close\", reconnect);\n websocket.on(\"error\", () => {\n websocket?.close();\n });\n };\n\n connect();\n server.httpServer?.once(\"close\", close);\n}\n\nasync function handleEventMessage(\n server: ViteDevServer,\n state: DevSyncState,\n message: WebSocket.RawData\n): Promise<void> {\n const event = parseEvent(message);\n\n if (event === null) {\n return;\n }\n\n if (event.type === \"fileChanged\") {\n await syncChangedFile(server, state, event);\n return;\n }\n\n if (event.type === \"fileDeleted\") {\n await removeDeletedFile(server, state, event);\n }\n}\n\nfunction parseEvent(message: WebSocket.RawData): UISystemDevEvent | null {\n try {\n const event = JSON.parse(rawMessageToString(message)) as UISystemDevEvent;\n\n if (!isDevEvent(event)) {\n return null;\n }\n\n return event;\n } catch {\n return null;\n }\n}\n\nfunction rawMessageToString(message: WebSocket.RawData): string {\n if (Buffer.isBuffer(message)) {\n return message.toString(\"utf8\");\n }\n\n if (Array.isArray(message)) {\n return Buffer.concat(message).toString(\"utf8\");\n }\n\n return Buffer.from(message).toString(\"utf8\");\n}\n\nfunction isDevEvent(event: UISystemDevEvent): event is UISystemDevEvent {\n if (event === null || typeof event !== \"object\") {\n return false;\n }\n\n if (event.type === \"fileChanged\") {\n return typeof event.path === \"string\" && typeof event.hash === \"string\";\n }\n\n if (event.type === \"fileDeleted\") {\n return typeof event.path === \"string\";\n }\n\n return event.type === \"manifestChanged\" || event.type === \"componentsChanged\";\n}\n\nfunction invalidateFile(server: ViteDevServer, filePath: string): void {\n const modules = server.moduleGraph.getModulesByFile(filePath);\n\n if (modules === undefined) {\n return;\n }\n\n for (const moduleNode of modules) {\n server.moduleGraph.invalidateModule(moduleNode);\n }\n}\n\nasync function fetchComponentsMetadata(serverUrl: URL): Promise<void> {\n try {\n await fetchJson<unknown>(serverUrl, \"/components\");\n } catch {\n // Component diagnostics are best-effort; source sync and aliases are sufficient.\n }\n}\n\nasync function fetchJson<T>(serverUrl: URL, endpoint: string): Promise<T> {\n const response = await fetch(new URL(endpoint, serverUrl));\n\n if (!response.ok) {\n throw new Error(\n `@nextop-os/ui-system dev server ${endpoint} failed with ${response.status}`\n );\n }\n\n return (await response.json()) as T;\n}\n\nasync function fetchFile(serverUrl: URL, syncPath: string): Promise<Buffer> {\n const response = await fetch(\n new URL(`/files/${encodeSyncPath(syncPath)}`, serverUrl)\n );\n\n if (!response.ok) {\n throw new Error(\n `@nextop-os/ui-system dev server file fetch failed for ${syncPath}`\n );\n }\n\n return Buffer.from(await response.arrayBuffer());\n}\n\nasync function readCachedHash(filePath: string): Promise<string | null> {\n try {\n return hashBytes(await readFile(filePath));\n } catch {\n return null;\n }\n}\n\nfunction validateManifest(\n manifest: UISystemDevManifest\n): asserts manifest is UISystemDevManifest & {\n entrypoints: Record<StableEntrypoint, string>;\n} {\n if (\n manifest === null ||\n typeof manifest !== \"object\" ||\n manifest.packageName !== packageName ||\n typeof manifest.entrypoints !== \"object\" ||\n manifest.entrypoints === null\n ) {\n throw new Error(\"@nextop-os/ui-system dev server returned invalid manifest\");\n }\n\n for (const entrypoint of stableEntrypoints) {\n const syncPath = manifest.entrypoints[entrypoint];\n\n if (typeof syncPath !== \"string\" || normalizeSyncPath(syncPath) === null) {\n throw new Error(\n `@nextop-os/ui-system dev server manifest is missing ${entrypoint}`\n );\n }\n }\n}\n\nfunction validateSyncFile(file: UISystemDevFile): void {\n if (\n file === null ||\n typeof file !== \"object\" ||\n typeof file.path !== \"string\" ||\n typeof file.hash !== \"string\" ||\n typeof file.size !== \"number\" ||\n normalizeSyncPath(file.path) === null\n ) {\n throw new Error(\"@nextop-os/ui-system dev server returned invalid file entry\");\n }\n}\n\nfunction validateEventPath(syncPath: string): void {\n if (normalizeSyncPath(syncPath) === null) {\n throw new Error(\n `Refusing unsafe @nextop-os/ui-system event path: ${syncPath}`\n );\n }\n}\n\nasync function prepareCacheRoot(\n projectRoot: string,\n cacheDir: string\n): Promise<Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">> {\n const cacheRoot = resolveCacheRoot(projectRoot, cacheDir);\n\n await ensureNoSymlinkAncestors(projectRoot, path.dirname(cacheRoot));\n await mkdir(cacheRoot, { recursive: true });\n await ensureNoSymlinkAncestors(projectRoot, cacheRoot);\n\n const cacheStat = await lstat(cacheRoot);\n\n if (!cacheStat.isDirectory() || cacheStat.isSymbolicLink()) {\n throw new Error(\"@nextop-os/ui-system dev cacheDir must be a real directory\");\n }\n\n const realProjectRoot = await realpath(projectRoot);\n const realCacheRoot = await realpath(cacheRoot);\n\n if (!isPathInside(realProjectRoot, realCacheRoot)) {\n throw new Error(\n \"@nextop-os/ui-system dev cacheDir must resolve inside the Vite project root\"\n );\n }\n\n await ensureOwnedCacheRoot(cacheRoot);\n\n return { cacheRoot, realCacheRoot };\n}\n\nfunction resolveCacheRoot(projectRoot: string, cacheDir: string): string {\n const cacheRoot = path.resolve(projectRoot, cacheDir);\n const relative = path.relative(projectRoot, cacheRoot);\n\n if (\n relative === \"\" ||\n relative.startsWith(\"..\") ||\n path.isAbsolute(relative)\n ) {\n throw new Error(\n \"@nextop-os/ui-system dev cacheDir must resolve inside the Vite project root\"\n );\n }\n\n return cacheRoot;\n}\n\nasync function prepareCacheFileTarget(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n destination: string\n): Promise<void> {\n const parent = path.dirname(destination);\n\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n await mkdir(parent, { recursive: true });\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n\n const realParent = await realpath(parent);\n\n if (!isPathInside(cacheState.realCacheRoot, realParent)) {\n throw new Error(\n \"@nextop-os/ui-system dev cache file resolved outside cacheDir\"\n );\n }\n\n await rejectExistingSymlink(destination);\n}\n\nasync function removeCacheFile(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n destination: string\n): Promise<void> {\n const parent = path.dirname(destination);\n\n await ensureNoSymlinkAncestors(cacheState.cacheRoot, parent);\n\n const realParent = await realpath(parent).catch(() => null);\n\n if (\n realParent === null ||\n !isPathInside(cacheState.realCacheRoot, realParent)\n ) {\n throw new Error(\n \"@nextop-os/ui-system dev cache file resolved outside cacheDir\"\n );\n }\n\n await rejectExistingSymlink(destination);\n await rm(destination, { force: true });\n}\n\nasync function removeStaleCacheFiles(\n cacheState: Pick<DevSyncState, \"cacheRoot\" | \"realCacheRoot\">,\n authoritativePaths: Set<string>\n): Promise<void> {\n await ensureOwnedCacheRoot(cacheState.cacheRoot);\n\n const cachedFiles = await listCacheFiles(cacheState.cacheRoot);\n\n await Promise.all(\n cachedFiles.map(async (cachedFile) => {\n if (authoritativePaths.has(cachedFile)) {\n return;\n }\n\n await removeCacheFile(\n cacheState,\n resolveCacheFile(cacheState.cacheRoot, cachedFile)\n );\n })\n );\n}\n\nasync function listCacheFiles(\n directory: string,\n prefix = \"\"\n): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const paths = await Promise.all(\n entries.map(async (entry) => {\n const syncPath = prefix === \"\" ? entry.name : `${prefix}/${entry.name}`;\n const absolutePath = path.join(directory, entry.name);\n\n if (syncPath === cacheMarkerFileName) {\n return [];\n }\n\n if (entry.isSymbolicLink()) {\n throw new Error(\n `Refusing symlink in @nextop-os/ui-system dev cache: ${syncPath}`\n );\n }\n\n if (entry.isDirectory()) {\n return listCacheFiles(absolutePath, syncPath);\n }\n\n return entry.isFile() ? [syncPath] : [];\n })\n );\n\n return paths.flat();\n}\n\nasync function ensureOwnedCacheRoot(cacheRoot: string): Promise<void> {\n const markerPath = path.join(cacheRoot, cacheMarkerFileName);\n\n try {\n const markerStat = await lstat(markerPath);\n\n if (markerStat.isSymbolicLink() || !markerStat.isFile()) {\n throw new Error(\n \"@nextop-os/ui-system dev cacheDir contains an unsafe ownership marker\"\n );\n }\n\n return;\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n\n const entries = await readdir(cacheRoot);\n\n if (entries.length > 0) {\n throw new Error(\n \"@nextop-os/ui-system dev cacheDir must be empty or contain a Nextop UI cache marker before stale cleanup\"\n );\n }\n\n await writeFile(\n markerPath,\n JSON.stringify({ packageName, cache: \"ui-system-dev\" }, null, 2)\n );\n}\n\nfunction resolveCacheFile(cacheRoot: string, syncPath: string): string {\n const normalized = normalizeSyncPath(syncPath);\n\n if (normalized === null) {\n throw new Error(\n `Refusing to sync unsafe @nextop-os/ui-system path: ${syncPath}`\n );\n }\n\n const destination = path.resolve(cacheRoot, normalized);\n const relative = path.relative(cacheRoot, destination);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Refusing to sync @nextop-os/ui-system path: ${syncPath}`);\n }\n\n return destination;\n}\n\nasync function ensureNoSymlinkAncestors(\n root: string,\n target: string\n): Promise<void> {\n const relative = path.relative(root, target);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(\"@nextop-os/ui-system dev cache path escaped cacheDir\");\n }\n\n const segments = relative === \"\" ? [] : relative.split(path.sep);\n let current = root;\n\n for (const segment of segments) {\n current = path.join(current, segment);\n\n try {\n const stat = await lstat(current);\n\n if (stat.isSymbolicLink()) {\n throw new Error(\n `Refusing symlink in @nextop-os/ui-system dev cache path: ${current}`\n );\n }\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return;\n }\n\n throw error;\n }\n }\n}\n\nasync function rejectExistingSymlink(filePath: string): Promise<void> {\n try {\n const stat = await lstat(filePath);\n\n if (stat.isSymbolicLink() || !stat.isFile()) {\n throw new Error(\n `Refusing unsafe @nextop-os/ui-system cache file: ${filePath}`\n );\n }\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n\n throw error;\n }\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isPathInside(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n}\n\nfunction normalizeSyncPath(input: string): string | null {\n if (input.includes(\"\\0\")) {\n return null;\n }\n\n const slashPath = input.replaceAll(\"\\\\\", \"/\").replace(/^\\/+/, \"\");\n const normalized = path.posix.normalize(slashPath);\n\n if (\n normalized === \".\" ||\n normalized.startsWith(\"../\") ||\n normalized.split(\"/\").includes(\"..\")\n ) {\n return null;\n }\n\n return normalized;\n}\n\nfunction encodeSyncPath(syncPath: string): string {\n return syncPath.split(\"/\").map(encodeURIComponent).join(\"/\");\n}\n\nfunction hashBytes(bytes: Buffer): string {\n return `sha256:${createHash(\"sha256\").update(bytes).digest(\"hex\")}`;\n}\n\nfunction normalizeServerUrl(serverUrl: string): URL {\n return new URL(serverUrl);\n}\n\nfunction eventUrl(serverUrl: URL): string {\n const url = new URL(\"/events\", serverUrl);\n\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n\n return url.href;\n}\n\nfunction entrypointAlias(entrypoint: StableEntrypoint): RegExp {\n const specifier =\n entrypoint === \".\" ? packageName : `${packageName}${entrypoint.slice(1)}`;\n\n return new RegExp(`^${escapeRegExp(specifier)}$`);\n}\n\nfunction isCacheImporter(\n state: DevSyncState | null,\n importer: string | undefined\n): boolean {\n if (state === null || importer === undefined) {\n return false;\n }\n\n const importerPath = stripViteIdQuery(importer);\n\n if (!path.isAbsolute(importerPath)) {\n return false;\n }\n\n return isPathInside(state.cacheRoot, path.resolve(importerPath));\n}\n\nfunction stripViteIdQuery(id: string): string {\n const [pathWithoutQuery = \"\"] = id.split(\"?\", 1);\n\n return pathWithoutQuery;\n}\n\nfunction packageContextImporter(): string {\n return fileURLToPath(new URL(\"../styles/index.css\", import.meta.url));\n}\n\nfunction resolvePackageStyleDependency(dependencyName: string): string {\n const packageDirectory = findDependencyPackageDirectory(dependencyName);\n const manifest = JSON.parse(\n readFileSync(path.join(packageDirectory, \"package.json\"), \"utf8\")\n ) as {\n exports?: {\n \".\"?: {\n style?: unknown;\n };\n };\n };\n const styleExport = manifest.exports?.[\".\"]?.style;\n\n if (typeof styleExport !== \"string\") {\n throw new Error(`${dependencyName} does not expose a style export`);\n }\n\n return path.join(packageDirectory, styleExport);\n}\n\nfunction findDependencyPackageDirectory(dependencyName: string): string {\n const searchPaths = packageRequire.resolve.paths(dependencyName) ?? [];\n\n for (const searchPath of searchPaths) {\n const packageDirectory = path.join(searchPath, dependencyName);\n\n try {\n const manifest = JSON.parse(\n readFileSync(path.join(packageDirectory, \"package.json\"), \"utf8\")\n ) as { name?: unknown };\n\n if (manifest.name === dependencyName) {\n return packageDirectory;\n }\n } catch {\n // Try the next Node resolution search path.\n }\n }\n\n throw new Error(`Could not resolve ${dependencyName} from ${packageName}`);\n}\n\nfunction dependencyAlias(dependencyName: string): RegExp {\n return new RegExp(`^${escapeRegExp(dependencyName)}$`);\n}\n\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],"mappings":"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","names":[]}