@ryndesign/preview 0.1.1 → 0.1.2
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.cjs +3 -289
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -293
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -5,9 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __esm = (fn, res) => function __init() {
|
|
9
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
-
};
|
|
11
8
|
var __export = (target, all) => {
|
|
12
9
|
for (var name in all)
|
|
13
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -30,289 +27,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
27
|
));
|
|
31
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
32
29
|
|
|
33
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/utils.js
|
|
34
|
-
var init_utils = __esm({
|
|
35
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/utils.js"() {
|
|
36
|
-
"use strict";
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.js
|
|
41
|
-
var init_composable_filters = __esm({
|
|
42
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.js"() {
|
|
43
|
-
"use strict";
|
|
44
|
-
init_utils();
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.js
|
|
49
|
-
var init_filter_vite_plugins = __esm({
|
|
50
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.js"() {
|
|
51
|
-
"use strict";
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.js
|
|
56
|
-
function exactRegex(str, flags) {
|
|
57
|
-
return new RegExp(`^${escapeRegex(str)}$`, flags);
|
|
58
|
-
}
|
|
59
|
-
function escapeRegex(str) {
|
|
60
|
-
return str.replace(escapeRegexRE, "\\$&");
|
|
61
|
-
}
|
|
62
|
-
function makeIdFiltersToMatchWithQuery(input) {
|
|
63
|
-
if (!Array.isArray(input)) {
|
|
64
|
-
return makeIdFilterToMatchWithQuery(
|
|
65
|
-
// Array.isArray cannot narrow the type
|
|
66
|
-
// https://github.com/microsoft/TypeScript/issues/17002
|
|
67
|
-
input
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
return input.map((i) => makeIdFilterToMatchWithQuery(i));
|
|
71
|
-
}
|
|
72
|
-
function makeIdFilterToMatchWithQuery(input) {
|
|
73
|
-
if (typeof input === "string") {
|
|
74
|
-
return `${input}{?*,}`;
|
|
75
|
-
}
|
|
76
|
-
return makeRegexIdFilterToMatchWithQuery(input);
|
|
77
|
-
}
|
|
78
|
-
function makeRegexIdFilterToMatchWithQuery(input) {
|
|
79
|
-
return new RegExp(
|
|
80
|
-
// replace `$` with `(?:\?.*)?$` (ignore `\$`)
|
|
81
|
-
input.source.replace(/(?<!\\)\$/g, "(?:\\?.*)?$"),
|
|
82
|
-
input.flags
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
var escapeRegexRE;
|
|
86
|
-
var init_simple_filters = __esm({
|
|
87
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.js"() {
|
|
88
|
-
"use strict";
|
|
89
|
-
escapeRegexRE = /[-/\\^$*+?.()|[\]{}]/g;
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/index.js
|
|
94
|
-
var init_filter = __esm({
|
|
95
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/index.js"() {
|
|
96
|
-
"use strict";
|
|
97
|
-
init_composable_filters();
|
|
98
|
-
init_filter_vite_plugins();
|
|
99
|
-
init_simple_filters();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/index.js
|
|
104
|
-
var init_dist = __esm({
|
|
105
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/index.js"() {
|
|
106
|
-
"use strict";
|
|
107
|
-
init_filter();
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
// ../../node_modules/.pnpm/@vitejs+plugin-react@6.0.1_vite@6.4.1_@types+node@25.5.0_jiti@2.6.1_/node_modules/@vitejs/plugin-react/dist/index.js
|
|
112
|
-
var dist_exports = {};
|
|
113
|
-
__export(dist_exports, {
|
|
114
|
-
default: () => viteReact,
|
|
115
|
-
"module.exports": () => viteReactForCjs,
|
|
116
|
-
reactCompilerPreset: () => reactCompilerPreset
|
|
117
|
-
});
|
|
118
|
-
function virtualPreamblePlugin({ name, isEnabled }) {
|
|
119
|
-
return {
|
|
120
|
-
name: "vite:react-virtual-preamble",
|
|
121
|
-
resolveId: {
|
|
122
|
-
order: "pre",
|
|
123
|
-
filter: { id: exactRegex(name) },
|
|
124
|
-
handler(source) {
|
|
125
|
-
if (source === name) return "\0" + source;
|
|
126
|
-
}
|
|
127
|
-
},
|
|
128
|
-
load: {
|
|
129
|
-
filter: { id: exactRegex("\0" + name) },
|
|
130
|
-
handler(id) {
|
|
131
|
-
if (id === "\0" + name) {
|
|
132
|
-
if (isEnabled()) return preambleCode.replace("__BASE__", "/");
|
|
133
|
-
return "";
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
function viteReact(opts = {}) {
|
|
140
|
-
const include = opts.include ?? defaultIncludeRE;
|
|
141
|
-
const exclude = opts.exclude ?? defaultExcludeRE;
|
|
142
|
-
const jsxImportSource = opts.jsxImportSource ?? "react";
|
|
143
|
-
const jsxImportRuntime = `${jsxImportSource}/jsx-runtime`;
|
|
144
|
-
const jsxImportDevRuntime = `${jsxImportSource}/jsx-dev-runtime`;
|
|
145
|
-
let runningInVite = false;
|
|
146
|
-
let isProduction = true;
|
|
147
|
-
let skipFastRefresh = true;
|
|
148
|
-
let base;
|
|
149
|
-
let isBundledDev = false;
|
|
150
|
-
const viteBabel = {
|
|
151
|
-
name: "vite:react-babel",
|
|
152
|
-
enforce: "pre",
|
|
153
|
-
config(_userConfig, { command }) {
|
|
154
|
-
if (opts.jsxRuntime === "classic") return { oxc: {
|
|
155
|
-
jsx: {
|
|
156
|
-
runtime: "classic",
|
|
157
|
-
refresh: command === "serve"
|
|
158
|
-
},
|
|
159
|
-
jsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),
|
|
160
|
-
jsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)
|
|
161
|
-
} };
|
|
162
|
-
else return {
|
|
163
|
-
oxc: {
|
|
164
|
-
jsx: {
|
|
165
|
-
runtime: "automatic",
|
|
166
|
-
importSource: opts.jsxImportSource,
|
|
167
|
-
refresh: command === "serve"
|
|
168
|
-
},
|
|
169
|
-
jsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),
|
|
170
|
-
jsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)
|
|
171
|
-
},
|
|
172
|
-
optimizeDeps: { rolldownOptions: { transform: { jsx: { runtime: "automatic" } } } }
|
|
173
|
-
};
|
|
174
|
-
},
|
|
175
|
-
configResolved(config) {
|
|
176
|
-
runningInVite = true;
|
|
177
|
-
base = config.base;
|
|
178
|
-
if (config.experimental.bundledDev) isBundledDev = true;
|
|
179
|
-
isProduction = config.isProduction;
|
|
180
|
-
skipFastRefresh = isProduction || config.command === "build" || config.server.hmr === false;
|
|
181
|
-
},
|
|
182
|
-
options(options) {
|
|
183
|
-
if (!runningInVite) {
|
|
184
|
-
options.transform ??= {};
|
|
185
|
-
options.transform.jsx = {
|
|
186
|
-
runtime: opts.jsxRuntime,
|
|
187
|
-
importSource: opts.jsxImportSource
|
|
188
|
-
};
|
|
189
|
-
return options;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
const viteRefreshWrapper = {
|
|
194
|
-
name: "vite:react:refresh-wrapper",
|
|
195
|
-
apply: "serve",
|
|
196
|
-
async applyToEnvironment(env) {
|
|
197
|
-
if (env.config.consumer !== "client" || skipFastRefresh) return false;
|
|
198
|
-
return (0, import_internal.reactRefreshWrapperPlugin)({
|
|
199
|
-
cwd: process.cwd(),
|
|
200
|
-
include: makeIdFiltersToMatchWithQuery(include),
|
|
201
|
-
exclude: makeIdFiltersToMatchWithQuery(exclude),
|
|
202
|
-
jsxImportSource,
|
|
203
|
-
reactRefreshHost: opts.reactRefreshHost ?? ""
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
const viteConfigPost = {
|
|
208
|
-
name: "vite:react:config-post",
|
|
209
|
-
enforce: "post",
|
|
210
|
-
config(userConfig) {
|
|
211
|
-
if (userConfig.server?.hmr === false) return { oxc: { jsx: { refresh: false } } };
|
|
212
|
-
}
|
|
213
|
-
};
|
|
214
|
-
const viteReactRefreshBundledDevMode = {
|
|
215
|
-
name: "vite:react-refresh-fbm",
|
|
216
|
-
enforce: "pre",
|
|
217
|
-
transformIndexHtml: {
|
|
218
|
-
handler() {
|
|
219
|
-
if (!skipFastRefresh && isBundledDev) return [{
|
|
220
|
-
tag: "script",
|
|
221
|
-
attrs: { type: "module" },
|
|
222
|
-
children: getPreambleCode(base)
|
|
223
|
-
}];
|
|
224
|
-
},
|
|
225
|
-
order: "pre"
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
const dependencies = [
|
|
229
|
-
"react",
|
|
230
|
-
"react-dom",
|
|
231
|
-
jsxImportDevRuntime,
|
|
232
|
-
jsxImportRuntime
|
|
233
|
-
];
|
|
234
|
-
return [
|
|
235
|
-
viteBabel,
|
|
236
|
-
viteRefreshWrapper,
|
|
237
|
-
viteConfigPost,
|
|
238
|
-
viteReactRefreshBundledDevMode,
|
|
239
|
-
{
|
|
240
|
-
name: "vite:react-refresh",
|
|
241
|
-
enforce: "pre",
|
|
242
|
-
config: (userConfig) => ({
|
|
243
|
-
build: silenceUseClientWarning(userConfig),
|
|
244
|
-
optimizeDeps: { include: dependencies }
|
|
245
|
-
}),
|
|
246
|
-
resolveId: {
|
|
247
|
-
filter: { id: exactRegex(runtimePublicPath) },
|
|
248
|
-
handler(id) {
|
|
249
|
-
if (id === "/@react-refresh") return id;
|
|
250
|
-
}
|
|
251
|
-
},
|
|
252
|
-
load: {
|
|
253
|
-
filter: { id: exactRegex(runtimePublicPath) },
|
|
254
|
-
handler(id) {
|
|
255
|
-
if (id === "/@react-refresh") return (0, import_node_fs.readFileSync)(refreshRuntimePath, "utf-8").replace(/__README_URL__/g, "https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react");
|
|
256
|
-
}
|
|
257
|
-
},
|
|
258
|
-
transformIndexHtml() {
|
|
259
|
-
if (!skipFastRefresh && !isBundledDev) return [{
|
|
260
|
-
tag: "script",
|
|
261
|
-
attrs: { type: "module" },
|
|
262
|
-
children: getPreambleCode(base)
|
|
263
|
-
}];
|
|
264
|
-
}
|
|
265
|
-
},
|
|
266
|
-
virtualPreamblePlugin({
|
|
267
|
-
name: "@vitejs/plugin-react/preamble",
|
|
268
|
-
isEnabled: () => !skipFastRefresh && !isBundledDev
|
|
269
|
-
})
|
|
270
|
-
];
|
|
271
|
-
}
|
|
272
|
-
function viteReactForCjs(options) {
|
|
273
|
-
return viteReact.call(this, options);
|
|
274
|
-
}
|
|
275
|
-
var import_node_fs, import_node_path2, import_node_url, import_internal, import_meta, runtimePublicPath, preambleCode, getPreambleCode, silenceUseClientWarning, reactCompilerPreset, refreshRuntimePath, defaultIncludeRE, defaultExcludeRE;
|
|
276
|
-
var init_dist2 = __esm({
|
|
277
|
-
"../../node_modules/.pnpm/@vitejs+plugin-react@6.0.1_vite@6.4.1_@types+node@25.5.0_jiti@2.6.1_/node_modules/@vitejs/plugin-react/dist/index.js"() {
|
|
278
|
-
"use strict";
|
|
279
|
-
import_node_fs = require("fs");
|
|
280
|
-
import_node_path2 = require("path");
|
|
281
|
-
import_node_url = require("url");
|
|
282
|
-
init_dist();
|
|
283
|
-
import_internal = require("vite/internal");
|
|
284
|
-
import_meta = {};
|
|
285
|
-
runtimePublicPath = "/@react-refresh";
|
|
286
|
-
preambleCode = `import { injectIntoGlobalHook } from "__BASE__${runtimePublicPath.slice(1)}";
|
|
287
|
-
injectIntoGlobalHook(window);
|
|
288
|
-
window.$RefreshReg$ = () => {};
|
|
289
|
-
window.$RefreshSig$ = () => (type) => type;`;
|
|
290
|
-
getPreambleCode = (base) => preambleCode.replace("__BASE__", base);
|
|
291
|
-
silenceUseClientWarning = (userConfig) => ({ rollupOptions: { onwarn(warning, defaultHandler) {
|
|
292
|
-
if (warning.code === "MODULE_LEVEL_DIRECTIVE" && (warning.message.includes("use client") || warning.message.includes("use server"))) return;
|
|
293
|
-
if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) return;
|
|
294
|
-
if (userConfig.build?.rollupOptions?.onwarn) userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
|
|
295
|
-
else defaultHandler(warning);
|
|
296
|
-
} } });
|
|
297
|
-
reactCompilerPreset = (options = {}) => ({
|
|
298
|
-
preset: () => ({ plugins: [["babel-plugin-react-compiler", options]] }),
|
|
299
|
-
rolldown: {
|
|
300
|
-
filter: { code: options.compilationMode === "annotation" ? /['"]use memo['"]/ : /\b[A-Z]|\buse/ },
|
|
301
|
-
applyToEnvironmentHook: (env) => env.config.consumer === "client",
|
|
302
|
-
optimizeDeps: { include: options.target === "17" || options.target === "18" ? ["react-compiler-runtime"] : ["react/compiler-runtime"] }
|
|
303
|
-
}
|
|
304
|
-
});
|
|
305
|
-
refreshRuntimePath = (0, import_node_path2.join)((0, import_node_path2.dirname)((0, import_node_url.fileURLToPath)(import_meta.url)), "refresh-runtime.js");
|
|
306
|
-
defaultIncludeRE = /\.[tj]sx?$/;
|
|
307
|
-
defaultExcludeRE = /\/node_modules\//;
|
|
308
|
-
viteReact.preambleCode = preambleCode;
|
|
309
|
-
Object.assign(viteReactForCjs, {
|
|
310
|
-
default: viteReactForCjs,
|
|
311
|
-
reactCompilerPreset
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
});
|
|
315
|
-
|
|
316
30
|
// src/index.ts
|
|
317
31
|
var index_exports = {};
|
|
318
32
|
__export(index_exports, {
|
|
@@ -324,7 +38,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
324
38
|
var import_vite = require("vite");
|
|
325
39
|
var import_ws = require("ws");
|
|
326
40
|
var import_node_http = __toESM(require("http"), 1);
|
|
327
|
-
var
|
|
41
|
+
var import_node_path2 = __toESM(require("path"), 1);
|
|
328
42
|
|
|
329
43
|
// src/server/api-routes.ts
|
|
330
44
|
function setupApiRoutes(builder) {
|
|
@@ -641,12 +355,12 @@ async function startPreviewServer(options = {}) {
|
|
|
641
355
|
setupWsHandler(wss, builder);
|
|
642
356
|
let reactPlugin;
|
|
643
357
|
try {
|
|
644
|
-
const mod = await
|
|
358
|
+
const mod = await import("@vitejs/plugin-react");
|
|
645
359
|
reactPlugin = (mod.default ?? mod)();
|
|
646
360
|
} catch {
|
|
647
361
|
}
|
|
648
362
|
const vite = await (0, import_vite.createServer)({
|
|
649
|
-
root:
|
|
363
|
+
root: import_node_path2.default.resolve(__dirname, "../client"),
|
|
650
364
|
server: {
|
|
651
365
|
middlewareMode: true,
|
|
652
366
|
hmr: { server }
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/utils.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/index.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/index.js","../../../node_modules/.pnpm/@vitejs+plugin-react@6.0.1_vite@6.4.1_@types+node@25.5.0_jiti@2.6.1_/node_modules/@vitejs/plugin-react/dist/index.js","../src/index.ts","../src/server/index.ts","../src/server/api-routes.ts","../src/server/ws-handler.ts","../src/server/watcher.ts","../src/server/incremental-build.ts"],"sourcesContent":["const postfixRE = /[?#].*$/;\nexport function cleanUrl(url) {\n return url.replace(postfixRE, '');\n}\nexport function extractQueryWithoutFragment(url) {\n const questionMarkIndex = url.indexOf('?');\n if (questionMarkIndex === -1) {\n return '';\n }\n const fragmentIndex = url.indexOf('#', questionMarkIndex); // Search for # after ?\n if (fragmentIndex === -1) {\n return url.substring(questionMarkIndex);\n }\n else {\n return url.substring(questionMarkIndex, fragmentIndex);\n }\n}\n","import { cleanUrl, extractQueryWithoutFragment } from \"../utils.js\";\nclass And {\n kind;\n args;\n constructor(...args) {\n if (args.length === 0) {\n throw new Error('`And` expects at least one operand');\n }\n this.args = args;\n this.kind = 'and';\n }\n}\nclass Or {\n kind;\n args;\n constructor(...args) {\n if (args.length === 0) {\n throw new Error('`Or` expects at least one operand');\n }\n this.args = args;\n this.kind = 'or';\n }\n}\nclass Not {\n kind;\n expr;\n constructor(expr) {\n this.expr = expr;\n this.kind = 'not';\n }\n}\nclass Id {\n kind;\n pattern;\n params;\n constructor(pattern, params) {\n this.pattern = pattern;\n this.kind = 'id';\n this.params = params ?? {\n cleanUrl: false,\n };\n }\n}\nclass ImporterId {\n kind;\n pattern;\n params;\n constructor(pattern, params) {\n this.pattern = pattern;\n this.kind = 'importerId';\n this.params = params ?? {\n cleanUrl: false,\n };\n }\n}\nclass ModuleType {\n kind;\n pattern;\n constructor(pattern) {\n this.pattern = pattern;\n this.kind = 'moduleType';\n }\n}\nclass Code {\n kind;\n pattern;\n constructor(expr) {\n this.pattern = expr;\n this.kind = 'code';\n }\n}\nclass Query {\n kind;\n key;\n pattern;\n constructor(key, pattern) {\n this.pattern = pattern;\n this.key = key;\n this.kind = 'query';\n }\n}\nclass Include {\n kind;\n expr;\n constructor(expr) {\n this.expr = expr;\n this.kind = 'include';\n }\n}\nclass Exclude {\n kind;\n expr;\n constructor(expr) {\n this.expr = expr;\n this.kind = 'exclude';\n }\n}\nexport function and(...args) {\n return new And(...args);\n}\nexport function or(...args) {\n return new Or(...args);\n}\nexport function not(expr) {\n return new Not(expr);\n}\nexport function id(pattern, params) {\n return new Id(pattern, params);\n}\nexport function importerId(pattern, params) {\n return new ImporterId(pattern, params);\n}\nexport function moduleType(pattern) {\n return new ModuleType(pattern);\n}\nexport function code(pattern) {\n return new Code(pattern);\n}\n/*\n * There are three kinds of conditions are supported:\n * 1. `boolean`: if the value is `true`, the key must exist and be truthy. if the value is `false`, the key must not exist or be falsy.\n * 2. `string`: the key must exist and be equal to the value.\n * 3. `RegExp`: the key must exist and match the value.\n */\nexport function query(key, pattern) {\n return new Query(key, pattern);\n}\nexport function include(expr) {\n return new Include(expr);\n}\nexport function exclude(expr) {\n return new Exclude(expr);\n}\n/**\n * convert a queryObject to FilterExpression like\n * ```js\n * and(query(k1, v1), query(k2, v2))\n * ```\n * @param queryFilterObject The query filter object needs to be matched.\n * @returns a `And` FilterExpression\n */\nexport function queries(queryFilter) {\n let arr = Object.entries(queryFilter).map(([key, value]) => {\n return new Query(key, value);\n });\n return and(...arr);\n}\nexport function interpreter(exprs, code, id, moduleType, importerId) {\n let arr = [];\n if (Array.isArray(exprs)) {\n arr = exprs;\n }\n else {\n arr = [exprs];\n }\n return interpreterImpl(arr, code, id, moduleType, importerId);\n}\nexport function interpreterImpl(expr, code, id, moduleType, importerId, ctx = {}) {\n let hasInclude = false;\n for (const e of expr) {\n switch (e.kind) {\n case 'include': {\n hasInclude = true;\n if (exprInterpreter(e.expr, code, id, moduleType, importerId, ctx)) {\n return true;\n }\n break;\n }\n case 'exclude': {\n if (exprInterpreter(e.expr, code, id, moduleType, importerId, ctx)) {\n return false;\n }\n break;\n }\n }\n }\n return !hasInclude;\n}\nexport function exprInterpreter(expr, code, id, moduleType, importerId, ctx = {}) {\n switch (expr.kind) {\n case 'and': {\n return expr.args.every((e) => exprInterpreter(e, code, id, moduleType, importerId, ctx));\n }\n case 'or': {\n return expr.args.some((e) => exprInterpreter(e, code, id, moduleType, importerId, ctx));\n }\n case 'not': {\n return !exprInterpreter(expr.expr, code, id, moduleType, importerId, ctx);\n }\n case 'id': {\n if (id === undefined) {\n throw new Error('`id` is required for `id` expression');\n }\n let idToMatch = id;\n if (expr.params.cleanUrl) {\n idToMatch = cleanUrl(idToMatch);\n }\n return typeof expr.pattern === 'string'\n ? idToMatch === expr.pattern\n : expr.pattern.test(idToMatch);\n }\n case 'importerId': {\n if (importerId === undefined) {\n return false; // Entry files have no importer, so no match\n }\n let importerIdToMatch = importerId;\n if (expr.params.cleanUrl) {\n importerIdToMatch = cleanUrl(importerIdToMatch);\n }\n return typeof expr.pattern === 'string'\n ? importerIdToMatch === expr.pattern\n : expr.pattern.test(importerIdToMatch);\n }\n case 'moduleType': {\n if (moduleType === undefined) {\n throw new Error('`moduleType` is required for `moduleType` expression');\n }\n return moduleType === expr.pattern;\n }\n case 'code': {\n if (code === undefined) {\n throw new Error('`code` is required for `code` expression');\n }\n return typeof expr.pattern === 'string'\n ? code.includes(expr.pattern)\n : expr.pattern.test(code);\n }\n case 'query': {\n if (id === undefined) {\n throw new Error('`id` is required for `Query` expression');\n }\n if (!ctx.urlSearchParamsCache) {\n let queryString = extractQueryWithoutFragment(id);\n ctx.urlSearchParamsCache = new URLSearchParams(queryString);\n }\n let urlParams = ctx.urlSearchParamsCache;\n if (typeof expr.pattern === 'boolean') {\n if (expr.pattern) {\n return urlParams.has(expr.key);\n }\n else {\n return !urlParams.has(expr.key);\n }\n }\n else if (typeof expr.pattern === 'string') {\n return urlParams.get(expr.key) === expr.pattern;\n }\n else {\n return expr.pattern.test(urlParams.get(expr.key) ?? '');\n }\n }\n default: {\n throw new Error(`Expression ${JSON.stringify(expr)} is not expected.`);\n }\n }\n}\n","/**\n * Filters out Vite plugins that have `apply: 'serve'` set.\n *\n * Since Rolldown operates in build mode, plugins marked with `apply: 'serve'`\n * are intended only for Vite's dev server and should be excluded from the build process.\n *\n * @param plugins - Array of plugins (can include nested arrays)\n * @returns Filtered array with serve-only plugins removed\n *\n * @example\n * ```ts\n * import { defineConfig } from 'rolldown';\n * import { filterVitePlugins } from '@rolldown/pluginutils';\n * import viteReact from '@vitejs/plugin-react';\n *\n * export default defineConfig({\n * plugins: filterVitePlugins([\n * viteReact(),\n * {\n * name: 'dev-only',\n * apply: 'serve', // This will be filtered out\n * // ...\n * }\n * ])\n * });\n * ```\n */\nexport function filterVitePlugins(plugins) {\n if (!plugins) {\n return [];\n }\n const pluginArray = Array.isArray(plugins) ? plugins : [plugins];\n const result = [];\n for (const plugin of pluginArray) {\n // Skip falsy values\n if (!plugin) {\n continue;\n }\n // Handle nested arrays recursively\n if (Array.isArray(plugin)) {\n result.push(...filterVitePlugins(plugin));\n continue;\n }\n // Check if plugin has apply property\n const pluginWithApply = plugin;\n if ('apply' in pluginWithApply) {\n const applyValue = pluginWithApply.apply;\n // If apply is a function, call it with build mode\n if (typeof applyValue === 'function') {\n try {\n const shouldApply = applyValue({}, // config object\n { command: 'build', mode: 'production' });\n if (shouldApply) {\n result.push(plugin);\n }\n }\n catch {\n // If function throws, include the plugin to be safe\n result.push(plugin);\n }\n } // If apply is 'serve', skip this plugin\n else if (applyValue === 'serve') {\n continue;\n } // If apply is 'build' or anything else, include it\n else {\n result.push(plugin);\n }\n }\n else {\n // No apply property, include the plugin\n result.push(plugin);\n }\n }\n return result;\n}\n","/**\n * Constructs a RegExp that matches the exact string specified.\n *\n * This is useful for plugin hook filters.\n *\n * @param str the string to match.\n * @param flags flags for the RegExp.\n *\n * @example\n * ```ts\n * import { exactRegex } from '@rolldown/pluginutils';\n * const plugin = {\n * name: 'plugin',\n * resolveId: {\n * filter: { id: exactRegex('foo') },\n * handler(id) {} // will only be called for `foo`\n * }\n * }\n * ```\n */\nexport function exactRegex(str, flags) {\n return new RegExp(`^${escapeRegex(str)}$`, flags);\n}\n/**\n * Constructs a RegExp that matches a value that has the specified prefix.\n *\n * This is useful for plugin hook filters.\n *\n * @param str the string to match.\n * @param flags flags for the RegExp.\n *\n * @example\n * ```ts\n * import { prefixRegex } from '@rolldown/pluginutils';\n * const plugin = {\n * name: 'plugin',\n * resolveId: {\n * filter: { id: prefixRegex('foo') },\n * handler(id) {} // will only be called for IDs starting with `foo`\n * }\n * }\n * ```\n */\nexport function prefixRegex(str, flags) {\n return new RegExp(`^${escapeRegex(str)}`, flags);\n}\nconst escapeRegexRE = /[-/\\\\^$*+?.()|[\\]{}]/g;\nfunction escapeRegex(str) {\n return str.replace(escapeRegexRE, '\\\\$&');\n}\nexport function makeIdFiltersToMatchWithQuery(input) {\n if (!Array.isArray(input)) {\n return makeIdFilterToMatchWithQuery(\n // Array.isArray cannot narrow the type\n // https://github.com/microsoft/TypeScript/issues/17002\n input);\n }\n return input.map((i) => makeIdFilterToMatchWithQuery(i));\n}\nfunction makeIdFilterToMatchWithQuery(input) {\n if (typeof input === 'string') {\n return `${input}{?*,}`;\n }\n return makeRegexIdFilterToMatchWithQuery(input);\n}\nfunction makeRegexIdFilterToMatchWithQuery(input) {\n return new RegExp(\n // replace `$` with `(?:\\?.*)?$` (ignore `\\$`)\n input.source.replace(/(?<!\\\\)\\$/g, '(?:\\\\?.*)?$'), input.flags);\n}\n","export * from \"./composable-filters.js\";\nexport * from \"./filter-vite-plugins.js\";\nexport * from \"./simple-filters.js\";\n","export * from \"./filter/index.js\";\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { exactRegex, makeIdFiltersToMatchWithQuery } from \"@rolldown/pluginutils\";\nimport { reactRefreshWrapperPlugin } from \"vite/internal\";\n//#region ../common/refresh-utils.ts\nconst runtimePublicPath = \"/@react-refresh\";\nconst preambleCode = `import { injectIntoGlobalHook } from \"__BASE__${runtimePublicPath.slice(1)}\";\ninjectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;`;\nconst getPreambleCode = (base) => preambleCode.replace(\"__BASE__\", base);\nfunction virtualPreamblePlugin({ name, isEnabled }) {\n\treturn {\n\t\tname: \"vite:react-virtual-preamble\",\n\t\tresolveId: {\n\t\t\torder: \"pre\",\n\t\t\tfilter: { id: exactRegex(name) },\n\t\t\thandler(source) {\n\t\t\t\tif (source === name) return \"\\0\" + source;\n\t\t\t}\n\t\t},\n\t\tload: {\n\t\t\tfilter: { id: exactRegex(\"\\0\" + name) },\n\t\t\thandler(id) {\n\t\t\t\tif (id === \"\\0\" + name) {\n\t\t\t\t\tif (isEnabled()) return preambleCode.replace(\"__BASE__\", \"/\");\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n//#endregion\n//#region ../common/warning.ts\nconst silenceUseClientWarning = (userConfig) => ({ rollupOptions: { onwarn(warning, defaultHandler) {\n\tif (warning.code === \"MODULE_LEVEL_DIRECTIVE\" && (warning.message.includes(\"use client\") || warning.message.includes(\"use server\"))) return;\n\tif (warning.code === \"SOURCEMAP_ERROR\" && warning.message.includes(\"resolve original location\") && warning.pos === 0) return;\n\tif (userConfig.build?.rollupOptions?.onwarn) userConfig.build.rollupOptions.onwarn(warning, defaultHandler);\n\telse defaultHandler(warning);\n} } });\n//#endregion\n//#region src/reactCompilerPreset.ts\nconst reactCompilerPreset = (options = {}) => ({\n\tpreset: () => ({ plugins: [[\"babel-plugin-react-compiler\", options]] }),\n\trolldown: {\n\t\tfilter: { code: options.compilationMode === \"annotation\" ? /['\"]use memo['\"]/ : /\\b[A-Z]|\\buse/ },\n\t\tapplyToEnvironmentHook: (env) => env.config.consumer === \"client\",\n\t\toptimizeDeps: { include: options.target === \"17\" || options.target === \"18\" ? [\"react-compiler-runtime\"] : [\"react/compiler-runtime\"] }\n\t}\n});\n//#endregion\n//#region src/index.ts\nconst refreshRuntimePath = join(dirname(fileURLToPath(import.meta.url)), \"refresh-runtime.js\");\nconst defaultIncludeRE = /\\.[tj]sx?$/;\nconst defaultExcludeRE = /\\/node_modules\\//;\nfunction viteReact(opts = {}) {\n\tconst include = opts.include ?? defaultIncludeRE;\n\tconst exclude = opts.exclude ?? defaultExcludeRE;\n\tconst jsxImportSource = opts.jsxImportSource ?? \"react\";\n\tconst jsxImportRuntime = `${jsxImportSource}/jsx-runtime`;\n\tconst jsxImportDevRuntime = `${jsxImportSource}/jsx-dev-runtime`;\n\tlet runningInVite = false;\n\tlet isProduction = true;\n\tlet skipFastRefresh = true;\n\tlet base;\n\tlet isBundledDev = false;\n\tconst viteBabel = {\n\t\tname: \"vite:react-babel\",\n\t\tenforce: \"pre\",\n\t\tconfig(_userConfig, { command }) {\n\t\t\tif (opts.jsxRuntime === \"classic\") return { oxc: {\n\t\t\t\tjsx: {\n\t\t\t\t\truntime: \"classic\",\n\t\t\t\t\trefresh: command === \"serve\"\n\t\t\t\t},\n\t\t\t\tjsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),\n\t\t\t\tjsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)\n\t\t\t} };\n\t\t\telse return {\n\t\t\t\toxc: {\n\t\t\t\t\tjsx: {\n\t\t\t\t\t\truntime: \"automatic\",\n\t\t\t\t\t\timportSource: opts.jsxImportSource,\n\t\t\t\t\t\trefresh: command === \"serve\"\n\t\t\t\t\t},\n\t\t\t\t\tjsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),\n\t\t\t\t\tjsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)\n\t\t\t\t},\n\t\t\t\toptimizeDeps: { rolldownOptions: { transform: { jsx: { runtime: \"automatic\" } } } }\n\t\t\t};\n\t\t},\n\t\tconfigResolved(config) {\n\t\t\trunningInVite = true;\n\t\t\tbase = config.base;\n\t\t\tif (config.experimental.bundledDev) isBundledDev = true;\n\t\t\tisProduction = config.isProduction;\n\t\t\tskipFastRefresh = isProduction || config.command === \"build\" || config.server.hmr === false;\n\t\t},\n\t\toptions(options) {\n\t\t\tif (!runningInVite) {\n\t\t\t\toptions.transform ??= {};\n\t\t\t\toptions.transform.jsx = {\n\t\t\t\t\truntime: opts.jsxRuntime,\n\t\t\t\t\timportSource: opts.jsxImportSource\n\t\t\t\t};\n\t\t\t\treturn options;\n\t\t\t}\n\t\t}\n\t};\n\tconst viteRefreshWrapper = {\n\t\tname: \"vite:react:refresh-wrapper\",\n\t\tapply: \"serve\",\n\t\tasync applyToEnvironment(env) {\n\t\t\tif (env.config.consumer !== \"client\" || skipFastRefresh) return false;\n\t\t\treturn reactRefreshWrapperPlugin({\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tinclude: makeIdFiltersToMatchWithQuery(include),\n\t\t\t\texclude: makeIdFiltersToMatchWithQuery(exclude),\n\t\t\t\tjsxImportSource,\n\t\t\t\treactRefreshHost: opts.reactRefreshHost ?? \"\"\n\t\t\t});\n\t\t}\n\t};\n\tconst viteConfigPost = {\n\t\tname: \"vite:react:config-post\",\n\t\tenforce: \"post\",\n\t\tconfig(userConfig) {\n\t\t\tif (userConfig.server?.hmr === false) return { oxc: { jsx: { refresh: false } } };\n\t\t}\n\t};\n\tconst viteReactRefreshBundledDevMode = {\n\t\tname: \"vite:react-refresh-fbm\",\n\t\tenforce: \"pre\",\n\t\ttransformIndexHtml: {\n\t\t\thandler() {\n\t\t\t\tif (!skipFastRefresh && isBundledDev) return [{\n\t\t\t\t\ttag: \"script\",\n\t\t\t\t\tattrs: { type: \"module\" },\n\t\t\t\t\tchildren: getPreambleCode(base)\n\t\t\t\t}];\n\t\t\t},\n\t\t\torder: \"pre\"\n\t\t}\n\t};\n\tconst dependencies = [\n\t\t\"react\",\n\t\t\"react-dom\",\n\t\tjsxImportDevRuntime,\n\t\tjsxImportRuntime\n\t];\n\treturn [\n\t\tviteBabel,\n\t\tviteRefreshWrapper,\n\t\tviteConfigPost,\n\t\tviteReactRefreshBundledDevMode,\n\t\t{\n\t\t\tname: \"vite:react-refresh\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig: (userConfig) => ({\n\t\t\t\tbuild: silenceUseClientWarning(userConfig),\n\t\t\t\toptimizeDeps: { include: dependencies }\n\t\t\t}),\n\t\t\tresolveId: {\n\t\t\t\tfilter: { id: exactRegex(runtimePublicPath) },\n\t\t\t\thandler(id) {\n\t\t\t\t\tif (id === \"/@react-refresh\") return id;\n\t\t\t\t}\n\t\t\t},\n\t\t\tload: {\n\t\t\t\tfilter: { id: exactRegex(runtimePublicPath) },\n\t\t\t\thandler(id) {\n\t\t\t\t\tif (id === \"/@react-refresh\") return readFileSync(refreshRuntimePath, \"utf-8\").replace(/__README_URL__/g, \"https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react\");\n\t\t\t\t}\n\t\t\t},\n\t\t\ttransformIndexHtml() {\n\t\t\t\tif (!skipFastRefresh && !isBundledDev) return [{\n\t\t\t\t\ttag: \"script\",\n\t\t\t\t\tattrs: { type: \"module\" },\n\t\t\t\t\tchildren: getPreambleCode(base)\n\t\t\t\t}];\n\t\t\t}\n\t\t},\n\t\tvirtualPreamblePlugin({\n\t\t\tname: \"@vitejs/plugin-react/preamble\",\n\t\t\tisEnabled: () => !skipFastRefresh && !isBundledDev\n\t\t})\n\t];\n}\nviteReact.preambleCode = preambleCode;\nfunction viteReactForCjs(options) {\n\treturn viteReact.call(this, options);\n}\nObject.assign(viteReactForCjs, {\n\tdefault: viteReactForCjs,\n\treactCompilerPreset\n});\n//#endregion\nexport { viteReact as default, viteReactForCjs as \"module.exports\", reactCompilerPreset };\n","export { startPreviewServer } from './server/index.js';\nexport type { PreviewServerOptions } from './server/index.js';\n","import { createServer as createViteServer } from 'vite';\nimport { WebSocketServer } from 'ws';\nimport http from 'node:http';\nimport path from 'node:path';\nimport { setupApiRoutes } from './api-routes.js';\nimport { setupWsHandler } from './ws-handler.js';\nimport { setupWatcher } from './watcher.js';\nimport { IncrementalBuilder } from './incremental-build.js';\n\nexport interface PreviewServerOptions {\n port?: number;\n open?: boolean;\n configPath?: string;\n}\n\nexport async function startPreviewServer(options: PreviewServerOptions = {}): Promise<void> {\n const port = options.port ?? 4400;\n const cwd = process.cwd();\n\n // Initialize incremental builder\n const builder = new IncrementalBuilder(cwd, options.configPath);\n await builder.initialBuild();\n\n // Create HTTP server\n const server = http.createServer();\n\n // Setup WebSocket\n const wss = new WebSocketServer({ server });\n setupWsHandler(wss, builder);\n\n // Create Vite dev server for client SPA\n let reactPlugin;\n try {\n const mod = await import('@vitejs/plugin-react');\n reactPlugin = (mod.default ?? mod)();\n } catch {\n // Plugin not available, proceed without it\n }\n\n const vite = await createViteServer({\n root: path.resolve(__dirname, '../client'),\n server: {\n middlewareMode: true,\n hmr: { server },\n },\n plugins: reactPlugin ? [reactPlugin] : [],\n appType: 'spa',\n });\n\n // Setup API routes\n const apiHandler = setupApiRoutes(builder);\n\n // Handle requests\n server.on('request', (req, res) => {\n if (req.url?.startsWith('/api/')) {\n apiHandler(req, res);\n } else {\n vite.middlewares(req, res);\n }\n });\n\n // Setup file watcher\n setupWatcher(builder, wss, cwd);\n\n // Start server\n server.listen(port, () => {\n console.log(`\\n 🎨 RynDesign Preview`);\n console.log(` ➜ Local: http://localhost:${port}/`);\n console.log(` ➜ WS: ws://localhost:${port}/\\n`);\n\n if (options.open) {\n import('child_process').then(cp => {\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n cp.exec(`${cmd} http://localhost:${port}/`);\n }).catch(() => {});\n }\n });\n\n // Graceful shutdown\n process.on('SIGINT', () => {\n wss.close();\n vite.close();\n server.close();\n process.exit(0);\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\ntype RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\nexport function setupApiRoutes(builder: IncrementalBuilder): RequestHandler {\n return (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host}`);\n const pathname = url.pathname;\n\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n if (pathname === '/api/tokens' && req.method === 'GET') {\n json(res, builder.getTokenSet());\n } else if (pathname === '/api/themes' && req.method === 'GET') {\n json(res, builder.getThemes());\n } else if (pathname === '/api/components' && req.method === 'GET') {\n json(res, builder.getComponents());\n } else if (pathname === '/api/snippets' && req.method === 'GET') {\n const platform = url.searchParams.get('platform') ?? 'react';\n const component = url.searchParams.get('component') ?? undefined;\n const type = url.searchParams.get('type') ?? undefined;\n builder.generateSnippets(platform, component, type).then(code => {\n json(res, { code });\n }).catch(err => {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n });\n return; // async handling\n } else if (pathname === '/api/tokens' && req.method === 'PUT') {\n let body = '';\n req.on('data', chunk => { body += chunk; });\n req.on('end', async () => {\n const { path, value, theme } = JSON.parse(body);\n await builder.updateToken(path, value, theme);\n json(res, { success: true });\n });\n } else if (pathname === '/api/generated' && req.method === 'GET') {\n const platform = url.searchParams.get('platform');\n json(res, builder.getGeneratedFiles(platform ?? undefined));\n } else {\n res.writeHead(404);\n json(res, { error: 'Not found' });\n }\n } catch (err) {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n }\n };\n}\n\nfunction json(res: ServerResponse, data: unknown): void {\n if (!res.headersSent) {\n res.setHeader('Content-Type', 'application/json');\n }\n res.end(JSON.stringify(data));\n}\n","import type { WebSocketServer, WebSocket } from 'ws';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport interface WsMessage {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface TokenUpdateMessage extends WsMessage {\n type: 'token-update';\n theme?: string;\n path: string;\n value: unknown;\n}\n\nexport interface ThemeChangeMessage extends WsMessage {\n type: 'theme-change';\n theme: string;\n}\n\nexport interface RebuildCompleteMessage extends WsMessage {\n type: 'rebuild-complete';\n changedTokens: string[];\n timestamp: number;\n}\n\nexport function setupWsHandler(wss: WebSocketServer, builder: IncrementalBuilder): void {\n wss.on('connection', (ws: WebSocket) => {\n console.log('Preview client connected');\n\n // Send initial state\n ws.send(JSON.stringify({\n type: 'init',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n\n ws.on('message', async (data: Buffer) => {\n try {\n const message = JSON.parse(data.toString()) as WsMessage;\n\n switch (message.type) {\n case 'token-update': {\n const update = message as TokenUpdateMessage;\n await builder.updateToken(update.path, update.value, update.theme);\n\n // Broadcast rebuild complete to all clients\n broadcast(wss, {\n type: 'rebuild-complete',\n changedTokens: [update.path],\n timestamp: Date.now(),\n });\n break;\n }\n\n case 'theme-change': {\n const themeMsg = message as ThemeChangeMessage;\n broadcast(wss, {\n type: 'theme-switched',\n theme: themeMsg.theme,\n tokens: builder.getThemeTokens(themeMsg.theme),\n });\n break;\n }\n\n case 'request-state': {\n ws.send(JSON.stringify({\n type: 'full-state',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n break;\n }\n }\n } catch (err) {\n ws.send(JSON.stringify({\n type: 'error',\n message: (err as Error).message,\n }));\n }\n });\n\n ws.on('close', () => {\n console.log('Preview client disconnected');\n });\n });\n}\n\nfunction broadcast(wss: WebSocketServer, message: Record<string, unknown>): void {\n const data = JSON.stringify(message);\n for (const client of wss.clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data);\n }\n }\n}\n","import type { WebSocketServer } from 'ws';\nimport { watch } from 'chokidar';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport function setupWatcher(\n builder: IncrementalBuilder,\n wss: WebSocketServer,\n cwd: string\n): void {\n const watcher = watch(\n ['tokens/**/*.tokens.json', 'components/**/*.component.json'],\n {\n cwd,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 50,\n },\n }\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const handleChange = (changedPath: string) => {\n if (debounceTimer) clearTimeout(debounceTimer);\n\n debounceTimer = setTimeout(async () => {\n console.log(`File changed: ${changedPath}`);\n\n try {\n await builder.rebuild();\n\n // Broadcast to all connected clients\n const data = JSON.stringify({\n type: 'rebuild-complete',\n changedTokens: [],\n timestamp: Date.now(),\n tokenSet: builder.getTokenSet(),\n components: builder.getComponents(),\n });\n\n for (const client of wss.clients) {\n if (client.readyState === 1) {\n client.send(data);\n }\n }\n } catch (err) {\n console.error('Rebuild failed:', (err as Error).message);\n }\n }, 300);\n };\n\n watcher.on('change', handleChange);\n watcher.on('add', handleChange);\n watcher.on('unlink', handleChange);\n}\n","import { buildTokenSet, loadComponents, resolveComponent, type RawTokenTree } from '@ryndesign/core';\nimport type { ResolvedTokenSet, GeneratedFile, ResolvedComponent, GeneratorPlugin } from '@ryndesign/plugin-api';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport class IncrementalBuilder {\n private tokenSet: ResolvedTokenSet | null = null;\n private components: ResolvedComponent[] = [];\n private generatedFiles: Map<string, GeneratedFile[]> = new Map();\n private generators: GeneratorPlugin[] = [];\n private cwd: string;\n private configPath?: string;\n\n constructor(cwd: string, configPath?: string) {\n this.cwd = cwd;\n this.configPath = configPath;\n }\n\n async initialBuild(): Promise<void> {\n await this.rebuild();\n }\n\n async rebuild(): Promise<void> {\n const configFile = this.configPath ?? 'ryndesign.config.ts';\n\n const tokens = ['tokens/**/*.tokens.json'];\n const componentPatterns = ['components/**/*.component.json'];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let themes: any = undefined;\n\n try {\n const configPath = path.resolve(this.cwd, configFile);\n const content = await fs.readFile(configPath, 'utf-8');\n if (content.includes('dark')) {\n themes = {\n default: 'light',\n dark: { file: path.resolve(this.cwd, 'tokens/dark.tokens.json') },\n };\n }\n } catch {\n // Use defaults\n }\n\n this.tokenSet = await buildTokenSet({\n tokens,\n basePath: this.cwd,\n themes,\n });\n\n // Load and resolve components\n try {\n const componentDefs = await loadComponents(componentPatterns, this.cwd);\n this.components = componentDefs.map(def => resolveComponent(def, this.tokenSet!));\n } catch {\n this.components = [];\n }\n }\n\n getTokenSet(): ResolvedTokenSet | null {\n return this.tokenSet;\n }\n\n getThemes(): Record<string, unknown> {\n if (!this.tokenSet) return {};\n return {\n default: this.tokenSet.themes.default,\n available: Object.keys(this.tokenSet.themes.themes),\n themes: this.tokenSet.themes.themes,\n };\n }\n\n getThemeTokens(theme: string): Record<string, unknown> {\n if (!this.tokenSet) return {};\n const themeData = this.tokenSet.themes.themes[theme];\n if (!themeData) return {};\n return {\n name: themeData.name,\n tokens: themeData.tokens,\n };\n }\n\n getComponents(): ResolvedComponent[] {\n return this.components;\n }\n\n setGenerators(generators: GeneratorPlugin[]): void {\n this.generators = generators;\n }\n\n async generateSnippets(platform: string, componentName?: string, type?: string): Promise<string> {\n if (!this.tokenSet) return '';\n\n const generator = this.generators.find(g => g.name === platform);\n if (!generator) return `// Generator for \"${platform}\" not available`;\n\n const { createGeneratorHelpers } = await import('@ryndesign/core');\n const ctx = {\n tokenSet: this.tokenSet,\n config: { outDir: 'generated' },\n outputDir: path.resolve(this.cwd, 'generated'),\n helpers: createGeneratorHelpers(),\n components: this.components,\n };\n\n try {\n if (type === 'tokens') {\n const files = await generator.generateTokens(ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n\n if (componentName) {\n const comp = this.components.find(c => c.definition.name === componentName);\n if (comp) {\n const files = await generator.generateComponent(comp, ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n return `// Component \"${componentName}\" not found`;\n }\n\n return '// Specify a component or type=tokens';\n } catch (err) {\n return `// Error: ${(err as Error).message}`;\n }\n }\n\n getGeneratedFiles(platform?: string): GeneratedFile[] {\n if (!platform) {\n return Array.from(this.generatedFiles.values()).flat();\n }\n return this.generatedFiles.get(platform) ?? [];\n }\n\n async updateToken(tokenPath: string, value: unknown, theme?: string): Promise<void> {\n const filePath = theme\n ? path.resolve(this.cwd, `tokens/${theme}.tokens.json`)\n : path.resolve(this.cwd, 'tokens/semantic.tokens.json');\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const tree = JSON.parse(content) as RawTokenTree;\n\n const parts = tokenPath.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]];\n }\n\n const lastKey = parts[parts.length - 1];\n if (current[lastKey] && typeof current[lastKey] === 'object' && '$value' in current[lastKey]) {\n current[lastKey].$value = value;\n } else {\n current[lastKey] = { $type: 'color', $value: value };\n }\n\n await fs.writeFile(filePath, JSON.stringify(tree, null, 2), 'utf-8');\n await this.rebuild();\n } catch (err) {\n console.error(`Failed to update token: ${(err as Error).message}`);\n throw err;\n }\n }\n}\n"],"mappings":"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","names":["import_node_path","init_dist","import_node_path","path","path","fs","http","createViteServer","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server/index.ts","../src/server/api-routes.ts","../src/server/ws-handler.ts","../src/server/watcher.ts","../src/server/incremental-build.ts"],"sourcesContent":["export { startPreviewServer } from './server/index.js';\nexport type { PreviewServerOptions } from './server/index.js';\n","import { createServer as createViteServer } from 'vite';\nimport { WebSocketServer } from 'ws';\nimport http from 'node:http';\nimport path from 'node:path';\nimport { setupApiRoutes } from './api-routes.js';\nimport { setupWsHandler } from './ws-handler.js';\nimport { setupWatcher } from './watcher.js';\nimport { IncrementalBuilder } from './incremental-build.js';\n\nexport interface PreviewServerOptions {\n port?: number;\n open?: boolean;\n configPath?: string;\n}\n\nexport async function startPreviewServer(options: PreviewServerOptions = {}): Promise<void> {\n const port = options.port ?? 4400;\n const cwd = process.cwd();\n\n // Initialize incremental builder\n const builder = new IncrementalBuilder(cwd, options.configPath);\n await builder.initialBuild();\n\n // Create HTTP server\n const server = http.createServer();\n\n // Setup WebSocket\n const wss = new WebSocketServer({ server });\n setupWsHandler(wss, builder);\n\n // Create Vite dev server for client SPA\n let reactPlugin;\n try {\n const mod = await import('@vitejs/plugin-react');\n reactPlugin = (mod.default ?? mod)();\n } catch {\n // Plugin not available, proceed without it\n }\n\n const vite = await createViteServer({\n root: path.resolve(__dirname, '../client'),\n server: {\n middlewareMode: true,\n hmr: { server },\n },\n plugins: reactPlugin ? [reactPlugin] : [],\n appType: 'spa',\n });\n\n // Setup API routes\n const apiHandler = setupApiRoutes(builder);\n\n // Handle requests\n server.on('request', (req, res) => {\n if (req.url?.startsWith('/api/')) {\n apiHandler(req, res);\n } else {\n vite.middlewares(req, res);\n }\n });\n\n // Setup file watcher\n setupWatcher(builder, wss, cwd);\n\n // Start server\n server.listen(port, () => {\n console.log(`\\n 🎨 RynDesign Preview`);\n console.log(` ➜ Local: http://localhost:${port}/`);\n console.log(` ➜ WS: ws://localhost:${port}/\\n`);\n\n if (options.open) {\n import('child_process').then(cp => {\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n cp.exec(`${cmd} http://localhost:${port}/`);\n }).catch(() => {});\n }\n });\n\n // Graceful shutdown\n process.on('SIGINT', () => {\n wss.close();\n vite.close();\n server.close();\n process.exit(0);\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\ntype RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\nexport function setupApiRoutes(builder: IncrementalBuilder): RequestHandler {\n return (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host}`);\n const pathname = url.pathname;\n\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n if (pathname === '/api/tokens' && req.method === 'GET') {\n json(res, builder.getTokenSet());\n } else if (pathname === '/api/themes' && req.method === 'GET') {\n json(res, builder.getThemes());\n } else if (pathname === '/api/components' && req.method === 'GET') {\n json(res, builder.getComponents());\n } else if (pathname === '/api/snippets' && req.method === 'GET') {\n const platform = url.searchParams.get('platform') ?? 'react';\n const component = url.searchParams.get('component') ?? undefined;\n const type = url.searchParams.get('type') ?? undefined;\n builder.generateSnippets(platform, component, type).then(code => {\n json(res, { code });\n }).catch(err => {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n });\n return; // async handling\n } else if (pathname === '/api/tokens' && req.method === 'PUT') {\n let body = '';\n req.on('data', chunk => { body += chunk; });\n req.on('end', async () => {\n const { path, value, theme } = JSON.parse(body);\n await builder.updateToken(path, value, theme);\n json(res, { success: true });\n });\n } else if (pathname === '/api/generated' && req.method === 'GET') {\n const platform = url.searchParams.get('platform');\n json(res, builder.getGeneratedFiles(platform ?? undefined));\n } else {\n res.writeHead(404);\n json(res, { error: 'Not found' });\n }\n } catch (err) {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n }\n };\n}\n\nfunction json(res: ServerResponse, data: unknown): void {\n if (!res.headersSent) {\n res.setHeader('Content-Type', 'application/json');\n }\n res.end(JSON.stringify(data));\n}\n","import type { WebSocketServer, WebSocket } from 'ws';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport interface WsMessage {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface TokenUpdateMessage extends WsMessage {\n type: 'token-update';\n theme?: string;\n path: string;\n value: unknown;\n}\n\nexport interface ThemeChangeMessage extends WsMessage {\n type: 'theme-change';\n theme: string;\n}\n\nexport interface RebuildCompleteMessage extends WsMessage {\n type: 'rebuild-complete';\n changedTokens: string[];\n timestamp: number;\n}\n\nexport function setupWsHandler(wss: WebSocketServer, builder: IncrementalBuilder): void {\n wss.on('connection', (ws: WebSocket) => {\n console.log('Preview client connected');\n\n // Send initial state\n ws.send(JSON.stringify({\n type: 'init',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n\n ws.on('message', async (data: Buffer) => {\n try {\n const message = JSON.parse(data.toString()) as WsMessage;\n\n switch (message.type) {\n case 'token-update': {\n const update = message as TokenUpdateMessage;\n await builder.updateToken(update.path, update.value, update.theme);\n\n // Broadcast rebuild complete to all clients\n broadcast(wss, {\n type: 'rebuild-complete',\n changedTokens: [update.path],\n timestamp: Date.now(),\n });\n break;\n }\n\n case 'theme-change': {\n const themeMsg = message as ThemeChangeMessage;\n broadcast(wss, {\n type: 'theme-switched',\n theme: themeMsg.theme,\n tokens: builder.getThemeTokens(themeMsg.theme),\n });\n break;\n }\n\n case 'request-state': {\n ws.send(JSON.stringify({\n type: 'full-state',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n break;\n }\n }\n } catch (err) {\n ws.send(JSON.stringify({\n type: 'error',\n message: (err as Error).message,\n }));\n }\n });\n\n ws.on('close', () => {\n console.log('Preview client disconnected');\n });\n });\n}\n\nfunction broadcast(wss: WebSocketServer, message: Record<string, unknown>): void {\n const data = JSON.stringify(message);\n for (const client of wss.clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data);\n }\n }\n}\n","import type { WebSocketServer } from 'ws';\nimport { watch } from 'chokidar';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport function setupWatcher(\n builder: IncrementalBuilder,\n wss: WebSocketServer,\n cwd: string\n): void {\n const watcher = watch(\n ['tokens/**/*.tokens.json', 'components/**/*.component.json'],\n {\n cwd,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 50,\n },\n }\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const handleChange = (changedPath: string) => {\n if (debounceTimer) clearTimeout(debounceTimer);\n\n debounceTimer = setTimeout(async () => {\n console.log(`File changed: ${changedPath}`);\n\n try {\n await builder.rebuild();\n\n // Broadcast to all connected clients\n const data = JSON.stringify({\n type: 'rebuild-complete',\n changedTokens: [],\n timestamp: Date.now(),\n tokenSet: builder.getTokenSet(),\n components: builder.getComponents(),\n });\n\n for (const client of wss.clients) {\n if (client.readyState === 1) {\n client.send(data);\n }\n }\n } catch (err) {\n console.error('Rebuild failed:', (err as Error).message);\n }\n }, 300);\n };\n\n watcher.on('change', handleChange);\n watcher.on('add', handleChange);\n watcher.on('unlink', handleChange);\n}\n","import { buildTokenSet, loadComponents, resolveComponent, type RawTokenTree } from '@ryndesign/core';\nimport type { ResolvedTokenSet, GeneratedFile, ResolvedComponent, GeneratorPlugin } from '@ryndesign/plugin-api';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport class IncrementalBuilder {\n private tokenSet: ResolvedTokenSet | null = null;\n private components: ResolvedComponent[] = [];\n private generatedFiles: Map<string, GeneratedFile[]> = new Map();\n private generators: GeneratorPlugin[] = [];\n private cwd: string;\n private configPath?: string;\n\n constructor(cwd: string, configPath?: string) {\n this.cwd = cwd;\n this.configPath = configPath;\n }\n\n async initialBuild(): Promise<void> {\n await this.rebuild();\n }\n\n async rebuild(): Promise<void> {\n const configFile = this.configPath ?? 'ryndesign.config.ts';\n\n const tokens = ['tokens/**/*.tokens.json'];\n const componentPatterns = ['components/**/*.component.json'];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let themes: any = undefined;\n\n try {\n const configPath = path.resolve(this.cwd, configFile);\n const content = await fs.readFile(configPath, 'utf-8');\n if (content.includes('dark')) {\n themes = {\n default: 'light',\n dark: { file: path.resolve(this.cwd, 'tokens/dark.tokens.json') },\n };\n }\n } catch {\n // Use defaults\n }\n\n this.tokenSet = await buildTokenSet({\n tokens,\n basePath: this.cwd,\n themes,\n });\n\n // Load and resolve components\n try {\n const componentDefs = await loadComponents(componentPatterns, this.cwd);\n this.components = componentDefs.map(def => resolveComponent(def, this.tokenSet!));\n } catch {\n this.components = [];\n }\n }\n\n getTokenSet(): ResolvedTokenSet | null {\n return this.tokenSet;\n }\n\n getThemes(): Record<string, unknown> {\n if (!this.tokenSet) return {};\n return {\n default: this.tokenSet.themes.default,\n available: Object.keys(this.tokenSet.themes.themes),\n themes: this.tokenSet.themes.themes,\n };\n }\n\n getThemeTokens(theme: string): Record<string, unknown> {\n if (!this.tokenSet) return {};\n const themeData = this.tokenSet.themes.themes[theme];\n if (!themeData) return {};\n return {\n name: themeData.name,\n tokens: themeData.tokens,\n };\n }\n\n getComponents(): ResolvedComponent[] {\n return this.components;\n }\n\n setGenerators(generators: GeneratorPlugin[]): void {\n this.generators = generators;\n }\n\n async generateSnippets(platform: string, componentName?: string, type?: string): Promise<string> {\n if (!this.tokenSet) return '';\n\n const generator = this.generators.find(g => g.name === platform);\n if (!generator) return `// Generator for \"${platform}\" not available`;\n\n const { createGeneratorHelpers } = await import('@ryndesign/core');\n const ctx = {\n tokenSet: this.tokenSet,\n config: { outDir: 'generated' },\n outputDir: path.resolve(this.cwd, 'generated'),\n helpers: createGeneratorHelpers(),\n components: this.components,\n };\n\n try {\n if (type === 'tokens') {\n const files = await generator.generateTokens(ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n\n if (componentName) {\n const comp = this.components.find(c => c.definition.name === componentName);\n if (comp) {\n const files = await generator.generateComponent(comp, ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n return `// Component \"${componentName}\" not found`;\n }\n\n return '// Specify a component or type=tokens';\n } catch (err) {\n return `// Error: ${(err as Error).message}`;\n }\n }\n\n getGeneratedFiles(platform?: string): GeneratedFile[] {\n if (!platform) {\n return Array.from(this.generatedFiles.values()).flat();\n }\n return this.generatedFiles.get(platform) ?? [];\n }\n\n async updateToken(tokenPath: string, value: unknown, theme?: string): Promise<void> {\n const filePath = theme\n ? path.resolve(this.cwd, `tokens/${theme}.tokens.json`)\n : path.resolve(this.cwd, 'tokens/semantic.tokens.json');\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const tree = JSON.parse(content) as RawTokenTree;\n\n const parts = tokenPath.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]];\n }\n\n const lastKey = parts[parts.length - 1];\n if (current[lastKey] && typeof current[lastKey] === 'object' && '$value' in current[lastKey]) {\n current[lastKey].$value = value;\n } else {\n current[lastKey] = { $type: 'color', $value: value };\n }\n\n await fs.writeFile(filePath, JSON.stringify(tree, null, 2), 'utf-8');\n await this.rebuild();\n } catch (err) {\n console.error(`Failed to update token: ${(err as Error).message}`);\n throw err;\n }\n }\n}\n"],"mappings":"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","names":["import_node_path","path","path","fs","http","createViteServer","path"]}
|
package/dist/index.js
CHANGED
|
@@ -1,295 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
-
var __esm = (fn, res) => function __init() {
|
|
4
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
5
|
-
};
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/utils.js
|
|
12
|
-
var init_utils = __esm({
|
|
13
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/utils.js"() {
|
|
14
|
-
"use strict";
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.js
|
|
19
|
-
var init_composable_filters = __esm({
|
|
20
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.js"() {
|
|
21
|
-
"use strict";
|
|
22
|
-
init_utils();
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.js
|
|
27
|
-
var init_filter_vite_plugins = __esm({
|
|
28
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.js"() {
|
|
29
|
-
"use strict";
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.js
|
|
34
|
-
function exactRegex(str, flags) {
|
|
35
|
-
return new RegExp(`^${escapeRegex(str)}$`, flags);
|
|
36
|
-
}
|
|
37
|
-
function escapeRegex(str) {
|
|
38
|
-
return str.replace(escapeRegexRE, "\\$&");
|
|
39
|
-
}
|
|
40
|
-
function makeIdFiltersToMatchWithQuery(input) {
|
|
41
|
-
if (!Array.isArray(input)) {
|
|
42
|
-
return makeIdFilterToMatchWithQuery(
|
|
43
|
-
// Array.isArray cannot narrow the type
|
|
44
|
-
// https://github.com/microsoft/TypeScript/issues/17002
|
|
45
|
-
input
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
return input.map((i) => makeIdFilterToMatchWithQuery(i));
|
|
49
|
-
}
|
|
50
|
-
function makeIdFilterToMatchWithQuery(input) {
|
|
51
|
-
if (typeof input === "string") {
|
|
52
|
-
return `${input}{?*,}`;
|
|
53
|
-
}
|
|
54
|
-
return makeRegexIdFilterToMatchWithQuery(input);
|
|
55
|
-
}
|
|
56
|
-
function makeRegexIdFilterToMatchWithQuery(input) {
|
|
57
|
-
return new RegExp(
|
|
58
|
-
// replace `$` with `(?:\?.*)?$` (ignore `\$`)
|
|
59
|
-
input.source.replace(/(?<!\\)\$/g, "(?:\\?.*)?$"),
|
|
60
|
-
input.flags
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
var escapeRegexRE;
|
|
64
|
-
var init_simple_filters = __esm({
|
|
65
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.js"() {
|
|
66
|
-
"use strict";
|
|
67
|
-
escapeRegexRE = /[-/\\^$*+?.()|[\]{}]/g;
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/index.js
|
|
72
|
-
var init_filter = __esm({
|
|
73
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/index.js"() {
|
|
74
|
-
"use strict";
|
|
75
|
-
init_composable_filters();
|
|
76
|
-
init_filter_vite_plugins();
|
|
77
|
-
init_simple_filters();
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// ../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/index.js
|
|
82
|
-
var init_dist = __esm({
|
|
83
|
-
"../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/index.js"() {
|
|
84
|
-
"use strict";
|
|
85
|
-
init_filter();
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
// ../../node_modules/.pnpm/@vitejs+plugin-react@6.0.1_vite@6.4.1_@types+node@25.5.0_jiti@2.6.1_/node_modules/@vitejs/plugin-react/dist/index.js
|
|
90
|
-
var dist_exports = {};
|
|
91
|
-
__export(dist_exports, {
|
|
92
|
-
default: () => viteReact,
|
|
93
|
-
"module.exports": () => viteReactForCjs,
|
|
94
|
-
reactCompilerPreset: () => reactCompilerPreset
|
|
95
|
-
});
|
|
96
|
-
import { readFileSync } from "fs";
|
|
97
|
-
import { dirname, join } from "path";
|
|
98
|
-
import { fileURLToPath } from "url";
|
|
99
|
-
import { reactRefreshWrapperPlugin } from "vite/internal";
|
|
100
|
-
function virtualPreamblePlugin({ name, isEnabled }) {
|
|
101
|
-
return {
|
|
102
|
-
name: "vite:react-virtual-preamble",
|
|
103
|
-
resolveId: {
|
|
104
|
-
order: "pre",
|
|
105
|
-
filter: { id: exactRegex(name) },
|
|
106
|
-
handler(source) {
|
|
107
|
-
if (source === name) return "\0" + source;
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
load: {
|
|
111
|
-
filter: { id: exactRegex("\0" + name) },
|
|
112
|
-
handler(id) {
|
|
113
|
-
if (id === "\0" + name) {
|
|
114
|
-
if (isEnabled()) return preambleCode.replace("__BASE__", "/");
|
|
115
|
-
return "";
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function viteReact(opts = {}) {
|
|
122
|
-
const include = opts.include ?? defaultIncludeRE;
|
|
123
|
-
const exclude = opts.exclude ?? defaultExcludeRE;
|
|
124
|
-
const jsxImportSource = opts.jsxImportSource ?? "react";
|
|
125
|
-
const jsxImportRuntime = `${jsxImportSource}/jsx-runtime`;
|
|
126
|
-
const jsxImportDevRuntime = `${jsxImportSource}/jsx-dev-runtime`;
|
|
127
|
-
let runningInVite = false;
|
|
128
|
-
let isProduction = true;
|
|
129
|
-
let skipFastRefresh = true;
|
|
130
|
-
let base;
|
|
131
|
-
let isBundledDev = false;
|
|
132
|
-
const viteBabel = {
|
|
133
|
-
name: "vite:react-babel",
|
|
134
|
-
enforce: "pre",
|
|
135
|
-
config(_userConfig, { command }) {
|
|
136
|
-
if (opts.jsxRuntime === "classic") return { oxc: {
|
|
137
|
-
jsx: {
|
|
138
|
-
runtime: "classic",
|
|
139
|
-
refresh: command === "serve"
|
|
140
|
-
},
|
|
141
|
-
jsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),
|
|
142
|
-
jsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)
|
|
143
|
-
} };
|
|
144
|
-
else return {
|
|
145
|
-
oxc: {
|
|
146
|
-
jsx: {
|
|
147
|
-
runtime: "automatic",
|
|
148
|
-
importSource: opts.jsxImportSource,
|
|
149
|
-
refresh: command === "serve"
|
|
150
|
-
},
|
|
151
|
-
jsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),
|
|
152
|
-
jsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)
|
|
153
|
-
},
|
|
154
|
-
optimizeDeps: { rolldownOptions: { transform: { jsx: { runtime: "automatic" } } } }
|
|
155
|
-
};
|
|
156
|
-
},
|
|
157
|
-
configResolved(config) {
|
|
158
|
-
runningInVite = true;
|
|
159
|
-
base = config.base;
|
|
160
|
-
if (config.experimental.bundledDev) isBundledDev = true;
|
|
161
|
-
isProduction = config.isProduction;
|
|
162
|
-
skipFastRefresh = isProduction || config.command === "build" || config.server.hmr === false;
|
|
163
|
-
},
|
|
164
|
-
options(options) {
|
|
165
|
-
if (!runningInVite) {
|
|
166
|
-
options.transform ??= {};
|
|
167
|
-
options.transform.jsx = {
|
|
168
|
-
runtime: opts.jsxRuntime,
|
|
169
|
-
importSource: opts.jsxImportSource
|
|
170
|
-
};
|
|
171
|
-
return options;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
const viteRefreshWrapper = {
|
|
176
|
-
name: "vite:react:refresh-wrapper",
|
|
177
|
-
apply: "serve",
|
|
178
|
-
async applyToEnvironment(env) {
|
|
179
|
-
if (env.config.consumer !== "client" || skipFastRefresh) return false;
|
|
180
|
-
return reactRefreshWrapperPlugin({
|
|
181
|
-
cwd: process.cwd(),
|
|
182
|
-
include: makeIdFiltersToMatchWithQuery(include),
|
|
183
|
-
exclude: makeIdFiltersToMatchWithQuery(exclude),
|
|
184
|
-
jsxImportSource,
|
|
185
|
-
reactRefreshHost: opts.reactRefreshHost ?? ""
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
const viteConfigPost = {
|
|
190
|
-
name: "vite:react:config-post",
|
|
191
|
-
enforce: "post",
|
|
192
|
-
config(userConfig) {
|
|
193
|
-
if (userConfig.server?.hmr === false) return { oxc: { jsx: { refresh: false } } };
|
|
194
|
-
}
|
|
195
|
-
};
|
|
196
|
-
const viteReactRefreshBundledDevMode = {
|
|
197
|
-
name: "vite:react-refresh-fbm",
|
|
198
|
-
enforce: "pre",
|
|
199
|
-
transformIndexHtml: {
|
|
200
|
-
handler() {
|
|
201
|
-
if (!skipFastRefresh && isBundledDev) return [{
|
|
202
|
-
tag: "script",
|
|
203
|
-
attrs: { type: "module" },
|
|
204
|
-
children: getPreambleCode(base)
|
|
205
|
-
}];
|
|
206
|
-
},
|
|
207
|
-
order: "pre"
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
const dependencies = [
|
|
211
|
-
"react",
|
|
212
|
-
"react-dom",
|
|
213
|
-
jsxImportDevRuntime,
|
|
214
|
-
jsxImportRuntime
|
|
215
|
-
];
|
|
216
|
-
return [
|
|
217
|
-
viteBabel,
|
|
218
|
-
viteRefreshWrapper,
|
|
219
|
-
viteConfigPost,
|
|
220
|
-
viteReactRefreshBundledDevMode,
|
|
221
|
-
{
|
|
222
|
-
name: "vite:react-refresh",
|
|
223
|
-
enforce: "pre",
|
|
224
|
-
config: (userConfig) => ({
|
|
225
|
-
build: silenceUseClientWarning(userConfig),
|
|
226
|
-
optimizeDeps: { include: dependencies }
|
|
227
|
-
}),
|
|
228
|
-
resolveId: {
|
|
229
|
-
filter: { id: exactRegex(runtimePublicPath) },
|
|
230
|
-
handler(id) {
|
|
231
|
-
if (id === "/@react-refresh") return id;
|
|
232
|
-
}
|
|
233
|
-
},
|
|
234
|
-
load: {
|
|
235
|
-
filter: { id: exactRegex(runtimePublicPath) },
|
|
236
|
-
handler(id) {
|
|
237
|
-
if (id === "/@react-refresh") return readFileSync(refreshRuntimePath, "utf-8").replace(/__README_URL__/g, "https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react");
|
|
238
|
-
}
|
|
239
|
-
},
|
|
240
|
-
transformIndexHtml() {
|
|
241
|
-
if (!skipFastRefresh && !isBundledDev) return [{
|
|
242
|
-
tag: "script",
|
|
243
|
-
attrs: { type: "module" },
|
|
244
|
-
children: getPreambleCode(base)
|
|
245
|
-
}];
|
|
246
|
-
}
|
|
247
|
-
},
|
|
248
|
-
virtualPreamblePlugin({
|
|
249
|
-
name: "@vitejs/plugin-react/preamble",
|
|
250
|
-
isEnabled: () => !skipFastRefresh && !isBundledDev
|
|
251
|
-
})
|
|
252
|
-
];
|
|
253
|
-
}
|
|
254
|
-
function viteReactForCjs(options) {
|
|
255
|
-
return viteReact.call(this, options);
|
|
256
|
-
}
|
|
257
|
-
var runtimePublicPath, preambleCode, getPreambleCode, silenceUseClientWarning, reactCompilerPreset, refreshRuntimePath, defaultIncludeRE, defaultExcludeRE;
|
|
258
|
-
var init_dist2 = __esm({
|
|
259
|
-
"../../node_modules/.pnpm/@vitejs+plugin-react@6.0.1_vite@6.4.1_@types+node@25.5.0_jiti@2.6.1_/node_modules/@vitejs/plugin-react/dist/index.js"() {
|
|
260
|
-
"use strict";
|
|
261
|
-
init_dist();
|
|
262
|
-
runtimePublicPath = "/@react-refresh";
|
|
263
|
-
preambleCode = `import { injectIntoGlobalHook } from "__BASE__${runtimePublicPath.slice(1)}";
|
|
264
|
-
injectIntoGlobalHook(window);
|
|
265
|
-
window.$RefreshReg$ = () => {};
|
|
266
|
-
window.$RefreshSig$ = () => (type) => type;`;
|
|
267
|
-
getPreambleCode = (base) => preambleCode.replace("__BASE__", base);
|
|
268
|
-
silenceUseClientWarning = (userConfig) => ({ rollupOptions: { onwarn(warning, defaultHandler) {
|
|
269
|
-
if (warning.code === "MODULE_LEVEL_DIRECTIVE" && (warning.message.includes("use client") || warning.message.includes("use server"))) return;
|
|
270
|
-
if (warning.code === "SOURCEMAP_ERROR" && warning.message.includes("resolve original location") && warning.pos === 0) return;
|
|
271
|
-
if (userConfig.build?.rollupOptions?.onwarn) userConfig.build.rollupOptions.onwarn(warning, defaultHandler);
|
|
272
|
-
else defaultHandler(warning);
|
|
273
|
-
} } });
|
|
274
|
-
reactCompilerPreset = (options = {}) => ({
|
|
275
|
-
preset: () => ({ plugins: [["babel-plugin-react-compiler", options]] }),
|
|
276
|
-
rolldown: {
|
|
277
|
-
filter: { code: options.compilationMode === "annotation" ? /['"]use memo['"]/ : /\b[A-Z]|\buse/ },
|
|
278
|
-
applyToEnvironmentHook: (env) => env.config.consumer === "client",
|
|
279
|
-
optimizeDeps: { include: options.target === "17" || options.target === "18" ? ["react-compiler-runtime"] : ["react/compiler-runtime"] }
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
refreshRuntimePath = join(dirname(fileURLToPath(import.meta.url)), "refresh-runtime.js");
|
|
283
|
-
defaultIncludeRE = /\.[tj]sx?$/;
|
|
284
|
-
defaultExcludeRE = /\/node_modules\//;
|
|
285
|
-
viteReact.preambleCode = preambleCode;
|
|
286
|
-
Object.assign(viteReactForCjs, {
|
|
287
|
-
default: viteReactForCjs,
|
|
288
|
-
reactCompilerPreset
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
|
|
293
1
|
// src/server/index.ts
|
|
294
2
|
import { createServer as createViteServer } from "vite";
|
|
295
3
|
import { WebSocketServer } from "ws";
|
|
@@ -611,7 +319,7 @@ async function startPreviewServer(options = {}) {
|
|
|
611
319
|
setupWsHandler(wss, builder);
|
|
612
320
|
let reactPlugin;
|
|
613
321
|
try {
|
|
614
|
-
const mod = await
|
|
322
|
+
const mod = await import("@vitejs/plugin-react");
|
|
615
323
|
reactPlugin = (mod.default ?? mod)();
|
|
616
324
|
} catch {
|
|
617
325
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/utils.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/composable-filters.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/filter-vite-plugins.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/simple-filters.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/filter/index.js","../../../node_modules/.pnpm/@rolldown+pluginutils@1.0.0-rc.7/node_modules/@rolldown/pluginutils/dist/index.js","../../../node_modules/.pnpm/@vitejs+plugin-react@6.0.1_vite@6.4.1_@types+node@25.5.0_jiti@2.6.1_/node_modules/@vitejs/plugin-react/dist/index.js","../src/server/index.ts","../src/server/api-routes.ts","../src/server/ws-handler.ts","../src/server/watcher.ts","../src/server/incremental-build.ts"],"sourcesContent":["const postfixRE = /[?#].*$/;\nexport function cleanUrl(url) {\n return url.replace(postfixRE, '');\n}\nexport function extractQueryWithoutFragment(url) {\n const questionMarkIndex = url.indexOf('?');\n if (questionMarkIndex === -1) {\n return '';\n }\n const fragmentIndex = url.indexOf('#', questionMarkIndex); // Search for # after ?\n if (fragmentIndex === -1) {\n return url.substring(questionMarkIndex);\n }\n else {\n return url.substring(questionMarkIndex, fragmentIndex);\n }\n}\n","import { cleanUrl, extractQueryWithoutFragment } from \"../utils.js\";\nclass And {\n kind;\n args;\n constructor(...args) {\n if (args.length === 0) {\n throw new Error('`And` expects at least one operand');\n }\n this.args = args;\n this.kind = 'and';\n }\n}\nclass Or {\n kind;\n args;\n constructor(...args) {\n if (args.length === 0) {\n throw new Error('`Or` expects at least one operand');\n }\n this.args = args;\n this.kind = 'or';\n }\n}\nclass Not {\n kind;\n expr;\n constructor(expr) {\n this.expr = expr;\n this.kind = 'not';\n }\n}\nclass Id {\n kind;\n pattern;\n params;\n constructor(pattern, params) {\n this.pattern = pattern;\n this.kind = 'id';\n this.params = params ?? {\n cleanUrl: false,\n };\n }\n}\nclass ImporterId {\n kind;\n pattern;\n params;\n constructor(pattern, params) {\n this.pattern = pattern;\n this.kind = 'importerId';\n this.params = params ?? {\n cleanUrl: false,\n };\n }\n}\nclass ModuleType {\n kind;\n pattern;\n constructor(pattern) {\n this.pattern = pattern;\n this.kind = 'moduleType';\n }\n}\nclass Code {\n kind;\n pattern;\n constructor(expr) {\n this.pattern = expr;\n this.kind = 'code';\n }\n}\nclass Query {\n kind;\n key;\n pattern;\n constructor(key, pattern) {\n this.pattern = pattern;\n this.key = key;\n this.kind = 'query';\n }\n}\nclass Include {\n kind;\n expr;\n constructor(expr) {\n this.expr = expr;\n this.kind = 'include';\n }\n}\nclass Exclude {\n kind;\n expr;\n constructor(expr) {\n this.expr = expr;\n this.kind = 'exclude';\n }\n}\nexport function and(...args) {\n return new And(...args);\n}\nexport function or(...args) {\n return new Or(...args);\n}\nexport function not(expr) {\n return new Not(expr);\n}\nexport function id(pattern, params) {\n return new Id(pattern, params);\n}\nexport function importerId(pattern, params) {\n return new ImporterId(pattern, params);\n}\nexport function moduleType(pattern) {\n return new ModuleType(pattern);\n}\nexport function code(pattern) {\n return new Code(pattern);\n}\n/*\n * There are three kinds of conditions are supported:\n * 1. `boolean`: if the value is `true`, the key must exist and be truthy. if the value is `false`, the key must not exist or be falsy.\n * 2. `string`: the key must exist and be equal to the value.\n * 3. `RegExp`: the key must exist and match the value.\n */\nexport function query(key, pattern) {\n return new Query(key, pattern);\n}\nexport function include(expr) {\n return new Include(expr);\n}\nexport function exclude(expr) {\n return new Exclude(expr);\n}\n/**\n * convert a queryObject to FilterExpression like\n * ```js\n * and(query(k1, v1), query(k2, v2))\n * ```\n * @param queryFilterObject The query filter object needs to be matched.\n * @returns a `And` FilterExpression\n */\nexport function queries(queryFilter) {\n let arr = Object.entries(queryFilter).map(([key, value]) => {\n return new Query(key, value);\n });\n return and(...arr);\n}\nexport function interpreter(exprs, code, id, moduleType, importerId) {\n let arr = [];\n if (Array.isArray(exprs)) {\n arr = exprs;\n }\n else {\n arr = [exprs];\n }\n return interpreterImpl(arr, code, id, moduleType, importerId);\n}\nexport function interpreterImpl(expr, code, id, moduleType, importerId, ctx = {}) {\n let hasInclude = false;\n for (const e of expr) {\n switch (e.kind) {\n case 'include': {\n hasInclude = true;\n if (exprInterpreter(e.expr, code, id, moduleType, importerId, ctx)) {\n return true;\n }\n break;\n }\n case 'exclude': {\n if (exprInterpreter(e.expr, code, id, moduleType, importerId, ctx)) {\n return false;\n }\n break;\n }\n }\n }\n return !hasInclude;\n}\nexport function exprInterpreter(expr, code, id, moduleType, importerId, ctx = {}) {\n switch (expr.kind) {\n case 'and': {\n return expr.args.every((e) => exprInterpreter(e, code, id, moduleType, importerId, ctx));\n }\n case 'or': {\n return expr.args.some((e) => exprInterpreter(e, code, id, moduleType, importerId, ctx));\n }\n case 'not': {\n return !exprInterpreter(expr.expr, code, id, moduleType, importerId, ctx);\n }\n case 'id': {\n if (id === undefined) {\n throw new Error('`id` is required for `id` expression');\n }\n let idToMatch = id;\n if (expr.params.cleanUrl) {\n idToMatch = cleanUrl(idToMatch);\n }\n return typeof expr.pattern === 'string'\n ? idToMatch === expr.pattern\n : expr.pattern.test(idToMatch);\n }\n case 'importerId': {\n if (importerId === undefined) {\n return false; // Entry files have no importer, so no match\n }\n let importerIdToMatch = importerId;\n if (expr.params.cleanUrl) {\n importerIdToMatch = cleanUrl(importerIdToMatch);\n }\n return typeof expr.pattern === 'string'\n ? importerIdToMatch === expr.pattern\n : expr.pattern.test(importerIdToMatch);\n }\n case 'moduleType': {\n if (moduleType === undefined) {\n throw new Error('`moduleType` is required for `moduleType` expression');\n }\n return moduleType === expr.pattern;\n }\n case 'code': {\n if (code === undefined) {\n throw new Error('`code` is required for `code` expression');\n }\n return typeof expr.pattern === 'string'\n ? code.includes(expr.pattern)\n : expr.pattern.test(code);\n }\n case 'query': {\n if (id === undefined) {\n throw new Error('`id` is required for `Query` expression');\n }\n if (!ctx.urlSearchParamsCache) {\n let queryString = extractQueryWithoutFragment(id);\n ctx.urlSearchParamsCache = new URLSearchParams(queryString);\n }\n let urlParams = ctx.urlSearchParamsCache;\n if (typeof expr.pattern === 'boolean') {\n if (expr.pattern) {\n return urlParams.has(expr.key);\n }\n else {\n return !urlParams.has(expr.key);\n }\n }\n else if (typeof expr.pattern === 'string') {\n return urlParams.get(expr.key) === expr.pattern;\n }\n else {\n return expr.pattern.test(urlParams.get(expr.key) ?? '');\n }\n }\n default: {\n throw new Error(`Expression ${JSON.stringify(expr)} is not expected.`);\n }\n }\n}\n","/**\n * Filters out Vite plugins that have `apply: 'serve'` set.\n *\n * Since Rolldown operates in build mode, plugins marked with `apply: 'serve'`\n * are intended only for Vite's dev server and should be excluded from the build process.\n *\n * @param plugins - Array of plugins (can include nested arrays)\n * @returns Filtered array with serve-only plugins removed\n *\n * @example\n * ```ts\n * import { defineConfig } from 'rolldown';\n * import { filterVitePlugins } from '@rolldown/pluginutils';\n * import viteReact from '@vitejs/plugin-react';\n *\n * export default defineConfig({\n * plugins: filterVitePlugins([\n * viteReact(),\n * {\n * name: 'dev-only',\n * apply: 'serve', // This will be filtered out\n * // ...\n * }\n * ])\n * });\n * ```\n */\nexport function filterVitePlugins(plugins) {\n if (!plugins) {\n return [];\n }\n const pluginArray = Array.isArray(plugins) ? plugins : [plugins];\n const result = [];\n for (const plugin of pluginArray) {\n // Skip falsy values\n if (!plugin) {\n continue;\n }\n // Handle nested arrays recursively\n if (Array.isArray(plugin)) {\n result.push(...filterVitePlugins(plugin));\n continue;\n }\n // Check if plugin has apply property\n const pluginWithApply = plugin;\n if ('apply' in pluginWithApply) {\n const applyValue = pluginWithApply.apply;\n // If apply is a function, call it with build mode\n if (typeof applyValue === 'function') {\n try {\n const shouldApply = applyValue({}, // config object\n { command: 'build', mode: 'production' });\n if (shouldApply) {\n result.push(plugin);\n }\n }\n catch {\n // If function throws, include the plugin to be safe\n result.push(plugin);\n }\n } // If apply is 'serve', skip this plugin\n else if (applyValue === 'serve') {\n continue;\n } // If apply is 'build' or anything else, include it\n else {\n result.push(plugin);\n }\n }\n else {\n // No apply property, include the plugin\n result.push(plugin);\n }\n }\n return result;\n}\n","/**\n * Constructs a RegExp that matches the exact string specified.\n *\n * This is useful for plugin hook filters.\n *\n * @param str the string to match.\n * @param flags flags for the RegExp.\n *\n * @example\n * ```ts\n * import { exactRegex } from '@rolldown/pluginutils';\n * const plugin = {\n * name: 'plugin',\n * resolveId: {\n * filter: { id: exactRegex('foo') },\n * handler(id) {} // will only be called for `foo`\n * }\n * }\n * ```\n */\nexport function exactRegex(str, flags) {\n return new RegExp(`^${escapeRegex(str)}$`, flags);\n}\n/**\n * Constructs a RegExp that matches a value that has the specified prefix.\n *\n * This is useful for plugin hook filters.\n *\n * @param str the string to match.\n * @param flags flags for the RegExp.\n *\n * @example\n * ```ts\n * import { prefixRegex } from '@rolldown/pluginutils';\n * const plugin = {\n * name: 'plugin',\n * resolveId: {\n * filter: { id: prefixRegex('foo') },\n * handler(id) {} // will only be called for IDs starting with `foo`\n * }\n * }\n * ```\n */\nexport function prefixRegex(str, flags) {\n return new RegExp(`^${escapeRegex(str)}`, flags);\n}\nconst escapeRegexRE = /[-/\\\\^$*+?.()|[\\]{}]/g;\nfunction escapeRegex(str) {\n return str.replace(escapeRegexRE, '\\\\$&');\n}\nexport function makeIdFiltersToMatchWithQuery(input) {\n if (!Array.isArray(input)) {\n return makeIdFilterToMatchWithQuery(\n // Array.isArray cannot narrow the type\n // https://github.com/microsoft/TypeScript/issues/17002\n input);\n }\n return input.map((i) => makeIdFilterToMatchWithQuery(i));\n}\nfunction makeIdFilterToMatchWithQuery(input) {\n if (typeof input === 'string') {\n return `${input}{?*,}`;\n }\n return makeRegexIdFilterToMatchWithQuery(input);\n}\nfunction makeRegexIdFilterToMatchWithQuery(input) {\n return new RegExp(\n // replace `$` with `(?:\\?.*)?$` (ignore `\\$`)\n input.source.replace(/(?<!\\\\)\\$/g, '(?:\\\\?.*)?$'), input.flags);\n}\n","export * from \"./composable-filters.js\";\nexport * from \"./filter-vite-plugins.js\";\nexport * from \"./simple-filters.js\";\n","export * from \"./filter/index.js\";\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { exactRegex, makeIdFiltersToMatchWithQuery } from \"@rolldown/pluginutils\";\nimport { reactRefreshWrapperPlugin } from \"vite/internal\";\n//#region ../common/refresh-utils.ts\nconst runtimePublicPath = \"/@react-refresh\";\nconst preambleCode = `import { injectIntoGlobalHook } from \"__BASE__${runtimePublicPath.slice(1)}\";\ninjectIntoGlobalHook(window);\nwindow.$RefreshReg$ = () => {};\nwindow.$RefreshSig$ = () => (type) => type;`;\nconst getPreambleCode = (base) => preambleCode.replace(\"__BASE__\", base);\nfunction virtualPreamblePlugin({ name, isEnabled }) {\n\treturn {\n\t\tname: \"vite:react-virtual-preamble\",\n\t\tresolveId: {\n\t\t\torder: \"pre\",\n\t\t\tfilter: { id: exactRegex(name) },\n\t\t\thandler(source) {\n\t\t\t\tif (source === name) return \"\\0\" + source;\n\t\t\t}\n\t\t},\n\t\tload: {\n\t\t\tfilter: { id: exactRegex(\"\\0\" + name) },\n\t\t\thandler(id) {\n\t\t\t\tif (id === \"\\0\" + name) {\n\t\t\t\t\tif (isEnabled()) return preambleCode.replace(\"__BASE__\", \"/\");\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n//#endregion\n//#region ../common/warning.ts\nconst silenceUseClientWarning = (userConfig) => ({ rollupOptions: { onwarn(warning, defaultHandler) {\n\tif (warning.code === \"MODULE_LEVEL_DIRECTIVE\" && (warning.message.includes(\"use client\") || warning.message.includes(\"use server\"))) return;\n\tif (warning.code === \"SOURCEMAP_ERROR\" && warning.message.includes(\"resolve original location\") && warning.pos === 0) return;\n\tif (userConfig.build?.rollupOptions?.onwarn) userConfig.build.rollupOptions.onwarn(warning, defaultHandler);\n\telse defaultHandler(warning);\n} } });\n//#endregion\n//#region src/reactCompilerPreset.ts\nconst reactCompilerPreset = (options = {}) => ({\n\tpreset: () => ({ plugins: [[\"babel-plugin-react-compiler\", options]] }),\n\trolldown: {\n\t\tfilter: { code: options.compilationMode === \"annotation\" ? /['\"]use memo['\"]/ : /\\b[A-Z]|\\buse/ },\n\t\tapplyToEnvironmentHook: (env) => env.config.consumer === \"client\",\n\t\toptimizeDeps: { include: options.target === \"17\" || options.target === \"18\" ? [\"react-compiler-runtime\"] : [\"react/compiler-runtime\"] }\n\t}\n});\n//#endregion\n//#region src/index.ts\nconst refreshRuntimePath = join(dirname(fileURLToPath(import.meta.url)), \"refresh-runtime.js\");\nconst defaultIncludeRE = /\\.[tj]sx?$/;\nconst defaultExcludeRE = /\\/node_modules\\//;\nfunction viteReact(opts = {}) {\n\tconst include = opts.include ?? defaultIncludeRE;\n\tconst exclude = opts.exclude ?? defaultExcludeRE;\n\tconst jsxImportSource = opts.jsxImportSource ?? \"react\";\n\tconst jsxImportRuntime = `${jsxImportSource}/jsx-runtime`;\n\tconst jsxImportDevRuntime = `${jsxImportSource}/jsx-dev-runtime`;\n\tlet runningInVite = false;\n\tlet isProduction = true;\n\tlet skipFastRefresh = true;\n\tlet base;\n\tlet isBundledDev = false;\n\tconst viteBabel = {\n\t\tname: \"vite:react-babel\",\n\t\tenforce: \"pre\",\n\t\tconfig(_userConfig, { command }) {\n\t\t\tif (opts.jsxRuntime === \"classic\") return { oxc: {\n\t\t\t\tjsx: {\n\t\t\t\t\truntime: \"classic\",\n\t\t\t\t\trefresh: command === \"serve\"\n\t\t\t\t},\n\t\t\t\tjsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),\n\t\t\t\tjsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)\n\t\t\t} };\n\t\t\telse return {\n\t\t\t\toxc: {\n\t\t\t\t\tjsx: {\n\t\t\t\t\t\truntime: \"automatic\",\n\t\t\t\t\t\timportSource: opts.jsxImportSource,\n\t\t\t\t\t\trefresh: command === \"serve\"\n\t\t\t\t\t},\n\t\t\t\t\tjsxRefreshInclude: makeIdFiltersToMatchWithQuery(include),\n\t\t\t\t\tjsxRefreshExclude: makeIdFiltersToMatchWithQuery(exclude)\n\t\t\t\t},\n\t\t\t\toptimizeDeps: { rolldownOptions: { transform: { jsx: { runtime: \"automatic\" } } } }\n\t\t\t};\n\t\t},\n\t\tconfigResolved(config) {\n\t\t\trunningInVite = true;\n\t\t\tbase = config.base;\n\t\t\tif (config.experimental.bundledDev) isBundledDev = true;\n\t\t\tisProduction = config.isProduction;\n\t\t\tskipFastRefresh = isProduction || config.command === \"build\" || config.server.hmr === false;\n\t\t},\n\t\toptions(options) {\n\t\t\tif (!runningInVite) {\n\t\t\t\toptions.transform ??= {};\n\t\t\t\toptions.transform.jsx = {\n\t\t\t\t\truntime: opts.jsxRuntime,\n\t\t\t\t\timportSource: opts.jsxImportSource\n\t\t\t\t};\n\t\t\t\treturn options;\n\t\t\t}\n\t\t}\n\t};\n\tconst viteRefreshWrapper = {\n\t\tname: \"vite:react:refresh-wrapper\",\n\t\tapply: \"serve\",\n\t\tasync applyToEnvironment(env) {\n\t\t\tif (env.config.consumer !== \"client\" || skipFastRefresh) return false;\n\t\t\treturn reactRefreshWrapperPlugin({\n\t\t\t\tcwd: process.cwd(),\n\t\t\t\tinclude: makeIdFiltersToMatchWithQuery(include),\n\t\t\t\texclude: makeIdFiltersToMatchWithQuery(exclude),\n\t\t\t\tjsxImportSource,\n\t\t\t\treactRefreshHost: opts.reactRefreshHost ?? \"\"\n\t\t\t});\n\t\t}\n\t};\n\tconst viteConfigPost = {\n\t\tname: \"vite:react:config-post\",\n\t\tenforce: \"post\",\n\t\tconfig(userConfig) {\n\t\t\tif (userConfig.server?.hmr === false) return { oxc: { jsx: { refresh: false } } };\n\t\t}\n\t};\n\tconst viteReactRefreshBundledDevMode = {\n\t\tname: \"vite:react-refresh-fbm\",\n\t\tenforce: \"pre\",\n\t\ttransformIndexHtml: {\n\t\t\thandler() {\n\t\t\t\tif (!skipFastRefresh && isBundledDev) return [{\n\t\t\t\t\ttag: \"script\",\n\t\t\t\t\tattrs: { type: \"module\" },\n\t\t\t\t\tchildren: getPreambleCode(base)\n\t\t\t\t}];\n\t\t\t},\n\t\t\torder: \"pre\"\n\t\t}\n\t};\n\tconst dependencies = [\n\t\t\"react\",\n\t\t\"react-dom\",\n\t\tjsxImportDevRuntime,\n\t\tjsxImportRuntime\n\t];\n\treturn [\n\t\tviteBabel,\n\t\tviteRefreshWrapper,\n\t\tviteConfigPost,\n\t\tviteReactRefreshBundledDevMode,\n\t\t{\n\t\t\tname: \"vite:react-refresh\",\n\t\t\tenforce: \"pre\",\n\t\t\tconfig: (userConfig) => ({\n\t\t\t\tbuild: silenceUseClientWarning(userConfig),\n\t\t\t\toptimizeDeps: { include: dependencies }\n\t\t\t}),\n\t\t\tresolveId: {\n\t\t\t\tfilter: { id: exactRegex(runtimePublicPath) },\n\t\t\t\thandler(id) {\n\t\t\t\t\tif (id === \"/@react-refresh\") return id;\n\t\t\t\t}\n\t\t\t},\n\t\t\tload: {\n\t\t\t\tfilter: { id: exactRegex(runtimePublicPath) },\n\t\t\t\thandler(id) {\n\t\t\t\t\tif (id === \"/@react-refresh\") return readFileSync(refreshRuntimePath, \"utf-8\").replace(/__README_URL__/g, \"https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-react\");\n\t\t\t\t}\n\t\t\t},\n\t\t\ttransformIndexHtml() {\n\t\t\t\tif (!skipFastRefresh && !isBundledDev) return [{\n\t\t\t\t\ttag: \"script\",\n\t\t\t\t\tattrs: { type: \"module\" },\n\t\t\t\t\tchildren: getPreambleCode(base)\n\t\t\t\t}];\n\t\t\t}\n\t\t},\n\t\tvirtualPreamblePlugin({\n\t\t\tname: \"@vitejs/plugin-react/preamble\",\n\t\t\tisEnabled: () => !skipFastRefresh && !isBundledDev\n\t\t})\n\t];\n}\nviteReact.preambleCode = preambleCode;\nfunction viteReactForCjs(options) {\n\treturn viteReact.call(this, options);\n}\nObject.assign(viteReactForCjs, {\n\tdefault: viteReactForCjs,\n\treactCompilerPreset\n});\n//#endregion\nexport { viteReact as default, viteReactForCjs as \"module.exports\", reactCompilerPreset };\n","import { createServer as createViteServer } from 'vite';\nimport { WebSocketServer } from 'ws';\nimport http from 'node:http';\nimport path from 'node:path';\nimport { setupApiRoutes } from './api-routes.js';\nimport { setupWsHandler } from './ws-handler.js';\nimport { setupWatcher } from './watcher.js';\nimport { IncrementalBuilder } from './incremental-build.js';\n\nexport interface PreviewServerOptions {\n port?: number;\n open?: boolean;\n configPath?: string;\n}\n\nexport async function startPreviewServer(options: PreviewServerOptions = {}): Promise<void> {\n const port = options.port ?? 4400;\n const cwd = process.cwd();\n\n // Initialize incremental builder\n const builder = new IncrementalBuilder(cwd, options.configPath);\n await builder.initialBuild();\n\n // Create HTTP server\n const server = http.createServer();\n\n // Setup WebSocket\n const wss = new WebSocketServer({ server });\n setupWsHandler(wss, builder);\n\n // Create Vite dev server for client SPA\n let reactPlugin;\n try {\n const mod = await import('@vitejs/plugin-react');\n reactPlugin = (mod.default ?? mod)();\n } catch {\n // Plugin not available, proceed without it\n }\n\n const vite = await createViteServer({\n root: path.resolve(__dirname, '../client'),\n server: {\n middlewareMode: true,\n hmr: { server },\n },\n plugins: reactPlugin ? [reactPlugin] : [],\n appType: 'spa',\n });\n\n // Setup API routes\n const apiHandler = setupApiRoutes(builder);\n\n // Handle requests\n server.on('request', (req, res) => {\n if (req.url?.startsWith('/api/')) {\n apiHandler(req, res);\n } else {\n vite.middlewares(req, res);\n }\n });\n\n // Setup file watcher\n setupWatcher(builder, wss, cwd);\n\n // Start server\n server.listen(port, () => {\n console.log(`\\n 🎨 RynDesign Preview`);\n console.log(` ➜ Local: http://localhost:${port}/`);\n console.log(` ➜ WS: ws://localhost:${port}/\\n`);\n\n if (options.open) {\n import('child_process').then(cp => {\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n cp.exec(`${cmd} http://localhost:${port}/`);\n }).catch(() => {});\n }\n });\n\n // Graceful shutdown\n process.on('SIGINT', () => {\n wss.close();\n vite.close();\n server.close();\n process.exit(0);\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\ntype RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\nexport function setupApiRoutes(builder: IncrementalBuilder): RequestHandler {\n return (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host}`);\n const pathname = url.pathname;\n\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n if (pathname === '/api/tokens' && req.method === 'GET') {\n json(res, builder.getTokenSet());\n } else if (pathname === '/api/themes' && req.method === 'GET') {\n json(res, builder.getThemes());\n } else if (pathname === '/api/components' && req.method === 'GET') {\n json(res, builder.getComponents());\n } else if (pathname === '/api/snippets' && req.method === 'GET') {\n const platform = url.searchParams.get('platform') ?? 'react';\n const component = url.searchParams.get('component') ?? undefined;\n const type = url.searchParams.get('type') ?? undefined;\n builder.generateSnippets(platform, component, type).then(code => {\n json(res, { code });\n }).catch(err => {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n });\n return; // async handling\n } else if (pathname === '/api/tokens' && req.method === 'PUT') {\n let body = '';\n req.on('data', chunk => { body += chunk; });\n req.on('end', async () => {\n const { path, value, theme } = JSON.parse(body);\n await builder.updateToken(path, value, theme);\n json(res, { success: true });\n });\n } else if (pathname === '/api/generated' && req.method === 'GET') {\n const platform = url.searchParams.get('platform');\n json(res, builder.getGeneratedFiles(platform ?? undefined));\n } else {\n res.writeHead(404);\n json(res, { error: 'Not found' });\n }\n } catch (err) {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n }\n };\n}\n\nfunction json(res: ServerResponse, data: unknown): void {\n if (!res.headersSent) {\n res.setHeader('Content-Type', 'application/json');\n }\n res.end(JSON.stringify(data));\n}\n","import type { WebSocketServer, WebSocket } from 'ws';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport interface WsMessage {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface TokenUpdateMessage extends WsMessage {\n type: 'token-update';\n theme?: string;\n path: string;\n value: unknown;\n}\n\nexport interface ThemeChangeMessage extends WsMessage {\n type: 'theme-change';\n theme: string;\n}\n\nexport interface RebuildCompleteMessage extends WsMessage {\n type: 'rebuild-complete';\n changedTokens: string[];\n timestamp: number;\n}\n\nexport function setupWsHandler(wss: WebSocketServer, builder: IncrementalBuilder): void {\n wss.on('connection', (ws: WebSocket) => {\n console.log('Preview client connected');\n\n // Send initial state\n ws.send(JSON.stringify({\n type: 'init',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n\n ws.on('message', async (data: Buffer) => {\n try {\n const message = JSON.parse(data.toString()) as WsMessage;\n\n switch (message.type) {\n case 'token-update': {\n const update = message as TokenUpdateMessage;\n await builder.updateToken(update.path, update.value, update.theme);\n\n // Broadcast rebuild complete to all clients\n broadcast(wss, {\n type: 'rebuild-complete',\n changedTokens: [update.path],\n timestamp: Date.now(),\n });\n break;\n }\n\n case 'theme-change': {\n const themeMsg = message as ThemeChangeMessage;\n broadcast(wss, {\n type: 'theme-switched',\n theme: themeMsg.theme,\n tokens: builder.getThemeTokens(themeMsg.theme),\n });\n break;\n }\n\n case 'request-state': {\n ws.send(JSON.stringify({\n type: 'full-state',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n break;\n }\n }\n } catch (err) {\n ws.send(JSON.stringify({\n type: 'error',\n message: (err as Error).message,\n }));\n }\n });\n\n ws.on('close', () => {\n console.log('Preview client disconnected');\n });\n });\n}\n\nfunction broadcast(wss: WebSocketServer, message: Record<string, unknown>): void {\n const data = JSON.stringify(message);\n for (const client of wss.clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data);\n }\n }\n}\n","import type { WebSocketServer } from 'ws';\nimport { watch } from 'chokidar';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport function setupWatcher(\n builder: IncrementalBuilder,\n wss: WebSocketServer,\n cwd: string\n): void {\n const watcher = watch(\n ['tokens/**/*.tokens.json', 'components/**/*.component.json'],\n {\n cwd,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 50,\n },\n }\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const handleChange = (changedPath: string) => {\n if (debounceTimer) clearTimeout(debounceTimer);\n\n debounceTimer = setTimeout(async () => {\n console.log(`File changed: ${changedPath}`);\n\n try {\n await builder.rebuild();\n\n // Broadcast to all connected clients\n const data = JSON.stringify({\n type: 'rebuild-complete',\n changedTokens: [],\n timestamp: Date.now(),\n tokenSet: builder.getTokenSet(),\n components: builder.getComponents(),\n });\n\n for (const client of wss.clients) {\n if (client.readyState === 1) {\n client.send(data);\n }\n }\n } catch (err) {\n console.error('Rebuild failed:', (err as Error).message);\n }\n }, 300);\n };\n\n watcher.on('change', handleChange);\n watcher.on('add', handleChange);\n watcher.on('unlink', handleChange);\n}\n","import { buildTokenSet, loadComponents, resolveComponent, type RawTokenTree } from '@ryndesign/core';\nimport type { ResolvedTokenSet, GeneratedFile, ResolvedComponent, GeneratorPlugin } from '@ryndesign/plugin-api';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport class IncrementalBuilder {\n private tokenSet: ResolvedTokenSet | null = null;\n private components: ResolvedComponent[] = [];\n private generatedFiles: Map<string, GeneratedFile[]> = new Map();\n private generators: GeneratorPlugin[] = [];\n private cwd: string;\n private configPath?: string;\n\n constructor(cwd: string, configPath?: string) {\n this.cwd = cwd;\n this.configPath = configPath;\n }\n\n async initialBuild(): Promise<void> {\n await this.rebuild();\n }\n\n async rebuild(): Promise<void> {\n const configFile = this.configPath ?? 'ryndesign.config.ts';\n\n const tokens = ['tokens/**/*.tokens.json'];\n const componentPatterns = ['components/**/*.component.json'];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let themes: any = undefined;\n\n try {\n const configPath = path.resolve(this.cwd, configFile);\n const content = await fs.readFile(configPath, 'utf-8');\n if (content.includes('dark')) {\n themes = {\n default: 'light',\n dark: { file: path.resolve(this.cwd, 'tokens/dark.tokens.json') },\n };\n }\n } catch {\n // Use defaults\n }\n\n this.tokenSet = await buildTokenSet({\n tokens,\n basePath: this.cwd,\n themes,\n });\n\n // Load and resolve components\n try {\n const componentDefs = await loadComponents(componentPatterns, this.cwd);\n this.components = componentDefs.map(def => resolveComponent(def, this.tokenSet!));\n } catch {\n this.components = [];\n }\n }\n\n getTokenSet(): ResolvedTokenSet | null {\n return this.tokenSet;\n }\n\n getThemes(): Record<string, unknown> {\n if (!this.tokenSet) return {};\n return {\n default: this.tokenSet.themes.default,\n available: Object.keys(this.tokenSet.themes.themes),\n themes: this.tokenSet.themes.themes,\n };\n }\n\n getThemeTokens(theme: string): Record<string, unknown> {\n if (!this.tokenSet) return {};\n const themeData = this.tokenSet.themes.themes[theme];\n if (!themeData) return {};\n return {\n name: themeData.name,\n tokens: themeData.tokens,\n };\n }\n\n getComponents(): ResolvedComponent[] {\n return this.components;\n }\n\n setGenerators(generators: GeneratorPlugin[]): void {\n this.generators = generators;\n }\n\n async generateSnippets(platform: string, componentName?: string, type?: string): Promise<string> {\n if (!this.tokenSet) return '';\n\n const generator = this.generators.find(g => g.name === platform);\n if (!generator) return `// Generator for \"${platform}\" not available`;\n\n const { createGeneratorHelpers } = await import('@ryndesign/core');\n const ctx = {\n tokenSet: this.tokenSet,\n config: { outDir: 'generated' },\n outputDir: path.resolve(this.cwd, 'generated'),\n helpers: createGeneratorHelpers(),\n components: this.components,\n };\n\n try {\n if (type === 'tokens') {\n const files = await generator.generateTokens(ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n\n if (componentName) {\n const comp = this.components.find(c => c.definition.name === componentName);\n if (comp) {\n const files = await generator.generateComponent(comp, ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n return `// Component \"${componentName}\" not found`;\n }\n\n return '// Specify a component or type=tokens';\n } catch (err) {\n return `// Error: ${(err as Error).message}`;\n }\n }\n\n getGeneratedFiles(platform?: string): GeneratedFile[] {\n if (!platform) {\n return Array.from(this.generatedFiles.values()).flat();\n }\n return this.generatedFiles.get(platform) ?? [];\n }\n\n async updateToken(tokenPath: string, value: unknown, theme?: string): Promise<void> {\n const filePath = theme\n ? path.resolve(this.cwd, `tokens/${theme}.tokens.json`)\n : path.resolve(this.cwd, 'tokens/semantic.tokens.json');\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const tree = JSON.parse(content) as RawTokenTree;\n\n const parts = tokenPath.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]];\n }\n\n const lastKey = parts[parts.length - 1];\n if (current[lastKey] && typeof current[lastKey] === 'object' && '$value' in current[lastKey]) {\n current[lastKey].$value = value;\n } else {\n current[lastKey] = { $type: 'color', $value: value };\n }\n\n await fs.writeFile(filePath, JSON.stringify(tree, null, 2), 'utf-8');\n await this.rebuild();\n } catch (err) {\n console.error(`Failed to update token: ${(err as Error).message}`);\n throw err;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACoBO,SAAS,WAAW,KAAK,OAAO;AACnC,SAAO,IAAI,OAAO,IAAI,YAAY,GAAG,CAAC,KAAK,KAAK;AACpD;AAyBA,SAAS,YAAY,KAAK;AACtB,SAAO,IAAI,QAAQ,eAAe,MAAM;AAC5C;AACO,SAAS,8BAA8B,OAAO;AACjD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,WAAO;AAAA;AAAA;AAAA,MAGP;AAAA,IAAK;AAAA,EACT;AACA,SAAO,MAAM,IAAI,CAAC,MAAM,6BAA6B,CAAC,CAAC;AAC3D;AACA,SAAS,6BAA6B,OAAO;AACzC,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO,GAAG,KAAK;AAAA,EACnB;AACA,SAAO,kCAAkC,KAAK;AAClD;AACA,SAAS,kCAAkC,OAAO;AAC9C,SAAO,IAAI;AAAA;AAAA,IAEX,MAAM,OAAO,QAAQ,cAAc,aAAa;AAAA,IAAG,MAAM;AAAA,EAAK;AAClE;AArEA,IA8CM;AA9CN;AAAA;AAAA;AA8CA,IAAM,gBAAgB;AAAA;AAAA;;;AC9CtB;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;;;ACFA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,iCAAiC;AAQ1C,SAAS,sBAAsB,EAAE,MAAM,UAAU,GAAG;AACnD,SAAO;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACV,OAAO;AAAA,MACP,QAAQ,EAAE,IAAI,WAAW,IAAI,EAAE;AAAA,MAC/B,QAAQ,QAAQ;AACf,YAAI,WAAW,KAAM,QAAO,OAAO;AAAA,MACpC;AAAA,IACD;AAAA,IACA,MAAM;AAAA,MACL,QAAQ,EAAE,IAAI,WAAW,OAAO,IAAI,EAAE;AAAA,MACtC,QAAQ,IAAI;AACX,YAAI,OAAO,OAAO,MAAM;AACvB,cAAI,UAAU,EAAG,QAAO,aAAa,QAAQ,YAAY,GAAG;AAC5D,iBAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAwBA,SAAS,UAAU,OAAO,CAAC,GAAG;AAC7B,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,kBAAkB,KAAK,mBAAmB;AAChD,QAAM,mBAAmB,GAAG,eAAe;AAC3C,QAAM,sBAAsB,GAAG,eAAe;AAC9C,MAAI,gBAAgB;AACpB,MAAI,eAAe;AACnB,MAAI,kBAAkB;AACtB,MAAI;AACJ,MAAI,eAAe;AACnB,QAAM,YAAY;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO,aAAa,EAAE,QAAQ,GAAG;AAChC,UAAI,KAAK,eAAe,UAAW,QAAO,EAAE,KAAK;AAAA,QAChD,KAAK;AAAA,UACJ,SAAS;AAAA,UACT,SAAS,YAAY;AAAA,QACtB;AAAA,QACA,mBAAmB,8BAA8B,OAAO;AAAA,QACxD,mBAAmB,8BAA8B,OAAO;AAAA,MACzD,EAAE;AAAA,UACG,QAAO;AAAA,QACX,KAAK;AAAA,UACJ,KAAK;AAAA,YACJ,SAAS;AAAA,YACT,cAAc,KAAK;AAAA,YACnB,SAAS,YAAY;AAAA,UACtB;AAAA,UACA,mBAAmB,8BAA8B,OAAO;AAAA,UACxD,mBAAmB,8BAA8B,OAAO;AAAA,QACzD;AAAA,QACA,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,EAAE;AAAA,MACnF;AAAA,IACD;AAAA,IACA,eAAe,QAAQ;AACtB,sBAAgB;AAChB,aAAO,OAAO;AACd,UAAI,OAAO,aAAa,WAAY,gBAAe;AACnD,qBAAe,OAAO;AACtB,wBAAkB,gBAAgB,OAAO,YAAY,WAAW,OAAO,OAAO,QAAQ;AAAA,IACvF;AAAA,IACA,QAAQ,SAAS;AAChB,UAAI,CAAC,eAAe;AACnB,gBAAQ,cAAc,CAAC;AACvB,gBAAQ,UAAU,MAAM;AAAA,UACvB,SAAS,KAAK;AAAA,UACd,cAAc,KAAK;AAAA,QACpB;AACA,eAAO;AAAA,MACR;AAAA,IACD;AAAA,EACD;AACA,QAAM,qBAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,mBAAmB,KAAK;AAC7B,UAAI,IAAI,OAAO,aAAa,YAAY,gBAAiB,QAAO;AAChE,aAAO,0BAA0B;AAAA,QAChC,KAAK,QAAQ,IAAI;AAAA,QACjB,SAAS,8BAA8B,OAAO;AAAA,QAC9C,SAAS,8BAA8B,OAAO;AAAA,QAC9C;AAAA,QACA,kBAAkB,KAAK,oBAAoB;AAAA,MAC5C,CAAC;AAAA,IACF;AAAA,EACD;AACA,QAAM,iBAAiB;AAAA,IACtB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO,YAAY;AAClB,UAAI,WAAW,QAAQ,QAAQ,MAAO,QAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE;AAAA,IACjF;AAAA,EACD;AACA,QAAM,iCAAiC;AAAA,IACtC,MAAM;AAAA,IACN,SAAS;AAAA,IACT,oBAAoB;AAAA,MACnB,UAAU;AACT,YAAI,CAAC,mBAAmB,aAAc,QAAO,CAAC;AAAA,UAC7C,KAAK;AAAA,UACL,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,gBAAgB,IAAI;AAAA,QAC/B,CAAC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD;AACA,QAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,CAAC,gBAAgB;AAAA,QACxB,OAAO,wBAAwB,UAAU;AAAA,QACzC,cAAc,EAAE,SAAS,aAAa;AAAA,MACvC;AAAA,MACA,WAAW;AAAA,QACV,QAAQ,EAAE,IAAI,WAAW,iBAAiB,EAAE;AAAA,QAC5C,QAAQ,IAAI;AACX,cAAI,OAAO,kBAAmB,QAAO;AAAA,QACtC;AAAA,MACD;AAAA,MACA,MAAM;AAAA,QACL,QAAQ,EAAE,IAAI,WAAW,iBAAiB,EAAE;AAAA,QAC5C,QAAQ,IAAI;AACX,cAAI,OAAO,kBAAmB,QAAO,aAAa,oBAAoB,OAAO,EAAE,QAAQ,mBAAmB,6EAA6E;AAAA,QACxL;AAAA,MACD;AAAA,MACA,qBAAqB;AACpB,YAAI,CAAC,mBAAmB,CAAC,aAAc,QAAO,CAAC;AAAA,UAC9C,KAAK;AAAA,UACL,OAAO,EAAE,MAAM,SAAS;AAAA,UACxB,UAAU,gBAAgB,IAAI;AAAA,QAC/B,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IACA,sBAAsB;AAAA,MACrB,MAAM;AAAA,MACN,WAAW,MAAM,CAAC,mBAAmB,CAAC;AAAA,IACvC,CAAC;AAAA,EACF;AACD;AAEA,SAAS,gBAAgB,SAAS;AACjC,SAAO,UAAU,KAAK,MAAM,OAAO;AACpC;AAhMA,IAMM,mBACA,cAIA,iBAwBA,yBAQA,qBAUA,oBACA,kBACA;AAvDN,IAAAA,aAAA;AAAA;AAAA;AAGA;AAGA,IAAM,oBAAoB;AAC1B,IAAM,eAAe,iDAAiD,kBAAkB,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAIhG,IAAM,kBAAkB,CAAC,SAAS,aAAa,QAAQ,YAAY,IAAI;AAwBvE,IAAM,0BAA0B,CAAC,gBAAgB,EAAE,eAAe,EAAE,OAAO,SAAS,gBAAgB;AACnG,UAAI,QAAQ,SAAS,6BAA6B,QAAQ,QAAQ,SAAS,YAAY,KAAK,QAAQ,QAAQ,SAAS,YAAY,GAAI;AACrI,UAAI,QAAQ,SAAS,qBAAqB,QAAQ,QAAQ,SAAS,2BAA2B,KAAK,QAAQ,QAAQ,EAAG;AACtH,UAAI,WAAW,OAAO,eAAe,OAAQ,YAAW,MAAM,cAAc,OAAO,SAAS,cAAc;AAAA,UACrG,gBAAe,OAAO;AAAA,IAC5B,EAAE,EAAE;AAGJ,IAAM,sBAAsB,CAAC,UAAU,CAAC,OAAO;AAAA,MAC9C,QAAQ,OAAO,EAAE,SAAS,CAAC,CAAC,+BAA+B,OAAO,CAAC,EAAE;AAAA,MACrE,UAAU;AAAA,QACT,QAAQ,EAAE,MAAM,QAAQ,oBAAoB,eAAe,qBAAqB,gBAAgB;AAAA,QAChG,wBAAwB,CAAC,QAAQ,IAAI,OAAO,aAAa;AAAA,QACzD,cAAc,EAAE,SAAS,QAAQ,WAAW,QAAQ,QAAQ,WAAW,OAAO,CAAC,wBAAwB,IAAI,CAAC,wBAAwB,EAAE;AAAA,MACvI;AAAA,IACD;AAGA,IAAM,qBAAqB,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,oBAAoB;AAC7F,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAsIzB,cAAU,eAAe;AAIzB,WAAO,OAAO,iBAAiB;AAAA,MAC9B,SAAS;AAAA,MACT;AAAA,IACD,CAAC;AAAA;AAAA;;;ACpMD,SAAS,gBAAgB,wBAAwB;AACjD,SAAS,uBAAuB;AAChC,OAAO,UAAU;AACjB,OAAOC,WAAU;;;ACEV,SAAS,eAAe,SAA6C;AAC1E,SAAO,CAAC,KAAK,QAAQ;AACnB,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,WAAW,IAAI;AAGrB,QAAI,UAAU,+BAA+B,GAAG;AAChD,QAAI,UAAU,gCAAgC,yBAAyB;AACvE,QAAI,UAAU,gCAAgC,cAAc;AAE5D,QAAI,IAAI,WAAW,WAAW;AAC5B,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI;AACR;AAAA,IACF;AAEA,QAAI;AACF,UAAI,aAAa,iBAAiB,IAAI,WAAW,OAAO;AACtD,aAAK,KAAK,QAAQ,YAAY,CAAC;AAAA,MACjC,WAAW,aAAa,iBAAiB,IAAI,WAAW,OAAO;AAC7D,aAAK,KAAK,QAAQ,UAAU,CAAC;AAAA,MAC/B,WAAW,aAAa,qBAAqB,IAAI,WAAW,OAAO;AACjE,aAAK,KAAK,QAAQ,cAAc,CAAC;AAAA,MACnC,WAAW,aAAa,mBAAmB,IAAI,WAAW,OAAO;AAC/D,cAAM,WAAW,IAAI,aAAa,IAAI,UAAU,KAAK;AACrD,cAAM,YAAY,IAAI,aAAa,IAAI,WAAW,KAAK;AACvD,cAAM,OAAO,IAAI,aAAa,IAAI,MAAM,KAAK;AAC7C,gBAAQ,iBAAiB,UAAU,WAAW,IAAI,EAAE,KAAK,UAAQ;AAC/D,eAAK,KAAK,EAAE,KAAK,CAAC;AAAA,QACpB,CAAC,EAAE,MAAM,SAAO;AACd,cAAI,UAAU,GAAG;AACjB,eAAK,KAAK,EAAE,OAAQ,IAAc,QAAQ,CAAC;AAAA,QAC7C,CAAC;AACD;AAAA,MACF,WAAW,aAAa,iBAAiB,IAAI,WAAW,OAAO;AAC7D,YAAI,OAAO;AACX,YAAI,GAAG,QAAQ,WAAS;AAAE,kBAAQ;AAAA,QAAO,CAAC;AAC1C,YAAI,GAAG,OAAO,YAAY;AACxB,gBAAM,EAAE,MAAAC,OAAM,OAAO,MAAM,IAAI,KAAK,MAAM,IAAI;AAC9C,gBAAM,QAAQ,YAAYA,OAAM,OAAO,KAAK;AAC5C,eAAK,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,QAC7B,CAAC;AAAA,MACH,WAAW,aAAa,oBAAoB,IAAI,WAAW,OAAO;AAChE,cAAM,WAAW,IAAI,aAAa,IAAI,UAAU;AAChD,aAAK,KAAK,QAAQ,kBAAkB,YAAY,MAAS,CAAC;AAAA,MAC5D,OAAO;AACL,YAAI,UAAU,GAAG;AACjB,aAAK,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,MAClC;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,UAAU,GAAG;AACjB,WAAK,KAAK,EAAE,OAAQ,IAAc,QAAQ,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,KAAK,KAAqB,MAAqB;AACtD,MAAI,CAAC,IAAI,aAAa;AACpB,QAAI,UAAU,gBAAgB,kBAAkB;AAAA,EAClD;AACA,MAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9B;;;ACxCO,SAAS,eAAe,KAAsB,SAAmC;AACtF,MAAI,GAAG,cAAc,CAAC,OAAkB;AACtC,YAAQ,IAAI,0BAA0B;AAGtC,OAAG,KAAK,KAAK,UAAU;AAAA,MACrB,MAAM;AAAA,MACN,UAAU,QAAQ,YAAY;AAAA,MAC9B,QAAQ,QAAQ,UAAU;AAAA,MAC1B,YAAY,QAAQ,cAAc;AAAA,IACpC,CAAC,CAAC;AAEF,OAAG,GAAG,WAAW,OAAO,SAAiB;AACvC,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,KAAK,SAAS,CAAC;AAE1C,gBAAQ,QAAQ,MAAM;AAAA,UACpB,KAAK,gBAAgB;AACnB,kBAAM,SAAS;AACf,kBAAM,QAAQ,YAAY,OAAO,MAAM,OAAO,OAAO,OAAO,KAAK;AAGjE,sBAAU,KAAK;AAAA,cACb,MAAM;AAAA,cACN,eAAe,CAAC,OAAO,IAAI;AAAA,cAC3B,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AACD;AAAA,UACF;AAAA,UAEA,KAAK,gBAAgB;AACnB,kBAAM,WAAW;AACjB,sBAAU,KAAK;AAAA,cACb,MAAM;AAAA,cACN,OAAO,SAAS;AAAA,cAChB,QAAQ,QAAQ,eAAe,SAAS,KAAK;AAAA,YAC/C,CAAC;AACD;AAAA,UACF;AAAA,UAEA,KAAK,iBAAiB;AACpB,eAAG,KAAK,KAAK,UAAU;AAAA,cACrB,MAAM;AAAA,cACN,UAAU,QAAQ,YAAY;AAAA,cAC9B,QAAQ,QAAQ,UAAU;AAAA,cAC1B,YAAY,QAAQ,cAAc;AAAA,YACpC,CAAC,CAAC;AACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,WAAG,KAAK,KAAK,UAAU;AAAA,UACrB,MAAM;AAAA,UACN,SAAU,IAAc;AAAA,QAC1B,CAAC,CAAC;AAAA,MACJ;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,cAAQ,IAAI,6BAA6B;AAAA,IAC3C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,UAAU,KAAsB,SAAwC;AAC/E,QAAM,OAAO,KAAK,UAAU,OAAO;AACnC,aAAW,UAAU,IAAI,SAAS;AAChC,QAAI,OAAO,eAAe,GAAG;AAC3B,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AACF;;;AChGA,SAAS,aAAa;AAGf,SAAS,aACd,SACA,KACA,KACM;AACN,QAAM,UAAU;AAAA,IACd,CAAC,2BAA2B,gCAAgC;AAAA,IAC5D;AAAA,MACE;AAAA,MACA,eAAe;AAAA,MACf,kBAAkB;AAAA,QAChB,oBAAoB;AAAA,QACpB,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAsD;AAE1D,QAAM,eAAe,CAAC,gBAAwB;AAC5C,QAAI,cAAe,cAAa,aAAa;AAE7C,oBAAgB,WAAW,YAAY;AACrC,cAAQ,IAAI,iBAAiB,WAAW,EAAE;AAE1C,UAAI;AACF,cAAM,QAAQ,QAAQ;AAGtB,cAAM,OAAO,KAAK,UAAU;AAAA,UAC1B,MAAM;AAAA,UACN,eAAe,CAAC;AAAA,UAChB,WAAW,KAAK,IAAI;AAAA,UACpB,UAAU,QAAQ,YAAY;AAAA,UAC9B,YAAY,QAAQ,cAAc;AAAA,QACpC,CAAC;AAED,mBAAW,UAAU,IAAI,SAAS;AAChC,cAAI,OAAO,eAAe,GAAG;AAC3B,mBAAO,KAAK,IAAI;AAAA,UAClB;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,mBAAoB,IAAc,OAAO;AAAA,MACzD;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAEA,UAAQ,GAAG,UAAU,YAAY;AACjC,UAAQ,GAAG,OAAO,YAAY;AAC9B,UAAQ,GAAG,UAAU,YAAY;AACnC;;;ACvDA,SAAS,eAAe,gBAAgB,wBAA2C;AAEnF,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,IAAM,qBAAN,MAAyB;AAAA,EACtB,WAAoC;AAAA,EACpC,aAAkC,CAAC;AAAA,EACnC,iBAA+C,oBAAI,IAAI;AAAA,EACvD,aAAgC,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EAER,YAAY,KAAa,YAAqB;AAC5C,SAAK,MAAM;AACX,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,eAA8B;AAClC,UAAM,KAAK,QAAQ;AAAA,EACrB;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,aAAa,KAAK,cAAc;AAEtC,UAAM,SAAS,CAAC,yBAAyB;AACzC,UAAM,oBAAoB,CAAC,gCAAgC;AAE3D,QAAI,SAAc;AAElB,QAAI;AACF,YAAM,aAAa,KAAK,QAAQ,KAAK,KAAK,UAAU;AACpD,YAAM,UAAU,MAAM,GAAG,SAAS,YAAY,OAAO;AACrD,UAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,iBAAS;AAAA,UACP,SAAS;AAAA,UACT,MAAM,EAAE,MAAM,KAAK,QAAQ,KAAK,KAAK,yBAAyB,EAAE;AAAA,QAClE;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,SAAK,WAAW,MAAM,cAAc;AAAA,MAClC;AAAA,MACA,UAAU,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AAGD,QAAI;AACF,YAAM,gBAAgB,MAAM,eAAe,mBAAmB,KAAK,GAAG;AACtE,WAAK,aAAa,cAAc,IAAI,SAAO,iBAAiB,KAAK,KAAK,QAAS,CAAC;AAAA,IAClF,QAAQ;AACN,WAAK,aAAa,CAAC;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,cAAuC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAqC;AACnC,QAAI,CAAC,KAAK,SAAU,QAAO,CAAC;AAC5B,WAAO;AAAA,MACL,SAAS,KAAK,SAAS,OAAO;AAAA,MAC9B,WAAW,OAAO,KAAK,KAAK,SAAS,OAAO,MAAM;AAAA,MAClD,QAAQ,KAAK,SAAS,OAAO;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,eAAe,OAAwC;AACrD,QAAI,CAAC,KAAK,SAAU,QAAO,CAAC;AAC5B,UAAM,YAAY,KAAK,SAAS,OAAO,OAAO,KAAK;AACnD,QAAI,CAAC,UAAW,QAAO,CAAC;AACxB,WAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,gBAAqC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,YAAqC;AACjD,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAM,iBAAiB,UAAkB,eAAwB,MAAgC;AAC/F,QAAI,CAAC,KAAK,SAAU,QAAO;AAE3B,UAAM,YAAY,KAAK,WAAW,KAAK,OAAK,EAAE,SAAS,QAAQ;AAC/D,QAAI,CAAC,UAAW,QAAO,qBAAqB,QAAQ;AAEpD,UAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,iBAAiB;AACjE,UAAM,MAAM;AAAA,MACV,UAAU,KAAK;AAAA,MACf,QAAQ,EAAE,QAAQ,YAAY;AAAA,MAC9B,WAAW,KAAK,QAAQ,KAAK,KAAK,WAAW;AAAA,MAC7C,SAAS,uBAAuB;AAAA,MAChC,YAAY,KAAK;AAAA,IACnB;AAEA,QAAI;AACF,UAAI,SAAS,UAAU;AACrB,cAAM,QAAQ,MAAM,UAAU,eAAe,GAAG;AAChD,eAAO,MAAM,IAAI,OAAK,MAAM,EAAE,IAAI;AAAA,EAAK,EAAE,OAAO,EAAE,EAAE,KAAK,MAAM;AAAA,MACjE;AAEA,UAAI,eAAe;AACjB,cAAM,OAAO,KAAK,WAAW,KAAK,OAAK,EAAE,WAAW,SAAS,aAAa;AAC1E,YAAI,MAAM;AACR,gBAAM,QAAQ,MAAM,UAAU,kBAAkB,MAAM,GAAG;AACzD,iBAAO,MAAM,IAAI,OAAK,MAAM,EAAE,IAAI;AAAA,EAAK,EAAE,OAAO,EAAE,EAAE,KAAK,MAAM;AAAA,QACjE;AACA,eAAO,iBAAiB,aAAa;AAAA,MACvC;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,aAAO,aAAc,IAAc,OAAO;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,kBAAkB,UAAoC;AACpD,QAAI,CAAC,UAAU;AACb,aAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EAAE,KAAK;AAAA,IACvD;AACA,WAAO,KAAK,eAAe,IAAI,QAAQ,KAAK,CAAC;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAY,WAAmB,OAAgB,OAA+B;AAClF,UAAM,WAAW,QACb,KAAK,QAAQ,KAAK,KAAK,UAAU,KAAK,cAAc,IACpD,KAAK,QAAQ,KAAK,KAAK,6BAA6B;AAExD,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,YAAM,OAAO,KAAK,MAAM,OAAO;AAE/B,YAAM,QAAQ,UAAU,MAAM,GAAG;AAEjC,UAAI,UAAe;AACnB,eAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,YAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAG,SAAQ,MAAM,CAAC,CAAC,IAAI,CAAC;AAC7C,kBAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC5B;AAEA,YAAM,UAAU,MAAM,MAAM,SAAS,CAAC;AACtC,UAAI,QAAQ,OAAO,KAAK,OAAO,QAAQ,OAAO,MAAM,YAAY,YAAY,QAAQ,OAAO,GAAG;AAC5F,gBAAQ,OAAO,EAAE,SAAS;AAAA,MAC5B,OAAO;AACL,gBAAQ,OAAO,IAAI,EAAE,OAAO,SAAS,QAAQ,MAAM;AAAA,MACrD;AAEA,YAAM,GAAG,UAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AACnE,YAAM,KAAK,QAAQ;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA4B,IAAc,OAAO,EAAE;AACjE,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AJpJA,eAAsB,mBAAmB,UAAgC,CAAC,GAAkB;AAC1F,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,MAAM,QAAQ,IAAI;AAGxB,QAAM,UAAU,IAAI,mBAAmB,KAAK,QAAQ,UAAU;AAC9D,QAAM,QAAQ,aAAa;AAG3B,QAAM,SAAS,KAAK,aAAa;AAGjC,QAAM,MAAM,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAC1C,iBAAe,KAAK,OAAO;AAG3B,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM;AAClB,mBAAe,IAAI,WAAW,KAAK;AAAA,EACrC,QAAQ;AAAA,EAER;AAEA,QAAM,OAAO,MAAM,iBAAiB;AAAA,IAClC,MAAMC,MAAK,QAAQ,WAAW,WAAW;AAAA,IACzC,QAAQ;AAAA,MACN,gBAAgB;AAAA,MAChB,KAAK,EAAE,OAAO;AAAA,IAChB;AAAA,IACA,SAAS,cAAc,CAAC,WAAW,IAAI,CAAC;AAAA,IACxC,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,aAAa,eAAe,OAAO;AAGzC,SAAO,GAAG,WAAW,CAAC,KAAK,QAAQ;AACjC,QAAI,IAAI,KAAK,WAAW,OAAO,GAAG;AAChC,iBAAW,KAAK,GAAG;AAAA,IACrB,OAAO;AACL,WAAK,YAAY,KAAK,GAAG;AAAA,IAC3B;AAAA,EACF,CAAC;AAGD,eAAa,SAAS,KAAK,GAAG;AAG9B,SAAO,OAAO,MAAM,MAAM;AACxB,YAAQ,IAAI;AAAA,8BAA0B;AACtC,YAAQ,IAAI,sCAAiC,IAAI,GAAG;AACpD,YAAQ,IAAI,oCAA+B,IAAI;AAAA,CAAK;AAEpD,QAAI,QAAQ,MAAM;AAChB,aAAO,eAAe,EAAE,KAAK,QAAM;AACjC,cAAM,MAAM,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;AAC9F,WAAG,KAAK,GAAG,GAAG,qBAAqB,IAAI,GAAG;AAAA,MAC5C,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB;AAAA,EACF,CAAC;AAGD,UAAQ,GAAG,UAAU,MAAM;AACzB,QAAI,MAAM;AACV,SAAK,MAAM;AACX,WAAO,MAAM;AACb,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":["init_dist","path","path","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/server/index.ts","../src/server/api-routes.ts","../src/server/ws-handler.ts","../src/server/watcher.ts","../src/server/incremental-build.ts"],"sourcesContent":["import { createServer as createViteServer } from 'vite';\nimport { WebSocketServer } from 'ws';\nimport http from 'node:http';\nimport path from 'node:path';\nimport { setupApiRoutes } from './api-routes.js';\nimport { setupWsHandler } from './ws-handler.js';\nimport { setupWatcher } from './watcher.js';\nimport { IncrementalBuilder } from './incremental-build.js';\n\nexport interface PreviewServerOptions {\n port?: number;\n open?: boolean;\n configPath?: string;\n}\n\nexport async function startPreviewServer(options: PreviewServerOptions = {}): Promise<void> {\n const port = options.port ?? 4400;\n const cwd = process.cwd();\n\n // Initialize incremental builder\n const builder = new IncrementalBuilder(cwd, options.configPath);\n await builder.initialBuild();\n\n // Create HTTP server\n const server = http.createServer();\n\n // Setup WebSocket\n const wss = new WebSocketServer({ server });\n setupWsHandler(wss, builder);\n\n // Create Vite dev server for client SPA\n let reactPlugin;\n try {\n const mod = await import('@vitejs/plugin-react');\n reactPlugin = (mod.default ?? mod)();\n } catch {\n // Plugin not available, proceed without it\n }\n\n const vite = await createViteServer({\n root: path.resolve(__dirname, '../client'),\n server: {\n middlewareMode: true,\n hmr: { server },\n },\n plugins: reactPlugin ? [reactPlugin] : [],\n appType: 'spa',\n });\n\n // Setup API routes\n const apiHandler = setupApiRoutes(builder);\n\n // Handle requests\n server.on('request', (req, res) => {\n if (req.url?.startsWith('/api/')) {\n apiHandler(req, res);\n } else {\n vite.middlewares(req, res);\n }\n });\n\n // Setup file watcher\n setupWatcher(builder, wss, cwd);\n\n // Start server\n server.listen(port, () => {\n console.log(`\\n 🎨 RynDesign Preview`);\n console.log(` ➜ Local: http://localhost:${port}/`);\n console.log(` ➜ WS: ws://localhost:${port}/\\n`);\n\n if (options.open) {\n import('child_process').then(cp => {\n const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n cp.exec(`${cmd} http://localhost:${port}/`);\n }).catch(() => {});\n }\n });\n\n // Graceful shutdown\n process.on('SIGINT', () => {\n wss.close();\n vite.close();\n server.close();\n process.exit(0);\n });\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\ntype RequestHandler = (req: IncomingMessage, res: ServerResponse) => void;\n\nexport function setupApiRoutes(builder: IncrementalBuilder): RequestHandler {\n return (req, res) => {\n const url = new URL(req.url ?? '/', `http://${req.headers.host}`);\n const pathname = url.pathname;\n\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n try {\n if (pathname === '/api/tokens' && req.method === 'GET') {\n json(res, builder.getTokenSet());\n } else if (pathname === '/api/themes' && req.method === 'GET') {\n json(res, builder.getThemes());\n } else if (pathname === '/api/components' && req.method === 'GET') {\n json(res, builder.getComponents());\n } else if (pathname === '/api/snippets' && req.method === 'GET') {\n const platform = url.searchParams.get('platform') ?? 'react';\n const component = url.searchParams.get('component') ?? undefined;\n const type = url.searchParams.get('type') ?? undefined;\n builder.generateSnippets(platform, component, type).then(code => {\n json(res, { code });\n }).catch(err => {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n });\n return; // async handling\n } else if (pathname === '/api/tokens' && req.method === 'PUT') {\n let body = '';\n req.on('data', chunk => { body += chunk; });\n req.on('end', async () => {\n const { path, value, theme } = JSON.parse(body);\n await builder.updateToken(path, value, theme);\n json(res, { success: true });\n });\n } else if (pathname === '/api/generated' && req.method === 'GET') {\n const platform = url.searchParams.get('platform');\n json(res, builder.getGeneratedFiles(platform ?? undefined));\n } else {\n res.writeHead(404);\n json(res, { error: 'Not found' });\n }\n } catch (err) {\n res.writeHead(500);\n json(res, { error: (err as Error).message });\n }\n };\n}\n\nfunction json(res: ServerResponse, data: unknown): void {\n if (!res.headersSent) {\n res.setHeader('Content-Type', 'application/json');\n }\n res.end(JSON.stringify(data));\n}\n","import type { WebSocketServer, WebSocket } from 'ws';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport interface WsMessage {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface TokenUpdateMessage extends WsMessage {\n type: 'token-update';\n theme?: string;\n path: string;\n value: unknown;\n}\n\nexport interface ThemeChangeMessage extends WsMessage {\n type: 'theme-change';\n theme: string;\n}\n\nexport interface RebuildCompleteMessage extends WsMessage {\n type: 'rebuild-complete';\n changedTokens: string[];\n timestamp: number;\n}\n\nexport function setupWsHandler(wss: WebSocketServer, builder: IncrementalBuilder): void {\n wss.on('connection', (ws: WebSocket) => {\n console.log('Preview client connected');\n\n // Send initial state\n ws.send(JSON.stringify({\n type: 'init',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n\n ws.on('message', async (data: Buffer) => {\n try {\n const message = JSON.parse(data.toString()) as WsMessage;\n\n switch (message.type) {\n case 'token-update': {\n const update = message as TokenUpdateMessage;\n await builder.updateToken(update.path, update.value, update.theme);\n\n // Broadcast rebuild complete to all clients\n broadcast(wss, {\n type: 'rebuild-complete',\n changedTokens: [update.path],\n timestamp: Date.now(),\n });\n break;\n }\n\n case 'theme-change': {\n const themeMsg = message as ThemeChangeMessage;\n broadcast(wss, {\n type: 'theme-switched',\n theme: themeMsg.theme,\n tokens: builder.getThemeTokens(themeMsg.theme),\n });\n break;\n }\n\n case 'request-state': {\n ws.send(JSON.stringify({\n type: 'full-state',\n tokenSet: builder.getTokenSet(),\n themes: builder.getThemes(),\n components: builder.getComponents(),\n }));\n break;\n }\n }\n } catch (err) {\n ws.send(JSON.stringify({\n type: 'error',\n message: (err as Error).message,\n }));\n }\n });\n\n ws.on('close', () => {\n console.log('Preview client disconnected');\n });\n });\n}\n\nfunction broadcast(wss: WebSocketServer, message: Record<string, unknown>): void {\n const data = JSON.stringify(message);\n for (const client of wss.clients) {\n if (client.readyState === 1) { // WebSocket.OPEN\n client.send(data);\n }\n }\n}\n","import type { WebSocketServer } from 'ws';\nimport { watch } from 'chokidar';\nimport type { IncrementalBuilder } from './incremental-build.js';\n\nexport function setupWatcher(\n builder: IncrementalBuilder,\n wss: WebSocketServer,\n cwd: string\n): void {\n const watcher = watch(\n ['tokens/**/*.tokens.json', 'components/**/*.component.json'],\n {\n cwd,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 50,\n },\n }\n );\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const handleChange = (changedPath: string) => {\n if (debounceTimer) clearTimeout(debounceTimer);\n\n debounceTimer = setTimeout(async () => {\n console.log(`File changed: ${changedPath}`);\n\n try {\n await builder.rebuild();\n\n // Broadcast to all connected clients\n const data = JSON.stringify({\n type: 'rebuild-complete',\n changedTokens: [],\n timestamp: Date.now(),\n tokenSet: builder.getTokenSet(),\n components: builder.getComponents(),\n });\n\n for (const client of wss.clients) {\n if (client.readyState === 1) {\n client.send(data);\n }\n }\n } catch (err) {\n console.error('Rebuild failed:', (err as Error).message);\n }\n }, 300);\n };\n\n watcher.on('change', handleChange);\n watcher.on('add', handleChange);\n watcher.on('unlink', handleChange);\n}\n","import { buildTokenSet, loadComponents, resolveComponent, type RawTokenTree } from '@ryndesign/core';\nimport type { ResolvedTokenSet, GeneratedFile, ResolvedComponent, GeneratorPlugin } from '@ryndesign/plugin-api';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport class IncrementalBuilder {\n private tokenSet: ResolvedTokenSet | null = null;\n private components: ResolvedComponent[] = [];\n private generatedFiles: Map<string, GeneratedFile[]> = new Map();\n private generators: GeneratorPlugin[] = [];\n private cwd: string;\n private configPath?: string;\n\n constructor(cwd: string, configPath?: string) {\n this.cwd = cwd;\n this.configPath = configPath;\n }\n\n async initialBuild(): Promise<void> {\n await this.rebuild();\n }\n\n async rebuild(): Promise<void> {\n const configFile = this.configPath ?? 'ryndesign.config.ts';\n\n const tokens = ['tokens/**/*.tokens.json'];\n const componentPatterns = ['components/**/*.component.json'];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let themes: any = undefined;\n\n try {\n const configPath = path.resolve(this.cwd, configFile);\n const content = await fs.readFile(configPath, 'utf-8');\n if (content.includes('dark')) {\n themes = {\n default: 'light',\n dark: { file: path.resolve(this.cwd, 'tokens/dark.tokens.json') },\n };\n }\n } catch {\n // Use defaults\n }\n\n this.tokenSet = await buildTokenSet({\n tokens,\n basePath: this.cwd,\n themes,\n });\n\n // Load and resolve components\n try {\n const componentDefs = await loadComponents(componentPatterns, this.cwd);\n this.components = componentDefs.map(def => resolveComponent(def, this.tokenSet!));\n } catch {\n this.components = [];\n }\n }\n\n getTokenSet(): ResolvedTokenSet | null {\n return this.tokenSet;\n }\n\n getThemes(): Record<string, unknown> {\n if (!this.tokenSet) return {};\n return {\n default: this.tokenSet.themes.default,\n available: Object.keys(this.tokenSet.themes.themes),\n themes: this.tokenSet.themes.themes,\n };\n }\n\n getThemeTokens(theme: string): Record<string, unknown> {\n if (!this.tokenSet) return {};\n const themeData = this.tokenSet.themes.themes[theme];\n if (!themeData) return {};\n return {\n name: themeData.name,\n tokens: themeData.tokens,\n };\n }\n\n getComponents(): ResolvedComponent[] {\n return this.components;\n }\n\n setGenerators(generators: GeneratorPlugin[]): void {\n this.generators = generators;\n }\n\n async generateSnippets(platform: string, componentName?: string, type?: string): Promise<string> {\n if (!this.tokenSet) return '';\n\n const generator = this.generators.find(g => g.name === platform);\n if (!generator) return `// Generator for \"${platform}\" not available`;\n\n const { createGeneratorHelpers } = await import('@ryndesign/core');\n const ctx = {\n tokenSet: this.tokenSet,\n config: { outDir: 'generated' },\n outputDir: path.resolve(this.cwd, 'generated'),\n helpers: createGeneratorHelpers(),\n components: this.components,\n };\n\n try {\n if (type === 'tokens') {\n const files = await generator.generateTokens(ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n\n if (componentName) {\n const comp = this.components.find(c => c.definition.name === componentName);\n if (comp) {\n const files = await generator.generateComponent(comp, ctx);\n return files.map(f => `// ${f.path}\\n${f.content}`).join('\\n\\n');\n }\n return `// Component \"${componentName}\" not found`;\n }\n\n return '// Specify a component or type=tokens';\n } catch (err) {\n return `// Error: ${(err as Error).message}`;\n }\n }\n\n getGeneratedFiles(platform?: string): GeneratedFile[] {\n if (!platform) {\n return Array.from(this.generatedFiles.values()).flat();\n }\n return this.generatedFiles.get(platform) ?? [];\n }\n\n async updateToken(tokenPath: string, value: unknown, theme?: string): Promise<void> {\n const filePath = theme\n ? path.resolve(this.cwd, `tokens/${theme}.tokens.json`)\n : path.resolve(this.cwd, 'tokens/semantic.tokens.json');\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const tree = JSON.parse(content) as RawTokenTree;\n\n const parts = tokenPath.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = tree;\n for (let i = 0; i < parts.length - 1; i++) {\n if (!current[parts[i]]) current[parts[i]] = {};\n current = current[parts[i]];\n }\n\n const lastKey = parts[parts.length - 1];\n if (current[lastKey] && typeof current[lastKey] === 'object' && '$value' in current[lastKey]) {\n current[lastKey].$value = value;\n } else {\n current[lastKey] = { $type: 'color', $value: value };\n }\n\n await fs.writeFile(filePath, JSON.stringify(tree, null, 2), 'utf-8');\n await this.rebuild();\n } catch (err) {\n console.error(`Failed to update token: ${(err as Error).message}`);\n throw err;\n }\n }\n}\n"],"mappings":"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","names":["path","path","path"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ryndesign/preview",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Preview server for RynDesign design system",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -29,20 +29,20 @@
|
|
|
29
29
|
"client"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
32
33
|
"chokidar": "^4.0.0",
|
|
33
34
|
"fast-glob": "^3.3.0",
|
|
34
35
|
"react": "^19.2.4",
|
|
35
36
|
"react-dom": "^19.2.4",
|
|
36
|
-
"vite": "^
|
|
37
|
+
"vite": "^8.0.0",
|
|
37
38
|
"ws": "^8.18.0",
|
|
38
|
-
"@ryndesign/
|
|
39
|
-
"@ryndesign/
|
|
39
|
+
"@ryndesign/plugin-api": "0.1.1",
|
|
40
|
+
"@ryndesign/core": "0.1.1"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@types/react": "^19.2.14",
|
|
43
44
|
"@types/react-dom": "^19.2.3",
|
|
44
45
|
"@types/ws": "^8.5.0",
|
|
45
|
-
"@vitejs/plugin-react": "^6.0.1",
|
|
46
46
|
"tsup": "^8.3.0",
|
|
47
47
|
"typescript": "~5.5.0",
|
|
48
48
|
"vitest": "^2.1.0"
|