@gtkx/cli 0.20.0 → 1.0.0-rc.1

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 (341) hide show
  1. package/README.md +173 -0
  2. package/bin/gtkx-dev-runner.js +9 -0
  3. package/dist/builder.d.ts +2 -50
  4. package/dist/builder.d.ts.map +1 -1
  5. package/dist/builder.js +22 -48
  6. package/dist/builder.js.map +1 -1
  7. package/dist/cli.d.ts +1 -2
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +11 -124
  10. package/dist/cli.js.map +1 -1
  11. package/dist/codegen/freshness.d.ts +11 -0
  12. package/dist/codegen/freshness.d.ts.map +1 -0
  13. package/dist/codegen/freshness.js +42 -0
  14. package/dist/codegen/freshness.js.map +1 -0
  15. package/dist/codegen/report.d.ts +3 -0
  16. package/dist/codegen/report.d.ts.map +1 -0
  17. package/dist/codegen/report.js +16 -0
  18. package/dist/codegen/report.js.map +1 -0
  19. package/dist/codegen/run-codegen.d.ts +35 -0
  20. package/dist/codegen/run-codegen.d.ts.map +1 -0
  21. package/dist/codegen/run-codegen.js +133 -0
  22. package/dist/codegen/run-codegen.js.map +1 -0
  23. package/dist/codegen/store-resolver.d.ts +21 -0
  24. package/dist/codegen/store-resolver.d.ts.map +1 -0
  25. package/dist/codegen/store-resolver.js +52 -0
  26. package/dist/codegen/store-resolver.js.map +1 -0
  27. package/dist/commands/build.d.ts +9 -0
  28. package/dist/commands/build.d.ts.map +1 -0
  29. package/dist/commands/build.js +33 -0
  30. package/dist/commands/build.js.map +1 -0
  31. package/dist/commands/codegen.d.ts +9 -0
  32. package/dist/commands/codegen.d.ts.map +1 -0
  33. package/dist/commands/codegen.js +40 -0
  34. package/dist/commands/codegen.js.map +1 -0
  35. package/dist/commands/dev.d.ts +5 -0
  36. package/dist/commands/dev.d.ts.map +1 -0
  37. package/dist/commands/dev.js +21 -0
  38. package/dist/commands/dev.js.map +1 -0
  39. package/dist/commands/docs.d.ts +19 -0
  40. package/dist/commands/docs.d.ts.map +1 -0
  41. package/dist/commands/docs.js +59 -0
  42. package/dist/commands/docs.js.map +1 -0
  43. package/dist/dev/icon-dir.d.ts +2 -0
  44. package/dist/dev/icon-dir.d.ts.map +1 -0
  45. package/dist/dev/icon-dir.js +13 -0
  46. package/dist/dev/icon-dir.js.map +1 -0
  47. package/dist/dev/refresh-tracker.d.ts +6 -0
  48. package/dist/dev/refresh-tracker.d.ts.map +1 -0
  49. package/dist/dev/refresh-tracker.js +18 -0
  50. package/dist/dev/refresh-tracker.js.map +1 -0
  51. package/dist/dev/runner-deps.d.ts +3 -0
  52. package/dist/dev/runner-deps.d.ts.map +1 -0
  53. package/dist/dev/runner-deps.js +39 -0
  54. package/dist/dev/runner-deps.js.map +1 -0
  55. package/dist/dev/runner-main.d.ts +2 -0
  56. package/dist/dev/runner-main.d.ts.map +1 -0
  57. package/dist/dev/runner-main.js +28 -0
  58. package/dist/dev/runner-main.js.map +1 -0
  59. package/dist/dev/runner.d.ts +23 -0
  60. package/dist/dev/runner.d.ts.map +1 -0
  61. package/dist/dev/runner.js +88 -0
  62. package/dist/dev/runner.js.map +1 -0
  63. package/dist/dev/schema-dir.d.ts +2 -0
  64. package/dist/dev/schema-dir.d.ts.map +1 -0
  65. package/dist/dev/schema-dir.js +10 -0
  66. package/dist/dev/schema-dir.js.map +1 -0
  67. package/dist/dev/supervisor.d.ts +17 -0
  68. package/dist/dev/supervisor.d.ts.map +1 -0
  69. package/dist/dev/supervisor.js +142 -0
  70. package/dist/dev/supervisor.js.map +1 -0
  71. package/dist/dev/vite-dev-server.d.ts +21 -0
  72. package/dist/dev/vite-dev-server.d.ts.map +1 -0
  73. package/dist/dev/vite-dev-server.js +12 -0
  74. package/dist/dev/vite-dev-server.js.map +1 -0
  75. package/dist/internal/banner.d.ts +3 -0
  76. package/dist/internal/banner.d.ts.map +1 -0
  77. package/dist/internal/banner.js +8 -0
  78. package/dist/internal/banner.js.map +1 -0
  79. package/dist/internal/data-dir.d.ts +3 -0
  80. package/dist/internal/data-dir.d.ts.map +1 -0
  81. package/dist/internal/data-dir.js +37 -0
  82. package/dist/internal/data-dir.js.map +1 -0
  83. package/dist/internal/entry-arg.d.ts +19 -0
  84. package/dist/internal/entry-arg.d.ts.map +1 -0
  85. package/dist/internal/entry-arg.js +33 -0
  86. package/dist/internal/entry-arg.js.map +1 -0
  87. package/dist/internal/errors.d.ts +4 -0
  88. package/dist/internal/errors.d.ts.map +1 -0
  89. package/dist/internal/errors.js +27 -0
  90. package/dist/internal/errors.js.map +1 -0
  91. package/dist/internal/list-files.d.ts +6 -0
  92. package/dist/internal/list-files.d.ts.map +1 -0
  93. package/dist/internal/list-files.js +13 -0
  94. package/dist/internal/list-files.js.map +1 -0
  95. package/dist/internal/resolve-cli-tool.d.ts +2 -0
  96. package/dist/internal/resolve-cli-tool.d.ts.map +1 -0
  97. package/dist/internal/resolve-cli-tool.js +20 -0
  98. package/dist/internal/resolve-cli-tool.js.map +1 -0
  99. package/dist/internal/staging-dir.d.ts +3 -0
  100. package/dist/internal/staging-dir.d.ts.map +1 -0
  101. package/dist/internal/staging-dir.js +16 -0
  102. package/dist/internal/staging-dir.js.map +1 -0
  103. package/dist/internal/xdg-data-dirs.d.ts +2 -0
  104. package/dist/internal/xdg-data-dirs.d.ts.map +1 -0
  105. package/dist/internal/xdg-data-dirs.js +8 -0
  106. package/dist/internal/xdg-data-dirs.js.map +1 -0
  107. package/dist/mcp/client.d.ts +23 -0
  108. package/dist/mcp/client.d.ts.map +1 -0
  109. package/dist/mcp/client.js +157 -0
  110. package/dist/mcp/client.js.map +1 -0
  111. package/dist/mcp/handlers.d.ts +8 -0
  112. package/dist/mcp/handlers.d.ts.map +1 -0
  113. package/dist/mcp/handlers.js +119 -0
  114. package/dist/mcp/handlers.js.map +1 -0
  115. package/dist/mcp/index.d.ts +4 -0
  116. package/dist/mcp/index.d.ts.map +1 -0
  117. package/dist/mcp/index.js +17 -0
  118. package/dist/mcp/index.js.map +1 -0
  119. package/dist/mcp/serialize-widget.d.ts +10 -0
  120. package/dist/mcp/serialize-widget.d.ts.map +1 -0
  121. package/dist/mcp/serialize-widget.js +20 -0
  122. package/dist/mcp/serialize-widget.js.map +1 -0
  123. package/dist/mcp/testing-loader.d.ts +6 -0
  124. package/dist/mcp/testing-loader.d.ts.map +1 -0
  125. package/dist/mcp/testing-loader.js +25 -0
  126. package/dist/mcp/testing-loader.js.map +1 -0
  127. package/dist/mcp/widget-registry.d.ts +13 -0
  128. package/dist/mcp/widget-registry.d.ts.map +1 -0
  129. package/dist/mcp/widget-registry.js +38 -0
  130. package/dist/mcp/widget-registry.js.map +1 -0
  131. package/dist/refresh-runtime.d.ts +10 -20
  132. package/dist/refresh-runtime.d.ts.map +1 -1
  133. package/dist/refresh-runtime.js +12 -36
  134. package/dist/refresh-runtime.js.map +1 -1
  135. package/dist/settings/compile.d.ts +2 -0
  136. package/dist/settings/compile.d.ts.map +1 -0
  137. package/dist/settings/compile.js +19 -0
  138. package/dist/settings/compile.js.map +1 -0
  139. package/dist/settings/parser.d.ts +23 -0
  140. package/dist/settings/parser.d.ts.map +1 -0
  141. package/dist/settings/parser.js +117 -0
  142. package/dist/settings/parser.js.map +1 -0
  143. package/dist/settings/render.d.ts +4 -0
  144. package/dist/settings/render.d.ts.map +1 -0
  145. package/dist/settings/render.js +148 -0
  146. package/dist/settings/render.js.map +1 -0
  147. package/dist/settings/schema.d.ts +13 -0
  148. package/dist/settings/schema.d.ts.map +1 -0
  149. package/dist/settings/schema.js +103 -0
  150. package/dist/settings/schema.js.map +1 -0
  151. package/dist/vite-plugins/asset-extensions.d.ts +4 -0
  152. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -0
  153. package/dist/vite-plugins/asset-extensions.js +27 -0
  154. package/dist/vite-plugins/asset-extensions.js.map +1 -0
  155. package/dist/vite-plugins/built-url.d.ts +3 -0
  156. package/dist/vite-plugins/built-url.d.ts.map +1 -0
  157. package/dist/{vite-plugin-gtkx-built-url.js → vite-plugins/built-url.js} +4 -17
  158. package/dist/vite-plugins/built-url.js.map +1 -0
  159. package/dist/vite-plugins/css.d.ts +3 -0
  160. package/dist/vite-plugins/css.d.ts.map +1 -0
  161. package/dist/vite-plugins/css.js +30 -0
  162. package/dist/vite-plugins/css.js.map +1 -0
  163. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +7 -0
  164. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -0
  165. package/dist/vite-plugins/fast-refresh/refresh-filter.js +15 -0
  166. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -0
  167. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +5 -0
  168. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -0
  169. package/dist/vite-plugins/fast-refresh/swc-refresh.js +66 -0
  170. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -0
  171. package/dist/vite-plugins/icons.d.ts +3 -0
  172. package/dist/vite-plugins/icons.d.ts.map +1 -0
  173. package/dist/vite-plugins/icons.js +47 -0
  174. package/dist/vite-plugins/icons.js.map +1 -0
  175. package/dist/vite-plugins/index.d.ts +3 -0
  176. package/dist/vite-plugins/index.d.ts.map +1 -0
  177. package/dist/vite-plugins/index.js +21 -0
  178. package/dist/vite-plugins/index.js.map +1 -0
  179. package/dist/vite-plugins/native.d.ts +3 -0
  180. package/dist/vite-plugins/native.d.ts.map +1 -0
  181. package/dist/vite-plugins/native.js +60 -0
  182. package/dist/vite-plugins/native.js.map +1 -0
  183. package/dist/vite-plugins/react-compiler.d.ts +4 -0
  184. package/dist/vite-plugins/react-compiler.d.ts.map +1 -0
  185. package/dist/vite-plugins/react-compiler.js +56 -0
  186. package/dist/vite-plugins/react-compiler.js.map +1 -0
  187. package/dist/vite-plugins/react-dom-prebundle.d.ts +3 -0
  188. package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -0
  189. package/dist/vite-plugins/react-dom-prebundle.js +11 -0
  190. package/dist/vite-plugins/react-dom-prebundle.js.map +1 -0
  191. package/dist/vite-plugins/resource-init-module.d.ts +5 -0
  192. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -0
  193. package/dist/vite-plugins/resource-init-module.js +50 -0
  194. package/dist/vite-plugins/resource-init-module.js.map +1 -0
  195. package/dist/vite-plugins/resource-shared.d.ts +6 -0
  196. package/dist/vite-plugins/resource-shared.d.ts.map +1 -0
  197. package/dist/vite-plugins/resource-shared.js +21 -0
  198. package/dist/vite-plugins/resource-shared.js.map +1 -0
  199. package/dist/vite-plugins/resources.d.ts +4 -0
  200. package/dist/vite-plugins/resources.d.ts.map +1 -0
  201. package/dist/vite-plugins/resources.js +220 -0
  202. package/dist/vite-plugins/resources.js.map +1 -0
  203. package/dist/vite-plugins/settings-worker-env.d.ts +3 -0
  204. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -0
  205. package/dist/vite-plugins/settings-worker-env.js +21 -0
  206. package/dist/vite-plugins/settings-worker-env.js.map +1 -0
  207. package/dist/vite-plugins/settings.d.ts +3 -0
  208. package/dist/vite-plugins/settings.d.ts.map +1 -0
  209. package/dist/vite-plugins/settings.js +190 -0
  210. package/dist/vite-plugins/settings.js.map +1 -0
  211. package/dist/vite-plugins/undeclared-library.d.ts +3 -0
  212. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -0
  213. package/dist/vite-plugins/undeclared-library.js +47 -0
  214. package/dist/vite-plugins/undeclared-library.js.map +1 -0
  215. package/dist/vite-plugins/virtual-module.d.ts +22 -0
  216. package/dist/vite-plugins/virtual-module.d.ts.map +1 -0
  217. package/dist/vite-plugins/virtual-module.js +18 -0
  218. package/dist/vite-plugins/virtual-module.js.map +1 -0
  219. package/dist/vitest-plugin.d.ts +10 -0
  220. package/dist/vitest-plugin.d.ts.map +1 -0
  221. package/dist/vitest-plugin.js +12 -0
  222. package/dist/vitest-plugin.js.map +1 -0
  223. package/env.d.ts +131 -3
  224. package/package.json +32 -38
  225. package/src/babel-modules.d.ts +13 -0
  226. package/src/builder.ts +28 -76
  227. package/src/cli.ts +22 -0
  228. package/src/codegen/freshness.ts +52 -0
  229. package/src/codegen/report.ts +20 -0
  230. package/src/codegen/run-codegen.ts +185 -0
  231. package/src/codegen/store-resolver.ts +75 -0
  232. package/src/commands/build.ts +37 -0
  233. package/src/commands/codegen.ts +44 -0
  234. package/src/commands/dev.ts +25 -0
  235. package/src/commands/docs.ts +66 -0
  236. package/src/dev/icon-dir.ts +11 -0
  237. package/src/dev/refresh-tracker.ts +21 -0
  238. package/src/dev/runner-deps.ts +42 -0
  239. package/src/dev/runner-main.ts +33 -0
  240. package/src/dev/runner.ts +126 -0
  241. package/src/dev/schema-dir.ts +11 -0
  242. package/src/dev/supervisor.ts +178 -0
  243. package/src/dev/vite-dev-server.ts +34 -0
  244. package/src/internal/banner.ts +9 -0
  245. package/src/internal/data-dir.ts +39 -0
  246. package/src/internal/entry-arg.ts +38 -0
  247. package/src/internal/errors.ts +28 -0
  248. package/src/internal/list-files.ts +17 -0
  249. package/src/internal/resolve-cli-tool.ts +21 -0
  250. package/src/internal/staging-dir.ts +16 -0
  251. package/src/internal/xdg-data-dirs.ts +7 -0
  252. package/src/mcp/client.ts +177 -0
  253. package/src/mcp/handlers.ts +156 -0
  254. package/src/mcp/index.ts +22 -0
  255. package/src/mcp/serialize-widget.ts +34 -0
  256. package/src/mcp/testing-loader.ts +32 -0
  257. package/src/mcp/widget-registry.ts +43 -0
  258. package/src/refresh-runtime.ts +12 -41
  259. package/src/settings/compile.ts +19 -0
  260. package/src/settings/parser.ts +154 -0
  261. package/src/settings/render.ts +167 -0
  262. package/src/settings/schema.ts +115 -0
  263. package/src/vite-plugins/asset-extensions.ts +28 -0
  264. package/src/{vite-plugin-gtkx-built-url.ts → vite-plugins/built-url.ts} +3 -16
  265. package/src/vite-plugins/css.ts +38 -0
  266. package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -0
  267. package/src/vite-plugins/fast-refresh/swc-refresh.ts +79 -0
  268. package/src/vite-plugins/icons.ts +58 -0
  269. package/src/vite-plugins/index.ts +22 -0
  270. package/src/vite-plugins/native.ts +74 -0
  271. package/src/vite-plugins/react-compiler.ts +70 -0
  272. package/src/vite-plugins/react-dom-prebundle.ts +14 -0
  273. package/src/vite-plugins/resource-init-module.ts +54 -0
  274. package/src/vite-plugins/resource-shared.ts +27 -0
  275. package/src/vite-plugins/resources.ts +272 -0
  276. package/src/vite-plugins/settings-worker-env.ts +25 -0
  277. package/src/vite-plugins/settings.ts +221 -0
  278. package/src/vite-plugins/undeclared-library.ts +69 -0
  279. package/src/vite-plugins/virtual-module.ts +37 -0
  280. package/src/vitest-plugin.ts +14 -0
  281. package/dist/create.d.ts +0 -54
  282. package/dist/create.d.ts.map +0 -1
  283. package/dist/create.js +0 -221
  284. package/dist/create.js.map +0 -1
  285. package/dist/dev-server.d.ts +0 -38
  286. package/dist/dev-server.d.ts.map +0 -1
  287. package/dist/dev-server.js +0 -128
  288. package/dist/dev-server.js.map +0 -1
  289. package/dist/index.d.ts +0 -4
  290. package/dist/index.d.ts.map +0 -1
  291. package/dist/index.js +0 -4
  292. package/dist/index.js.map +0 -1
  293. package/dist/mcp-client.d.ts +0 -31
  294. package/dist/mcp-client.d.ts.map +0 -1
  295. package/dist/mcp-client.js +0 -430
  296. package/dist/mcp-client.js.map +0 -1
  297. package/dist/templates.d.ts +0 -9
  298. package/dist/templates.d.ts.map +0 -1
  299. package/dist/templates.js +0 -16
  300. package/dist/templates.js.map +0 -1
  301. package/dist/vite-plugin-gtkx-assets.d.ts +0 -20
  302. package/dist/vite-plugin-gtkx-assets.d.ts.map +0 -1
  303. package/dist/vite-plugin-gtkx-assets.js +0 -57
  304. package/dist/vite-plugin-gtkx-assets.js.map +0 -1
  305. package/dist/vite-plugin-gtkx-built-url.d.ts +0 -18
  306. package/dist/vite-plugin-gtkx-built-url.d.ts.map +0 -1
  307. package/dist/vite-plugin-gtkx-built-url.js.map +0 -1
  308. package/dist/vite-plugin-gtkx-native.d.ts +0 -14
  309. package/dist/vite-plugin-gtkx-native.d.ts.map +0 -1
  310. package/dist/vite-plugin-gtkx-native.js +0 -53
  311. package/dist/vite-plugin-gtkx-native.js.map +0 -1
  312. package/dist/vite-plugin-gtkx-refresh.d.ts +0 -8
  313. package/dist/vite-plugin-gtkx-refresh.d.ts.map +0 -1
  314. package/dist/vite-plugin-gtkx-refresh.js +0 -37
  315. package/dist/vite-plugin-gtkx-refresh.js.map +0 -1
  316. package/dist/vite-plugin-swc-ssr-refresh.d.ts +0 -8
  317. package/dist/vite-plugin-swc-ssr-refresh.d.ts.map +0 -1
  318. package/dist/vite-plugin-swc-ssr-refresh.js +0 -46
  319. package/dist/vite-plugin-swc-ssr-refresh.js.map +0 -1
  320. package/src/cli.tsx +0 -154
  321. package/src/create.ts +0 -310
  322. package/src/dev-server.tsx +0 -162
  323. package/src/index.ts +0 -3
  324. package/src/mcp-client.ts +0 -518
  325. package/src/templates.ts +0 -26
  326. package/src/vite-plugin-gtkx-assets.ts +0 -69
  327. package/src/vite-plugin-gtkx-native.ts +0 -64
  328. package/src/vite-plugin-gtkx-refresh.ts +0 -54
  329. package/src/vite-plugin-swc-ssr-refresh.ts +0 -61
  330. package/templates/claude/EXAMPLES.md.ejs +0 -744
  331. package/templates/claude/SKILL.md.ejs +0 -93
  332. package/templates/claude/WIDGETS.md.ejs +0 -820
  333. package/templates/config/vitest.config.ts.ejs +0 -11
  334. package/templates/gitignore.ejs +0 -4
  335. package/templates/package.json.ejs +0 -16
  336. package/templates/src/app.tsx.ejs +0 -32
  337. package/templates/src/dev.tsx.ejs +0 -5
  338. package/templates/src/gtkx-env.d.ts.ejs +0 -1
  339. package/templates/src/index.tsx.ejs +0 -5
  340. package/templates/tests/app.test.tsx.ejs +0 -16
  341. package/templates/tsconfig.json.ejs +0 -14
@@ -0,0 +1,221 @@
1
+ import { mkdtempSync, readFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { basename, join } from "node:path";
4
+ import { error, errorMessage, info } from "@gtkx/utils";
5
+ import type { ModuleNode, Plugin, UserConfig, ViteDevServer } from "vite";
6
+ import { prependBanner } from "../internal/banner.js";
7
+ import { resolveDataDir } from "../internal/data-dir.js";
8
+ import { removeTempDir, withStagingDir } from "../internal/staging-dir.js";
9
+ import { compileSchemas } from "../settings/compile.js";
10
+ import { parseSchemaXml, SchemaParseError } from "../settings/parser.js";
11
+ import { renderRuntimeModule } from "../settings/render.js";
12
+ import { emitSchemaEnv, prependSchemaDir, SCHEMA_SUFFIX, stageSchema } from "../settings/schema.js";
13
+ import { createVirtualNamespace } from "./virtual-module.js";
14
+
15
+ const VIRTUAL_PREFIX = "\0gtkx-settings:";
16
+ const { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);
17
+
18
+ const SCHEMA_ENV_BANNER = [
19
+ `process.env.GSETTINGS_SCHEMA_DIR = [`,
20
+ ` decodeURIComponent(new URL(".", import.meta.url).pathname),`,
21
+ ` process.env.GSETTINGS_SCHEMA_DIR,`,
22
+ `]`,
23
+ ` .filter(Boolean)`,
24
+ ` .join(":");`,
25
+ ].join("\n");
26
+
27
+ type PluginState = {
28
+ schemaDir: string | null;
29
+ rootDir: string | null;
30
+ dataDir: string | null;
31
+ isBuild: boolean;
32
+ trackedSchemas: Map<string, string>;
33
+ buildSchemas: Set<string>;
34
+ cleanupProcessExit: (() => void) | null;
35
+ };
36
+
37
+ type PluginContext = {
38
+ error: (message: string) => never;
39
+ emitFile: (file: { type: "asset"; fileName: string; source: Buffer }) => void;
40
+ };
41
+
42
+ const ensureSchemaDir = (state: PluginState): string => {
43
+ if (!state.schemaDir) {
44
+ const runnerDir = process.env.GTKX_DEV_SCHEMA_DIR;
45
+ if (runnerDir) {
46
+ state.schemaDir = runnerDir;
47
+ return runnerDir;
48
+ }
49
+ const dir = mkdtempSync(join(tmpdir(), "gtkx-schemas-"));
50
+ state.schemaDir = dir;
51
+ const cleanup = (): void => removeTempDir(dir);
52
+ state.cleanupProcessExit = cleanup;
53
+ process.once("exit", cleanup);
54
+ }
55
+ return state.schemaDir;
56
+ };
57
+
58
+ const releaseSchemaDir = (state: PluginState): void => {
59
+ if (!state.schemaDir) return;
60
+ if (state.cleanupProcessExit) {
61
+ removeTempDir(state.schemaDir);
62
+ process.removeListener("exit", state.cleanupProcessExit);
63
+ state.cleanupProcessExit = null;
64
+ }
65
+ state.schemaDir = null;
66
+ };
67
+
68
+ const compileSchemaDir = (state: PluginState): void => {
69
+ if (!state.schemaDir) return;
70
+ compileSchemas(state.schemaDir);
71
+ process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(state.schemaDir, process.env.GSETTINGS_SCHEMA_DIR);
72
+ };
73
+
74
+ const syncSchemaEnv = (state: PluginState): void => {
75
+ if (state.rootDir === null) return;
76
+ try {
77
+ emitSchemaEnv(state.rootDir, state.dataDir);
78
+ } catch (cause) {
79
+ error(`Failed to generate GSettings schema types: ${errorMessage(cause)}`);
80
+ }
81
+ };
82
+
83
+ const registerSchemaForMode = (state: PluginState, filePath: string, id: string): void => {
84
+ const fileName = basename(filePath);
85
+ if (state.isBuild) {
86
+ state.buildSchemas.add(filePath);
87
+ info(`Queued GSettings schema: ${fileName}`);
88
+ return;
89
+ }
90
+ state.trackedSchemas.set(filePath, id);
91
+ const dir = ensureSchemaDir(state);
92
+ stageSchema(dir, filePath);
93
+ compileSchemaDir(state);
94
+ info(`Compiled GSettings schema: ${fileName}`);
95
+ };
96
+
97
+ const loadSchemaModule = (ctx: PluginContext, state: PluginState, id: string): string => {
98
+ const filePath = fromVirtualId(id);
99
+ const xml = readFileSync(filePath, "utf-8");
100
+ const fileName = basename(filePath);
101
+
102
+ registerSchemaForMode(state, filePath, id);
103
+
104
+ let parsed: ReturnType<typeof parseSchemaXml>;
105
+ try {
106
+ parsed = parseSchemaXml(xml, fileName);
107
+ } catch (error) {
108
+ if (!(error instanceof SchemaParseError)) throw error;
109
+ ctx.error(error.message);
110
+ }
111
+ if (parsed.schemas.length === 0) {
112
+ ctx.error(`No <schema id="..."> found in ${fileName}`);
113
+ }
114
+ return renderRuntimeModule(parsed);
115
+ };
116
+
117
+ const emitCompiledSchemas = (ctx: PluginContext, state: PluginState): void => {
118
+ if (!state.isBuild || state.buildSchemas.size === 0) return;
119
+
120
+ const compiled = withStagingDir("schemas-build", (dir) => {
121
+ for (const filePath of state.buildSchemas) {
122
+ stageSchema(dir, filePath);
123
+ }
124
+ compileSchemas(dir);
125
+ return readFileSync(join(dir, "gschemas.compiled"));
126
+ });
127
+ ctx.emitFile({
128
+ type: "asset",
129
+ fileName: "gschemas.compiled",
130
+ source: compiled,
131
+ });
132
+
133
+ info(`Compiled ${state.buildSchemas.size} GSettings schema(s)`);
134
+ };
135
+
136
+ const handleSchemaHotUpdate = (state: PluginState, file: string, server: ViteDevServer): ModuleNode[] | undefined => {
137
+ const virtualId = state.trackedSchemas.get(file);
138
+ if (!virtualId) return;
139
+
140
+ const dir = ensureSchemaDir(state);
141
+ stageSchema(dir, file);
142
+ compileSchemaDir(state);
143
+
144
+ info(`Recompiled GSettings schema: ${basename(file)}`);
145
+
146
+ const mod = server.moduleGraph.getModuleById(virtualId);
147
+ if (mod) {
148
+ server.moduleGraph.invalidateModule(mod);
149
+ return [mod];
150
+ }
151
+ return undefined;
152
+ };
153
+
154
+ const watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {
155
+ server.httpServer?.once("close", () => releaseSchemaDir(state));
156
+ server.watcher.once("close", () => releaseSchemaDir(state));
157
+ const refreshSchemaTypes = (file: string): void => {
158
+ if (file.endsWith(SCHEMA_SUFFIX)) syncSchemaEnv(state);
159
+ };
160
+ server.watcher.on("add", refreshSchemaTypes);
161
+ server.watcher.on("unlink", refreshSchemaTypes);
162
+ };
163
+
164
+ export function gtkxSettings(): Plugin {
165
+ const state: PluginState = {
166
+ schemaDir: null,
167
+ rootDir: null,
168
+ dataDir: null,
169
+ isBuild: false,
170
+ trackedSchemas: new Map(),
171
+ buildSchemas: new Set(),
172
+ cleanupProcessExit: null,
173
+ };
174
+
175
+ return {
176
+ name: "gtkx:settings",
177
+ enforce: "pre",
178
+
179
+ config(config: UserConfig) {
180
+ state.dataDir = resolveDataDir(config.root ?? process.cwd());
181
+ },
182
+
183
+ configResolved(config) {
184
+ state.isBuild = config.command === "build";
185
+ state.rootDir = typeof config.root === "string" ? config.root : null;
186
+ syncSchemaEnv(state);
187
+ },
188
+
189
+ configureServer(server) {
190
+ watchSchemaFiles(state, server);
191
+ },
192
+
193
+ outputOptions(options) {
194
+ if (!state.isBuild) return;
195
+ return prependBanner(options, SCHEMA_ENV_BANNER);
196
+ },
197
+
198
+ async resolveId(source, importer, options) {
199
+ if (!source.endsWith(SCHEMA_SUFFIX)) return;
200
+ return resolveToVirtual(this, { source, importer, options });
201
+ },
202
+
203
+ load(id) {
204
+ if (!isVirtual(id)) return;
205
+ return loadSchemaModule(this, state, id);
206
+ },
207
+
208
+ buildEnd() {
209
+ emitCompiledSchemas(this, state);
210
+ },
211
+
212
+ closeBundle() {
213
+ releaseSchemaDir(state);
214
+ },
215
+
216
+ handleHotUpdate({ file, server }) {
217
+ if (file.endsWith(SCHEMA_SUFFIX)) syncSchemaEnv(state);
218
+ return handleSchemaHotUpdate(state, file, server);
219
+ },
220
+ };
221
+ }
@@ -0,0 +1,69 @@
1
+ import { discoverGirNamespaces, resolveGirPath } from "@gtkx/codegen";
2
+ import { loadConfig } from "@gtkx/config";
3
+ import type { Plugin, UserConfig } from "vite";
4
+
5
+ const GENERATED_MODULE_PATTERN = /^@gtkx\/(?:gi|jsx)\/([a-z0-9]+)$/;
6
+
7
+ type PluginState = {
8
+ root: string;
9
+ mode: string | undefined;
10
+ girPath: string[] | null;
11
+ };
12
+
13
+ const girSearchPaths = async (state: PluginState): Promise<string[]> => {
14
+ if (state.girPath === null) {
15
+ const { config } = await loadConfig(state.root, { mode: state.mode });
16
+ state.girPath = resolveGirPath(config.girPath);
17
+ }
18
+ return state.girPath;
19
+ };
20
+
21
+ const namespaceOf = (identifier: string): string => identifier.slice(0, identifier.indexOf("-")).toLowerCase();
22
+
23
+ const findGirIdentifier = (girPath: string[], namespace: string): string | undefined =>
24
+ discoverGirNamespaces(girPath).find((identifier) => namespaceOf(identifier) === namespace);
25
+
26
+ const undeclaredLibraryError = (source: string, namespace: string, girPath: string[]): Error => {
27
+ const identifier = findGirIdentifier(girPath, namespace);
28
+
29
+ if (identifier === undefined) {
30
+ return new Error(
31
+ `Cannot resolve "${source}": the binding store has no "${namespace}" module, and no GIR data for it ` +
32
+ `was found in [${girPath.join(", ")}]. If "${namespace}" is a library, install its ` +
33
+ "gobject-introspection data package and add its GIR identifier to `libraries` in gtkx.config.ts. " +
34
+ "Otherwise run gtkx codegen to regenerate the store.",
35
+ );
36
+ }
37
+
38
+ return new Error(
39
+ `Cannot resolve "${source}": the "${identifier}" bindings have not been generated. ` +
40
+ `Add "${identifier}" to \`libraries\` in gtkx.config.ts, then run gtkx dev or gtkx build again.`,
41
+ );
42
+ };
43
+
44
+ export function gtkxUndeclaredLibrary(mode?: string): Plugin {
45
+ const state: PluginState = {
46
+ root: "",
47
+ mode,
48
+ girPath: null,
49
+ };
50
+
51
+ return {
52
+ name: "gtkx:undeclared-library",
53
+ enforce: "pre",
54
+
55
+ config(config: UserConfig) {
56
+ state.root = config.root ?? process.cwd();
57
+ },
58
+
59
+ async resolveId(source, importer, options) {
60
+ const namespace = GENERATED_MODULE_PATTERN.exec(source)?.[1];
61
+ if (namespace === undefined) return;
62
+
63
+ const resolved = await this.resolve(source, importer, { ...options, skipSelf: true });
64
+ if (resolved !== null) return;
65
+
66
+ throw undeclaredLibraryError(source, namespace, await girSearchPaths(state));
67
+ },
68
+ };
69
+ }
@@ -0,0 +1,37 @@
1
+ type VirtualResolveContext = {
2
+ resolve: (
3
+ source: string,
4
+ importer?: string,
5
+ options?: { skipSelf?: boolean } & Record<string, unknown>,
6
+ ) => Promise<{ id: string; external?: boolean | "absolute" | "relative" } | null>;
7
+ };
8
+
9
+ type VirtualResolveRequest = {
10
+ source: string;
11
+ importer: string | undefined;
12
+ options: Record<string, unknown> | undefined;
13
+ };
14
+
15
+ type VirtualNamespace = {
16
+ isVirtual: (id: string) => boolean;
17
+ toVirtualId: (realId: string) => string;
18
+ fromVirtualId: (id: string) => string;
19
+ resolveToVirtual: (ctx: VirtualResolveContext, request: VirtualResolveRequest) => Promise<string | undefined>;
20
+ };
21
+
22
+ export const createVirtualNamespace = (prefix: string): VirtualNamespace => {
23
+ const toVirtualId = (realId: string): string => prefix + realId;
24
+ return {
25
+ isVirtual: (id) => id.startsWith(prefix),
26
+ toVirtualId,
27
+ fromVirtualId: (id) => id.slice(prefix.length),
28
+ resolveToVirtual: async (ctx, request) => {
29
+ const resolved = await ctx.resolve(request.source, request.importer, {
30
+ ...request.options,
31
+ skipSelf: true,
32
+ });
33
+ if (!resolved || resolved.external) return undefined;
34
+ return toVirtualId(resolved.id);
35
+ },
36
+ };
37
+ };
@@ -0,0 +1,14 @@
1
+ import gtkxVitest from "@gtkx/vitest";
2
+ import type { Plugin } from "vite";
3
+ import { gtkxVitePlugins } from "./vite-plugins/index.js";
4
+ import { gtkxSettingsWorkerEnv } from "./vite-plugins/settings-worker-env.js";
5
+
6
+ /**
7
+ * Vite plugin factory that assembles the plugins needed to run GTKX apps under Vitest,
8
+ * combining the shared GTKX Vite plugins with the `@gtkx/vitest` test integration.
9
+ *
10
+ * @returns The ordered array of Vite plugins to include in a Vitest configuration.
11
+ */
12
+ const gtkx = (): Plugin[] => [...gtkxVitePlugins(), gtkxSettingsWorkerEnv(), gtkxVitest()];
13
+
14
+ export default gtkx;
package/dist/create.d.ts DELETED
@@ -1,54 +0,0 @@
1
- /**
2
- * Supported package managers for GTKX projects.
3
- */
4
- export type PackageManager = "pnpm" | "npm" | "yarn";
5
- /**
6
- * Whether to include testing setup in GTKX projects.
7
- */
8
- export type TestingOption = "vitest" | "none";
9
- /**
10
- * Options for creating a new GTKX project.
11
- *
12
- * All options are optional; missing values will be prompted interactively.
13
- */
14
- export type CreateOptions = {
15
- name?: string;
16
- appId?: string;
17
- packageManager?: PackageManager;
18
- testing?: TestingOption;
19
- claudeSkills?: boolean;
20
- };
21
- export declare const getAddCommand: (pm: PackageManager, deps: string[], dev: boolean) => string;
22
- export declare const getRunCommand: (pm: PackageManager) => string;
23
- export declare const isValidProjectName: (name: string) => boolean;
24
- export declare const isValidAppId: (appId: string) => boolean;
25
- /**
26
- * Creates a new GTKX project with interactive prompts.
27
- *
28
- * Scaffolds a complete project structure including:
29
- * - TypeScript configuration
30
- * - React component template
31
- * - Development server entry point
32
- * - Optional testing setup
33
- * - Optional Claude Code skills
34
- *
35
- * @param options - Pre-filled options to skip prompts
36
- *
37
- * @example
38
- * ```tsx
39
- * import { createApp } from "@gtkx/cli";
40
- *
41
- * // Interactive mode
42
- * await createApp();
43
- *
44
- * // With pre-filled options
45
- * await createApp({
46
- * name: "my-app",
47
- * appId: "com.example.myapp",
48
- * packageManager: "pnpm",
49
- * testing: "vitest",
50
- * });
51
- * ```
52
- */
53
- export declare const createApp: (options?: CreateOptions) => Promise<void>;
54
- //# sourceMappingURL=create.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAiBF,eAAO,MAAM,aAAa,GAAI,IAAI,cAAc,EAAE,MAAM,MAAM,EAAE,EAAE,KAAK,OAAO,KAAG,MAYhF,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,IAAI,cAAc,KAAG,MASlD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,OAEjD,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OAE5C,CAAC;AA+LF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,SAAS,GAAU,UAAS,aAAkB,KAAG,OAAO,CAAC,IAAI,CAezE,CAAC"}
package/dist/create.js DELETED
@@ -1,221 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
- import { join, resolve } from "node:path";
4
- import * as p from "@clack/prompts";
5
- import { renderFile } from "./templates.js";
6
- const DEPENDENCIES = ["@gtkx/css", "@gtkx/ffi", "@gtkx/react", "react"];
7
- const DEV_DEPENDENCIES = ["@gtkx/cli", "@types/react", "typescript", "vite"];
8
- const TESTING_DEV_DEPENDENCIES = ["@gtkx/testing", "@gtkx/vitest", "vitest"];
9
- const createTemplateContext = (name, appId, testing) => {
10
- const title = name
11
- .split("-")
12
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
13
- .join(" ");
14
- return { name, appId, title, testing };
15
- };
16
- export const getAddCommand = (pm, deps, dev) => {
17
- const devFlag = dev ? (pm === "npm" ? "--save-dev" : "-D") : "";
18
- const parts = [devFlag, ...deps].filter(Boolean).join(" ");
19
- switch (pm) {
20
- case "npm":
21
- return `npm install ${parts}`;
22
- case "yarn":
23
- return `yarn add ${parts}`;
24
- case "pnpm":
25
- return `pnpm add ${parts}`;
26
- }
27
- };
28
- export const getRunCommand = (pm) => {
29
- switch (pm) {
30
- case "npm":
31
- return "npm run dev";
32
- case "yarn":
33
- return "yarn dev";
34
- case "pnpm":
35
- return "pnpm dev";
36
- }
37
- };
38
- export const isValidProjectName = (name) => {
39
- return /^[a-z0-9-]+$/.test(name);
40
- };
41
- export const isValidAppId = (appId) => {
42
- return /^[a-zA-Z][a-zA-Z0-9]*(\.[a-zA-Z][a-zA-Z0-9]*)+$/.test(appId);
43
- };
44
- const runCommand = (command, cwd) => {
45
- return new Promise((resolve, reject) => {
46
- const proc = spawn(command, { cwd, stdio: "pipe", shell: true });
47
- proc.on("close", (code) => code === 0 ? resolve() : reject(new Error(`Command failed with exit code ${code}`)));
48
- proc.on("error", reject);
49
- });
50
- };
51
- const suggestAppId = (name) => {
52
- const sanitized = name.replace(/-/g, "");
53
- return `com.${sanitized}.app`;
54
- };
55
- const checkCancelled = (value) => {
56
- if (p.isCancel(value)) {
57
- p.cancel("Operation cancelled");
58
- process.exit(0);
59
- }
60
- return value;
61
- };
62
- const promptForOptions = async (options) => {
63
- const name = options.name ??
64
- checkCancelled(await p.text({
65
- message: "Project name",
66
- placeholder: "my-app",
67
- validate: (value) => {
68
- if (!value)
69
- return "Project name is required";
70
- if (!isValidProjectName(value)) {
71
- return "Project name must be lowercase letters, numbers, and hyphens only";
72
- }
73
- if (existsSync(resolve(process.cwd(), value))) {
74
- return `Directory "${value}" already exists`;
75
- }
76
- },
77
- }));
78
- const defaultAppId = suggestAppId(name);
79
- const appId = options.appId ??
80
- checkCancelled(await p.text({
81
- message: "App ID",
82
- placeholder: defaultAppId,
83
- initialValue: defaultAppId,
84
- validate: (value) => {
85
- if (!value)
86
- return "App ID is required";
87
- if (!isValidAppId(value)) {
88
- return "App ID must be reverse domain notation (e.g., com.example.myapp)";
89
- }
90
- },
91
- }));
92
- const packageManager = options.packageManager ??
93
- checkCancelled(await p.select({
94
- message: "Package manager",
95
- options: [
96
- { value: "pnpm", label: "pnpm", hint: "recommended" },
97
- { value: "npm", label: "npm" },
98
- { value: "yarn", label: "yarn" },
99
- ],
100
- initialValue: "pnpm",
101
- }));
102
- const testing = options.testing ??
103
- (checkCancelled(await p.confirm({
104
- message: "Include testing setup (Vitest)?",
105
- initialValue: true,
106
- }))
107
- ? "vitest"
108
- : "none");
109
- const claudeSkills = options.claudeSkills ??
110
- checkCancelled(await p.confirm({
111
- message: "Include Claude Code skills?",
112
- initialValue: true,
113
- }));
114
- return { name, appId, packageManager, testing, claudeSkills };
115
- };
116
- const scaffoldProject = (projectPath, resolved) => {
117
- const { name, appId, testing, claudeSkills } = resolved;
118
- const context = createTemplateContext(name, appId, testing);
119
- mkdirSync(projectPath, { recursive: true });
120
- mkdirSync(join(projectPath, "src"), { recursive: true });
121
- if (testing !== "none") {
122
- mkdirSync(join(projectPath, "tests"), { recursive: true });
123
- }
124
- writeFileSync(join(projectPath, "package.json"), renderFile("package.json.ejs", context));
125
- writeFileSync(join(projectPath, "tsconfig.json"), renderFile("tsconfig.json.ejs", context));
126
- writeFileSync(join(projectPath, "src", "app.tsx"), renderFile("src/app.tsx.ejs", context));
127
- writeFileSync(join(projectPath, "src", "dev.tsx"), renderFile("src/dev.tsx.ejs", context));
128
- writeFileSync(join(projectPath, "src", "index.tsx"), renderFile("src/index.tsx.ejs", context));
129
- writeFileSync(join(projectPath, "src", "gtkx-env.d.ts"), renderFile("src/gtkx-env.d.ts.ejs", context));
130
- writeFileSync(join(projectPath, ".gitignore"), renderFile("gitignore.ejs", context));
131
- if (claudeSkills) {
132
- const skillsDir = join(projectPath, ".claude", "skills", "developing-gtkx-apps");
133
- mkdirSync(skillsDir, { recursive: true });
134
- writeFileSync(join(skillsDir, "SKILL.md"), renderFile("claude/SKILL.md.ejs", context));
135
- writeFileSync(join(skillsDir, "WIDGETS.md"), renderFile("claude/WIDGETS.md.ejs", context));
136
- writeFileSync(join(skillsDir, "EXAMPLES.md"), renderFile("claude/EXAMPLES.md.ejs", context));
137
- }
138
- if (testing === "vitest") {
139
- writeFileSync(join(projectPath, "vitest.config.ts"), renderFile("config/vitest.config.ts.ejs", context));
140
- writeFileSync(join(projectPath, "tests", "app.test.tsx"), renderFile("tests/app.test.tsx.ejs", context));
141
- }
142
- };
143
- const getDevDependencies = (testing) => {
144
- const devDeps = [...DEV_DEPENDENCIES];
145
- if (testing === "vitest") {
146
- devDeps.push(...TESTING_DEV_DEPENDENCIES);
147
- }
148
- return devDeps;
149
- };
150
- const installDependencies = async (projectPath, name, packageManager, devDeps) => {
151
- const installSpinner = p.spinner();
152
- installSpinner.start("Installing dependencies...");
153
- try {
154
- const addCmd = getAddCommand(packageManager, DEPENDENCIES, false);
155
- await runCommand(addCmd, projectPath);
156
- const addDevCmd = getAddCommand(packageManager, devDeps, true);
157
- await runCommand(addDevCmd, projectPath);
158
- installSpinner.stop("Dependencies installed!");
159
- }
160
- catch (error) {
161
- installSpinner.stop("Failed to install dependencies");
162
- p.log.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
163
- p.log.info("You can install dependencies manually by running:");
164
- p.log.info(` cd ${name}`);
165
- p.log.info(` ${getAddCommand(packageManager, DEPENDENCIES, false)}`);
166
- p.log.info(` ${getAddCommand(packageManager, devDeps, true)}`);
167
- }
168
- };
169
- const printNextSteps = (name, packageManager, testing) => {
170
- const runCmd = getRunCommand(packageManager);
171
- const nextSteps = `cd ${name}\n${runCmd}`;
172
- const testingNote = testing !== "none"
173
- ? `
174
-
175
- To run tests, you need xvfb installed:
176
- Fedora: sudo dnf install xorg-x11-server-Xvfb
177
- Ubuntu: sudo apt install xvfb`
178
- : "";
179
- p.note(`${nextSteps}${testingNote}`, "Next steps");
180
- };
181
- /**
182
- * Creates a new GTKX project with interactive prompts.
183
- *
184
- * Scaffolds a complete project structure including:
185
- * - TypeScript configuration
186
- * - React component template
187
- * - Development server entry point
188
- * - Optional testing setup
189
- * - Optional Claude Code skills
190
- *
191
- * @param options - Pre-filled options to skip prompts
192
- *
193
- * @example
194
- * ```tsx
195
- * import { createApp } from "@gtkx/cli";
196
- *
197
- * // Interactive mode
198
- * await createApp();
199
- *
200
- * // With pre-filled options
201
- * await createApp({
202
- * name: "my-app",
203
- * appId: "com.example.myapp",
204
- * packageManager: "pnpm",
205
- * testing: "vitest",
206
- * });
207
- * ```
208
- */
209
- export const createApp = async (options = {}) => {
210
- p.intro("Create GTKX App");
211
- const resolved = await promptForOptions(options);
212
- const projectPath = resolve(process.cwd(), resolved.name);
213
- const s = p.spinner();
214
- s.start("Creating project structure...");
215
- scaffoldProject(projectPath, resolved);
216
- s.stop("Project structure created!");
217
- const devDeps = getDevDependencies(resolved.testing);
218
- await installDependencies(projectPath, resolved.name, resolved.packageManager, devDeps);
219
- printNextSteps(resolved.name, resolved.packageManager, resolved.testing);
220
- };
221
- //# sourceMappingURL=create.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import { type InlineConfig, type ViteDevServer } from "vite";
2
- /**
3
- * Options for the GTKX development server.
4
- */
5
- export type DevServerOptions = {
6
- /** Path to the entry file (e.g., "src/dev.tsx") */
7
- entry: string;
8
- /** Additional Vite configuration */
9
- vite?: InlineConfig;
10
- };
11
- /**
12
- * Creates a Vite-based development server with hot module replacement.
13
- *
14
- * Provides fast refresh for React components and full reload for other changes.
15
- * The server watches for file changes and automatically updates the running
16
- * GTK application.
17
- *
18
- * @param options - Server configuration including entry point and Vite options
19
- * @returns A Vite development server instance
20
- *
21
- * @example
22
- * ```tsx
23
- * import { createDevServer } from "@gtkx/cli";
24
- * import { render } from "@gtkx/react";
25
- *
26
- * const server = await createDevServer({
27
- * entry: "./src/dev.tsx",
28
- * });
29
- *
30
- * const mod = await server.ssrLoadModule("./src/dev.tsx");
31
- * render(<mod.default />, mod.appId);
32
- * ```
33
- *
34
- * @see {@link DevServerOptions} for configuration options
35
- */
36
- export declare const createDevServer: (options: DevServerOptions) => Promise<ViteDevServer>;
37
- export type { ViteDevServer };
38
- //# sourceMappingURL=dev-server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAM3E;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,IAAI,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,eAAe,GAAU,SAAS,gBAAgB,KAAG,OAAO,CAAC,aAAa,CAgHtF,CAAC;AAEF,YAAY,EAAE,aAAa,EAAE,CAAC"}