@epoch32/visage 0.0.0-stage → 0.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.
Files changed (138) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +110 -2
  3. package/dist/bundle.dev.js +4875 -0
  4. package/dist/index.js +9633 -0
  5. package/dist/src/api/index.js +4002 -0
  6. package/dist/src/charts/index.js +2717 -0
  7. package/dist/src/devtools/index.js +4677 -0
  8. package/dist/src/dom/index.js +1550 -0
  9. package/dist/src/form/index.js +1415 -0
  10. package/dist/src/index.js +11826 -0
  11. package/dist/src/jsx-runtime/index.js +1630 -0
  12. package/dist/src/query/index.js +2422 -0
  13. package/dist/src/router/index.js +1856 -0
  14. package/dist/src/rpc/index.js +3484 -0
  15. package/dist/src/server/index.js +1173 -0
  16. package/dist/src/signals/index.js +1077 -0
  17. package/dist/src/style/index.js +2340 -0
  18. package/dist/src/template/index.js +1149 -0
  19. package/dist/src/ui/index.js +4155 -0
  20. package/dist/src/virtual/index.js +1955 -0
  21. package/dist/src/vite/index.js +984 -0
  22. package/dist/vite/index.js +707 -0
  23. package/package.json +140 -4
  24. package/src/api/client.ts +371 -0
  25. package/src/api/file-router.ts +183 -0
  26. package/src/api/handler.ts +326 -0
  27. package/src/api/index.ts +71 -0
  28. package/src/api/middleware.ts +54 -0
  29. package/src/api/pragma.ts +155 -0
  30. package/src/api/procedure.ts +172 -0
  31. package/src/api/types.ts +249 -0
  32. package/src/charts/Area.tsx +111 -0
  33. package/src/charts/Axis.tsx +126 -0
  34. package/src/charts/Bar.tsx +86 -0
  35. package/src/charts/CartesianGrid.tsx +72 -0
  36. package/src/charts/Chart.tsx +269 -0
  37. package/src/charts/Cursor.tsx +42 -0
  38. package/src/charts/Legend.tsx +56 -0
  39. package/src/charts/Line.tsx +106 -0
  40. package/src/charts/Pie.tsx +88 -0
  41. package/src/charts/Tooltip.tsx +127 -0
  42. package/src/charts/context.ts +30 -0
  43. package/src/charts/index.ts +14 -0
  44. package/src/charts/path.ts +155 -0
  45. package/src/charts/scale.ts +133 -0
  46. package/src/charts/types.ts +50 -0
  47. package/src/devtools/DomTab.tsx +134 -0
  48. package/src/devtools/GraphInspector.tsx +196 -0
  49. package/src/devtools/GraphTab.tsx +315 -0
  50. package/src/devtools/QueryTab.tsx +200 -0
  51. package/src/devtools/RpcTab.tsx +190 -0
  52. package/src/devtools/SignalsTab.tsx +129 -0
  53. package/src/devtools/component.tsx +243 -0
  54. package/src/devtools/highlighter.ts +134 -0
  55. package/src/devtools/hub.ts +175 -0
  56. package/src/devtools/index.ts +20 -0
  57. package/src/devtools/styles.ts +313 -0
  58. package/src/devtools/types.ts +45 -0
  59. package/src/dom/async.ts +232 -0
  60. package/src/dom/control-flow.ts +353 -0
  61. package/src/dom/index.ts +32 -0
  62. package/src/dom/lazy.ts +82 -0
  63. package/src/dom/render.ts +286 -0
  64. package/src/dom/resource.ts +120 -0
  65. package/src/form/form.ts +218 -0
  66. package/src/form/index.ts +17 -0
  67. package/src/form/schema.ts +299 -0
  68. package/src/index.ts +413 -0
  69. package/src/jsx-dev-runtime/index.ts +1 -0
  70. package/src/jsx-runtime/index.ts +112 -0
  71. package/src/jsx-runtime/jsx.d.ts +278 -0
  72. package/src/query/create-mutation.ts +64 -0
  73. package/src/query/create-query.ts +426 -0
  74. package/src/query/focus-manager.ts +68 -0
  75. package/src/query/index.ts +63 -0
  76. package/src/query/mutation-cache.ts +138 -0
  77. package/src/query/online-manager.ts +67 -0
  78. package/src/query/query-cache.ts +369 -0
  79. package/src/query/query-client.ts +248 -0
  80. package/src/query/types.ts +221 -0
  81. package/src/query/utils.ts +132 -0
  82. package/src/router/index.ts +19 -0
  83. package/src/router/router.tsx +352 -0
  84. package/src/rpc/client.ts +317 -0
  85. package/src/rpc/error.ts +70 -0
  86. package/src/rpc/index.ts +52 -0
  87. package/src/rpc/procedure.ts +88 -0
  88. package/src/rpc/router.ts +105 -0
  89. package/src/rpc/server.ts +511 -0
  90. package/src/rpc/types.ts +328 -0
  91. package/src/server/hydrate.ts +21 -0
  92. package/src/server/index.ts +10 -0
  93. package/src/server/render-to-stream.ts +31 -0
  94. package/src/server/render-to-string.ts +125 -0
  95. package/src/signals/computed.ts +217 -0
  96. package/src/signals/context.ts +89 -0
  97. package/src/signals/effect.ts +161 -0
  98. package/src/signals/index.ts +57 -0
  99. package/src/signals/scope.ts +132 -0
  100. package/src/signals/signal.ts +203 -0
  101. package/src/signals/store.ts +163 -0
  102. package/src/signals/system.ts +124 -0
  103. package/src/signals/types.ts +64 -0
  104. package/src/style/component.tsx +122 -0
  105. package/src/style/create-style.ts +229 -0
  106. package/src/style/cx.ts +75 -0
  107. package/src/style/hash.ts +19 -0
  108. package/src/style/index.ts +8 -0
  109. package/src/style/layout.tsx +406 -0
  110. package/src/style/manager.ts +87 -0
  111. package/src/style/parser.ts +257 -0
  112. package/src/style/scale.ts +237 -0
  113. package/src/template/index.ts +4 -0
  114. package/src/template/template.ts +126 -0
  115. package/src/ui/accordion.tsx +286 -0
  116. package/src/ui/command-dialog.tsx +49 -0
  117. package/src/ui/command.tsx +400 -0
  118. package/src/ui/data-table.tsx +322 -0
  119. package/src/ui/dialog.tsx +362 -0
  120. package/src/ui/dropdown-menu.tsx +381 -0
  121. package/src/ui/icon.tsx +69 -0
  122. package/src/ui/index.ts +138 -0
  123. package/src/ui/layout.tsx +13 -0
  124. package/src/ui/popover.tsx +249 -0
  125. package/src/ui/switch.tsx +114 -0
  126. package/src/ui/tabs.tsx +297 -0
  127. package/src/ui/toast.tsx +280 -0
  128. package/src/ui/tooltip.tsx +262 -0
  129. package/src/ui/utils.ts +110 -0
  130. package/src/virtual/index.ts +12 -0
  131. package/src/virtual/virtual-list.tsx +185 -0
  132. package/src/virtual/virtualizer.ts +274 -0
  133. package/src/vite/hmr.ts +38 -0
  134. package/src/vite/index.ts +3 -0
  135. package/src/vite/lucide.ts +124 -0
  136. package/src/vite/plugin.ts +102 -0
  137. package/src/vite/rpc-middleware.ts +82 -0
  138. 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
+ }