@gtkx/cli 1.0.0-rc.1 → 1.0.0-rc.3

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 (286) hide show
  1. package/dist/builder.d.ts +3 -2
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +2 -1
  4. package/dist/builder.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +21 -6
  8. package/dist/cli.js.map +1 -1
  9. package/dist/codegen/freshness.d.ts +5 -5
  10. package/dist/codegen/freshness.d.ts.map +1 -1
  11. package/dist/codegen/freshness.js +26 -23
  12. package/dist/codegen/freshness.js.map +1 -1
  13. package/dist/codegen/report.d.ts +2 -1
  14. package/dist/codegen/report.d.ts.map +1 -1
  15. package/dist/codegen/report.js +4 -2
  16. package/dist/codegen/report.js.map +1 -1
  17. package/dist/codegen/run-codegen.d.ts +10 -10
  18. package/dist/codegen/run-codegen.d.ts.map +1 -1
  19. package/dist/codegen/run-codegen.js +72 -47
  20. package/dist/codegen/run-codegen.js.map +1 -1
  21. package/dist/codegen/store-resolver.d.ts +9 -6
  22. package/dist/codegen/store-resolver.d.ts.map +1 -1
  23. package/dist/codegen/store-resolver.js +24 -7
  24. package/dist/codegen/store-resolver.js.map +1 -1
  25. package/dist/commands/build.d.ts +4 -3
  26. package/dist/commands/build.d.ts.map +1 -1
  27. package/dist/commands/build.js +2 -1
  28. package/dist/commands/build.js.map +1 -1
  29. package/dist/commands/codegen.d.ts +2 -1
  30. package/dist/commands/codegen.d.ts.map +1 -1
  31. package/dist/commands/codegen.js +6 -4
  32. package/dist/commands/codegen.js.map +1 -1
  33. package/dist/commands/dev.d.ts +2 -1
  34. package/dist/commands/dev.d.ts.map +1 -1
  35. package/dist/commands/dev.js +2 -1
  36. package/dist/commands/dev.js.map +1 -1
  37. package/dist/commands/docs.d.ts +2 -1
  38. package/dist/commands/docs.d.ts.map +1 -1
  39. package/dist/commands/docs.js +25 -7
  40. package/dist/commands/docs.js.map +1 -1
  41. package/dist/dev/icon-dir.d.ts +2 -1
  42. package/dist/dev/icon-dir.d.ts.map +1 -1
  43. package/dist/dev/icon-dir.js +6 -3
  44. package/dist/dev/icon-dir.js.map +1 -1
  45. package/dist/dev/refresh-tracker.d.ts +5 -4
  46. package/dist/dev/refresh-tracker.d.ts.map +1 -1
  47. package/dist/dev/refresh-tracker.js +6 -5
  48. package/dist/dev/refresh-tracker.js.map +1 -1
  49. package/dist/dev/runner-deps.d.ts +2 -1
  50. package/dist/dev/runner-deps.d.ts.map +1 -1
  51. package/dist/dev/runner-deps.js +20 -4
  52. package/dist/dev/runner-deps.js.map +1 -1
  53. package/dist/dev/runner-main.d.ts +2 -1
  54. package/dist/dev/runner-main.d.ts.map +1 -1
  55. package/dist/dev/runner-main.js +3 -2
  56. package/dist/dev/runner-main.js.map +1 -1
  57. package/dist/dev/runner.d.ts +6 -5
  58. package/dist/dev/runner.d.ts.map +1 -1
  59. package/dist/dev/runner.js +69 -38
  60. package/dist/dev/runner.js.map +1 -1
  61. package/dist/dev/schema-dir.d.ts +2 -1
  62. package/dist/dev/schema-dir.d.ts.map +1 -1
  63. package/dist/dev/schema-dir.js +4 -2
  64. package/dist/dev/schema-dir.js.map +1 -1
  65. package/dist/dev/supervisor.d.ts +7 -6
  66. package/dist/dev/supervisor.d.ts.map +1 -1
  67. package/dist/dev/supervisor.js +107 -67
  68. package/dist/dev/supervisor.js.map +1 -1
  69. package/dist/dev/vite-dev-server.d.ts +3 -3
  70. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  71. package/dist/dev/vite-dev-server.js +2 -1
  72. package/dist/dev/vite-dev-server.js.map +1 -1
  73. package/dist/internal/banner.d.ts +2 -1
  74. package/dist/internal/banner.d.ts.map +1 -1
  75. package/dist/internal/banner.js +2 -1
  76. package/dist/internal/banner.js.map +1 -1
  77. package/dist/internal/data-dir.d.ts +3 -2
  78. package/dist/internal/data-dir.d.ts.map +1 -1
  79. package/dist/internal/data-dir.js +29 -14
  80. package/dist/internal/data-dir.js.map +1 -1
  81. package/dist/internal/entry-arg.d.ts +5 -4
  82. package/dist/internal/entry-arg.d.ts.map +1 -1
  83. package/dist/internal/entry-arg.js +10 -7
  84. package/dist/internal/entry-arg.js.map +1 -1
  85. package/dist/internal/errors.d.ts +3 -2
  86. package/dist/internal/errors.d.ts.map +1 -1
  87. package/dist/internal/errors.js +7 -5
  88. package/dist/internal/errors.js.map +1 -1
  89. package/dist/internal/list-files.d.ts +3 -2
  90. package/dist/internal/list-files.d.ts.map +1 -1
  91. package/dist/internal/list-files.js +5 -3
  92. package/dist/internal/list-files.js.map +1 -1
  93. package/dist/internal/resolve-cli-tool.d.ts +2 -1
  94. package/dist/internal/resolve-cli-tool.d.ts.map +1 -1
  95. package/dist/internal/resolve-cli-tool.js +17 -10
  96. package/dist/internal/resolve-cli-tool.js.map +1 -1
  97. package/dist/internal/staging-dir.d.ts +3 -2
  98. package/dist/internal/staging-dir.d.ts.map +1 -1
  99. package/dist/internal/staging-dir.js +3 -2
  100. package/dist/internal/staging-dir.js.map +1 -1
  101. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  102. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  103. package/dist/internal/xdg-data-dirs.js +4 -2
  104. package/dist/internal/xdg-data-dirs.js.map +1 -1
  105. package/dist/mcp/client.d.ts +9 -4
  106. package/dist/mcp/client.d.ts.map +1 -1
  107. package/dist/mcp/client.js +106 -81
  108. package/dist/mcp/client.js.map +1 -1
  109. package/dist/mcp/handlers.d.ts +3 -2
  110. package/dist/mcp/handlers.d.ts.map +1 -1
  111. package/dist/mcp/handlers.js +89 -61
  112. package/dist/mcp/handlers.js.map +1 -1
  113. package/dist/mcp/index.d.ts +2 -2
  114. package/dist/mcp/index.d.ts.map +1 -1
  115. package/dist/mcp/index.js +30 -13
  116. package/dist/mcp/index.js.map +1 -1
  117. package/dist/mcp/serialize-widget.d.ts +3 -3
  118. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  119. package/dist/mcp/serialize-widget.js +9 -6
  120. package/dist/mcp/serialize-widget.js.map +1 -1
  121. package/dist/mcp/testing-loader.d.ts +3 -4
  122. package/dist/mcp/testing-loader.d.ts.map +1 -1
  123. package/dist/mcp/testing-loader.js +43 -21
  124. package/dist/mcp/testing-loader.js.map +1 -1
  125. package/dist/mcp/widget-registry.d.ts +3 -2
  126. package/dist/mcp/widget-registry.d.ts.map +1 -1
  127. package/dist/mcp/widget-registry.js +4 -3
  128. package/dist/mcp/widget-registry.js.map +1 -1
  129. package/dist/refresh-globals.d.ts +2 -0
  130. package/dist/refresh-globals.d.ts.map +1 -0
  131. package/dist/refresh-globals.js +8 -0
  132. package/dist/refresh-globals.js.map +1 -0
  133. package/dist/refresh-runtime.d.ts +5 -11
  134. package/dist/refresh-runtime.d.ts.map +1 -1
  135. package/dist/refresh-runtime.js +16 -14
  136. package/dist/refresh-runtime.js.map +1 -1
  137. package/dist/settings/compile.d.ts +2 -1
  138. package/dist/settings/compile.d.ts.map +1 -1
  139. package/dist/settings/compile.js +6 -4
  140. package/dist/settings/compile.js.map +1 -1
  141. package/dist/settings/parser.d.ts +6 -5
  142. package/dist/settings/parser.d.ts.map +1 -1
  143. package/dist/settings/parser.js +26 -22
  144. package/dist/settings/parser.js.map +1 -1
  145. package/dist/settings/render.d.ts +3 -2
  146. package/dist/settings/render.d.ts.map +1 -1
  147. package/dist/settings/render.js +38 -64
  148. package/dist/settings/render.js.map +1 -1
  149. package/dist/settings/schema.d.ts +8 -8
  150. package/dist/settings/schema.d.ts.map +1 -1
  151. package/dist/settings/schema.js +61 -43
  152. package/dist/settings/schema.js.map +1 -1
  153. package/dist/vite-plugins/asset-extensions.d.ts +4 -3
  154. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  155. package/dist/vite-plugins/asset-extensions.js +4 -3
  156. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  157. package/dist/vite-plugins/built-url.d.ts +2 -1
  158. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  159. package/dist/vite-plugins/built-url.js +19 -13
  160. package/dist/vite-plugins/built-url.js.map +1 -1
  161. package/dist/vite-plugins/css.d.ts +2 -1
  162. package/dist/vite-plugins/css.d.ts.map +1 -1
  163. package/dist/vite-plugins/css.js +23 -15
  164. package/dist/vite-plugins/css.js.map +1 -1
  165. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +5 -4
  166. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -1
  167. package/dist/vite-plugins/fast-refresh/refresh-filter.js +11 -7
  168. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -1
  169. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +4 -3
  170. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -1
  171. package/dist/vite-plugins/fast-refresh/swc-refresh.js +45 -41
  172. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -1
  173. package/dist/vite-plugins/icons.d.ts +2 -1
  174. package/dist/vite-plugins/icons.d.ts.map +1 -1
  175. package/dist/vite-plugins/icons.js +24 -20
  176. package/dist/vite-plugins/icons.js.map +1 -1
  177. package/dist/vite-plugins/index.d.ts +2 -1
  178. package/dist/vite-plugins/index.d.ts.map +1 -1
  179. package/dist/vite-plugins/index.js +4 -3
  180. package/dist/vite-plugins/index.js.map +1 -1
  181. package/dist/vite-plugins/native.d.ts +2 -1
  182. package/dist/vite-plugins/native.d.ts.map +1 -1
  183. package/dist/vite-plugins/native.js +6 -4
  184. package/dist/vite-plugins/native.js.map +1 -1
  185. package/dist/vite-plugins/react-compiler.d.ts +3 -2
  186. package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
  187. package/dist/vite-plugins/react-compiler.js +26 -20
  188. package/dist/vite-plugins/react-compiler.js.map +1 -1
  189. package/dist/vite-plugins/react-dom-prebundle.d.ts +2 -1
  190. package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -1
  191. package/dist/vite-plugins/react-dom-prebundle.js +2 -1
  192. package/dist/vite-plugins/react-dom-prebundle.js.map +1 -1
  193. package/dist/vite-plugins/resource-init-module.d.ts +2 -1
  194. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
  195. package/dist/vite-plugins/resource-init-module.js +39 -38
  196. package/dist/vite-plugins/resource-init-module.js.map +1 -1
  197. package/dist/vite-plugins/resource-shared.d.ts +7 -5
  198. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  199. package/dist/vite-plugins/resource-shared.js +17 -10
  200. package/dist/vite-plugins/resource-shared.js.map +1 -1
  201. package/dist/vite-plugins/resources.d.ts +3 -2
  202. package/dist/vite-plugins/resources.d.ts.map +1 -1
  203. package/dist/vite-plugins/resources.js +95 -55
  204. package/dist/vite-plugins/resources.js.map +1 -1
  205. package/dist/vite-plugins/settings-worker-env.d.ts +2 -1
  206. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  207. package/dist/vite-plugins/settings-worker-env.js +4 -2
  208. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  209. package/dist/vite-plugins/settings.d.ts +2 -1
  210. package/dist/vite-plugins/settings.d.ts.map +1 -1
  211. package/dist/vite-plugins/settings.js +56 -32
  212. package/dist/vite-plugins/settings.js.map +1 -1
  213. package/dist/vite-plugins/strip-query.d.ts +3 -0
  214. package/dist/vite-plugins/strip-query.d.ts.map +1 -0
  215. package/dist/vite-plugins/strip-query.js +6 -0
  216. package/dist/vite-plugins/strip-query.js.map +1 -0
  217. package/dist/vite-plugins/undeclared-library.d.ts +3 -1
  218. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  219. package/dist/vite-plugins/undeclared-library.js +11 -8
  220. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  221. package/dist/vite-plugins/virtual-module.d.ts +2 -2
  222. package/dist/vite-plugins/virtual-module.d.ts.map +1 -1
  223. package/dist/vite-plugins/virtual-module.js +5 -3
  224. package/dist/vite-plugins/virtual-module.js.map +1 -1
  225. package/dist/vitest-plugin.d.ts.map +1 -1
  226. package/dist/vitest-plugin.js.map +1 -1
  227. package/env.d.ts +21 -61
  228. package/package.json +12 -14
  229. package/src/babel-modules.d.ts +0 -2
  230. package/src/builder.ts +7 -6
  231. package/src/cli.ts +26 -6
  232. package/src/codegen/freshness.ts +39 -26
  233. package/src/codegen/report.ts +10 -2
  234. package/src/codegen/run-codegen.ts +131 -66
  235. package/src/codegen/store-resolver.ts +52 -15
  236. package/src/commands/build.ts +3 -2
  237. package/src/commands/codegen.ts +9 -4
  238. package/src/commands/dev.ts +3 -4
  239. package/src/commands/docs.ts +47 -7
  240. package/src/dev/icon-dir.ts +13 -3
  241. package/src/dev/refresh-tracker.ts +12 -8
  242. package/src/dev/runner-deps.ts +30 -7
  243. package/src/dev/runner-main.ts +4 -3
  244. package/src/dev/runner.ts +100 -41
  245. package/src/dev/schema-dir.ts +7 -2
  246. package/src/dev/supervisor.ts +169 -71
  247. package/src/dev/vite-dev-server.ts +4 -2
  248. package/src/internal/banner.ts +5 -1
  249. package/src/internal/data-dir.ts +47 -16
  250. package/src/internal/entry-arg.ts +16 -8
  251. package/src/internal/errors.ts +15 -7
  252. package/src/internal/list-files.ts +10 -4
  253. package/src/internal/resolve-cli-tool.ts +28 -12
  254. package/src/internal/staging-dir.ts +5 -2
  255. package/src/internal/xdg-data-dirs.ts +8 -2
  256. package/src/mcp/client.ts +143 -85
  257. package/src/mcp/handlers.ts +126 -69
  258. package/src/mcp/index.ts +38 -14
  259. package/src/mcp/serialize-widget.ts +15 -8
  260. package/src/mcp/testing-loader.ts +64 -23
  261. package/src/mcp/widget-registry.ts +11 -5
  262. package/src/refresh-globals.ts +10 -0
  263. package/src/refresh-runtime.ts +20 -16
  264. package/src/settings/compile.ts +7 -4
  265. package/src/settings/parser.ts +69 -30
  266. package/src/settings/render.ts +66 -66
  267. package/src/settings/schema.ts +100 -46
  268. package/src/vite-plugins/asset-extensions.ts +4 -3
  269. package/src/vite-plugins/built-url.ts +30 -15
  270. package/src/vite-plugins/css.ts +35 -20
  271. package/src/vite-plugins/fast-refresh/refresh-filter.ts +18 -10
  272. package/src/vite-plugins/fast-refresh/swc-refresh.ts +60 -47
  273. package/src/vite-plugins/icons.ts +40 -24
  274. package/src/vite-plugins/index.ts +7 -4
  275. package/src/vite-plugins/native.ts +14 -5
  276. package/src/vite-plugins/react-compiler.ts +44 -30
  277. package/src/vite-plugins/react-dom-prebundle.ts +4 -1
  278. package/src/vite-plugins/resource-init-module.ts +41 -38
  279. package/src/vite-plugins/resource-shared.ts +27 -14
  280. package/src/vite-plugins/resources.ts +154 -60
  281. package/src/vite-plugins/settings-worker-env.ts +7 -2
  282. package/src/vite-plugins/settings.ts +107 -42
  283. package/src/vite-plugins/strip-query.ts +7 -0
  284. package/src/vite-plugins/undeclared-library.ts +26 -16
  285. package/src/vite-plugins/virtual-module.ts +9 -2
  286. package/src/vitest-plugin.ts +1 -2
@@ -1,9 +1,55 @@
1
- import { fileURLToPath } from "node:url";
2
- import { type Options as SwcOptions, transform } from "@swc/core";
3
1
  import type { Plugin } from "vite";
2
+ import { type Output, type Options as SwcOptions, transform } from "@swc/core";
3
+ import { fileURLToPath } from "node:url";
4
4
  import { REFRESH_REG, REFRESH_RUNTIME_SPECIFIER, REFRESH_SIG, shouldTransformForRefresh } from "./refresh-filter.js";
5
5
 
6
- export function gtkxSwcRefresh(): Plugin {
6
+ const buildSwcOptions = (id: string): SwcOptions => {
7
+ const isTsx = id.endsWith(".tsx");
8
+ const isTs = id.endsWith(".ts") || isTsx;
9
+
10
+ return {
11
+ filename: id,
12
+ sourceFileName: id,
13
+ sourceMaps: true,
14
+ jsc: {
15
+ parser: isTs ? { syntax: "typescript", tsx: isTsx } : { syntax: "ecmascript", jsx: true },
16
+ transform: {
17
+ react: {
18
+ runtime: "automatic",
19
+ development: true,
20
+ refresh: true,
21
+ },
22
+ },
23
+ target: "es2022",
24
+ },
25
+ };
26
+ };
27
+
28
+ const buildRefreshResult = (result: Output): { code: string; map?: string } =>
29
+ result.map === undefined ? { code: result.code } : { code: result.code, map: result.map };
30
+
31
+ const injectRefreshRegistration = (
32
+ code: string,
33
+ id: string,
34
+ transformOptions: { ssr?: boolean | undefined } | undefined,
35
+ ): { code: string; map: null } | undefined => {
36
+ if (!shouldTransformForRefresh(id, transformOptions)) {
37
+ return;
38
+ }
39
+
40
+ if (!code.includes(REFRESH_REG) && !code.includes(REFRESH_SIG)) {
41
+ return;
42
+ }
43
+
44
+ const header = `
45
+ import { createModuleRegistration as __createModuleRegistration__ } from "${REFRESH_RUNTIME_SPECIFIER}";
46
+ const { ${REFRESH_REG}, ${REFRESH_SIG} } = __createModuleRegistration__(${JSON.stringify(id)});
47
+ `;
48
+
49
+ return { code: header + code, map: null };
50
+ };
51
+
52
+ function gtkxSwcRefresh(): Plugin {
7
53
  return {
8
54
  name: "gtkx:swc-refresh",
9
55
  enforce: "pre",
@@ -14,66 +60,33 @@ export function gtkxSwcRefresh(): Plugin {
14
60
  return;
15
61
  }
16
62
 
17
- const isTsx = id.endsWith(".tsx");
18
- const isTs = id.endsWith(".ts") || isTsx;
19
-
20
- const swcOptions: SwcOptions = {
21
- filename: id,
22
- sourceFileName: id,
23
- sourceMaps: true,
24
- jsc: {
25
- parser: isTs ? { syntax: "typescript", tsx: isTsx } : { syntax: "ecmascript", jsx: true },
26
- transform: {
27
- react: {
28
- runtime: "automatic",
29
- development: true,
30
- refresh: true,
31
- },
32
- },
33
- target: "es2022",
34
- },
35
- };
36
-
37
- const result = await transform(code, swcOptions);
63
+ const result = await transform(code, buildSwcOptions(id));
38
64
 
39
- return result.map === undefined ? { code: result.code } : { code: result.code, map: result.map };
65
+ return buildRefreshResult(result);
40
66
  },
41
67
  };
42
68
  }
43
69
 
44
- export function gtkxRefreshRuntime(): Plugin {
70
+ function gtkxRefreshRuntime(): Plugin {
45
71
  return {
46
72
  name: "gtkx:refresh-runtime",
47
73
  enforce: "post",
48
74
  apply: "serve",
49
75
 
50
76
  resolveId(id) {
51
- if (id !== REFRESH_RUNTIME_SPECIFIER) return undefined;
52
- return fileURLToPath(import.meta.resolve(REFRESH_RUNTIME_SPECIFIER));
53
- },
54
-
55
- transform(code, id, transformOptions) {
56
- if (!shouldTransformForRefresh(id, transformOptions)) {
57
- return;
58
- }
59
-
60
- if (!code.includes(REFRESH_REG) && !code.includes(REFRESH_SIG)) {
77
+ if (id !== REFRESH_RUNTIME_SPECIFIER) {
61
78
  return;
62
79
  }
63
80
 
64
- const moduleIdJson = JSON.stringify(id);
65
-
66
- const header = `
67
- import { createModuleRegistration as __createModuleRegistration__ } from "${REFRESH_RUNTIME_SPECIFIER}";
68
- const { ${REFRESH_REG}, ${REFRESH_SIG} } = __createModuleRegistration__(${moduleIdJson});
69
- `;
81
+ return fileURLToPath(import.meta.resolve(REFRESH_RUNTIME_SPECIFIER));
82
+ },
70
83
 
71
- return {
72
- code: header + code,
73
- map: null,
74
- };
84
+ transform(code, id, transformOptions) {
85
+ return injectRefreshRegistration(code, id, transformOptions);
75
86
  },
76
87
  };
77
88
  }
78
89
 
79
- export const gtkxFastRefresh = (): Plugin[] => [gtkxSwcRefresh(), gtkxRefreshRuntime()];
90
+ const gtkxFastRefresh = (): Plugin[] => [gtkxSwcRefresh(), gtkxRefreshRuntime()];
91
+
92
+ export { gtkxSwcRefresh, gtkxRefreshRuntime, gtkxFastRefresh };
@@ -1,28 +1,49 @@
1
+ import type { Plugin, UserConfig } from "vite";
2
+ import { info } from "@gtkx/utils";
1
3
  import { readFileSync } from "node:fs";
2
4
  import { join } from "node:path";
3
- import { info } from "@gtkx/utils";
4
- import type { Plugin, UserConfig } from "vite";
5
5
  import { prependBanner } from "../internal/banner.js";
6
6
  import { resolveDataDir } from "../internal/data-dir.js";
7
7
  import { type ListedFile, listFilesRecursive } from "../internal/list-files.js";
8
8
 
9
+ type PluginState = {
10
+ iconsDir: string | null;
11
+ };
12
+
13
+ type PluginContext = {
14
+ emitFile: (file: { type: "asset"; fileName: string; source: Buffer }) => void;
15
+ };
16
+
9
17
  const ICONS_DIR = "icons";
10
18
 
11
19
  const XDG_ENV_BANNER = [
12
- `process.env.XDG_DATA_DIRS = [`,
13
- ` decodeURIComponent(new URL(".", import.meta.url).pathname),`,
14
- ` process.env.XDG_DATA_DIRS || "/usr/local/share:/usr/share",`,
15
- `].join(":");`,
20
+ "process.env.XDG_DATA_DIRS = [",
21
+ " decodeURIComponent(new URL(\".\", import.meta.url).pathname),",
22
+ " process.env.XDG_DATA_DIRS || \"/usr/local/share:/usr/share\",",
23
+ "].join(\":\");",
16
24
  ].join("\n");
17
25
 
18
- type PluginState = {
19
- iconsDir: string | null;
20
- };
21
-
22
26
  const findIconFiles = (iconsDir: string | null): ListedFile[] =>
23
27
  iconsDir === null ? [] : listFilesRecursive(iconsDir);
24
28
 
25
- export function gtkxIcons(): Plugin {
29
+ const resolveIconsDir = (config: UserConfig): string | null => {
30
+ const root = config.root ?? process.cwd();
31
+ const dataDir = resolveDataDir(root);
32
+
33
+ return dataDir === null ? null : join(root, dataDir, ICONS_DIR);
34
+ };
35
+
36
+ const emitIcons = (ctx: PluginContext, icons: ListedFile[]): void => {
37
+ for (const { absPath, rel } of icons) {
38
+ ctx.emitFile({ type: "asset", fileName: join(ICONS_DIR, rel), source: readFileSync(absPath) });
39
+ }
40
+
41
+ if (icons.length > 0) {
42
+ info(`Copied ${String(icons.length)} icon(s) into ${ICONS_DIR}/`);
43
+ }
44
+ };
45
+
46
+ function gtkxIcons(): Plugin {
26
47
  const state: PluginState = {
27
48
  iconsDir: null,
28
49
  };
@@ -33,26 +54,21 @@ export function gtkxIcons(): Plugin {
33
54
  apply: "build",
34
55
 
35
56
  config(config: UserConfig) {
36
- const root = config.root ?? process.cwd();
37
- const dataDir = resolveDataDir(root);
38
- state.iconsDir = dataDir === null ? null : join(root, dataDir, ICONS_DIR);
57
+ state.iconsDir = resolveIconsDir(config);
39
58
  },
40
59
 
41
60
  outputOptions(options) {
42
- if (findIconFiles(state.iconsDir).length === 0) return;
61
+ if (findIconFiles(state.iconsDir).length === 0) {
62
+ return;
63
+ }
64
+
43
65
  return prependBanner(options, XDG_ENV_BANNER);
44
66
  },
45
67
 
46
68
  buildEnd() {
47
- const icons = findIconFiles(state.iconsDir);
48
- for (const { absPath, rel } of icons) {
49
- this.emitFile({
50
- type: "asset",
51
- fileName: join(ICONS_DIR, rel),
52
- source: readFileSync(absPath),
53
- });
54
- }
55
- if (icons.length > 0) info(`Copied ${icons.length} icon(s) into ${ICONS_DIR}/`);
69
+ emitIcons(this, findIconFiles(state.iconsDir));
56
70
  },
57
71
  };
58
72
  }
73
+
74
+ export { gtkxIcons };
@@ -1,6 +1,6 @@
1
+ import type { Plugin } from "vite";
1
2
  import { createConfigLoader } from "@gtkx/config/internal";
2
3
  import createConfigPlugin from "@gtkx/config/vite-plugin";
3
- import type { Plugin } from "vite";
4
4
  import { gtkxCss } from "./css.js";
5
5
  import { gtkxIcons } from "./icons.js";
6
6
  import { gtkxReactCompiler } from "./react-compiler.js";
@@ -8,11 +8,12 @@ import { gtkxResources } from "./resources.js";
8
8
  import { gtkxSettings } from "./settings.js";
9
9
  import { gtkxUndeclaredLibrary } from "./undeclared-library.js";
10
10
 
11
- export const gtkxVitePlugins = (mode?: string): Plugin[] => {
12
- const loadConfig = createConfigLoader(mode !== undefined ? { mode } : {});
11
+ const gtkxVitePlugins = (mode?: string): Plugin[] => {
12
+ const loadConfig = createConfigLoader(mode === undefined ? {} : { mode });
13
+
13
14
  return [
14
15
  createConfigPlugin({ name: "gtkx:config", loadConfig }),
15
- gtkxUndeclaredLibrary(mode),
16
+ gtkxUndeclaredLibrary(loadConfig),
16
17
  gtkxSettings(),
17
18
  gtkxIcons(),
18
19
  gtkxResources(loadConfig),
@@ -20,3 +21,5 @@ export const gtkxVitePlugins = (mode?: string): Plugin[] => {
20
21
  gtkxReactCompiler(loadConfig),
21
22
  ];
22
23
  };
24
+
25
+ export { gtkxVitePlugins };
@@ -1,25 +1,28 @@
1
+ import type { Plugin } from "vite";
1
2
  import { existsSync, readFileSync } from "node:fs";
2
3
  import { createRequire } from "node:module";
3
4
  import { arch, platform } from "node:os";
4
5
  import { dirname, join } from "node:path";
5
- import type { Plugin } from "vite";
6
+ import { stripQuery } from "./strip-query.js";
6
7
 
7
8
  const EMITTED_BINDING_SPECIFIER = "./gtkx.node";
8
9
 
9
10
  function resolveBinaryPath(projectRequire: ReturnType<typeof createRequire>, currentArch: string): string {
10
11
  const nativeRoot = dirname(projectRequire.resolve("@gtkx/native/package.json"));
11
12
  const localBinary = join(nativeRoot, `native.linux-${currentArch}-gnu.node`);
13
+
12
14
  return existsSync(localBinary) ? localBinary : projectRequire.resolve(`@gtkx/native-linux-${currentArch}-gnu`);
13
15
  }
14
16
 
15
17
  function resolvePlatformBinary(projectRequire: ReturnType<typeof createRequire>): Buffer {
16
18
  const currentPlatform = platform();
17
- const currentArch = arch();
18
19
 
19
20
  if (currentPlatform !== "linux") {
20
21
  throw new Error(`Unsupported build platform: ${currentPlatform}, only Linux is supported`);
21
22
  }
22
23
 
24
+ const currentArch = arch();
25
+
23
26
  if (currentArch !== "x64" && currentArch !== "arm64") {
24
27
  throw new Error(`Unsupported build architecture: ${currentArch}, only x64 and arm64 are supported`);
25
28
  }
@@ -29,28 +32,32 @@ function resolvePlatformBinary(projectRequire: ReturnType<typeof createRequire>)
29
32
 
30
33
  function rewriteLoader(code: string): string {
31
34
  const idents: string[] = [];
35
+
32
36
  for (const match of code.matchAll(/export\s*\{\s*([A-Za-z0-9_$]+)\s*\}/g)) {
33
37
  const ident = match[1];
38
+
34
39
  if (ident) {
35
40
  idents.push(ident);
36
41
  }
37
42
  }
43
+
38
44
  const bindings = idents.join(", ");
39
45
 
40
46
  return [
41
- `import { createRequire as __gtkxCreateRequire } from "node:module";`,
47
+ "import { createRequire as __gtkxCreateRequire } from \"node:module\";",
42
48
  `const __gtkxNative = __gtkxCreateRequire(import.meta.url)(${JSON.stringify(EMITTED_BINDING_SPECIFIER)});`,
43
49
  `const { ${bindings} } = __gtkxNative;`,
44
50
  `export { ${bindings} };`,
45
51
  ].join("\n");
46
52
  }
47
53
 
48
- export function gtkxNative(root: string): Plugin {
54
+ function gtkxNative(root: string): Plugin {
49
55
  const projectRequire = createRequire(join(root, "package.json"));
50
56
  let cachedLoaderPath: string | undefined;
51
57
 
52
58
  const loaderPath = (): string => {
53
59
  cachedLoaderPath ??= join(dirname(projectRequire.resolve("@gtkx/native/package.json")), "index.js");
60
+
54
61
  return cachedLoaderPath;
55
62
  };
56
63
 
@@ -68,7 +75,9 @@ export function gtkxNative(root: string): Plugin {
68
75
  },
69
76
 
70
77
  transform(code, id) {
71
- return id.replace(/\?.*$/, "") === loaderPath() ? rewriteLoader(code) : null;
78
+ return stripQuery(id) === loaderPath() ? rewriteLoader(code) : null;
72
79
  },
73
80
  };
74
81
  }
82
+
83
+ export { gtkxNative };
@@ -1,32 +1,56 @@
1
- /// <reference path="../babel-modules.d.ts" />
1
+ import type { ResolvedReactCompilerOptions } from "@gtkx/config";
2
+ import type { Plugin, ResolvedConfig, UserConfig } from "vite";
2
3
  import { transformAsync } from "@babel/core";
3
4
  import babelPresetTypescriptNs from "@babel/preset-typescript";
4
- import type { ResolvedReactCompilerOptions } from "@gtkx/config";
5
5
  import { type ConfigLoader, createConfigLoader } from "@gtkx/config/internal";
6
6
  import babelPluginReactCompilerNs from "babel-plugin-react-compiler";
7
- import type { Plugin, ResolvedConfig, UserConfig } from "vite";
7
+
8
+ type ReactCompilerState = {
9
+ root: string;
10
+ options: ResolvedReactCompilerOptions | null;
11
+ };
8
12
 
9
13
  const babelPresetTypescript = babelPresetTypescriptNs.default ?? babelPresetTypescriptNs;
10
14
  const babelPluginReactCompiler = babelPluginReactCompilerNs.default ?? babelPluginReactCompilerNs;
11
-
12
15
  const SOURCE_EXTENSION = /\.[jt]sx?$/;
13
16
  const TYPESCRIPT_EXTENSION = /\.tsx?$/;
14
- const TYPE_ONLY_EXTENSION = /\.ts$/;
15
17
  const NODE_MODULES = /(?:^|\/)node_modules\//;
16
18
 
17
- type ReactCompilerState = {
18
- root: string;
19
- options: ResolvedReactCompilerOptions | null;
20
- };
21
-
22
19
  const isProjectSource = (root: string, id: string): boolean => {
23
- if (!SOURCE_EXTENSION.test(id)) return false;
24
- if (NODE_MODULES.test(id)) return false;
25
- if (root !== "" && !id.startsWith(`${root}/`)) return false;
20
+ if (!SOURCE_EXTENSION.test(id)) {
21
+ return false;
22
+ }
23
+
24
+ if (NODE_MODULES.test(id)) {
25
+ return false;
26
+ }
27
+
28
+ if (root !== "" && !id.startsWith(`${root}/`)) {
29
+ return false;
30
+ }
31
+
26
32
  return true;
27
33
  };
28
34
 
29
- export function gtkxReactCompiler(loadConfig: ConfigLoader = createConfigLoader()): Plugin {
35
+ const compileSource = async (code: string, id: string, options: ResolvedReactCompilerOptions) => {
36
+ const result = await transformAsync(code, {
37
+ filename: id,
38
+ babelrc: false,
39
+ configFile: false,
40
+ sourceMaps: true,
41
+ parserOpts: { plugins: id.endsWith(".ts") ? [] : ["jsx"] },
42
+ presets: TYPESCRIPT_EXTENSION.test(id) ? [babelPresetTypescript] : [],
43
+ plugins: [[babelPluginReactCompiler, options]],
44
+ });
45
+
46
+ if (!result?.code) {
47
+ return;
48
+ }
49
+
50
+ return result.map == null ? { code: result.code } : { code: result.code, map: JSON.stringify(result.map) };
51
+ };
52
+
53
+ function gtkxReactCompiler(loadConfig: ConfigLoader = createConfigLoader()): Plugin {
30
54
  const state: ReactCompilerState = {
31
55
  root: "",
32
56
  options: null,
@@ -37,7 +61,8 @@ export function gtkxReactCompiler(loadConfig: ConfigLoader = createConfigLoader(
37
61
  enforce: "pre",
38
62
 
39
63
  async config(config: UserConfig) {
40
- state.options = (await loadConfig(config.root ?? process.cwd())).reactCompiler;
64
+ const resolved = await loadConfig.resolve(config.root ?? process.cwd());
65
+ state.options = resolved.reactCompiler;
41
66
  },
42
67
 
43
68
  configResolved(config: ResolvedConfig) {
@@ -46,25 +71,14 @@ export function gtkxReactCompiler(loadConfig: ConfigLoader = createConfigLoader(
46
71
 
47
72
  async transform(code, id) {
48
73
  const options = state.options;
49
- if (options === null || !isProjectSource(state.root, id)) {
50
- return;
51
- }
52
74
 
53
- const result = await transformAsync(code, {
54
- filename: id,
55
- babelrc: false,
56
- configFile: false,
57
- sourceMaps: true,
58
- parserOpts: { plugins: TYPE_ONLY_EXTENSION.test(id) ? [] : ["jsx"] },
59
- presets: TYPESCRIPT_EXTENSION.test(id) ? [babelPresetTypescript] : [],
60
- plugins: [[babelPluginReactCompiler, options]],
61
- });
62
-
63
- if (!result?.code) {
75
+ if (options === null || !isProjectSource(state.root, id)) {
64
76
  return;
65
77
  }
66
78
 
67
- return result.map == null ? { code: result.code } : { code: result.code, map: JSON.stringify(result.map) };
79
+ return compileSource(code, id, options);
68
80
  },
69
81
  };
70
82
  }
83
+
84
+ export { gtkxReactCompiler };
@@ -1,10 +1,11 @@
1
1
  import type { Plugin } from "vite";
2
2
 
3
- export const gtkxReactDomPrebundle = (): Plugin => ({
3
+ const gtkxReactDomPrebundle = (): Plugin => ({
4
4
  name: "gtkx:react-dom-prebundle",
5
5
  enforce: "post",
6
6
  config(config) {
7
7
  config.optimizeDeps ??= {};
8
+
8
9
  if (config.optimizeDeps.include) {
9
10
  config.optimizeDeps.include = config.optimizeDeps.include.filter(
10
11
  (dep) => dep !== "react-dom" && !dep.startsWith("react-dom/"),
@@ -12,3 +13,5 @@ export const gtkxReactDomPrebundle = (): Plugin => ({
12
13
  }
13
14
  },
14
15
  });
16
+
17
+ export { gtkxReactDomPrebundle };
@@ -1,54 +1,57 @@
1
- import { BUNDLE_FILENAME } from "./resource-shared.js";
1
+ import { BUNDLE_FILENAME, REFRESH_EXPORT } from "./resource-shared.js";
2
2
 
3
3
  const buildInitModuleSource = (): string =>
4
4
  [
5
- `import { dirname, join } from "node:path";`,
6
- `import { fileURLToPath } from "node:url";`,
7
- `import { resourceLoad, resourcesRegister } from "@gtkx/gi/gio";`,
8
- ``,
9
- `const bundleDir = dirname(fileURLToPath(import.meta.url));`,
10
- `const resource = resourceLoad(join(bundleDir, ${JSON.stringify(BUNDLE_FILENAME)}));`,
11
- `resourcesRegister(resource);`,
12
- ``,
13
- `export function ensureRegistered() {}`,
14
- `export function __refresh() {}`,
5
+ "import { dirname, join } from \"node:path\";",
6
+ "import { fileURLToPath } from \"node:url\";",
7
+ "import { Resource, resourcesRegister } from \"@gtkx/gi/gio\";",
8
+ "",
9
+ "const bundleDir = dirname(fileURLToPath(import.meta.url));",
10
+ `const resource = Resource.load(join(bundleDir, ${JSON.stringify(BUNDLE_FILENAME)}));`,
11
+ "resourcesRegister(resource);",
12
+ "",
13
+ "export function ensureRegistered() {}",
14
+ `export function ${REFRESH_EXPORT}() {}`,
15
15
  ].join("\n");
16
16
 
17
17
  const devInitModuleSource = (bundlePath: string): string => {
18
18
  const bundlePathLiteral = JSON.stringify(bundlePath);
19
+
19
20
  return [
20
- `import { existsSync, statSync } from "node:fs";`,
21
- `import { resourceLoad, resourcesRegister, resourcesUnregister } from "@gtkx/gi/gio";`,
22
- ``,
23
- `let current = null;`,
24
- `let lastSig = "";`,
25
- ``,
26
- `function register() {`,
27
- ` const next = resourceLoad(${bundlePathLiteral});`,
28
- ` if (current) resourcesUnregister(current);`,
29
- ` resourcesRegister(next);`,
30
- ` current = next;`,
31
- `}`,
32
- ``,
33
- `export function ensureRegistered() {`,
21
+ "import { existsSync, statSync } from \"node:fs\";",
22
+ "import { Resource, resourcesRegister, resourcesUnregister } from \"@gtkx/gi/gio\";",
23
+ "",
24
+ "let current = null;",
25
+ "let lastSig = \"\";",
26
+ "",
27
+ "function register() {",
28
+ ` const next = Resource.load(${bundlePathLiteral});`,
29
+ " if (current) resourcesUnregister(current);",
30
+ " resourcesRegister(next);",
31
+ " current = next;",
32
+ "}",
33
+ "",
34
+ "export function ensureRegistered() {",
34
35
  ` if (!existsSync(${bundlePathLiteral})) return;`,
35
36
  ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,
36
- ` const sig = size + ":" + mtimeMs;`,
37
- ` if (sig === lastSig) return;`,
38
- ` register();`,
39
- ` lastSig = sig;`,
40
- `}`,
41
- ``,
42
- `ensureRegistered();`,
43
- ``,
44
- `export function __refresh() {`,
37
+ " const sig = size + \":\" + mtimeMs;",
38
+ " if (sig === lastSig) return;",
39
+ " register();",
40
+ " lastSig = sig;",
41
+ "}",
42
+ "",
43
+ "ensureRegistered();",
44
+ "",
45
+ `export function ${REFRESH_EXPORT}() {`,
45
46
  ` if (!existsSync(${bundlePathLiteral})) return;`,
46
- ` register();`,
47
+ " register();",
47
48
  ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,
48
- ` lastSig = size + ":" + mtimeMs;`,
49
- `}`,
49
+ " lastSig = size + \":\" + mtimeMs;",
50
+ "}",
50
51
  ].join("\n");
51
52
  };
52
53
 
53
- export const renderInitModule = (options: { isBuild: boolean; devBundlePath: string }): string =>
54
+ const renderInitModule = (options: { isBuild: boolean; devBundlePath: string }): string =>
54
55
  options.isBuild ? buildInitModuleSource() : devInitModuleSource(options.devBundlePath);
56
+
57
+ export { renderInitModule };
@@ -1,27 +1,40 @@
1
1
  import { createVirtualNamespace } from "./virtual-module.js";
2
2
 
3
3
  const VIRTUAL_PREFIX = "\0gtkx-resources:";
4
+ const VIRTUAL_INIT = "\0gtkx-resources-init";
5
+ const BUNDLE_FILENAME = "gtkx.gresource";
6
+ const REL_SEPARATOR = "\0rel=";
7
+ const REFRESH_EXPORT = "__refresh";
8
+ const { isVirtual, toVirtualId, fromVirtualId } = createVirtualNamespace(VIRTUAL_PREFIX);
4
9
 
5
- export const VIRTUAL_INIT = "\0gtkx-resources-init";
6
-
7
- export const BUNDLE_FILENAME = "gtkx.gresource";
8
-
9
- export const REL_SEPARATOR = "\0rel=";
10
-
11
- export const { isVirtual, toVirtualId, fromVirtualId } = createVirtualNamespace(VIRTUAL_PREFIX);
12
-
13
- export const escapeXml = (value: string): string =>
10
+ const escapeXml = (value: string): string =>
14
11
  value.replaceAll(/[<>&"']/g, (char) => {
15
12
  switch (char) {
16
- case "<":
13
+ case "<": {
17
14
  return "&lt;";
18
- case ">":
15
+ }
16
+ case ">": {
19
17
  return "&gt;";
20
- case "&":
18
+ }
19
+ case "&": {
21
20
  return "&amp;";
22
- case '"':
21
+ }
22
+ case "\"": {
23
23
  return "&quot;";
24
- default:
24
+ }
25
+ default: {
25
26
  return "&apos;";
27
+ }
26
28
  }
27
29
  });
30
+
31
+ export {
32
+ VIRTUAL_INIT,
33
+ BUNDLE_FILENAME,
34
+ REL_SEPARATOR,
35
+ REFRESH_EXPORT,
36
+ escapeXml,
37
+ isVirtual,
38
+ toVirtualId,
39
+ fromVirtualId,
40
+ };