@gtkx/cli 0.21.0 → 1.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/README.md +173 -0
  2. package/bin/gtkx-dev-runner.js +9 -0
  3. package/dist/builder.d.ts +5 -52
  4. package/dist/builder.d.ts.map +1 -1
  5. package/dist/builder.js +24 -57
  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 +24 -122
  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 +45 -0
  14. package/dist/codegen/freshness.js.map +1 -0
  15. package/dist/codegen/report.d.ts +4 -0
  16. package/dist/codegen/report.d.ts.map +1 -0
  17. package/dist/codegen/report.js +18 -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 +162 -0
  22. package/dist/codegen/run-codegen.js.map +1 -0
  23. package/dist/codegen/store-resolver.d.ts +24 -0
  24. package/dist/codegen/store-resolver.d.ts.map +1 -0
  25. package/dist/codegen/store-resolver.js +72 -0
  26. package/dist/codegen/store-resolver.js.map +1 -0
  27. package/dist/commands/build.d.ts +10 -0
  28. package/dist/commands/build.d.ts.map +1 -0
  29. package/dist/commands/build.js +34 -0
  30. package/dist/commands/build.js.map +1 -0
  31. package/dist/commands/codegen.d.ts +10 -0
  32. package/dist/commands/codegen.d.ts.map +1 -0
  33. package/dist/commands/codegen.js +42 -0
  34. package/dist/commands/codegen.js.map +1 -0
  35. package/dist/commands/dev.d.ts +6 -0
  36. package/dist/commands/dev.d.ts.map +1 -0
  37. package/dist/commands/dev.js +22 -0
  38. package/dist/commands/dev.js.map +1 -0
  39. package/dist/commands/docs.d.ts +20 -0
  40. package/dist/commands/docs.d.ts.map +1 -0
  41. package/dist/commands/docs.js +74 -0
  42. package/dist/commands/docs.js.map +1 -0
  43. package/dist/dev/icon-dir.d.ts +3 -0
  44. package/dist/dev/icon-dir.d.ts.map +1 -0
  45. package/dist/dev/icon-dir.js +16 -0
  46. package/dist/dev/icon-dir.js.map +1 -0
  47. package/dist/dev/refresh-tracker.d.ts +7 -0
  48. package/dist/dev/refresh-tracker.d.ts.map +1 -0
  49. package/dist/dev/refresh-tracker.js +19 -0
  50. package/dist/dev/refresh-tracker.js.map +1 -0
  51. package/dist/dev/runner-deps.d.ts +4 -0
  52. package/dist/dev/runner-deps.d.ts.map +1 -0
  53. package/dist/dev/runner-deps.js +55 -0
  54. package/dist/dev/runner-deps.js.map +1 -0
  55. package/dist/dev/runner-main.d.ts +3 -0
  56. package/dist/dev/runner-main.d.ts.map +1 -0
  57. package/dist/dev/runner-main.js +29 -0
  58. package/dist/dev/runner-main.js.map +1 -0
  59. package/dist/dev/runner.d.ts +24 -0
  60. package/dist/dev/runner.d.ts.map +1 -0
  61. package/dist/dev/runner.js +119 -0
  62. package/dist/dev/runner.js.map +1 -0
  63. package/dist/dev/schema-dir.d.ts +3 -0
  64. package/dist/dev/schema-dir.d.ts.map +1 -0
  65. package/dist/dev/schema-dir.js +12 -0
  66. package/dist/dev/schema-dir.js.map +1 -0
  67. package/dist/dev/supervisor.d.ts +18 -0
  68. package/dist/dev/supervisor.d.ts.map +1 -0
  69. package/dist/dev/supervisor.js +182 -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 +13 -0
  74. package/dist/dev/vite-dev-server.js.map +1 -0
  75. package/dist/internal/banner.d.ts +4 -0
  76. package/dist/internal/banner.d.ts.map +1 -0
  77. package/dist/internal/banner.js +9 -0
  78. package/dist/internal/banner.js.map +1 -0
  79. package/dist/internal/data-dir.d.ts +4 -0
  80. package/dist/internal/data-dir.d.ts.map +1 -0
  81. package/dist/internal/data-dir.js +52 -0
  82. package/dist/internal/data-dir.js.map +1 -0
  83. package/dist/internal/entry-arg.d.ts +20 -0
  84. package/dist/internal/entry-arg.d.ts.map +1 -0
  85. package/dist/internal/entry-arg.js +36 -0
  86. package/dist/internal/entry-arg.js.map +1 -0
  87. package/dist/internal/errors.d.ts +5 -0
  88. package/dist/internal/errors.d.ts.map +1 -0
  89. package/dist/internal/errors.js +29 -0
  90. package/dist/internal/errors.js.map +1 -0
  91. package/dist/internal/list-files.d.ts +7 -0
  92. package/dist/internal/list-files.d.ts.map +1 -0
  93. package/dist/internal/list-files.js +15 -0
  94. package/dist/internal/list-files.js.map +1 -0
  95. package/dist/internal/resolve-cli-tool.d.ts +3 -0
  96. package/dist/internal/resolve-cli-tool.d.ts.map +1 -0
  97. package/dist/internal/resolve-cli-tool.js +27 -0
  98. package/dist/internal/resolve-cli-tool.js.map +1 -0
  99. package/dist/internal/staging-dir.d.ts +4 -0
  100. package/dist/internal/staging-dir.d.ts.map +1 -0
  101. package/dist/internal/staging-dir.js +17 -0
  102. package/dist/internal/staging-dir.js.map +1 -0
  103. package/dist/internal/xdg-data-dirs.d.ts +3 -0
  104. package/dist/internal/xdg-data-dirs.d.ts.map +1 -0
  105. package/dist/internal/xdg-data-dirs.js +10 -0
  106. package/dist/internal/xdg-data-dirs.js.map +1 -0
  107. package/dist/mcp/client.d.ts +28 -0
  108. package/dist/mcp/client.d.ts.map +1 -0
  109. package/dist/mcp/client.js +182 -0
  110. package/dist/mcp/client.js.map +1 -0
  111. package/dist/mcp/handlers.d.ts +9 -0
  112. package/dist/mcp/handlers.d.ts.map +1 -0
  113. package/dist/mcp/handlers.js +147 -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 +34 -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 +23 -0
  122. package/dist/mcp/serialize-widget.js.map +1 -0
  123. package/dist/mcp/testing-loader.d.ts +5 -0
  124. package/dist/mcp/testing-loader.d.ts.map +1 -0
  125. package/dist/mcp/testing-loader.js +47 -0
  126. package/dist/mcp/testing-loader.js.map +1 -0
  127. package/dist/mcp/widget-registry.d.ts +14 -0
  128. package/dist/mcp/widget-registry.d.ts.map +1 -0
  129. package/dist/mcp/widget-registry.js +39 -0
  130. package/dist/mcp/widget-registry.js.map +1 -0
  131. package/dist/refresh-globals.d.ts +2 -0
  132. package/dist/refresh-globals.d.ts.map +1 -0
  133. package/dist/refresh-globals.js +8 -0
  134. package/dist/refresh-globals.js.map +1 -0
  135. package/dist/refresh-runtime.d.ts +10 -26
  136. package/dist/refresh-runtime.d.ts.map +1 -1
  137. package/dist/refresh-runtime.js +26 -48
  138. package/dist/refresh-runtime.js.map +1 -1
  139. package/dist/settings/compile.d.ts +3 -0
  140. package/dist/settings/compile.d.ts.map +1 -0
  141. package/dist/settings/compile.js +21 -0
  142. package/dist/settings/compile.js.map +1 -0
  143. package/dist/settings/parser.d.ts +24 -0
  144. package/dist/settings/parser.d.ts.map +1 -0
  145. package/dist/settings/parser.js +121 -0
  146. package/dist/settings/parser.js.map +1 -0
  147. package/dist/settings/render.d.ts +5 -0
  148. package/dist/settings/render.d.ts.map +1 -0
  149. package/dist/settings/render.js +122 -0
  150. package/dist/settings/render.js.map +1 -0
  151. package/dist/settings/schema.d.ts +13 -0
  152. package/dist/settings/schema.d.ts.map +1 -0
  153. package/dist/settings/schema.js +121 -0
  154. package/dist/settings/schema.js.map +1 -0
  155. package/dist/vite-plugins/asset-extensions.d.ts +5 -0
  156. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -0
  157. package/dist/vite-plugins/asset-extensions.js +28 -0
  158. package/dist/vite-plugins/asset-extensions.js.map +1 -0
  159. package/dist/vite-plugins/built-url.d.ts +4 -0
  160. package/dist/vite-plugins/built-url.d.ts.map +1 -0
  161. package/dist/vite-plugins/built-url.js +36 -0
  162. package/dist/vite-plugins/built-url.js.map +1 -0
  163. package/dist/vite-plugins/css.d.ts +4 -0
  164. package/dist/vite-plugins/css.d.ts.map +1 -0
  165. package/dist/vite-plugins/css.js +38 -0
  166. package/dist/vite-plugins/css.js.map +1 -0
  167. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts +8 -0
  168. package/dist/vite-plugins/fast-refresh/refresh-filter.d.ts.map +1 -0
  169. package/dist/vite-plugins/fast-refresh/refresh-filter.js +19 -0
  170. package/dist/vite-plugins/fast-refresh/refresh-filter.js.map +1 -0
  171. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts +6 -0
  172. package/dist/vite-plugins/fast-refresh/swc-refresh.d.ts.map +1 -0
  173. package/dist/vite-plugins/fast-refresh/swc-refresh.js +70 -0
  174. package/dist/vite-plugins/fast-refresh/swc-refresh.js.map +1 -0
  175. package/dist/vite-plugins/icons.d.ts +4 -0
  176. package/dist/vite-plugins/icons.d.ts.map +1 -0
  177. package/dist/vite-plugins/icons.js +51 -0
  178. package/dist/vite-plugins/icons.js.map +1 -0
  179. package/dist/vite-plugins/index.d.ts +4 -0
  180. package/dist/vite-plugins/index.d.ts.map +1 -0
  181. package/dist/vite-plugins/index.js +22 -0
  182. package/dist/vite-plugins/index.js.map +1 -0
  183. package/dist/vite-plugins/native.d.ts +4 -0
  184. package/dist/vite-plugins/native.d.ts.map +1 -0
  185. package/dist/vite-plugins/native.js +62 -0
  186. package/dist/vite-plugins/native.js.map +1 -0
  187. package/dist/vite-plugins/react-compiler.d.ts +5 -0
  188. package/dist/vite-plugins/react-compiler.d.ts.map +1 -0
  189. package/dist/vite-plugins/react-compiler.js +62 -0
  190. package/dist/vite-plugins/react-compiler.js.map +1 -0
  191. package/dist/vite-plugins/react-dom-prebundle.d.ts +4 -0
  192. package/dist/vite-plugins/react-dom-prebundle.d.ts.map +1 -0
  193. package/dist/vite-plugins/react-dom-prebundle.js +12 -0
  194. package/dist/vite-plugins/react-dom-prebundle.js.map +1 -0
  195. package/dist/vite-plugins/resource-init-module.d.ts +6 -0
  196. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -0
  197. package/dist/vite-plugins/resource-init-module.js +51 -0
  198. package/dist/vite-plugins/resource-init-module.js.map +1 -0
  199. package/dist/vite-plugins/resource-shared.d.ts +8 -0
  200. package/dist/vite-plugins/resource-shared.d.ts.map +1 -0
  201. package/dist/vite-plugins/resource-shared.js +28 -0
  202. package/dist/vite-plugins/resource-shared.js.map +1 -0
  203. package/dist/vite-plugins/resources.d.ts +5 -0
  204. package/dist/vite-plugins/resources.d.ts.map +1 -0
  205. package/dist/vite-plugins/resources.js +260 -0
  206. package/dist/vite-plugins/resources.js.map +1 -0
  207. package/dist/vite-plugins/settings-worker-env.d.ts +4 -0
  208. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -0
  209. package/dist/vite-plugins/settings-worker-env.js +23 -0
  210. package/dist/vite-plugins/settings-worker-env.js.map +1 -0
  211. package/dist/vite-plugins/settings.d.ts +4 -0
  212. package/dist/vite-plugins/settings.d.ts.map +1 -0
  213. package/dist/vite-plugins/settings.js +214 -0
  214. package/dist/vite-plugins/settings.js.map +1 -0
  215. package/dist/vite-plugins/strip-query.d.ts +3 -0
  216. package/dist/vite-plugins/strip-query.d.ts.map +1 -0
  217. package/dist/vite-plugins/strip-query.js +6 -0
  218. package/dist/vite-plugins/strip-query.js.map +1 -0
  219. package/dist/vite-plugins/undeclared-library.d.ts +4 -0
  220. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -0
  221. package/dist/vite-plugins/undeclared-library.js +50 -0
  222. package/dist/vite-plugins/undeclared-library.js.map +1 -0
  223. package/dist/vite-plugins/virtual-module.d.ts +22 -0
  224. package/dist/vite-plugins/virtual-module.d.ts.map +1 -0
  225. package/dist/vite-plugins/virtual-module.js +20 -0
  226. package/dist/vite-plugins/virtual-module.js.map +1 -0
  227. package/dist/vitest-plugin.d.ts +10 -0
  228. package/dist/vitest-plugin.d.ts.map +1 -0
  229. package/dist/vitest-plugin.js +12 -0
  230. package/dist/vitest-plugin.js.map +1 -0
  231. package/env.d.ts +91 -8
  232. package/package.json +30 -38
  233. package/src/babel-modules.d.ts +11 -0
  234. package/src/builder.ts +31 -86
  235. package/src/cli.ts +42 -0
  236. package/src/codegen/freshness.ts +65 -0
  237. package/src/codegen/report.ts +28 -0
  238. package/src/codegen/run-codegen.ts +260 -0
  239. package/src/codegen/store-resolver.ts +116 -0
  240. package/src/commands/build.ts +38 -0
  241. package/src/commands/codegen.ts +49 -0
  242. package/src/commands/dev.ts +24 -0
  243. package/src/commands/docs.ts +95 -0
  244. package/src/dev/icon-dir.ts +21 -0
  245. package/src/dev/refresh-tracker.ts +25 -0
  246. package/src/dev/runner-deps.ts +65 -0
  247. package/src/dev/runner-main.ts +34 -0
  248. package/src/dev/runner.ts +185 -0
  249. package/src/dev/schema-dir.ts +16 -0
  250. package/src/dev/supervisor.ts +276 -0
  251. package/src/dev/vite-dev-server.ts +36 -0
  252. package/src/internal/banner.ts +13 -0
  253. package/src/internal/data-dir.ts +70 -0
  254. package/src/internal/entry-arg.ts +46 -0
  255. package/src/internal/errors.ts +36 -0
  256. package/src/internal/list-files.ts +23 -0
  257. package/src/internal/resolve-cli-tool.ts +37 -0
  258. package/src/internal/staging-dir.ts +19 -0
  259. package/src/internal/xdg-data-dirs.ts +13 -0
  260. package/src/mcp/client.ts +235 -0
  261. package/src/mcp/handlers.ts +213 -0
  262. package/src/mcp/index.ts +46 -0
  263. package/src/mcp/serialize-widget.ts +41 -0
  264. package/src/mcp/testing-loader.ts +73 -0
  265. package/src/mcp/widget-registry.ts +49 -0
  266. package/src/refresh-globals.ts +10 -0
  267. package/src/refresh-runtime.ts +30 -55
  268. package/src/settings/compile.ts +22 -0
  269. package/src/settings/parser.ts +193 -0
  270. package/src/settings/render.ts +167 -0
  271. package/src/settings/schema.ts +169 -0
  272. package/src/vite-plugins/asset-extensions.ts +29 -0
  273. package/src/vite-plugins/built-url.ts +50 -0
  274. package/src/vite-plugins/css.ts +53 -0
  275. package/src/vite-plugins/fast-refresh/refresh-filter.ts +26 -0
  276. package/src/vite-plugins/fast-refresh/swc-refresh.ts +92 -0
  277. package/src/vite-plugins/icons.ts +74 -0
  278. package/src/vite-plugins/index.ts +25 -0
  279. package/src/vite-plugins/native.ts +83 -0
  280. package/src/vite-plugins/react-compiler.ts +84 -0
  281. package/src/vite-plugins/react-dom-prebundle.ts +17 -0
  282. package/src/vite-plugins/resource-init-module.ts +57 -0
  283. package/src/vite-plugins/resource-shared.ts +40 -0
  284. package/src/vite-plugins/resources.ts +366 -0
  285. package/src/vite-plugins/settings-worker-env.ts +30 -0
  286. package/src/vite-plugins/settings.ts +286 -0
  287. package/src/vite-plugins/strip-query.ts +7 -0
  288. package/src/vite-plugins/undeclared-library.ts +78 -0
  289. package/src/vite-plugins/virtual-module.ts +44 -0
  290. package/src/vitest-plugin.ts +13 -0
  291. package/dist/create.d.ts +0 -55
  292. package/dist/create.d.ts.map +0 -1
  293. package/dist/create.js +0 -236
  294. package/dist/create.js.map +0 -1
  295. package/dist/dev-server.d.ts +0 -37
  296. package/dist/dev-server.d.ts.map +0 -1
  297. package/dist/dev-server.js +0 -130
  298. package/dist/dev-server.js.map +0 -1
  299. package/dist/index.d.ts +0 -4
  300. package/dist/index.d.ts.map +0 -1
  301. package/dist/index.js +0 -4
  302. package/dist/index.js.map +0 -1
  303. package/dist/mcp-client.d.ts +0 -31
  304. package/dist/mcp-client.d.ts.map +0 -1
  305. package/dist/mcp-client.js +0 -430
  306. package/dist/mcp-client.js.map +0 -1
  307. package/dist/templates.d.ts +0 -9
  308. package/dist/templates.d.ts.map +0 -1
  309. package/dist/templates.js +0 -16
  310. package/dist/templates.js.map +0 -1
  311. package/dist/vite-plugin-gtkx-assets.d.ts +0 -20
  312. package/dist/vite-plugin-gtkx-assets.d.ts.map +0 -1
  313. package/dist/vite-plugin-gtkx-assets.js +0 -57
  314. package/dist/vite-plugin-gtkx-assets.js.map +0 -1
  315. package/dist/vite-plugin-gtkx-built-url.d.ts +0 -18
  316. package/dist/vite-plugin-gtkx-built-url.d.ts.map +0 -1
  317. package/dist/vite-plugin-gtkx-built-url.js +0 -43
  318. package/dist/vite-plugin-gtkx-built-url.js.map +0 -1
  319. package/dist/vite-plugin-gtkx-gsettings.d.ts +0 -28
  320. package/dist/vite-plugin-gtkx-gsettings.d.ts.map +0 -1
  321. package/dist/vite-plugin-gtkx-gsettings.js +0 -147
  322. package/dist/vite-plugin-gtkx-gsettings.js.map +0 -1
  323. package/dist/vite-plugin-gtkx-native.d.ts +0 -14
  324. package/dist/vite-plugin-gtkx-native.d.ts.map +0 -1
  325. package/dist/vite-plugin-gtkx-native.js +0 -53
  326. package/dist/vite-plugin-gtkx-native.js.map +0 -1
  327. package/dist/vite-plugin-gtkx-refresh.d.ts +0 -8
  328. package/dist/vite-plugin-gtkx-refresh.d.ts.map +0 -1
  329. package/dist/vite-plugin-gtkx-refresh.js +0 -37
  330. package/dist/vite-plugin-gtkx-refresh.js.map +0 -1
  331. package/dist/vite-plugin-swc-ssr-refresh.d.ts +0 -8
  332. package/dist/vite-plugin-swc-ssr-refresh.d.ts.map +0 -1
  333. package/dist/vite-plugin-swc-ssr-refresh.js +0 -46
  334. package/dist/vite-plugin-swc-ssr-refresh.js.map +0 -1
  335. package/src/cli.tsx +0 -154
  336. package/src/create.ts +0 -326
  337. package/src/dev-server.tsx +0 -162
  338. package/src/index.ts +0 -3
  339. package/src/mcp-client.ts +0 -518
  340. package/src/templates.ts +0 -26
  341. package/src/vite-plugin-gtkx-assets.ts +0 -69
  342. package/src/vite-plugin-gtkx-built-url.ts +0 -48
  343. package/src/vite-plugin-gtkx-gsettings.ts +0 -168
  344. package/src/vite-plugin-gtkx-native.ts +0 -64
  345. package/src/vite-plugin-gtkx-refresh.ts +0 -54
  346. package/src/vite-plugin-swc-ssr-refresh.ts +0 -61
  347. package/templates/claude/EXAMPLES.md.ejs +0 -744
  348. package/templates/claude/SKILL.md.ejs +0 -93
  349. package/templates/claude/WIDGETS.md.ejs +0 -820
  350. package/templates/config/vitest.config.ts.ejs +0 -11
  351. package/templates/gitignore.ejs +0 -4
  352. package/templates/package.json.ejs +0 -16
  353. package/templates/src/app.tsx.ejs +0 -32
  354. package/templates/src/dev.tsx.ejs +0 -5
  355. package/templates/src/gtkx-env.d.ts.ejs +0 -1
  356. package/templates/src/index.tsx.ejs +0 -5
  357. package/templates/tests/app.test.tsx.ejs +0 -16
  358. package/templates/tsconfig.json.ejs +0 -14
@@ -0,0 +1,182 @@
1
+ import { error, exitCodeForSignal, info, installGracefulShutdown } from "@gtkx/utils";
2
+ import { fork as nodeFork } from "node:child_process";
3
+ import { watch as watchFs } from "node:fs";
4
+ import { basename, dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const DEV_RUNNER_URL = new URL("../../bin/gtkx-dev-runner.js", import.meta.url);
7
+ const FORCE_KILL_TIMEOUT_MS = 5000;
8
+ const CONFIG_DEBOUNCE_MS = 150;
9
+ const RESTART_EXIT_CODE = 75;
10
+ const defaultForkRunner = (modulePath, args, cwd) => nodeFork(modulePath, [...args], { cwd, stdio: "inherit", detached: true });
11
+ const forwardSignal = (child, signal) => {
12
+ if (!child.killed) {
13
+ child.kill(signal);
14
+ }
15
+ };
16
+ const didForceKillChild = (child) => {
17
+ if (!child?.pid || child.exitCode !== null || child.killed) {
18
+ return false;
19
+ }
20
+ try {
21
+ return process.kill(child.pid, "SIGKILL");
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ };
27
+ const captureShutdownExit = (state, code, signal) => {
28
+ if (code !== null) {
29
+ state.capturedChildExit = code;
30
+ }
31
+ else if (signal) {
32
+ state.capturedChildExit = exitCodeForSignal(signal);
33
+ }
34
+ };
35
+ const handleChildExit = (state, code, signal) => {
36
+ state.child = null;
37
+ if (state.restarting) {
38
+ return;
39
+ }
40
+ if (state.shuttingDown) {
41
+ captureShutdownExit(state, code, signal);
42
+ return;
43
+ }
44
+ if (code === RESTART_EXIT_CODE) {
45
+ info("Restarting dev runner...");
46
+ launch(state);
47
+ return;
48
+ }
49
+ process.exit(code ?? exitCodeForSignal(signal));
50
+ };
51
+ const launch = (state) => {
52
+ const child = state.fork(state.runnerPath, [state.entryPath], state.cwd);
53
+ state.child = child;
54
+ child.on("exit", (code, signal) => {
55
+ handleChildExit(state, code, signal);
56
+ });
57
+ };
58
+ const isRestartBlocked = (state) => state.restarting || state.shuttingDown;
59
+ const relaunchAfterExit = (state) => {
60
+ state.restarting = false;
61
+ if (state.shuttingDown) {
62
+ return;
63
+ }
64
+ info("Restarting dev runner...");
65
+ launch(state);
66
+ };
67
+ const restart = async (state) => {
68
+ const watch = state.watch;
69
+ if (watch === undefined || isRestartBlocked(state)) {
70
+ return;
71
+ }
72
+ state.restarting = true;
73
+ info("gtkx.config.ts changed; regenerating bindings...");
74
+ try {
75
+ await watch.regenerate();
76
+ }
77
+ catch (error_) {
78
+ error("Codegen failed; keeping the current dev runner. Fix the error and save again.", error_);
79
+ state.restarting = false;
80
+ return;
81
+ }
82
+ if (state.shuttingDown) {
83
+ state.restarting = false;
84
+ return;
85
+ }
86
+ const current = state.child;
87
+ if (current === null) {
88
+ state.restarting = false;
89
+ launch(state);
90
+ return;
91
+ }
92
+ current.once("exit", () => {
93
+ relaunchAfterExit(state);
94
+ });
95
+ forwardSignal(current, "SIGTERM");
96
+ };
97
+ const scheduleRestart = (state, timer) => {
98
+ if (timer.handle !== null) {
99
+ clearTimeout(timer.handle);
100
+ }
101
+ timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);
102
+ };
103
+ const isWatchedChange = (state, names, filename) => {
104
+ if (filename === null || state.shuttingDown) {
105
+ return false;
106
+ }
107
+ return names.has(basename(filename.toString()));
108
+ };
109
+ const groupWatchNamesByDirectory = (paths) => {
110
+ const namesByDirectory = new Map();
111
+ for (const path of paths) {
112
+ const directory = dirname(path);
113
+ const names = namesByDirectory.get(directory) ?? new Set();
114
+ names.add(basename(path));
115
+ namesByDirectory.set(directory, names);
116
+ }
117
+ return namesByDirectory;
118
+ };
119
+ const watchConfigDirectory = (state, directory, names, timer) => {
120
+ const watcher = watchFs(directory, (_event, filename) => {
121
+ if (isWatchedChange(state, names, filename)) {
122
+ scheduleRestart(state, timer);
123
+ }
124
+ });
125
+ watcher.on("error", () => undefined);
126
+ state.watchers.push(watcher);
127
+ };
128
+ const installConfigWatchers = (state) => {
129
+ const watch = state.watch;
130
+ if (watch === undefined || watch.paths.length === 0) {
131
+ return;
132
+ }
133
+ const timer = { handle: null };
134
+ for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {
135
+ watchConfigDirectory(state, directory, names, timer);
136
+ }
137
+ };
138
+ const closeWatchers = (state) => {
139
+ for (const watcher of state.watchers) {
140
+ watcher.close();
141
+ }
142
+ };
143
+ const shutdownOnSignal = (state, signal) => new Promise((resolve) => {
144
+ state.shuttingDown = true;
145
+ closeWatchers(state);
146
+ if (!state.child) {
147
+ resolve();
148
+ return;
149
+ }
150
+ state.child.once("exit", () => {
151
+ resolve();
152
+ });
153
+ forwardSignal(state.child, signal);
154
+ });
155
+ const installShutdown = (state) => {
156
+ installGracefulShutdown({
157
+ onSignal: (signal) => shutdownOnSignal(state, signal),
158
+ onForce: () => didForceKillChild(state.child),
159
+ forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,
160
+ exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),
161
+ });
162
+ };
163
+ const runDevSupervisor = async (entryPath, cwd, watch, fork = defaultForkRunner) => {
164
+ const state = {
165
+ runnerPath: fileURLToPath(DEV_RUNNER_URL),
166
+ entryPath,
167
+ cwd,
168
+ watch,
169
+ watchers: [],
170
+ fork,
171
+ child: null,
172
+ shuttingDown: false,
173
+ restarting: false,
174
+ capturedChildExit: undefined,
175
+ };
176
+ installConfigWatchers(state);
177
+ installShutdown(state);
178
+ launch(state);
179
+ return new Promise(() => undefined);
180
+ };
181
+ export { RESTART_EXIT_CODE, defaultForkRunner, runDevSupervisor };
182
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/dev/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAkB,KAAK,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiCzC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChF,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,iBAAiB,GAAe,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAC5D,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/E,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAE,MAAsB,EAAQ,EAAE;IAC3E,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAW,EAAE;IACjE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,KAAsB,EAAE,IAAmB,EAAE,MAA6B,EAAQ,EAAE;IAC7G,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACnC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,IAAmB,EAAE,MAA6B,EAAQ,EAAE;IACzG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IAEnB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEzC,OAAO;IACX,CAAC;IAED,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC7B,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEd,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAEpB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAC9B,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAsB,EAAW,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,CAAC;AAErG,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACvD,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;IAEzB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,OAAO;IACX,CAAC;IAED,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,KAAK,EAAE,KAAsB,EAAiB,EAAE;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO;IACX,CAAC;IAED,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAEzD,IAAI,CAAC;QACD,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,+EAA+E,EAAE,MAAM,CAAC,CAAC;QAC/F,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAEzB,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACrB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAEzB,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;IAE5B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC;QAEd,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,KAAoB,EAAQ,EAAE;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxB,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAE,KAAkB,EAAE,QAAgC,EAAW,EAAE;IAC9G,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,KAAe,EAA4B,EAAE;IAC7E,MAAM,gBAAgB,GAA6B,IAAI,GAAG,EAAE,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACnE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1B,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CACzB,KAAsB,EACtB,SAAiB,EACjB,KAAkB,EAClB,KAAoB,EAChB,EAAE;IACN,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpD,IAAI,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1C,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAS,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,KAAsB,EAAQ,EAAE;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE9C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,0BAA0B,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACnD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAsB,EAAE,MAAsB,EAAiB,EAAE,CACvF,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;IAC1B,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;QAEV,OAAO;IACX,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEP,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACrD,uBAAuB,CAAC;QACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC;QACrD,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,gBAAgB,EAAE,qBAAqB;QACvC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KACxG,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAC1B,SAAiB,EACjB,GAAW,EACX,KAAgB,EAChB,OAAmB,iBAAiB,EACtB,EAAE;IAChB,MAAM,KAAK,GAAoB;QAC3B,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC;QACzC,SAAS;QACT,GAAG;QACH,KAAK;QACL,QAAQ,EAAE,EAAE;QACZ,IAAI;QACJ,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,KAAK;QACjB,iBAAiB,EAAE,SAAS;KAC/B,CAAC;IAEF,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7B,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,CAAC;IAEd,OAAO,IAAI,OAAO,CAAQ,GAAS,EAAE,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAwD,CAAC","sourcesContent":["import { error, exitCodeForSignal, info, installGracefulShutdown } from \"@gtkx/utils\";\nimport { fork as nodeFork } from \"node:child_process\";\nimport { type FSWatcher, watch as watchFs } from \"node:fs\";\nimport { basename, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ntype SupervisedChild = {\n killed: boolean;\n pid?: number | undefined;\n exitCode: number | null;\n kill(signal?: number | NodeJS.Signals): boolean;\n on(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n once(event: \"exit\", listener: (code: number | null, signal: NodeJS.Signals | null) => void): void;\n};\n\ntype ForkRunner = (modulePath: string, args: string[], cwd: string) => SupervisedChild;\n\ntype DevWatch = {\n paths: string[];\n regenerate: () => Promise<void>;\n};\n\ntype SupervisorState = {\n runnerPath: string;\n entryPath: string;\n cwd: string;\n watch: DevWatch | undefined;\n watchers: FSWatcher[];\n fork: ForkRunner;\n child: SupervisedChild | null;\n shuttingDown: boolean;\n restarting: boolean;\n capturedChildExit: number | undefined;\n};\n\ntype DebounceTimer = { handle: NodeJS.Timeout | null };\n\nconst DEV_RUNNER_URL = new URL(\"../../bin/gtkx-dev-runner.js\", import.meta.url);\nconst FORCE_KILL_TIMEOUT_MS = 5000;\nconst CONFIG_DEBOUNCE_MS = 150;\nconst RESTART_EXIT_CODE = 75;\n\nconst defaultForkRunner: ForkRunner = (modulePath, args, cwd) =>\n nodeFork(modulePath, [...args], { cwd, stdio: \"inherit\", detached: true });\n\nconst forwardSignal = (child: SupervisedChild, signal: NodeJS.Signals): void => {\n if (!child.killed) {\n child.kill(signal);\n }\n};\n\nconst didForceKillChild = (child: SupervisedChild | null): boolean => {\n if (!child?.pid || child.exitCode !== null || child.killed) {\n return false;\n }\n\n try {\n return process.kill(child.pid, \"SIGKILL\");\n } catch {\n return false;\n }\n};\n\nconst captureShutdownExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n if (code !== null) {\n state.capturedChildExit = code;\n } else if (signal) {\n state.capturedChildExit = exitCodeForSignal(signal);\n }\n};\n\nconst handleChildExit = (state: SupervisorState, code: number | null, signal: NodeJS.Signals | null): void => {\n state.child = null;\n\n if (state.restarting) {\n return;\n }\n\n if (state.shuttingDown) {\n captureShutdownExit(state, code, signal);\n\n return;\n }\n\n if (code === RESTART_EXIT_CODE) {\n info(\"Restarting dev runner...\");\n launch(state);\n\n return;\n }\n\n process.exit(code ?? exitCodeForSignal(signal));\n};\n\nconst launch = (state: SupervisorState): void => {\n const child = state.fork(state.runnerPath, [state.entryPath], state.cwd);\n state.child = child;\n\n child.on(\"exit\", (code, signal) => {\n handleChildExit(state, code, signal);\n });\n};\n\nconst isRestartBlocked = (state: SupervisorState): boolean => state.restarting || state.shuttingDown;\n\nconst relaunchAfterExit = (state: SupervisorState): void => {\n state.restarting = false;\n\n if (state.shuttingDown) {\n return;\n }\n\n info(\"Restarting dev runner...\");\n launch(state);\n};\n\nconst restart = async (state: SupervisorState): Promise<void> => {\n const watch = state.watch;\n\n if (watch === undefined || isRestartBlocked(state)) {\n return;\n }\n\n state.restarting = true;\n info(\"gtkx.config.ts changed; regenerating bindings...\");\n\n try {\n await watch.regenerate();\n } catch (error_) {\n error(\"Codegen failed; keeping the current dev runner. Fix the error and save again.\", error_);\n state.restarting = false;\n\n return;\n }\n\n if (state.shuttingDown) {\n state.restarting = false;\n\n return;\n }\n\n const current = state.child;\n\n if (current === null) {\n state.restarting = false;\n launch(state);\n\n return;\n }\n\n current.once(\"exit\", () => {\n relaunchAfterExit(state);\n });\n\n forwardSignal(current, \"SIGTERM\");\n};\n\nconst scheduleRestart = (state: SupervisorState, timer: DebounceTimer): void => {\n if (timer.handle !== null) {\n clearTimeout(timer.handle);\n }\n\n timer.handle = setTimeout(() => void restart(state), CONFIG_DEBOUNCE_MS);\n};\n\nconst isWatchedChange = (state: SupervisorState, names: Set<string>, filename: string | Buffer | null): boolean => {\n if (filename === null || state.shuttingDown) {\n return false;\n }\n\n return names.has(basename(filename.toString()));\n};\n\nconst groupWatchNamesByDirectory = (paths: string[]): Map<string, Set<string>> => {\n const namesByDirectory: Map<string, Set<string>> = new Map();\n\n for (const path of paths) {\n const directory = dirname(path);\n const names = namesByDirectory.get(directory) ?? new Set<string>();\n names.add(basename(path));\n namesByDirectory.set(directory, names);\n }\n\n return namesByDirectory;\n};\n\nconst watchConfigDirectory = (\n state: SupervisorState,\n directory: string,\n names: Set<string>,\n timer: DebounceTimer,\n): void => {\n const watcher = watchFs(directory, (_event, filename) => {\n if (isWatchedChange(state, names, filename)) {\n scheduleRestart(state, timer);\n }\n });\n\n watcher.on(\"error\", (): void => undefined);\n state.watchers.push(watcher);\n};\n\nconst installConfigWatchers = (state: SupervisorState): void => {\n const watch = state.watch;\n\n if (watch === undefined || watch.paths.length === 0) {\n return;\n }\n\n const timer: DebounceTimer = { handle: null };\n\n for (const [directory, names] of groupWatchNamesByDirectory(watch.paths)) {\n watchConfigDirectory(state, directory, names, timer);\n }\n};\n\nconst closeWatchers = (state: SupervisorState): void => {\n for (const watcher of state.watchers) {\n watcher.close();\n }\n};\n\nconst shutdownOnSignal = (state: SupervisorState, signal: NodeJS.Signals): Promise<void> =>\n new Promise<void>((resolve) => {\n state.shuttingDown = true;\n closeWatchers(state);\n\n if (!state.child) {\n resolve();\n\n return;\n }\n\n state.child.once(\"exit\", () => {\n resolve();\n });\n\n forwardSignal(state.child, signal);\n });\n\nconst installShutdown = (state: SupervisorState): void => {\n installGracefulShutdown({\n onSignal: (signal) => shutdownOnSignal(state, signal),\n onForce: () => didForceKillChild(state.child),\n forceKillAfterMs: FORCE_KILL_TIMEOUT_MS,\n exitCode: (signal, graceful) => state.capturedChildExit ?? (graceful ? 0 : exitCodeForSignal(signal)),\n });\n};\n\nconst runDevSupervisor = async (\n entryPath: string,\n cwd: string,\n watch?: DevWatch,\n fork: ForkRunner = defaultForkRunner,\n): Promise<never> => {\n const state: SupervisorState = {\n runnerPath: fileURLToPath(DEV_RUNNER_URL),\n entryPath,\n cwd,\n watch,\n watchers: [],\n fork,\n child: null,\n shuttingDown: false,\n restarting: false,\n capturedChildExit: undefined,\n };\n\n installConfigWatchers(state);\n installShutdown(state);\n launch(state);\n\n return new Promise<never>((): void => undefined);\n};\n\nexport { RESTART_EXIT_CODE, defaultForkRunner, runDevSupervisor, type SupervisedChild, type ForkRunner, type DevWatch };\n"]}
@@ -0,0 +1,21 @@
1
+ import type { InlineConfig, Plugin } from "vite";
2
+ type DevServerModule = object;
3
+ type DevServerChangedModule = DevServerModule & {
4
+ importers: Iterable<DevServerModule>;
5
+ ssrModule?: Record<string, unknown> | null;
6
+ };
7
+ type DevServerModuleGraph = {
8
+ getModuleById(id: string): DevServerChangedModule | undefined;
9
+ invalidateModule(module: DevServerModule): void;
10
+ };
11
+ type DevServer = {
12
+ close(): Promise<void>;
13
+ moduleGraph: DevServerModuleGraph;
14
+ ssrLoadModule(id: string): Promise<Record<string, unknown>>;
15
+ watcher: {
16
+ on(event: "change", listener: (changedPath: string) => void): void;
17
+ };
18
+ };
19
+ declare const createDevServerConfig: (root: string, plugins: Plugin[]) => InlineConfig;
20
+ export { createDevServerConfig, type DevServer };
21
+ //# sourceMappingURL=vite-dev-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-dev-server.d.ts","sourceRoot":"","sources":["../../src/dev/vite-dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEjD,KAAK,eAAe,GAAG,MAAM,CAAC;AAE9B,KAAK,sBAAsB,GAAG,eAAe,GAAG;IAC5C,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C,CAAC;AAEF,KAAK,oBAAoB,GAAG;IACxB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAAC;IAC9D,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CACnD,CAAC;AAEF,KAAK,SAAS,GAAG;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,EAAE,oBAAoB,CAAC;IAClC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE;QACL,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;KACtE,CAAC;CACL,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,KAAG,YAU/D,CAAC;AAEH,OAAO,EAAE,qBAAqB,EAAE,KAAK,SAAS,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ const createDevServerConfig = (root, plugins) => ({
2
+ root,
3
+ appType: "custom",
4
+ plugins,
5
+ server: { middlewareMode: true },
6
+ optimizeDeps: { noDiscovery: true, include: [] },
7
+ ssr: {
8
+ external: true,
9
+ noExternal: [/^@gtkx\/(?!(?:native|gi|gl|runtime|utils|css)(?:\/|$))/, /[/\\]\.gtkx[/\\]/],
10
+ },
11
+ });
12
+ export { createDevServerConfig };
13
+ //# sourceMappingURL=vite-dev-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-dev-server.js","sourceRoot":"","sources":["../../src/dev/vite-dev-server.ts"],"names":[],"mappings":"AAuBA,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,OAAiB,EAAgB,EAAE,CAAC,CAAC;IAC9E,IAAI;IACJ,OAAO,EAAE,QAAQ;IACjB,OAAO;IACP,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;IAChC,YAAY,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;IAChD,GAAG,EAAE;QACD,QAAQ,EAAE,IAAI;QACd,UAAU,EAAE,CAAC,wDAAwD,EAAE,kBAAkB,CAAC;KAC7F;CACJ,CAAC,CAAC;AAEH,OAAO,EAAE,qBAAqB,EAAkB,CAAC","sourcesContent":["import type { InlineConfig, Plugin } from \"vite\";\n\ntype DevServerModule = object;\n\ntype DevServerChangedModule = DevServerModule & {\n importers: Iterable<DevServerModule>;\n ssrModule?: Record<string, unknown> | null;\n};\n\ntype DevServerModuleGraph = {\n getModuleById(id: string): DevServerChangedModule | undefined;\n invalidateModule(module: DevServerModule): void;\n};\n\ntype DevServer = {\n close(): Promise<void>;\n moduleGraph: DevServerModuleGraph;\n ssrLoadModule(id: string): Promise<Record<string, unknown>>;\n watcher: {\n on(event: \"change\", listener: (changedPath: string) => void): void;\n };\n};\n\nconst createDevServerConfig = (root: string, plugins: Plugin[]): InlineConfig => ({\n root,\n appType: \"custom\",\n plugins,\n server: { middlewareMode: true },\n optimizeDeps: { noDiscovery: true, include: [] },\n ssr: {\n external: true,\n noExternal: [/^@gtkx\\/(?!(?:native|gi|gl|runtime|utils|css)(?:\\/|$))/, /[/\\\\]\\.gtkx[/\\\\]/],\n },\n});\n\nexport { createDevServerConfig, type DevServer };\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Rollup } from "vite";
2
+ declare const prependBanner: (options: Rollup.OutputOptions, banner: string) => Rollup.OutputOptions;
3
+ export { prependBanner };
4
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/internal/banner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,QAAA,MAAM,aAAa,GAAI,SAAS,MAAM,CAAC,aAAa,EAAE,QAAQ,MAAM,KAAG,MAAM,CAAC,aAQ7E,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ const prependBanner = (options, banner) => {
2
+ const existing = options.banner;
3
+ if (typeof existing === "function") {
4
+ return { ...options, banner: async (chunk) => `${banner}\n${await existing(chunk)}` };
5
+ }
6
+ return { ...options, banner: existing ? `${banner}\n${existing}` : banner };
7
+ };
8
+ export { prependBanner };
9
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/internal/banner.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAE,MAAc,EAAwB,EAAE;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IAC1F,CAAC;IAED,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAChF,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type { Rollup } from \"vite\";\n\nconst prependBanner = (options: Rollup.OutputOptions, banner: string): Rollup.OutputOptions => {\n const existing = options.banner;\n\n if (typeof existing === \"function\") {\n return { ...options, banner: async (chunk) => `${banner}\\n${await existing(chunk)}` };\n }\n\n return { ...options, banner: existing ? `${banner}\\n${existing}` : banner };\n};\n\nexport { prependBanner };\n"]}
@@ -0,0 +1,4 @@
1
+ declare const DATA_IMPORT_PREFIX = "#data";
2
+ declare const resolveDataDir: (root: string) => string | null;
3
+ export { DATA_IMPORT_PREFIX, resolveDataDir };
4
+ //# sourceMappingURL=data-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-dir.d.ts","sourceRoot":"","sources":["../../src/internal/data-dir.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,kBAAkB,UAAU,CAAC;AAsCnC,QAAA,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IA0B/C,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const DATA_IMPORT_PREFIX = "#data";
4
+ const DATA_IMPORT_KEY = `${DATA_IMPORT_PREFIX}/*`;
5
+ const CONDITION_PRIORITY = ["default", "import", "node"];
6
+ const DATA_TARGET_PATTERN = /^\.?\/?(.+?)\/\*$/;
7
+ const isConditionMap = (entry) => entry !== null && typeof entry === "object" && !Array.isArray(entry);
8
+ const conditionTarget = (conditions) => {
9
+ for (const condition of CONDITION_PRIORITY) {
10
+ const value = conditions[condition];
11
+ if (typeof value === "string") {
12
+ return value;
13
+ }
14
+ }
15
+ return null;
16
+ };
17
+ const targetString = (entry) => {
18
+ if (typeof entry === "string") {
19
+ return entry;
20
+ }
21
+ if (isConditionMap(entry)) {
22
+ return conditionTarget(entry);
23
+ }
24
+ return null;
25
+ };
26
+ const directoryFromTarget = (target) => {
27
+ const match = DATA_TARGET_PATTERN.exec(target);
28
+ return match?.[1] ?? null;
29
+ };
30
+ const resolveDataDir = (root) => {
31
+ let manifest;
32
+ try {
33
+ manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ if (!isConditionMap(manifest)) {
39
+ return null;
40
+ }
41
+ const imports = manifest.imports;
42
+ if (!isConditionMap(imports)) {
43
+ return null;
44
+ }
45
+ const target = targetString(imports[DATA_IMPORT_KEY]);
46
+ if (target === null) {
47
+ return null;
48
+ }
49
+ return directoryFromTarget(target);
50
+ };
51
+ export { DATA_IMPORT_PREFIX, resolveDataDir };
52
+ //# sourceMappingURL=data-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-dir.js","sourceRoot":"","sources":["../../src/internal/data-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACnC,MAAM,eAAe,GAAG,GAAG,kBAAkB,IAAI,CAAC;AAClD,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAClE,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEhD,MAAM,cAAc,GAAG,CAAC,KAAc,EAAoC,EAAE,CACxE,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEzE,MAAM,eAAe,GAAG,CAAC,UAAmC,EAAiB,EAAE;IAC3E,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAiB,EAAE;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAiB,EAAE;IAC1D,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAiB,EAAE;IACnD,IAAI,QAAiB,CAAC;IAEtB,IAAI,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAEjC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst DATA_IMPORT_PREFIX = \"#data\";\nconst DATA_IMPORT_KEY = `${DATA_IMPORT_PREFIX}/*`;\nconst CONDITION_PRIORITY = [\"default\", \"import\", \"node\"] as const;\nconst DATA_TARGET_PATTERN = /^\\.?\\/?(.+?)\\/\\*$/;\n\nconst isConditionMap = (entry: unknown): entry is Record<string, unknown> =>\n entry !== null && typeof entry === \"object\" && !Array.isArray(entry);\n\nconst conditionTarget = (conditions: Record<string, unknown>): string | null => {\n for (const condition of CONDITION_PRIORITY) {\n const value = conditions[condition];\n\n if (typeof value === \"string\") {\n return value;\n }\n }\n\n return null;\n};\n\nconst targetString = (entry: unknown): string | null => {\n if (typeof entry === \"string\") {\n return entry;\n }\n\n if (isConditionMap(entry)) {\n return conditionTarget(entry);\n }\n\n return null;\n};\n\nconst directoryFromTarget = (target: string): string | null => {\n const match = DATA_TARGET_PATTERN.exec(target);\n\n return match?.[1] ?? null;\n};\n\nconst resolveDataDir = (root: string): string | null => {\n let manifest: unknown;\n\n try {\n manifest = JSON.parse(readFileSync(join(root, \"package.json\"), \"utf8\"));\n } catch {\n return null;\n }\n\n if (!isConditionMap(manifest)) {\n return null;\n }\n\n const imports = manifest.imports;\n\n if (!isConditionMap(imports)) {\n return null;\n }\n\n const target = targetString(imports[DATA_IMPORT_KEY]);\n\n if (target === null) {\n return null;\n }\n\n return directoryFromTarget(target);\n};\n\nexport { DATA_IMPORT_PREFIX, resolveDataDir };\n"]}
@@ -0,0 +1,20 @@
1
+ import type { PositionalArgDef, StringArgDef } from "citty";
2
+ declare const cwdArg: {
3
+ cwd: StringArgDef;
4
+ };
5
+ declare const entryArg: {
6
+ entry: PositionalArgDef;
7
+ cwd: StringArgDef;
8
+ };
9
+ declare const resolveCwd: (args: {
10
+ cwd?: string;
11
+ }) => string;
12
+ declare const resolveEntry: (args: {
13
+ entry?: string;
14
+ cwd?: string;
15
+ }) => {
16
+ cwd: string;
17
+ entry: string;
18
+ };
19
+ export { cwdArg, entryArg, resolveCwd, resolveEntry };
20
+ //# sourceMappingURL=entry-arg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-arg.d.ts","sourceRoot":"","sources":["../../src/internal/entry-arg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAS5D,QAAA,MAAM,MAAM,EAAE;IAAE,GAAG,EAAE,YAAY,CAAA;CAKhC,CAAC;AAEF,QAAA,MAAM,QAAQ,EAAE;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAO3D,CAAC;AAEF,QAAA,MAAM,UAAU,GAAI,MAAM;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,MAAwD,CAAC;AActG,QAAA,MAAM,YAAY,GAAI,MAAM;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAI1F,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ const DEFAULT_ENTRY_BASE = "src/index";
4
+ const DEFAULT_ENTRY_EXTENSION = ".tsx";
5
+ const DEFAULT_ENTRY_EXTENSIONS = [DEFAULT_ENTRY_EXTENSION, ".jsx", ".ts", ".js"];
6
+ const DEFAULT_ENTRY = `${DEFAULT_ENTRY_BASE}{${DEFAULT_ENTRY_EXTENSIONS.join(",")}}`;
7
+ const cwdArg = {
8
+ cwd: {
9
+ type: "string",
10
+ description: "Project root (default: current working directory)",
11
+ },
12
+ };
13
+ const entryArg = {
14
+ entry: {
15
+ type: "positional",
16
+ description: `Entry file (default: ${DEFAULT_ENTRY})`,
17
+ required: false,
18
+ },
19
+ ...cwdArg,
20
+ };
21
+ const resolveCwd = (args) => (args.cwd ? resolve(args.cwd) : process.cwd());
22
+ const resolveDefaultEntry = (cwd) => {
23
+ for (const extension of DEFAULT_ENTRY_EXTENSIONS) {
24
+ const candidate = resolve(cwd, `${DEFAULT_ENTRY_BASE}${extension}`);
25
+ if (existsSync(candidate)) {
26
+ return candidate;
27
+ }
28
+ }
29
+ return resolve(cwd, `${DEFAULT_ENTRY_BASE}${DEFAULT_ENTRY_EXTENSION}`);
30
+ };
31
+ const resolveEntry = (args) => {
32
+ const cwd = resolveCwd(args);
33
+ return { cwd, entry: args.entry ? resolve(cwd, args.entry) : resolveDefaultEntry(cwd) };
34
+ };
35
+ export { cwdArg, entryArg, resolveCwd, resolveEntry };
36
+ //# sourceMappingURL=entry-arg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-arg.js","sourceRoot":"","sources":["../../src/internal/entry-arg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AACvC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,wBAAwB,GAAG,CAAC,uBAAuB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACjF,MAAM,aAAa,GAAG,GAAG,kBAAkB,IAAI,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAErF,MAAM,MAAM,GAA0B;IAClC,GAAG,EAAE;QACD,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mDAAmD;KACnE;CACJ,CAAC;AAEF,MAAM,QAAQ,GAAmD;IAC7D,KAAK,EAAE;QACH,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,wBAAwB,aAAa,GAAG;QACrD,QAAQ,EAAE,KAAK;KAClB;IACD,GAAG,MAAM;CACZ,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAsB,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEtG,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAU,EAAE;IAChD,KAAK,MAAM,SAAS,IAAI,wBAAwB,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,kBAAkB,GAAG,SAAS,EAAE,CAAC,CAAC;QAEpE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,kBAAkB,GAAG,uBAAuB,EAAE,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAsC,EAAkC,EAAE;IAC5F,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { PositionalArgDef, StringArgDef } from \"citty\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nconst DEFAULT_ENTRY_BASE = \"src/index\";\nconst DEFAULT_ENTRY_EXTENSION = \".tsx\";\nconst DEFAULT_ENTRY_EXTENSIONS = [DEFAULT_ENTRY_EXTENSION, \".jsx\", \".ts\", \".js\"];\nconst DEFAULT_ENTRY = `${DEFAULT_ENTRY_BASE}{${DEFAULT_ENTRY_EXTENSIONS.join(\",\")}}`;\n\nconst cwdArg: { cwd: StringArgDef } = {\n cwd: {\n type: \"string\",\n description: \"Project root (default: current working directory)\",\n },\n};\n\nconst entryArg: { entry: PositionalArgDef; cwd: StringArgDef } = {\n entry: {\n type: \"positional\",\n description: `Entry file (default: ${DEFAULT_ENTRY})`,\n required: false,\n },\n ...cwdArg,\n};\n\nconst resolveCwd = (args: { cwd?: string }): string => (args.cwd ? resolve(args.cwd) : process.cwd());\n\nconst resolveDefaultEntry = (cwd: string): string => {\n for (const extension of DEFAULT_ENTRY_EXTENSIONS) {\n const candidate = resolve(cwd, `${DEFAULT_ENTRY_BASE}${extension}`);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return resolve(cwd, `${DEFAULT_ENTRY_BASE}${DEFAULT_ENTRY_EXTENSION}`);\n};\n\nconst resolveEntry = (args: { entry?: string; cwd?: string }): { cwd: string; entry: string } => {\n const cwd = resolveCwd(args);\n\n return { cwd, entry: args.entry ? resolve(cwd, args.entry) : resolveDefaultEntry(cwd) };\n};\n\nexport { cwdArg, entryArg, resolveCwd, resolveEntry };\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ArgsDef, CommandDef } from "citty";
2
+ declare const printError: (cause: unknown) => never;
3
+ declare const withErrorBoundary: <T extends ArgsDef>(command: CommandDef<T>) => CommandDef<T>;
4
+ export { printError, withErrorBoundary };
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAKjD,QAAA,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KASpC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,CAAC,SAAS,OAAO,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,CAiBlF,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { logger } from "@gtkx/utils";
2
+ const ERROR_EXIT_CODE = 1;
3
+ const printError = (cause) => {
4
+ const message = cause instanceof Error ? cause.message : String(cause);
5
+ logger.error(message);
6
+ if (cause instanceof Error && cause.stack !== undefined) {
7
+ logger.debug(cause.stack);
8
+ }
9
+ process.exit(ERROR_EXIT_CODE);
10
+ };
11
+ const withErrorBoundary = (command) => {
12
+ const run = command.run;
13
+ if (run === undefined) {
14
+ return command;
15
+ }
16
+ return {
17
+ ...command,
18
+ run: async (context) => {
19
+ try {
20
+ return await run(context);
21
+ }
22
+ catch (error) {
23
+ return printError(error);
24
+ }
25
+ },
26
+ };
27
+ };
28
+ export { printError, withErrorBoundary };
29
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,UAAU,GAAG,CAAC,KAAc,EAAS,EAAE;IACzC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtB,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAoB,OAAsB,EAAiB,EAAE;IACnF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAExB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,OAAO;QACH,GAAG,OAAO;QACV,GAAG,EAAE,KAAK,EAAE,OAAO,EAAoB,EAAE;YACrC,IAAI,CAAC;gBACD,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import type { ArgsDef, CommandDef } from \"citty\";\nimport { logger } from \"@gtkx/utils\";\n\nconst ERROR_EXIT_CODE = 1;\n\nconst printError = (cause: unknown): never => {\n const message = cause instanceof Error ? cause.message : String(cause);\n logger.error(message);\n\n if (cause instanceof Error && cause.stack !== undefined) {\n logger.debug(cause.stack);\n }\n\n process.exit(ERROR_EXIT_CODE);\n};\n\nconst withErrorBoundary = <T extends ArgsDef>(command: CommandDef<T>): CommandDef<T> => {\n const run = command.run;\n\n if (run === undefined) {\n return command;\n }\n\n return {\n ...command,\n run: async (context): Promise<unknown> => {\n try {\n return await run(context);\n } catch (error) {\n return printError(error);\n }\n },\n };\n};\n\nexport { printError, withErrorBoundary };\n"]}
@@ -0,0 +1,7 @@
1
+ type ListedFile = {
2
+ absPath: string;
3
+ rel: string;
4
+ };
5
+ declare const listFilesRecursive: (dir: string, shouldInclude?: (name: string) => boolean) => ListedFile[];
6
+ export { listFilesRecursive, type ListedFile };
7
+ //# sourceMappingURL=list-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.d.ts","sourceRoot":"","sources":["../../src/internal/list-files.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,GAAG;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,KAAK,MAAM,EAAE,gBAAgB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,KAAG,UAAU,EAY9F,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAU,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { join, relative } from "node:path";
3
+ const listFilesRecursive = (dir, shouldInclude) => {
4
+ if (!existsSync(dir)) {
5
+ return [];
6
+ }
7
+ return readdirSync(dir, { recursive: true, withFileTypes: true })
8
+ .filter((entry) => entry.isFile() && (shouldInclude === undefined || shouldInclude(entry.name)))
9
+ .map((entry) => {
10
+ const absPath = join(entry.parentPath, entry.name);
11
+ return { absPath, rel: relative(dir, absPath) };
12
+ });
13
+ };
14
+ export { listFilesRecursive };
15
+ //# sourceMappingURL=list-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-files.js","sourceRoot":"","sources":["../../src/internal/list-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAO3C,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,aAAyC,EAAgB,EAAE;IAChG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC5D,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;SAC/F,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAmB,CAAC","sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\ntype ListedFile = {\n absPath: string;\n rel: string;\n};\n\nconst listFilesRecursive = (dir: string, shouldInclude?: (name: string) => boolean): ListedFile[] => {\n if (!existsSync(dir)) {\n return [];\n }\n\n return readdirSync(dir, { recursive: true, withFileTypes: true })\n .filter((entry) => entry.isFile() && (shouldInclude === undefined || shouldInclude(entry.name)))\n .map((entry) => {\n const absPath = join(entry.parentPath, entry.name);\n\n return { absPath, rel: relative(dir, absPath) };\n });\n};\n\nexport { listFilesRecursive, type ListedFile };\n"]}
@@ -0,0 +1,3 @@
1
+ declare const resolveCliTool: (executable: string) => string;
2
+ export { resolveCliTool };
3
+ //# sourceMappingURL=resolve-cli-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-cli-tool.d.ts","sourceRoot":"","sources":["../../src/internal/resolve-cli-tool.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,cAAc,eAGI,MAAM,KAAG,MAY7B,CAAC;AAkBL,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { delimiter, join } from "node:path";
3
+ const resolveCliTool = (() => {
4
+ const cache = new Map();
5
+ return (executable) => {
6
+ const cached = cache.get(executable);
7
+ if (cached) {
8
+ return cached;
9
+ }
10
+ const resolved = findInPath(executable);
11
+ cache.set(executable, resolved);
12
+ return resolved;
13
+ };
14
+ })();
15
+ const isExecutableFile = (candidate) => existsSync(candidate) && statSync(candidate).isFile();
16
+ const findInPath = (executable) => {
17
+ const dirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
18
+ for (const dir of dirs) {
19
+ const candidate = join(dir, executable);
20
+ if (isExecutableFile(candidate)) {
21
+ return candidate;
22
+ }
23
+ }
24
+ throw new Error(`${executable} not found in PATH`);
25
+ };
26
+ export { resolveCliTool };
27
+ //# sourceMappingURL=resolve-cli-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-cli-tool.js","sourceRoot":"","sources":["../../src/internal/resolve-cli-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;IACzB,MAAM,KAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE7C,OAAO,CAAC,UAAkB,EAAU,EAAE;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErC,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACxC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEhC,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC;AACN,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;AAE/G,MAAM,UAAU,GAAG,CAAC,UAAkB,EAAU,EAAE;IAC9C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAExC,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,oBAAoB,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { existsSync, statSync } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\n\nconst resolveCliTool = (() => {\n const cache: Map<string, string> = new Map();\n\n return (executable: string): string => {\n const cached = cache.get(executable);\n\n if (cached) {\n return cached;\n }\n\n const resolved = findInPath(executable);\n cache.set(executable, resolved);\n\n return resolved;\n };\n})();\n\nconst isExecutableFile = (candidate: string): boolean => existsSync(candidate) && statSync(candidate).isFile();\n\nconst findInPath = (executable: string): string => {\n const dirs = (process.env.PATH ?? \"\").split(delimiter).filter(Boolean);\n\n for (const dir of dirs) {\n const candidate = join(dir, executable);\n\n if (isExecutableFile(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`${executable} not found in PATH`);\n};\n\nexport { resolveCliTool };\n"]}
@@ -0,0 +1,4 @@
1
+ declare const removeTempDir: (dir: string) => void;
2
+ declare const withStagingDir: <T>(prefix: string, produce: (dir: string) => T) => T;
3
+ export { removeTempDir, withStagingDir };
4
+ //# sourceMappingURL=staging-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staging-dir.d.ts","sourceRoot":"","sources":["../../src/internal/staging-dir.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,IAEpC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,CAAC,EAAE,QAAQ,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,KAAG,CAQxE,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { mkdtempSync, rmSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ const removeTempDir = (dir) => {
5
+ rmSync(dir, { recursive: true, force: true, maxRetries: 5 });
6
+ };
7
+ const withStagingDir = (prefix, produce) => {
8
+ const dir = mkdtempSync(join(tmpdir(), `gtkx-${prefix}-`));
9
+ try {
10
+ return produce(dir);
11
+ }
12
+ finally {
13
+ removeTempDir(dir);
14
+ }
15
+ };
16
+ export { removeTempDir, withStagingDir };
17
+ //# sourceMappingURL=staging-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staging-dir.js","sourceRoot":"","sources":["../../src/internal/staging-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAQ,EAAE;IACxC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAI,MAAc,EAAE,OAA2B,EAAK,EAAE;IACzE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,MAAM,GAAG,CAAC,CAAC,CAAC;IAE3D,IAAI,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;YAAS,CAAC;QACP,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { mkdtempSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst removeTempDir = (dir: string): void => {\n rmSync(dir, { recursive: true, force: true, maxRetries: 5 });\n};\n\nconst withStagingDir = <T>(prefix: string, produce: (dir: string) => T): T => {\n const dir = mkdtempSync(join(tmpdir(), `gtkx-${prefix}-`));\n\n try {\n return produce(dir);\n } finally {\n removeTempDir(dir);\n }\n};\n\nexport { removeTempDir, withStagingDir };\n"]}
@@ -0,0 +1,3 @@
1
+ declare const prependXdgDataDir: (dir: string, existing: string | undefined) => string;
2
+ export { prependXdgDataDir };
3
+ //# sourceMappingURL=xdg-data-dirs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg-data-dirs.d.ts","sourceRoot":"","sources":["../../src/internal/xdg-data-dirs.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAQtE,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ const XDG_DATA_DIRS_DEFAULT = "/usr/local/share:/usr/share";
2
+ const prependXdgDataDir = (dir, existing) => {
3
+ const base = existing === undefined || existing.length === 0 ? XDG_DATA_DIRS_DEFAULT : existing;
4
+ if (base.split(":").includes(dir)) {
5
+ return base;
6
+ }
7
+ return `${dir}:${base}`;
8
+ };
9
+ export { prependXdgDataDir };
10
+ //# sourceMappingURL=xdg-data-dirs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg-data-dirs.js","sourceRoot":"","sources":["../../src/internal/xdg-data-dirs.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG,6BAA6B,CAAC;AAE5D,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,QAA4B,EAAU,EAAE;IAC5E,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["const XDG_DATA_DIRS_DEFAULT = \"/usr/local/share:/usr/share\";\n\nconst prependXdgDataDir = (dir: string, existing: string | undefined): string => {\n const base = existing === undefined || existing.length === 0 ? XDG_DATA_DIRS_DEFAULT : existing;\n\n if (base.split(\":\").includes(dir)) {\n return base;\n }\n\n return `${dir}:${base}`;\n};\n\nexport { prependXdgDataDir };\n"]}