@epoch32/visage 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/README.md +110 -2
- package/dist/src/api/index.js +4002 -0
- package/dist/src/charts/index.js +2717 -0
- package/dist/src/devtools/index.js +4677 -0
- package/dist/src/dom/index.js +1550 -0
- package/dist/src/form/index.js +1415 -0
- package/dist/src/index.js +11826 -0
- package/dist/src/jsx-runtime/index.js +1630 -0
- package/dist/src/query/index.js +2422 -0
- package/dist/src/router/index.js +1856 -0
- package/dist/src/rpc/index.js +3484 -0
- package/dist/src/server/index.js +1173 -0
- package/dist/src/signals/index.js +1077 -0
- package/dist/src/style/index.js +2340 -0
- package/dist/src/template/index.js +1149 -0
- package/dist/src/ui/index.js +4155 -0
- package/dist/src/virtual/index.js +1955 -0
- package/dist/src/vite/index.js +984 -0
- package/package.json +140 -4
- package/src/api/client.ts +371 -0
- package/src/api/file-router.ts +183 -0
- package/src/api/handler.ts +326 -0
- package/src/api/index.ts +71 -0
- package/src/api/middleware.ts +54 -0
- package/src/api/pragma.ts +155 -0
- package/src/api/procedure.ts +172 -0
- package/src/api/types.ts +249 -0
- package/src/charts/Area.tsx +111 -0
- package/src/charts/Axis.tsx +126 -0
- package/src/charts/Bar.tsx +86 -0
- package/src/charts/CartesianGrid.tsx +72 -0
- package/src/charts/Chart.tsx +269 -0
- package/src/charts/Cursor.tsx +42 -0
- package/src/charts/Legend.tsx +56 -0
- package/src/charts/Line.tsx +106 -0
- package/src/charts/Pie.tsx +88 -0
- package/src/charts/Tooltip.tsx +127 -0
- package/src/charts/context.ts +30 -0
- package/src/charts/index.ts +14 -0
- package/src/charts/path.ts +155 -0
- package/src/charts/scale.ts +133 -0
- package/src/charts/types.ts +50 -0
- package/src/devtools/DomTab.tsx +134 -0
- package/src/devtools/GraphInspector.tsx +196 -0
- package/src/devtools/GraphTab.tsx +315 -0
- package/src/devtools/QueryTab.tsx +200 -0
- package/src/devtools/RpcTab.tsx +190 -0
- package/src/devtools/SignalsTab.tsx +129 -0
- package/src/devtools/component.tsx +243 -0
- package/src/devtools/highlighter.ts +134 -0
- package/src/devtools/hub.ts +175 -0
- package/src/devtools/index.ts +20 -0
- package/src/devtools/styles.ts +313 -0
- package/src/devtools/types.ts +45 -0
- package/src/dom/async.ts +232 -0
- package/src/dom/control-flow.ts +353 -0
- package/src/dom/index.ts +32 -0
- package/src/dom/lazy.ts +82 -0
- package/src/dom/render.ts +286 -0
- package/src/dom/resource.ts +120 -0
- package/src/form/form.ts +218 -0
- package/src/form/index.ts +17 -0
- package/src/form/schema.ts +299 -0
- package/src/index.ts +413 -0
- package/src/jsx-dev-runtime/index.ts +1 -0
- package/src/jsx-runtime/index.ts +112 -0
- package/src/jsx-runtime/jsx.d.ts +278 -0
- package/src/query/create-mutation.ts +64 -0
- package/src/query/create-query.ts +426 -0
- package/src/query/focus-manager.ts +68 -0
- package/src/query/index.ts +63 -0
- package/src/query/mutation-cache.ts +138 -0
- package/src/query/online-manager.ts +67 -0
- package/src/query/query-cache.ts +369 -0
- package/src/query/query-client.ts +248 -0
- package/src/query/types.ts +221 -0
- package/src/query/utils.ts +132 -0
- package/src/router/index.ts +19 -0
- package/src/router/router.tsx +352 -0
- package/src/rpc/client.ts +317 -0
- package/src/rpc/error.ts +70 -0
- package/src/rpc/index.ts +52 -0
- package/src/rpc/procedure.ts +88 -0
- package/src/rpc/router.ts +105 -0
- package/src/rpc/server.ts +511 -0
- package/src/rpc/types.ts +328 -0
- package/src/server/hydrate.ts +21 -0
- package/src/server/index.ts +10 -0
- package/src/server/render-to-stream.ts +31 -0
- package/src/server/render-to-string.ts +125 -0
- package/src/signals/computed.ts +217 -0
- package/src/signals/context.ts +89 -0
- package/src/signals/effect.ts +161 -0
- package/src/signals/index.ts +57 -0
- package/src/signals/scope.ts +132 -0
- package/src/signals/signal.ts +203 -0
- package/src/signals/store.ts +163 -0
- package/src/signals/system.ts +124 -0
- package/src/signals/types.ts +64 -0
- package/src/style/component.tsx +122 -0
- package/src/style/create-style.ts +229 -0
- package/src/style/cx.ts +75 -0
- package/src/style/hash.ts +19 -0
- package/src/style/index.ts +8 -0
- package/src/style/layout.tsx +406 -0
- package/src/style/manager.ts +87 -0
- package/src/style/parser.ts +257 -0
- package/src/style/scale.ts +237 -0
- package/src/template/index.ts +4 -0
- package/src/template/template.ts +126 -0
- package/src/ui/accordion.tsx +286 -0
- package/src/ui/command-dialog.tsx +49 -0
- package/src/ui/command.tsx +400 -0
- package/src/ui/data-table.tsx +322 -0
- package/src/ui/dialog.tsx +362 -0
- package/src/ui/dropdown-menu.tsx +381 -0
- package/src/ui/icon.tsx +69 -0
- package/src/ui/index.ts +138 -0
- package/src/ui/layout.tsx +13 -0
- package/src/ui/popover.tsx +249 -0
- package/src/ui/switch.tsx +114 -0
- package/src/ui/tabs.tsx +297 -0
- package/src/ui/toast.tsx +280 -0
- package/src/ui/tooltip.tsx +262 -0
- package/src/ui/utils.ts +110 -0
- package/src/virtual/index.ts +12 -0
- package/src/virtual/virtual-list.tsx +185 -0
- package/src/virtual/virtualizer.ts +274 -0
- package/src/vite/hmr.ts +38 -0
- package/src/vite/index.ts +3 -0
- package/src/vite/lucide.ts +124 -0
- package/src/vite/plugin.ts +102 -0
- package/src/vite/rpc-middleware.ts +82 -0
- package/src/vite/types.ts +65 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { transformHmr } from "./hmr";
|
|
2
|
+
import { createViteRpcMiddleware } from "./rpc-middleware";
|
|
3
|
+
import type { VisagePluginOptions, VisageVitePlugin } from "./types";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Official Visage Vite Plugin
|
|
7
|
+
*
|
|
8
|
+
* Provides zero-configuration JSX compilation, Hot Module Replacement (HMR),
|
|
9
|
+
* DevTools auto-injection, and full-stack RPC development server middleware.
|
|
10
|
+
*
|
|
11
|
+
* Example:
|
|
12
|
+
* ```ts
|
|
13
|
+
* // vite.config.ts
|
|
14
|
+
* import { defineConfig } from "vite";
|
|
15
|
+
* import visage from "visage/vite";
|
|
16
|
+
*
|
|
17
|
+
* export default defineConfig({
|
|
18
|
+
* plugins: [visage()]
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare const process: any;
|
|
23
|
+
|
|
24
|
+
export function visage(options: VisagePluginOptions = {}): VisageVitePlugin[] {
|
|
25
|
+
const isDev = typeof process !== "undefined" ? process.env?.NODE_ENV !== "production" : true;
|
|
26
|
+
|
|
27
|
+
const configPlugin: VisageVitePlugin = {
|
|
28
|
+
name: "visage:config",
|
|
29
|
+
config(_userConfig, { command }) {
|
|
30
|
+
return {
|
|
31
|
+
esbuild: {
|
|
32
|
+
jsx: "automatic",
|
|
33
|
+
jsxImportSource: "visage"
|
|
34
|
+
},
|
|
35
|
+
oxc: {
|
|
36
|
+
jsx: {
|
|
37
|
+
runtime: "automatic",
|
|
38
|
+
importSource: "visage",
|
|
39
|
+
development: command === "serve"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
optimizeDeps: {
|
|
43
|
+
exclude: [
|
|
44
|
+
"@epoch32/visage",
|
|
45
|
+
"visage",
|
|
46
|
+
"visage/signals",
|
|
47
|
+
"visage/dom",
|
|
48
|
+
"visage/query",
|
|
49
|
+
"visage/rpc",
|
|
50
|
+
"visage/style",
|
|
51
|
+
"visage/router",
|
|
52
|
+
"visage/form",
|
|
53
|
+
"visage/virtual",
|
|
54
|
+
"visage/devtools",
|
|
55
|
+
"visage/api",
|
|
56
|
+
"visage/charts"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
resolve: {
|
|
60
|
+
dedupe: ["@epoch32/visage", "visage"]
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const transformPlugin: VisageVitePlugin = {
|
|
67
|
+
name: "visage:transform",
|
|
68
|
+
transform(code: string, id: string) {
|
|
69
|
+
if (options.hmr !== false && isDev) {
|
|
70
|
+
return transformHmr(code, id);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const devServerPlugin: VisageVitePlugin = {
|
|
77
|
+
name: "visage:server",
|
|
78
|
+
apply: "serve",
|
|
79
|
+
configureServer(server) {
|
|
80
|
+
if (options.rpc) {
|
|
81
|
+
server.middlewares.use(createViteRpcMiddleware(options.rpc));
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
transformIndexHtml(html: string) {
|
|
85
|
+
if (options.devtools === false || !isDev) {
|
|
86
|
+
return html;
|
|
87
|
+
}
|
|
88
|
+
// Inject DevTools hint meta
|
|
89
|
+
if (!html.includes('name="visage-devtools"')) {
|
|
90
|
+
return html.replace(
|
|
91
|
+
"<head>",
|
|
92
|
+
'<head>\n <meta name="visage-devtools" content="enabled" />'
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
return html;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
return [configPlugin, transformPlugin, devServerPlugin];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export default visage;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createFetchHandler } from "../rpc/server";
|
|
2
|
+
import type { VisagePluginOptions } from "./types";
|
|
3
|
+
|
|
4
|
+
declare const Buffer: any;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Attach Visage RPC handler to Vite's Connect dev server middleware
|
|
8
|
+
*/
|
|
9
|
+
export function createViteRpcMiddleware(options: NonNullable<VisagePluginOptions["rpc"]>) {
|
|
10
|
+
const endpoint = options.endpoint ?? "/api/rpc";
|
|
11
|
+
const handler = createFetchHandler({
|
|
12
|
+
router: options.router,
|
|
13
|
+
endpoint,
|
|
14
|
+
cors: true
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
return async (req: any, res: any, next: () => void) => {
|
|
18
|
+
const url = req.url || "";
|
|
19
|
+
if (!url.startsWith(endpoint)) {
|
|
20
|
+
return next();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
// 1. Read request body if present
|
|
25
|
+
const chunks: any[] = [];
|
|
26
|
+
for await (const chunk of req) {
|
|
27
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
28
|
+
}
|
|
29
|
+
const rawBody = chunks.length > 0 ? Buffer.concat(chunks).toString("utf-8") : undefined;
|
|
30
|
+
|
|
31
|
+
// 2. Construct standard Web Request
|
|
32
|
+
const protocol = req.headers["x-forwarded-proto"] || "http";
|
|
33
|
+
const host = req.headers.host || "localhost";
|
|
34
|
+
const fullUrl = `${protocol}://${host}${url}`;
|
|
35
|
+
|
|
36
|
+
const headers = new Headers();
|
|
37
|
+
for (const [k, v] of Object.entries(req.headers)) {
|
|
38
|
+
if (v !== undefined) {
|
|
39
|
+
if (Array.isArray(v)) {
|
|
40
|
+
for (const item of v) headers.append(k, item);
|
|
41
|
+
} else {
|
|
42
|
+
headers.set(k, String(v));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const webReq = new Request(fullUrl, {
|
|
48
|
+
method: req.method,
|
|
49
|
+
headers,
|
|
50
|
+
body: req.method !== "GET" && req.method !== "HEAD" ? rawBody : undefined
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// 3. Execute Visage RPC handler
|
|
54
|
+
const webRes = await handler(webReq);
|
|
55
|
+
|
|
56
|
+
// 4. Send response back through Connect/Vite res
|
|
57
|
+
res.statusCode = webRes.status;
|
|
58
|
+
webRes.headers.forEach((val, key) => {
|
|
59
|
+
res.setHeader(key, val);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Handle SSE streams or standard bodies
|
|
63
|
+
const isStream = webRes.headers.get("content-type")?.includes("text/event-stream");
|
|
64
|
+
if (isStream && webRes.body) {
|
|
65
|
+
const reader = webRes.body.getReader();
|
|
66
|
+
while (true) {
|
|
67
|
+
const { done, value } = await reader.read();
|
|
68
|
+
if (done) break;
|
|
69
|
+
res.write(value);
|
|
70
|
+
}
|
|
71
|
+
res.end();
|
|
72
|
+
} else {
|
|
73
|
+
const text = await webRes.text();
|
|
74
|
+
res.end(text);
|
|
75
|
+
}
|
|
76
|
+
} catch (err: any) {
|
|
77
|
+
res.statusCode = 500;
|
|
78
|
+
res.setHeader("Content-Type", "application/json");
|
|
79
|
+
res.end(JSON.stringify({ error: err?.message || "Internal Server Error" }));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { createRouter } from "../rpc/router";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Options for the Visage Vite Plugin
|
|
5
|
+
*/
|
|
6
|
+
export interface VisagePluginOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Automatically auto-inject Visage DevTools in development mode
|
|
9
|
+
* @default true
|
|
10
|
+
*/
|
|
11
|
+
devtools?: boolean;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Enable Hot Module Replacement (HMR) with signal state preservation
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
hmr?: boolean;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Extract static <Style> blocks into production CSS bundle
|
|
21
|
+
* @default true
|
|
22
|
+
*/
|
|
23
|
+
extractCss?: boolean;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Enable Server-Side Rendering (SSR) pipeline
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
ssr?: boolean;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Optional full-stack RPC router configuration for Vite dev server middleware
|
|
33
|
+
*/
|
|
34
|
+
rpc?: {
|
|
35
|
+
router: ReturnType<typeof createRouter<any>>;
|
|
36
|
+
endpoint?: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Minimal interface representation of Vite Plugin to ensure zero hard runtime dependencies
|
|
42
|
+
*/
|
|
43
|
+
export interface VisageVitePlugin {
|
|
44
|
+
name: string;
|
|
45
|
+
enforce?: "pre" | "post";
|
|
46
|
+
apply?: "serve" | "build" | ((config: any, env: { command: string; mode: string }) => boolean);
|
|
47
|
+
config?: (config: any, env: any) => any;
|
|
48
|
+
configResolved?: (config: any) => void;
|
|
49
|
+
configureServer?: (server: any) => void | Promise<void>;
|
|
50
|
+
resolveId?: (
|
|
51
|
+
source: string,
|
|
52
|
+
importer?: string,
|
|
53
|
+
options?: any
|
|
54
|
+
) => Promise<string | null | undefined> | string | null | undefined;
|
|
55
|
+
load?: (
|
|
56
|
+
id: string,
|
|
57
|
+
options?: any
|
|
58
|
+
) => Promise<string | null | undefined> | string | null | undefined;
|
|
59
|
+
transform?: (
|
|
60
|
+
code: string,
|
|
61
|
+
id: string,
|
|
62
|
+
options?: { ssr?: boolean }
|
|
63
|
+
) => Promise<{ code: string; map?: any } | null> | { code: string; map?: any } | null;
|
|
64
|
+
transformIndexHtml?: (html: string) => string | Promise<string>;
|
|
65
|
+
}
|