@gtkx/cli 1.0.0-rc.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +5 -5
  2. package/dist/builder.d.ts +1 -1
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js +2 -1
  5. package/dist/builder.js.map +1 -1
  6. package/dist/cli.js +4 -2
  7. package/dist/cli.js.map +1 -1
  8. package/dist/codegen/freshness.d.ts.map +1 -1
  9. package/dist/codegen/freshness.js +0 -2
  10. package/dist/codegen/freshness.js.map +1 -1
  11. package/dist/codegen/run-codegen.d.ts +1 -1
  12. package/dist/codegen/run-codegen.d.ts.map +1 -1
  13. package/dist/codegen/run-codegen.js +1 -0
  14. package/dist/codegen/run-codegen.js.map +1 -1
  15. package/dist/codegen/store-resolver.d.ts +1 -1
  16. package/dist/codegen/store-resolver.d.ts.map +1 -1
  17. package/dist/codegen/store-resolver.js.map +1 -1
  18. package/dist/commands/dev.d.ts.map +1 -1
  19. package/dist/commands/dev.js +3 -1
  20. package/dist/commands/dev.js.map +1 -1
  21. package/dist/dev/entry-env.d.ts +3 -0
  22. package/dist/dev/entry-env.d.ts.map +1 -0
  23. package/dist/dev/entry-env.js +3 -0
  24. package/dist/dev/entry-env.js.map +1 -0
  25. package/dist/dev/runner-deps.d.ts.map +1 -1
  26. package/dist/dev/runner-deps.js +1 -0
  27. package/dist/dev/runner-deps.js.map +1 -1
  28. package/dist/dev/runner-main.d.ts.map +1 -1
  29. package/dist/dev/runner-main.js +3 -3
  30. package/dist/dev/runner-main.js.map +1 -1
  31. package/dist/dev/runner.d.ts +1 -0
  32. package/dist/dev/runner.d.ts.map +1 -1
  33. package/dist/dev/runner.js +22 -12
  34. package/dist/dev/runner.js.map +1 -1
  35. package/dist/dev/supervisor.d.ts +10 -3
  36. package/dist/dev/supervisor.d.ts.map +1 -1
  37. package/dist/dev/supervisor.js +23 -4
  38. package/dist/dev/supervisor.js.map +1 -1
  39. package/dist/internal/application-args.d.ts +6 -0
  40. package/dist/internal/application-args.d.ts.map +1 -0
  41. package/dist/internal/application-args.js +10 -0
  42. package/dist/internal/application-args.js.map +1 -0
  43. package/dist/internal/errors.d.ts +1 -2
  44. package/dist/internal/errors.d.ts.map +1 -1
  45. package/dist/internal/errors.js +1 -1
  46. package/dist/internal/errors.js.map +1 -1
  47. package/dist/internal/run-cli-tool.d.ts +10 -0
  48. package/dist/internal/run-cli-tool.d.ts.map +1 -0
  49. package/dist/internal/run-cli-tool.js +15 -0
  50. package/dist/internal/run-cli-tool.js.map +1 -0
  51. package/dist/internal.d.ts +3 -0
  52. package/dist/internal.d.ts.map +1 -0
  53. package/dist/internal.js +3 -0
  54. package/dist/internal.js.map +1 -0
  55. package/dist/mcp/client.d.ts +1 -1
  56. package/dist/mcp/client.d.ts.map +1 -1
  57. package/dist/mcp/client.js.map +1 -1
  58. package/dist/mcp/handlers.d.ts +1 -1
  59. package/dist/mcp/handlers.d.ts.map +1 -1
  60. package/dist/mcp/handlers.js +78 -41
  61. package/dist/mcp/handlers.js.map +1 -1
  62. package/dist/mcp/index.d.ts.map +1 -1
  63. package/dist/mcp/index.js +1 -0
  64. package/dist/mcp/index.js.map +1 -1
  65. package/dist/mcp/serialize-widget.d.ts +2 -2
  66. package/dist/mcp/serialize-widget.d.ts.map +1 -1
  67. package/dist/mcp/serialize-widget.js +47 -17
  68. package/dist/mcp/serialize-widget.js.map +1 -1
  69. package/dist/mcp/widget-properties.d.ts +6 -0
  70. package/dist/mcp/widget-properties.d.ts.map +1 -0
  71. package/dist/mcp/widget-properties.js +102 -0
  72. package/dist/mcp/widget-properties.js.map +1 -0
  73. package/dist/settings/compile.d.ts.map +1 -1
  74. package/dist/settings/compile.js +8 -12
  75. package/dist/settings/compile.js.map +1 -1
  76. package/dist/vite-plugins/asset-emitter.d.ts +9 -0
  77. package/dist/vite-plugins/asset-emitter.d.ts.map +1 -0
  78. package/dist/vite-plugins/asset-emitter.js +2 -0
  79. package/dist/vite-plugins/asset-emitter.js.map +1 -0
  80. package/dist/vite-plugins/asset-extensions.d.ts +1 -2
  81. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  82. package/dist/vite-plugins/asset-extensions.js +1 -1
  83. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  84. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  85. package/dist/vite-plugins/built-url.js +14 -10
  86. package/dist/vite-plugins/built-url.js.map +1 -1
  87. package/dist/vite-plugins/ensure-store.d.ts +4 -0
  88. package/dist/vite-plugins/ensure-store.d.ts.map +1 -0
  89. package/dist/vite-plugins/ensure-store.js +10 -0
  90. package/dist/vite-plugins/ensure-store.js.map +1 -0
  91. package/dist/vite-plugins/icons.d.ts.map +1 -1
  92. package/dist/vite-plugins/icons.js.map +1 -1
  93. package/dist/vite-plugins/react-compiler.d.ts +1 -1
  94. package/dist/vite-plugins/react-compiler.d.ts.map +1 -1
  95. package/dist/vite-plugins/react-compiler.js.map +1 -1
  96. package/dist/vite-plugins/resources.d.ts +1 -1
  97. package/dist/vite-plugins/resources.d.ts.map +1 -1
  98. package/dist/vite-plugins/resources.js +6 -15
  99. package/dist/vite-plugins/resources.js.map +1 -1
  100. package/dist/vite-plugins/settings.js.map +1 -1
  101. package/dist/vite-plugins/undeclared-library.d.ts +1 -1
  102. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  103. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  104. package/dist/vite-plugins/worker.d.ts +4 -0
  105. package/dist/vite-plugins/worker.d.ts.map +1 -0
  106. package/dist/vite-plugins/worker.js +136 -0
  107. package/dist/vite-plugins/worker.js.map +1 -0
  108. package/dist/vitest-plugin.d.ts +7 -0
  109. package/dist/vitest-plugin.d.ts.map +1 -1
  110. package/dist/vitest-plugin.js +14 -1
  111. package/dist/vitest-plugin.js.map +1 -1
  112. package/package.json +16 -12
  113. package/src/builder.ts +3 -2
  114. package/src/cli.ts +4 -2
  115. package/src/codegen/freshness.ts +0 -2
  116. package/src/codegen/run-codegen.ts +1 -1
  117. package/src/codegen/store-resolver.ts +1 -1
  118. package/src/commands/dev.ts +3 -1
  119. package/src/dev/entry-env.ts +3 -0
  120. package/src/dev/runner-deps.ts +1 -0
  121. package/src/dev/runner-main.ts +3 -4
  122. package/src/dev/runner.ts +44 -13
  123. package/src/dev/supervisor.ts +54 -11
  124. package/src/internal/application-args.ts +13 -0
  125. package/src/internal/errors.ts +1 -1
  126. package/src/internal/run-cli-tool.ts +22 -0
  127. package/src/internal.ts +2 -0
  128. package/src/mcp/client.ts +1 -1
  129. package/src/mcp/handlers.ts +123 -56
  130. package/src/mcp/index.ts +1 -0
  131. package/src/mcp/serialize-widget.ts +71 -21
  132. package/src/mcp/widget-properties.ts +153 -0
  133. package/src/settings/compile.ts +8 -11
  134. package/src/vite-plugins/asset-emitter.ts +5 -0
  135. package/src/vite-plugins/asset-extensions.ts +1 -1
  136. package/src/vite-plugins/built-url.ts +19 -13
  137. package/src/vite-plugins/ensure-store.ts +14 -0
  138. package/src/vite-plugins/icons.ts +2 -5
  139. package/src/vite-plugins/react-compiler.ts +2 -1
  140. package/src/vite-plugins/resources.ts +10 -19
  141. package/src/vite-plugins/settings.ts +2 -2
  142. package/src/vite-plugins/undeclared-library.ts +1 -1
  143. package/src/vite-plugins/worker.ts +235 -0
  144. package/src/vitest-plugin.ts +15 -1
  145. package/dist/internal/resolve-cli-tool.d.ts +0 -3
  146. package/dist/internal/resolve-cli-tool.d.ts.map +0 -1
  147. package/dist/internal/resolve-cli-tool.js +0 -27
  148. package/dist/internal/resolve-cli-tool.js.map +0 -1
  149. package/src/internal/resolve-cli-tool.ts +0 -37
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/mcp/handlers.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport {\n invalidRequestError,\n methodNotFoundError,\n type ParamsSchema,\n type ServerInitiatedMethod,\n type ServerRequestParams,\n ServerRequestParamsSchemas,\n widgetNotFoundError,\n} from \"@gtkx/mcp/internal\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { WidgetRegistry } from \"./widget-registry.js\";\nimport { serializeWidget } from \"./serialize-widget.js\";\nimport { loadTestingModule, type TestingModule } from \"./testing-loader.js\";\n\ntype HandlerContext = {\n app: Gtk.Application;\n registry: WidgetRegistry;\n};\n\ntype ValidatedHandler = (ctx: HandlerContext, params: unknown) => Promise<unknown>;\ntype WidgetTarget = { testing: TestingModule; widget: Gtk.Widget };\n\nconst HANDLERS: Record<ServerInitiatedMethod, ValidatedHandler> = {\n \"app.getWindows\": validated(ServerRequestParamsSchemas[\"app.getWindows\"], ({ registry }) =>\n Promise.resolve({\n windows: registry.toplevels().map((window) => ({\n id: registry.getOrCreateId(window),\n title: window.getTitle(),\n })),\n })),\n \"widget.getTree\": validated(ServerRequestParamsSchemas[\"widget.getTree\"], async ({ app, registry }, params) => {\n const testing = await loadTestingModule();\n const container = params.rootId === undefined ? app : requireWidget(registry, params.rootId);\n\n return {\n tree: testing.prettyWidget(container, {\n getId: (w) => registry.getOrCreateId(w),\n shouldHighlight: false,\n ...((params.maxDepth !== undefined) && { maxDepth: params.maxDepth }),\n }),\n };\n }),\n \"widget.query\": validated(ServerRequestParamsSchemas[\"widget.query\"], handleQuery),\n \"widget.getProps\": validated(ServerRequestParamsSchemas[\"widget.getProps\"], async ({ registry }, params) => {\n const { testing, widget } = await widgetTarget(registry, params.widgetId);\n\n return serializeWidget(widget, (target) => registry.getOrCreateId(target), testing);\n }),\n \"widget.click\": validated(ServerRequestParamsSchemas[\"widget.click\"], async ({ registry }, params) => {\n const { testing, widget } = await widgetTarget(registry, params.widgetId);\n await testing.userEvent.click(widget);\n\n return { success: true };\n }),\n \"widget.type\": validated(ServerRequestParamsSchemas[\"widget.type\"], async ({ registry }, params) => {\n const { testing, widget } = await widgetTarget(registry, params.widgetId);\n\n if (params.clear) {\n await testing.userEvent.clear(widget);\n }\n\n await testing.userEvent.type(widget, params.text);\n\n return { success: true };\n }),\n \"widget.fireEvent\": validated(ServerRequestParamsSchemas[\"widget.fireEvent\"], async ({ registry }, params) => {\n const { testing, widget } = await widgetTarget(registry, params.widgetId);\n const signalArgs = (params.args ?? []).map((arg) => extractSignalArg(arg));\n await testing.fireEvent(widget, params.signal, ...signalArgs);\n\n return { success: true };\n }),\n \"widget.screenshot\": validated(ServerRequestParamsSchemas[\"widget.screenshot\"], handleScreenshot),\n};\n\nfunction validated<Params>(\n schema: ParamsSchema<Params>,\n handler: (ctx: HandlerContext, params: Params) => Promise<unknown>,\n): ValidatedHandler {\n return (ctx, params) => {\n const parsed = schema.safeParse(params ?? {});\n\n if (!parsed.success) {\n throw invalidRequestError(parsed.error.message);\n }\n\n return handler(ctx, parsed.data);\n };\n}\n\nconst widgetTarget = async (registry: WidgetRegistry, widgetId: string | undefined): Promise<WidgetTarget> => ({\n testing: await loadTestingModule(),\n widget: requireWidget(registry, widgetId),\n});\n\nconst requireWidget = (registry: WidgetRegistry, widgetId: string | undefined): Gtk.Widget => {\n if (widgetId === undefined) {\n throw widgetNotFoundError(\"undefined\");\n }\n\n const widget = registry.get(widgetId);\n\n if (!widget) {\n throw widgetNotFoundError(widgetId);\n }\n\n return widget;\n};\n\nconst extractSignalArg = (arg: unknown): unknown => {\n const isTypedArg = typeof arg === \"object\" && arg !== null && \"type\" in arg && \"value\" in arg;\n\n return isTypedArg ? (arg as { value: unknown }).value : arg;\n};\n\nconst resolveRole = (value: string | number): Gtk.AccessibleRole | undefined => {\n if (typeof value === \"number\") {\n return value;\n }\n\n const resolved = Gtk.AccessibleRole[value.toUpperCase() as keyof typeof Gtk.AccessibleRole];\n\n return typeof resolved === \"number\" ? resolved : undefined;\n};\n\nconst matchesOrEmpty = async (find: () => Promise<Gtk.Widget[]>): Promise<Gtk.Widget[]> => {\n try {\n return await find();\n } catch {\n return [];\n }\n};\n\nasync function handleQuery(\n { app, registry }: HandlerContext,\n params: ServerRequestParams<\"widget.query\">,\n): Promise<unknown> {\n const testing = await loadTestingModule();\n let widgets: Gtk.Widget[] = [];\n\n switch (params.by) {\n case \"role\": {\n const roleValue = resolveRole(params.value);\n\n if (roleValue === undefined) {\n throw invalidRequestError(\n `Unknown accessible role \"${String(params.value)}\"; use the lowercase role shown in the ` +\n \"widget tree, e.g. \\\"button\\\", \\\"list\\\", \\\"list_item\\\", or \\\"checkbox\\\".\",\n );\n }\n\n widgets = await matchesOrEmpty(() => testing.findAllByRole(app, roleValue, params.options));\n break;\n }\n case \"text\": {\n widgets = await matchesOrEmpty(() => testing.findAllByText(app, String(params.value), params.options));\n break;\n }\n case \"name\": {\n widgets = await matchesOrEmpty(() => testing.findAllByName(app, String(params.value), params.options));\n break;\n }\n case \"labelText\": {\n widgets = await matchesOrEmpty(() => testing.findAllByLabelText(app, String(params.value), params.options));\n break;\n }\n }\n\n return { widgets: widgets.map((w) => serializeWidget(w, (widget) => registry.getOrCreateId(widget), testing, 0)) };\n}\n\nconst defaultScreenshotTarget = (registry: WidgetRegistry): Gtk.Widget => {\n const [toplevel] = registry.toplevels();\n\n if (!toplevel) {\n throw new Error(\"No windows available for screenshot\");\n }\n\n return toplevel;\n};\n\nasync function handleScreenshot(\n { registry }: HandlerContext,\n params: ServerRequestParams<\"widget.screenshot\">,\n): Promise<unknown> {\n const testing = await loadTestingModule();\n const target = params.windowId ? requireWidget(registry, params.windowId) : defaultScreenshotTarget(registry);\n const result = await testing.screenshot(target);\n\n if (params.path) {\n mkdirSync(dirname(params.path), { recursive: true });\n writeFileSync(params.path, Buffer.from(result.data, \"base64\"));\n\n return { data: result.data, mimeType: result.mimeType, savedPath: params.path };\n }\n\n return { data: result.data, mimeType: result.mimeType };\n}\n\nconst isServerInitiatedMethod = (method: string): method is ServerInitiatedMethod =>\n Object.hasOwn(ServerRequestParamsSchemas, method);\n\nconst dispatch = async (method: string, params: unknown, ctx: HandlerContext): Promise<unknown> => {\n if (!isServerInitiatedMethod(method)) {\n throw methodNotFoundError(method);\n }\n\n return HANDLERS[method](ctx, params);\n};\n\nexport { dispatch, type HandlerContext };\n"]}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/mcp/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EAInB,0BAA0B,EAC1B,mBAAmB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAsB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAe9D,MAAM,QAAQ,GAAoD;IAC9D,gBAAgB,EAAE,SAAS,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CACvF,OAAO,CAAC,OAAO,CAAC;QACZ,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3C,EAAE,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;YAClC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;SAC3B,CAAC,CAAC;KACN,CAAC,CAAC;IACP,gBAAgB,EAAE,SAAS,CAAC,0BAA0B,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE;QAC1G,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7F,OAAO;YACH,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE;gBAClC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBACvC,eAAe,EAAE,KAAK;gBACtB,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;aACxE,CAAC;SACL,CAAC;IACN,CAAC,CAAC;IACF,cAAc,EAAE,SAAS,CAAC,0BAA0B,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC;IAClF,iBAAiB,EAAE,QAAQ,CACvB,0BAA0B,CAAC,iBAAiB,CAAC,EAC7C,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAC1C,OAAO,CAAC,OAAO,CAAC;QACZ,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI;YACnC,UAAU,EAAE,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC;SACxE,CAAC;QACF,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC;KACnG,CAAC,CACT;IACD,cAAc,EAAE,QAAQ,CAAC,0BAA0B,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACrG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;IACF,aAAa,EAAE,QAAQ,CAAC,0BAA0B,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE;QAC3G,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAElD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;IACF,kBAAkB,EAAE,QAAQ,CACxB,0BAA0B,CAAC,kBAAkB,CAAC,EAC9C,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC;QAE9D,OAAO;YACH,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU;YACV,QAAQ;YACR,WAAW;YACX,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC;SAC3C,CAAC;IACN,CAAC,CACJ;IACD,mBAAmB,EAAE,SAAS,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;CACpG,CAAC;AAEF,MAAM,aAAa,GAAiC;IAChD,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,iBAAiB;CAC/B,CAAC;AAEF,MAAM,WAAW,GAA4B;IACzC,IAAI,EAAE,oDAAoD;IAC1D,IAAI,EAAE,6BAA6B;IACnC,IAAI,EACA,wGAAwG;QACxG,iEAAiE;IACrE,SAAS,EAAE,iGAAiG;CAC/G,CAAC;AAEF,SAAS,SAAS,CACd,MAA4B,EAC5B,OAAkE;IAElE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CACb,MAA4B,EAC5B,OAAgC;IAEhC,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAC3C,OAAO,CAAC,GAAG,EAAE,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,QAAwB,EAAE,QAA4B,EAAyB,EAAE,CAAC,CAAC;IAC3G,OAAO,EAAE,MAAM,iBAAiB,EAAE;IAClC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAE,QAA4B,EAAc,EAAE;IACzF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,GAAY,EAAW,EAAE;IAC/C,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;IAE9F,OAAO,UAAU,CAAC,CAAC,CAAE,GAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AAChE,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,UAAmB,EAAE,QAAiB,EAAU,EAAE;IACpE,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CACH,2FAA2F;YAC3F,sFAAsF,CACzF,CAAC;IACN,CAAC;IAED,OAAO,CACH,gGAAgG;QAChG,6FAA6F;QAC7F,4CAA4C,CAC/C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAsB,EAAkC,EAAE;IAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,EAAqC,CAAC,CAAC;IAE5F,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,IAAiC,EAAyB,EAAE;IACtF,IAAI,CAAC;QACD,OAAO,MAAM,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,OAAsB,EAAE,GAAoB,EAAE,MAAmB;IACnF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,mBAAmB,CACrB,4BAA4B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC;YACzF,yEAAyE,CAC5E,CAAC;IACN,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB,EAAE,GAAoB,EAAE,MAAmB;IACnF,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsB,EAAE,GAAoB,EAAE,MAAmB;IACxF,OAAO,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,KAAK,UAAU,YAAY,CACvB,OAAsB,EACtB,GAAoB,EACpB,MAAmB;IAEnB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9B,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACtF,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;QACvC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;KACrC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,MAAmB,EAAU,EAAE,CACnD,uBAAuB,MAAM,CAAC,EAAE,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;IAC/G,6GAA6G;IAC7G,4DAA4D,CAAC;AAEjE,KAAK,UAAU,WAAW,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAkB,EAAE,MAAmB;IAC7E,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAU,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAEjF,OAAO;QACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAChF,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;KAChE,CAAC;AACN,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,QAAwB,EAAc,EAAE;IACrE,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;IAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,KAAK,UAAU,gBAAgB,CAC3B,EAAE,QAAQ,EAAkB,EAC5B,MAAgD;IAEhD,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC9G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACpF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAmC,EAAE,CAChF,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;AAEtD,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,MAAe,EAAE,GAAmB,EAAoB,EAAE;IAC9F,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport {\n invalidRequestError,\n methodNotFoundError,\n type ParamsSchema,\n type ServerInitiatedMethod,\n type ServerRequestParams,\n ServerRequestParamsSchemas,\n widgetNotFoundError,\n} from \"@gtkx/mcp/internal\";\nimport type { WidgetRegistry } from \"./widget-registry.js\";\nimport { serializeWidget } from \"./serialize-widget.js\";\nimport { loadTestingModule, type TestingModule } from \"./testing-loader.js\";\nimport { readWidgetProperties } from \"./widget-properties.js\";\n\ntype HandlerContext = {\n app: Gtk.Application;\n registry: WidgetRegistry;\n};\n\ntype ValidatedHandler = (ctx: HandlerContext, params: unknown) => Promise<unknown>;\ntype WidgetTarget = { testing: TestingModule; widget: Gtk.Widget };\ntype WidgetParams = { widgetId?: string | undefined };\ntype TargetedHandler<Params> = (ctx: HandlerContext, target: WidgetTarget, params: Params) => Promise<unknown>;\ntype QueryParams = ServerRequestParams<\"widget.query\">;\ntype QueryBy = QueryParams[\"by\"];\ntype QueryRunner = (testing: TestingModule, app: Gtk.Application, params: QueryParams) => Promise<Gtk.Widget[]>;\n\nconst HANDLERS: Record<ServerInitiatedMethod, ValidatedHandler> = {\n \"app.getWindows\": validated(ServerRequestParamsSchemas[\"app.getWindows\"], ({ registry }) =>\n Promise.resolve({\n windows: registry.toplevels().map((window) => ({\n id: registry.getOrCreateId(window),\n title: window.getTitle(),\n })),\n })),\n \"widget.getTree\": validated(ServerRequestParamsSchemas[\"widget.getTree\"], async ({ app, registry }, params) => {\n const testing = await loadTestingModule();\n const container = params.rootId === undefined ? app : requireWidget(registry, params.rootId);\n\n return {\n tree: testing.prettyWidget(container, {\n getId: (w) => registry.getOrCreateId(w),\n shouldHighlight: false,\n ...((params.maxDepth !== undefined) && { maxDepth: params.maxDepth }),\n }),\n };\n }),\n \"widget.query\": validated(ServerRequestParamsSchemas[\"widget.query\"], handleQuery),\n \"widget.getProps\": targeted(\n ServerRequestParamsSchemas[\"widget.getProps\"],\n ({ registry }, { testing, widget }, params) =>\n Promise.resolve({\n ...(params.properties !== undefined && {\n properties: readWidgetProperties(widget, params.properties, registry),\n }),\n ...serializeWidget(widget, (target) => registry.getOrCreateId(target), testing, params.maxDepth),\n }),\n ),\n \"widget.click\": targeted(ServerRequestParamsSchemas[\"widget.click\"], async (_ctx, { testing, widget }) => {\n await testing.userEvent.click(widget);\n\n return { success: true };\n }),\n \"widget.type\": targeted(ServerRequestParamsSchemas[\"widget.type\"], async (_ctx, { testing, widget }, params) => {\n if (params.clear) {\n await testing.userEvent.clear(widget);\n }\n\n await testing.userEvent.type(widget, params.text);\n\n return { success: true };\n }),\n \"widget.fireEvent\": targeted(\n ServerRequestParamsSchemas[\"widget.fireEvent\"],\n async (_ctx, { testing, widget }, params) => {\n const signalArgs = (params.args ?? []).map((arg) => extractSignalArg(arg));\n const isRealized = widget.getRealized();\n const isMapped = widget.getMapped();\n const isSensitive = widget.getSensitive();\n await testing.fireEvent(widget, params.signal, ...signalArgs);\n\n return {\n signal: params.signal,\n isRealized,\n isMapped,\n isSensitive,\n note: emissionNote(isRealized, isMapped),\n };\n },\n ),\n \"widget.screenshot\": validated(ServerRequestParamsSchemas[\"widget.screenshot\"], handleScreenshot),\n};\n\nconst QUERY_RUNNERS: Record<QueryBy, QueryRunner> = {\n role: runRoleQuery,\n text: runTextQuery,\n name: runNameQuery,\n labelText: runLabelTextQuery,\n};\n\nconst SEARCHED_BY: Record<QueryBy, string> = {\n role: \"the accessible role, narrowed by any options given\",\n text: \"the text the widget renders\",\n name:\n \"the widget name (gtk_widget_get_name, which reports the GType name such as \\\"GtkButton\\\" when no name \" +\n \"was set), the accessible label, and the text the widget renders\",\n labelText: \"the accessible label, the labelled-by relation, and the label whose mnemonic targets the widget\",\n};\n\nfunction validated<Params>(\n schema: ParamsSchema<Params>,\n handler: (ctx: HandlerContext, params: Params) => Promise<unknown>,\n): ValidatedHandler {\n return (ctx, params) => {\n const parsed = schema.safeParse(params ?? {});\n\n if (!parsed.success) {\n throw invalidRequestError(parsed.error.message);\n }\n\n return handler(ctx, parsed.data);\n };\n}\n\nfunction targeted<Params extends WidgetParams>(\n schema: ParamsSchema<Params>,\n handler: TargetedHandler<Params>,\n): ValidatedHandler {\n return validated(schema, async (ctx, params) =>\n handler(ctx, await widgetTarget(ctx.registry, params.widgetId), params));\n}\n\nconst widgetTarget = async (registry: WidgetRegistry, widgetId: string | undefined): Promise<WidgetTarget> => ({\n testing: await loadTestingModule(),\n widget: requireWidget(registry, widgetId),\n});\n\nconst requireWidget = (registry: WidgetRegistry, widgetId: string | undefined): Gtk.Widget => {\n if (widgetId === undefined) {\n throw widgetNotFoundError(\"undefined\");\n }\n\n const widget = registry.get(widgetId);\n\n if (!widget) {\n throw widgetNotFoundError(widgetId);\n }\n\n return widget;\n};\n\nconst extractSignalArg = (arg: unknown): unknown => {\n const isTypedArg = typeof arg === \"object\" && arg !== null && \"type\" in arg && \"value\" in arg;\n\n return isTypedArg ? (arg as { value: unknown }).value : arg;\n};\n\nconst emissionNote = (isRealized: boolean, isMapped: boolean): string => {\n if (isRealized && isMapped) {\n return (\n \"The signal was emitted. Default handlers that animate, such as a button activate, settle \" +\n \"asynchronously, so read the widget again rather than assuming the effect has landed.\"\n );\n }\n\n return (\n \"The signal was emitted on a widget that is not realized and mapped, so a default handler that \" +\n \"requires a drawn widget does nothing. Present the containing window or open the containing \" +\n \"popover first, then fire the signal again.\"\n );\n};\n\nconst resolveRole = (value: string | number): Gtk.AccessibleRole | undefined => {\n if (typeof value === \"number\") {\n return value;\n }\n\n const resolved = Gtk.AccessibleRole[value.toUpperCase() as keyof typeof Gtk.AccessibleRole];\n\n return typeof resolved === \"number\" ? resolved : undefined;\n};\n\nconst matchesOrEmpty = async (find: () => Promise<Gtk.Widget[]>): Promise<Gtk.Widget[]> => {\n try {\n return await find();\n } catch {\n return [];\n }\n};\n\nfunction runRoleQuery(testing: TestingModule, app: Gtk.Application, params: QueryParams): Promise<Gtk.Widget[]> {\n const roleValue = resolveRole(params.value);\n\n if (roleValue === undefined) {\n throw invalidRequestError(\n `Unknown accessible role \"${String(params.value)}\"; use the lowercase role shown in the ` +\n \"widget tree, e.g. \\\"button\\\", \\\"list\\\", \\\"list_item\\\", or \\\"checkbox\\\".\",\n );\n }\n\n return matchesOrEmpty(() => testing.findAllByRole(app, roleValue, params.options));\n}\n\nfunction runTextQuery(testing: TestingModule, app: Gtk.Application, params: QueryParams): Promise<Gtk.Widget[]> {\n return matchesOrEmpty(() => testing.findAllByText(app, String(params.value), params.options));\n}\n\nfunction runLabelTextQuery(testing: TestingModule, app: Gtk.Application, params: QueryParams): Promise<Gtk.Widget[]> {\n return matchesOrEmpty(() => testing.findAllByLabelText(app, String(params.value), params.options));\n}\n\nasync function runNameQuery(\n testing: TestingModule,\n app: Gtk.Application,\n params: QueryParams,\n): Promise<Gtk.Widget[]> {\n const matches = await Promise.all([\n matchesOrEmpty(() => testing.findAllByName(app, String(params.value), params.options)),\n runLabelTextQuery(testing, app, params),\n runTextQuery(testing, app, params),\n ]);\n\n return [...new Set(matches.flat())];\n}\n\nconst emptyQueryHint = (params: QueryParams): string =>\n `Nothing matched by:\"${params.by}\" value:\"${String(params.value)}\", which compared ${SEARCHED_BY[params.by]}. ` +\n \"Call gtkx_get_widget_tree to see what is mounted; by:\\\"name\\\" is the widest match, and by:\\\"role\\\" accepts \" +\n \"options.name to match the accessible name of a known role.\";\n\nasync function handleQuery({ app, registry }: HandlerContext, params: QueryParams): Promise<unknown> {\n const testing = await loadTestingModule();\n const widgets = await QUERY_RUNNERS[params.by](testing, app, params);\n const resolveId = (widget: Gtk.Widget): string => registry.getOrCreateId(widget);\n\n return {\n widgets: widgets.map((widget) => serializeWidget(widget, resolveId, testing, 0)),\n searched: SEARCHED_BY[params.by],\n ...(widgets.length === 0 && { hint: emptyQueryHint(params) }),\n };\n}\n\nconst defaultScreenshotTarget = (registry: WidgetRegistry): Gtk.Widget => {\n const [toplevel] = registry.toplevels();\n\n if (!toplevel) {\n throw new Error(\"No windows available for screenshot\");\n }\n\n return toplevel;\n};\n\nasync function handleScreenshot(\n { registry }: HandlerContext,\n params: ServerRequestParams<\"widget.screenshot\">,\n): Promise<unknown> {\n const testing = await loadTestingModule();\n const target = params.windowId ? requireWidget(registry, params.windowId) : defaultScreenshotTarget(registry);\n const result = await testing.screenshot(target, { path: params.path });\n\n if (params.path) {\n return { data: result.data, mimeType: result.mimeType, savedPath: params.path };\n }\n\n return { data: result.data, mimeType: result.mimeType };\n}\n\nconst isServerInitiatedMethod = (method: string): method is ServerInitiatedMethod =>\n Object.hasOwn(ServerRequestParamsSchemas, method);\n\nconst dispatch = async (method: string, params: unknown, ctx: HandlerContext): Promise<unknown> => {\n if (!isServerInitiatedMethod(method)) {\n throw methodNotFoundError(method);\n }\n\n return HANDLERS[method](ctx, params);\n};\n\nexport { dispatch };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,QAAA,MAAe,cAAc,kBAJF,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,EAInB,aAAa,QAHlC,IAGkE,CAAC;AAsCnF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,QAAA,MAAe,cAAc,kBAJF,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,EAInB,aAAa,QAHlC,IAGkE,CAAC;AAuCnF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
package/dist/mcp/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { McpClient } from "./client.js";
2
2
  const { start: startMcpClient, stop: stopMcpClient } = createMcpClientController();
3
+ /* eslint-disable-next-line unicorn/consistent-boolean-name -- the boolean reports whether connecting succeeded */
3
4
  async function connectQuietly(client) {
4
5
  try {
5
6
  await client.connect();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,yBAAyB,EAAE,CAAC;AAEnF,KAAK,UAAU,cAAc,CAAC,MAAiB;IAC3C,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB;IAC9B,IAAI,OAAO,GAAqB,IAAI,CAAC;IAErC,OAAO;QACH,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAsB,EAAE;YACvD,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,OAAO,CAAC;YACnB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;YAChD,OAAO,GAAG,MAAM,CAAC;YACjB,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7B,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,EAAE,GAAS,EAAE;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO;YACX,CAAC;YAED,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import { McpClient } from \"./client.js\";\n\ntype McpClientController = {\n start: (applicationId: string) => Promise<McpClient>;\n stop: () => void;\n};\n\nconst { start: startMcpClient, stop: stopMcpClient } = createMcpClientController();\n\nasync function connectQuietly(client: McpClient): Promise<boolean> {\n try {\n await client.connect();\n\n return true;\n } catch {\n return false;\n }\n}\n\nfunction createMcpClientController(): McpClientController {\n let current: McpClient | null = null;\n\n return {\n start: async (applicationId: string): Promise<McpClient> => {\n if (current) {\n return current;\n }\n\n const client = new McpClient({ applicationId });\n current = client;\n await connectQuietly(client);\n\n return client;\n },\n stop: (): void => {\n if (!current) {\n return;\n }\n\n current.disconnect();\n current = null;\n },\n };\n}\n\nexport { startMcpClient, stopMcpClient };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,yBAAyB,EAAE,CAAC;AAEnF,kHAAkH;AAClH,KAAK,UAAU,cAAc,CAAC,MAAiB;IAC3C,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB;IAC9B,IAAI,OAAO,GAAqB,IAAI,CAAC;IAErC,OAAO;QACH,KAAK,EAAE,KAAK,EAAE,aAAqB,EAAsB,EAAE;YACvD,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,OAAO,CAAC;YACnB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;YAChD,OAAO,GAAG,MAAM,CAAC;YACjB,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAE7B,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,IAAI,EAAE,GAAS,EAAE;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO;YACX,CAAC;YAED,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import { McpClient } from \"./client.js\";\n\ntype McpClientController = {\n start: (applicationId: string) => Promise<McpClient>;\n stop: () => void;\n};\n\nconst { start: startMcpClient, stop: stopMcpClient } = createMcpClientController();\n\n/* eslint-disable-next-line unicorn/consistent-boolean-name -- the boolean reports whether connecting succeeded */\nasync function connectQuietly(client: McpClient): Promise<boolean> {\n try {\n await client.connect();\n\n return true;\n } catch {\n return false;\n }\n}\n\nfunction createMcpClientController(): McpClientController {\n let current: McpClient | null = null;\n\n return {\n start: async (applicationId: string): Promise<McpClient> => {\n if (current) {\n return current;\n }\n\n const client = new McpClient({ applicationId });\n current = client;\n await connectQuietly(client);\n\n return client;\n },\n stop: (): void => {\n if (!current) {\n return;\n }\n\n current.disconnect();\n current = null;\n },\n };\n}\n\nexport { startMcpClient, stopMcpClient };\n"]}
@@ -1,9 +1,9 @@
1
1
  import type * as Gtk from "@gtkx/gi/gtk";
2
- import type { SerializedWidget } from "@gtkx/mcp/internal";
2
+ import { type SerializedWidget } from "@gtkx/mcp/internal";
3
3
  type WidgetIdResolver = (widget: Gtk.Widget) => string;
4
4
  type WidgetFormatting = {
5
5
  formatRole(role: Gtk.AccessibleRole): string;
6
- getWidgetNodeText(widget: Gtk.Widget): string | null;
6
+ getWidgetText(widget: Gtk.Widget): string | null;
7
7
  };
8
8
  declare const serializeWidget: (widget: Gtk.Widget, resolveId: WidgetIdResolver, testing: WidgetFormatting, maxDepth?: number) => SerializedWidget;
9
9
  export { serializeWidget, type WidgetFormatting };
@@ -1 +1 @@
1
- {"version":3,"file":"serialize-widget.d.ts","sourceRoot":"","sources":["../../src/mcp/serialize-widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,KAAK,gBAAgB,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AAEvD,KAAK,gBAAgB,GAAG;IACpB,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC;IAC7C,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACxD,CAAC;AAEF,QAAA,MAAM,eAAe,GACjB,QAAQ,GAAG,CAAC,MAAM,EAClB,WAAW,gBAAgB,EAC3B,SAAS,gBAAgB,EACzB,iBAAmB,KACpB,gBAuBF,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"serialize-widget.d.ts","sourceRoot":"","sources":["../../src/mcp/serialize-widget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,EAA8C,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvG,KAAK,gBAAgB,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AAEvD,KAAK,gBAAgB,GAAG;IACpB,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC;IAC7C,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACpD,CAAC;AAyDF,QAAA,MAAM,eAAe,GACjB,QAAQ,GAAG,CAAC,MAAM,EAClB,WAAW,gBAAgB,EAC3B,SAAS,gBAAgB,EACzB,iBAAgC,KACjC,gBAkBF,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
@@ -1,23 +1,53 @@
1
- const serializeWidget = (widget, resolveId, testing, maxDepth = Infinity) => {
1
+ import { DEFAULT_SUBTREE_DEPTH, MAX_SUBTREE_WIDGETS } from "@gtkx/mcp/internal";
2
+ const getChildren = (widget) => {
2
3
  const children = [];
3
- if (maxDepth > 0) {
4
- let child = widget.getFirstChild();
5
- while (child) {
6
- children.push(serializeWidget(child, resolveId, testing, maxDepth - 1));
7
- child = child.getNextSibling();
8
- }
4
+ let child = widget.getFirstChild();
5
+ while (child) {
6
+ children.push(child);
7
+ child = child.getNextSibling();
9
8
  }
10
- return {
11
- id: resolveId(widget),
12
- type: widget.constructor.name,
13
- role: testing.formatRole(widget.getAccessibleRole()),
14
- name: widget.getName() || null,
15
- text: testing.getWidgetNodeText(widget),
16
- isSensitive: widget.getSensitive(),
17
- isVisible: widget.getVisible(),
18
- cssClasses: widget.getCssClasses(),
19
- children,
9
+ return children;
10
+ };
11
+ const createNode = (widget, expansion) => ({
12
+ id: expansion.resolveId(widget),
13
+ type: widget.constructor.name,
14
+ role: expansion.testing.formatRole(widget.getAccessibleRole()),
15
+ name: widget.getName() || null,
16
+ text: expansion.testing.getWidgetText(widget),
17
+ isSensitive: widget.getSensitive(),
18
+ isVisible: widget.getVisible(),
19
+ cssClasses: widget.getCssClasses(),
20
+ children: [],
21
+ });
22
+ const expandNode = (expansion, parent) => {
23
+ const children = getChildren(parent.widget);
24
+ const canDescend = parent.depth < expansion.maxDepth;
25
+ const shownCount = canDescend ? Math.min(children.length, expansion.budget) : 0;
26
+ expansion.budget -= shownCount;
27
+ for (const child of children.slice(0, shownCount)) {
28
+ const node = createNode(child, expansion);
29
+ parent.node.children.push(node);
30
+ expansion.pending.push({ depth: parent.depth + 1, node, widget: child });
31
+ }
32
+ if (shownCount < children.length) {
33
+ parent.node.hiddenChildren = children.length - shownCount;
34
+ }
35
+ };
36
+ const serializeWidget = (widget, resolveId, testing, maxDepth = DEFAULT_SUBTREE_DEPTH) => {
37
+ const expansion = {
38
+ budget: MAX_SUBTREE_WIDGETS - 1,
39
+ maxDepth,
40
+ pending: [],
41
+ resolveId,
42
+ testing,
20
43
  };
44
+ const root = createNode(widget, expansion);
45
+ let parent = { depth: 0, node: root, widget };
46
+ while (parent !== undefined) {
47
+ expandNode(expansion, parent);
48
+ parent = expansion.pending.shift();
49
+ }
50
+ return root;
21
51
  };
22
52
  export { serializeWidget };
23
53
  //# sourceMappingURL=serialize-widget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serialize-widget.js","sourceRoot":"","sources":["../../src/mcp/serialize-widget.ts"],"names":[],"mappings":"AAUA,MAAM,eAAe,GAAG,CACpB,MAAkB,EAClB,SAA2B,EAC3B,OAAyB,EACzB,QAAQ,GAAG,QAAQ,EACH,EAAE;IAClB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACf,IAAI,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QAEnC,OAAO,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;YACxE,KAAK,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;IACL,CAAC;IAED,OAAO;QACH,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI;QAC7B,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACpD,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI;QAC9B,IAAI,EAAE,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACvC,WAAW,EAAE,MAAM,CAAC,YAAY,EAAE;QAClC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE;QAC9B,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE;QAClC,QAAQ;KACX,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAyB,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { SerializedWidget } from \"@gtkx/mcp/internal\";\n\ntype WidgetIdResolver = (widget: Gtk.Widget) => string;\n\ntype WidgetFormatting = {\n formatRole(role: Gtk.AccessibleRole): string;\n getWidgetNodeText(widget: Gtk.Widget): string | null;\n};\n\nconst serializeWidget = (\n widget: Gtk.Widget,\n resolveId: WidgetIdResolver,\n testing: WidgetFormatting,\n maxDepth = Infinity,\n): SerializedWidget => {\n const children: SerializedWidget[] = [];\n\n if (maxDepth > 0) {\n let child = widget.getFirstChild();\n\n while (child) {\n children.push(serializeWidget(child, resolveId, testing, maxDepth - 1));\n child = child.getNextSibling();\n }\n }\n\n return {\n id: resolveId(widget),\n type: widget.constructor.name,\n role: testing.formatRole(widget.getAccessibleRole()),\n name: widget.getName() || null,\n text: testing.getWidgetNodeText(widget),\n isSensitive: widget.getSensitive(),\n isVisible: widget.getVisible(),\n cssClasses: widget.getCssClasses(),\n children,\n };\n};\n\nexport { serializeWidget, type WidgetFormatting };\n"]}
1
+ {"version":3,"file":"serialize-widget.js","sourceRoot":"","sources":["../../src/mcp/serialize-widget.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { DEFAULT_SUBTREE_DEPTH, MAX_SUBTREE_WIDGETS, type SerializedWidget } from \"@gtkx/mcp/internal\";\n\ntype WidgetIdResolver = (widget: Gtk.Widget) => string;\n\ntype WidgetFormatting = {\n formatRole(role: Gtk.AccessibleRole): string;\n getWidgetText(widget: Gtk.Widget): string | null;\n};\n\ntype PendingWidget = {\n depth: number;\n node: SerializedWidget;\n widget: Gtk.Widget;\n};\n\ntype Expansion = {\n budget: number;\n maxDepth: number;\n pending: PendingWidget[];\n resolveId: WidgetIdResolver;\n testing: WidgetFormatting;\n};\n\nconst getChildren = (widget: Gtk.Widget): Gtk.Widget[] => {\n const children: Gtk.Widget[] = [];\n let child = widget.getFirstChild();\n\n while (child) {\n children.push(child);\n child = child.getNextSibling();\n }\n\n return children;\n};\n\nconst createNode = (widget: Gtk.Widget, expansion: Expansion): SerializedWidget => ({\n id: expansion.resolveId(widget),\n type: widget.constructor.name,\n role: expansion.testing.formatRole(widget.getAccessibleRole()),\n name: widget.getName() || null,\n text: expansion.testing.getWidgetText(widget),\n isSensitive: widget.getSensitive(),\n isVisible: widget.getVisible(),\n cssClasses: widget.getCssClasses(),\n children: [],\n});\n\nconst expandNode = (expansion: Expansion, parent: PendingWidget): void => {\n const children = getChildren(parent.widget);\n const canDescend = parent.depth < expansion.maxDepth;\n const shownCount = canDescend ? Math.min(children.length, expansion.budget) : 0;\n expansion.budget -= shownCount;\n\n for (const child of children.slice(0, shownCount)) {\n const node = createNode(child, expansion);\n parent.node.children.push(node);\n expansion.pending.push({ depth: parent.depth + 1, node, widget: child });\n }\n\n if (shownCount < children.length) {\n parent.node.hiddenChildren = children.length - shownCount;\n }\n};\n\nconst serializeWidget = (\n widget: Gtk.Widget,\n resolveId: WidgetIdResolver,\n testing: WidgetFormatting,\n maxDepth = DEFAULT_SUBTREE_DEPTH,\n): SerializedWidget => {\n const expansion: Expansion = {\n budget: MAX_SUBTREE_WIDGETS - 1,\n maxDepth,\n pending: [],\n resolveId,\n testing,\n };\n\n const root = createNode(widget, expansion);\n let parent: PendingWidget | undefined = { depth: 0, node: root, widget };\n\n while (parent !== undefined) {\n expandNode(expansion, parent);\n parent = expansion.pending.shift();\n }\n\n return root;\n};\n\nexport { serializeWidget, type WidgetFormatting };\n"]}
@@ -0,0 +1,6 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+ import { type SerializedProperty } from "@gtkx/mcp/internal";
3
+ import type { WidgetRegistry } from "./widget-registry.js";
4
+ declare function readWidgetProperties(widget: Gtk.Widget, properties: string[], registry: WidgetRegistry): Record<string, SerializedProperty>;
5
+ export { readWidgetProperties };
6
+ //# sourceMappingURL=widget-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-properties.d.ts","sourceRoot":"","sources":["../../src/mcp/widget-properties.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAapF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAyH3D,iBAAS,oBAAoB,CACzB,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,cAAc,GACzB,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAUpC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,102 @@
1
+ import * as GObject from "@gtkx/gi/gobject";
2
+ import * as Gtk from "@gtkx/gi/gtk";
3
+ import { propertyNotFoundError } from "@gtkx/mcp/internal";
4
+ import { getHandle, getInstanceType, TYPE_ENUM, TYPE_FLAGS, typeIsA, typeName, } from "@gtkx/runtime";
5
+ import { fromValue, getValueType } from "@gtkx/runtime/internal";
6
+ import { camelCase, errorMessage, kebabCase } from "@gtkx/utils";
7
+ const SCALAR_TYPES = new Set(["string", "number", "boolean"]);
8
+ const canonicalName = (name) => kebabCase(name).replaceAll("_", "-");
9
+ const widgetTypeName = (widget) => typeName(getInstanceType(widget)) ?? widget.constructor.name;
10
+ const byName = (left, right) => left.localeCompare(right);
11
+ const isScalar = (value) => value === null || SCALAR_TYPES.has(typeof value);
12
+ function prototypesFor(widget) {
13
+ const prototypes = [];
14
+ let prototype = Object.getPrototypeOf(widget);
15
+ while (prototype !== null && prototype !== Object.prototype) {
16
+ prototypes.push(prototype);
17
+ prototype = Object.getPrototypeOf(prototype);
18
+ }
19
+ return prototypes;
20
+ }
21
+ function getAccessor(widget, member) {
22
+ for (const prototype of prototypesFor(widget)) {
23
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, member);
24
+ if (descriptor !== undefined) {
25
+ return descriptor;
26
+ }
27
+ }
28
+ return undefined;
29
+ }
30
+ function getReadableNames(prototype) {
31
+ const descriptors = Object.entries(Object.getOwnPropertyDescriptors(prototype));
32
+ return descriptors.filter(([, descriptor]) => descriptor.get !== undefined).map(([member]) => kebabCase(member));
33
+ }
34
+ function readablePropertyNames(widget) {
35
+ const names = prototypesFor(widget).flatMap((prototype) => getReadableNames(prototype));
36
+ return [...new Set(names)].toSorted(byName);
37
+ }
38
+ const requireReadableProperty = (widget, property) => {
39
+ if (getAccessor(widget, camelCase(property))?.get !== undefined) {
40
+ return;
41
+ }
42
+ throw propertyNotFoundError(widgetTypeName(widget), property, readablePropertyNames(widget));
43
+ };
44
+ function readNativeProperty(widget, property) {
45
+ const value = new GObject.Value();
46
+ widget.getProperty(property, value);
47
+ const handle = getHandle(value);
48
+ return { type: getValueType(handle), handle };
49
+ }
50
+ function describeObjectValue(value, registry) {
51
+ if (typeof value !== "object" || value === null) {
52
+ return { value: String(value) };
53
+ }
54
+ const name = typeName(getInstanceType(value)) ?? value.constructor.name;
55
+ if (!(value instanceof Gtk.Widget)) {
56
+ return { value: name };
57
+ }
58
+ registry.register(value);
59
+ return { value: name, widgetId: registry.getOrCreateId(value) };
60
+ }
61
+ function representValue(value, registry) {
62
+ if (isScalar(value)) {
63
+ return { value };
64
+ }
65
+ if (typeof value === "bigint") {
66
+ return { value: value.toString() };
67
+ }
68
+ if (Array.isArray(value)) {
69
+ return { value: value.map(String) };
70
+ }
71
+ return describeObjectValue(value, registry);
72
+ }
73
+ function representNativeProperty(native, registry) {
74
+ if (typeIsA(native.type, TYPE_ENUM)) {
75
+ return { value: GObject.enumToString(native.type, Number(fromValue(native.handle))) };
76
+ }
77
+ if (typeIsA(native.type, TYPE_FLAGS)) {
78
+ return { value: GObject.flagsToString(native.type, Number(fromValue(native.handle))) };
79
+ }
80
+ return representValue(fromValue(native.handle), registry);
81
+ }
82
+ function serializeProperty(widget, property, registry) {
83
+ const native = readNativeProperty(widget, property);
84
+ const type = typeName(native.type) ?? String(native.type);
85
+ try {
86
+ return { type, ...representNativeProperty(native, registry) };
87
+ }
88
+ catch (error) {
89
+ return { type, value: null, note: `cannot be represented over MCP: ${errorMessage(error)}` };
90
+ }
91
+ }
92
+ function readWidgetProperties(widget, properties, registry) {
93
+ const values = {};
94
+ for (const name of properties) {
95
+ const property = canonicalName(name);
96
+ requireReadableProperty(widget, property);
97
+ values[property] = serializeProperty(widget, property, registry);
98
+ }
99
+ return values;
100
+ }
101
+ export { readWidgetProperties };
102
+ //# sourceMappingURL=widget-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-properties.js","sourceRoot":"","sources":["../../src/mcp/widget-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { propertyNotFoundError, type SerializedProperty } from \"@gtkx/mcp/internal\";\nimport {\n type ExternalObject,\n getHandle,\n getInstanceType,\n type Handle,\n TYPE_ENUM,\n TYPE_FLAGS,\n typeIsA,\n typeName,\n} from \"@gtkx/runtime\";\nimport { fromValue, getValueType } from \"@gtkx/runtime/internal\";\nimport { camelCase, errorMessage, kebabCase } from \"@gtkx/utils\";\nimport type { WidgetRegistry } from \"./widget-registry.js\";\n\ntype PropertyRepresentation = Omit<SerializedProperty, \"type\">;\ntype NativeProperty = { type: bigint; handle: ExternalObject<Handle> };\n\nconst SCALAR_TYPES: Set<string> = new Set([\"string\", \"number\", \"boolean\"]);\n\nconst canonicalName = (name: string): string => kebabCase(name).replaceAll(\"_\", \"-\");\nconst widgetTypeName = (widget: Gtk.Widget): string => typeName(getInstanceType(widget)) ?? widget.constructor.name;\nconst byName = (left: string, right: string): number => left.localeCompare(right);\n\nconst isScalar = (value: unknown): value is string | number | boolean | null =>\n value === null || SCALAR_TYPES.has(typeof value);\n\nfunction prototypesFor(widget: Gtk.Widget): object[] {\n const prototypes: object[] = [];\n let prototype = Object.getPrototypeOf(widget) as object | null;\n\n while (prototype !== null && prototype !== Object.prototype) {\n prototypes.push(prototype);\n prototype = Object.getPrototypeOf(prototype) as object | null;\n }\n\n return prototypes;\n}\n\nfunction getAccessor(widget: Gtk.Widget, member: string): PropertyDescriptor | undefined {\n for (const prototype of prototypesFor(widget)) {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, member);\n\n if (descriptor !== undefined) {\n return descriptor;\n }\n }\n\n return undefined;\n}\n\nfunction getReadableNames(prototype: object): string[] {\n const descriptors = Object.entries(Object.getOwnPropertyDescriptors(prototype));\n\n return descriptors.filter(([, descriptor]) => descriptor.get !== undefined).map(([member]) => kebabCase(member));\n}\n\nfunction readablePropertyNames(widget: Gtk.Widget): string[] {\n const names = prototypesFor(widget).flatMap((prototype) => getReadableNames(prototype));\n\n return [...new Set(names)].toSorted(byName);\n}\n\nconst requireReadableProperty = (widget: Gtk.Widget, property: string): void => {\n if (getAccessor(widget, camelCase(property))?.get !== undefined) {\n return;\n }\n\n throw propertyNotFoundError(widgetTypeName(widget), property, readablePropertyNames(widget));\n};\n\nfunction readNativeProperty(widget: Gtk.Widget, property: string): NativeProperty {\n const value = new GObject.Value();\n widget.getProperty(property, value);\n const handle = getHandle(value);\n\n return { type: getValueType(handle), handle };\n}\n\nfunction describeObjectValue(value: unknown, registry: WidgetRegistry): PropertyRepresentation {\n if (typeof value !== \"object\" || value === null) {\n return { value: String(value) };\n }\n\n const name = typeName(getInstanceType(value)) ?? value.constructor.name;\n\n if (!(value instanceof Gtk.Widget)) {\n return { value: name };\n }\n\n registry.register(value);\n\n return { value: name, widgetId: registry.getOrCreateId(value) };\n}\n\nfunction representValue(value: unknown, registry: WidgetRegistry): PropertyRepresentation {\n if (isScalar(value)) {\n return { value };\n }\n\n if (typeof value === \"bigint\") {\n return { value: value.toString() };\n }\n\n if (Array.isArray(value)) {\n return { value: value.map(String) };\n }\n\n return describeObjectValue(value, registry);\n}\n\nfunction representNativeProperty(native: NativeProperty, registry: WidgetRegistry): PropertyRepresentation {\n if (typeIsA(native.type, TYPE_ENUM)) {\n return { value: GObject.enumToString(native.type, Number(fromValue(native.handle))) };\n }\n\n if (typeIsA(native.type, TYPE_FLAGS)) {\n return { value: GObject.flagsToString(native.type, Number(fromValue(native.handle))) };\n }\n\n return representValue(fromValue(native.handle), registry);\n}\n\nfunction serializeProperty(widget: Gtk.Widget, property: string, registry: WidgetRegistry): SerializedProperty {\n const native = readNativeProperty(widget, property);\n const type = typeName(native.type) ?? String(native.type);\n\n try {\n return { type, ...representNativeProperty(native, registry) };\n } catch (error) {\n return { type, value: null, note: `cannot be represented over MCP: ${errorMessage(error)}` };\n }\n}\n\nfunction readWidgetProperties(\n widget: Gtk.Widget,\n properties: string[],\n registry: WidgetRegistry,\n): Record<string, SerializedProperty> {\n const values: Record<string, SerializedProperty> = {};\n\n for (const name of properties) {\n const property = canonicalName(name);\n requireReadableProperty(widget, property);\n values[property] = serializeProperty(widget, property, registry);\n }\n\n return values;\n}\n\nexport { readWidgetProperties };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,IAYrC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,IAWrC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -1,21 +1,17 @@
1
- import { formatChildProcessError } from "@gtkx/utils";
2
- import { execFileSync } from "node:child_process";
3
- import { resolveCliTool } from "../internal/resolve-cli-tool.js";
1
+ import { runCliTool } from "../internal/run-cli-tool.js";
4
2
  const SCHEMA_COMPILER = "glib-compile-schemas";
5
3
  const SCHEMA_COMPILE_TIMEOUT_MS = 30_000;
6
4
  const compileSchemas = (dir) => {
7
- try {
8
- execFileSync(resolveCliTool(SCHEMA_COMPILER), ["--strict", dir], {
5
+ runCliTool({
6
+ tool: SCHEMA_COMPILER,
7
+ args: ["--strict", dir],
8
+ target: dir,
9
+ options: {
9
10
  stdio: ["ignore", "pipe", "pipe"],
10
11
  timeout: SCHEMA_COMPILE_TIMEOUT_MS,
11
12
  encoding: "utf8",
12
- });
13
- }
14
- catch (error) {
15
- const details = formatChildProcessError(error);
16
- const suffix = details ? `:\n${details}` : "";
17
- throw new Error(`glib-compile-schemas failed for ${dir}${suffix}`, { cause: error });
18
- }
13
+ },
14
+ });
19
15
  };
20
16
  export { compileSchemas };
21
17
  //# sourceMappingURL=compile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IACzC,IAAI,CAAC;QACD,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;YAC7D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,MAAM;SACnB,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { formatChildProcessError } from \"@gtkx/utils\";\nimport { execFileSync } from \"node:child_process\";\nimport { resolveCliTool } from \"../internal/resolve-cli-tool.js\";\n\nconst SCHEMA_COMPILER = \"glib-compile-schemas\";\nconst SCHEMA_COMPILE_TIMEOUT_MS = 30_000;\n\nconst compileSchemas = (dir: string): void => {\n try {\n execFileSync(resolveCliTool(SCHEMA_COMPILER), [\"--strict\", dir], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: SCHEMA_COMPILE_TIMEOUT_MS,\n encoding: \"utf8\",\n });\n } catch (error) {\n const details = formatChildProcessError(error);\n const suffix = details ? `:\\n${details}` : \"\";\n throw new Error(`glib-compile-schemas failed for ${dir}${suffix}`, { cause: error });\n }\n};\n\nexport { compileSchemas };\n"]}
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/settings/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,GAAW,EAAQ,EAAE;IACzC,UAAU,CAAC;QACP,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC;QACvB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACL,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,MAAM;SACnB;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { runCliTool } from \"../internal/run-cli-tool.js\";\n\nconst SCHEMA_COMPILER = \"glib-compile-schemas\";\nconst SCHEMA_COMPILE_TIMEOUT_MS = 30_000;\n\nconst compileSchemas = (dir: string): void => {\n runCliTool({\n tool: SCHEMA_COMPILER,\n args: [\"--strict\", dir],\n target: dir,\n options: {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: SCHEMA_COMPILE_TIMEOUT_MS,\n encoding: \"utf8\",\n },\n });\n};\n\nexport { compileSchemas };\n"]}
@@ -0,0 +1,9 @@
1
+ type AssetEmitter = {
2
+ emitFile: (file: {
3
+ type: "asset";
4
+ fileName: string;
5
+ source: Buffer;
6
+ }) => void;
7
+ };
8
+ export { type AssetEmitter };
9
+ //# sourceMappingURL=asset-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-emitter.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-emitter.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACjF,CAAC;AAEF,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=asset-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-emitter.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-emitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,CAAC","sourcesContent":["type AssetEmitter = {\n emitFile: (file: { type: \"asset\"; fileName: string; source: Buffer }) => void;\n};\n\nexport { type AssetEmitter };\n"]}
@@ -1,5 +1,4 @@
1
- declare const ASSET_EXTENSIONS: string[];
2
1
  declare const ASSET_RE: RegExp;
3
2
  declare const ASSET_PATH_RE: RegExp;
4
- export { ASSET_EXTENSIONS, ASSET_RE, ASSET_PATH_RE };
3
+ export { ASSET_RE, ASSET_PATH_RE };
5
4
  //# sourceMappingURL=asset-extensions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,gBAAgB,UAuBrB,CAAC;AAEF,QAAA,MAAM,QAAQ,QAAoE,CAAC;AACnF,QAAA,MAAM,aAAa,QAA6E,CAAC;AAEjG,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAyBA,QAAA,MAAM,QAAQ,QAAoE,CAAC;AACnF,QAAA,MAAM,aAAa,QAA6E,CAAC;AAEjG,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
@@ -24,5 +24,5 @@ const ASSET_EXTENSIONS = [
24
24
  ];
25
25
  const ASSET_RE = new RegExp(String.raw `\.(?:${ASSET_EXTENSIONS.join("|")})$`, "i");
26
26
  const ASSET_PATH_RE = new RegExp(String.raw `\.(?:${ASSET_EXTENSIONS.join("|")})(?:\?.*)?$`, "i");
27
- export { ASSET_EXTENSIONS, ASSET_RE, ASSET_PATH_RE };
27
+ export { ASSET_RE, ASSET_PATH_RE };
28
28
  //# sourceMappingURL=asset-extensions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACrB,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAEjG,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC","sourcesContent":["const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nconst ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\nconst ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\n\nexport { ASSET_EXTENSIONS, ASSET_RE, ASSET_PATH_RE };\n"]}
1
+ {"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACrB,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAEjG,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC","sourcesContent":["const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nconst ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\nconst ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\n\nexport { ASSET_RE, ASSET_PATH_RE };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA4BnC,iBAAS,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBhD;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAkCnC,iBAAS,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBhD;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,18 +1,22 @@
1
+ import { posix } from "node:path";
2
+ const EXECUTABLE_URL_BASE = "`file://${process.execPath}`";
3
+ const LEADING_SLASHES = /^\/+/;
4
+ const executableRelativeUrl = (target) => {
5
+ const specifier = JSON.stringify(target.replace(LEADING_SLASHES, "./"));
6
+ return `decodeURIComponent(new URL(${specifier}, ${EXECUTABLE_URL_BASE}).pathname)`;
7
+ };
8
+ const bundleRelativeUrl = (filename) => {
9
+ const specifier = JSON.stringify(`./${filename}`);
10
+ return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;
11
+ };
1
12
  const renderAssetUrl = (filename, type, assetBase) => {
2
13
  if (type !== "asset") {
3
14
  return undefined;
4
15
  }
5
- if (assetBase) {
6
- const executableDir = "require(\"path\").dirname(process.execPath)";
7
- return {
8
- runtime: `require("path").join(${executableDir},` +
9
- `${JSON.stringify(assetBase)},${JSON.stringify(filename)})`,
10
- };
16
+ if (assetBase === undefined) {
17
+ return { runtime: bundleRelativeUrl(filename) };
11
18
  }
12
- const filenameLiteral = JSON.stringify(`./${filename}`);
13
- return {
14
- runtime: `new URL(${filenameLiteral}, import.meta.url).pathname`,
15
- };
19
+ return { runtime: executableRelativeUrl(posix.join(assetBase, filename)) };
16
20
  };
17
21
  function gtkxBuiltUrl(assetBase) {
18
22
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,CACnB,QAAgB,EAChB,IAAY,EACZ,SAA6B,EACE,EAAE;IACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,aAAa,GAAG,6CAA6C,CAAC;QAEpE,OAAO;YACH,OAAO,EACH,wBAAwB,aAAa,GAAG;gBACxC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;SAClE,CAAC;IACN,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAExD,OAAO;QACH,OAAO,EAAE,WAAW,eAAe,6BAA6B;KACnE,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,SAAkB;IACpC,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,UAAU;YACb,IAAI,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;gBAC1C,OAAO;YACX,CAAC;YAED,OAAO;gBACH,YAAY,EAAE;oBACV,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;wBAC7B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACrD,CAAC;iBACJ;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\n\nconst renderAssetUrl = (\n filename: string,\n type: string,\n assetBase: string | undefined,\n): { runtime: string } | undefined => {\n if (type !== \"asset\") {\n return undefined;\n }\n\n if (assetBase) {\n const executableDir = \"require(\\\"path\\\").dirname(process.execPath)\";\n\n return {\n runtime:\n `require(\"path\").join(${executableDir},` +\n `${JSON.stringify(assetBase)},${JSON.stringify(filename)})`,\n };\n }\n\n const filenameLiteral = JSON.stringify(`./${filename}`);\n\n return {\n runtime: `new URL(${filenameLiteral}, import.meta.url).pathname`,\n };\n};\n\nfunction gtkxBuiltUrl(assetBase?: string): Plugin {\n return {\n name: \"gtkx:built-url\",\n apply: \"build\",\n\n config(userConfig) {\n if (userConfig.experimental?.renderBuiltUrl) {\n return;\n }\n\n return {\n experimental: {\n renderBuiltUrl(filename, { type }) {\n return renderAssetUrl(filename, type, assetBase);\n },\n },\n };\n },\n };\n}\n\nexport { gtkxBuiltUrl };\n"]}
1
+ {"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAC3D,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAU,EAAE;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC;IAExE,OAAO,8BAA8B,SAAS,KAAK,mBAAmB,aAAa,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAElD,OAAO,8BAA8B,SAAS,8BAA8B,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,QAAgB,EAChB,IAAY,EACZ,SAA6B,EACE,EAAE;IACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,SAAkB;IACpC,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,UAAU;YACb,IAAI,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;gBAC1C,OAAO;YACX,CAAC;YAED,OAAO;gBACH,YAAY,EAAE;oBACV,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;wBAC7B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACrD,CAAC;iBACJ;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { posix } from \"node:path\";\n\nconst EXECUTABLE_URL_BASE = \"`file://${process.execPath}`\";\nconst LEADING_SLASHES = /^\\/+/;\n\nconst executableRelativeUrl = (target: string): string => {\n const specifier = JSON.stringify(target.replace(LEADING_SLASHES, \"./\"));\n\n return `decodeURIComponent(new URL(${specifier}, ${EXECUTABLE_URL_BASE}).pathname)`;\n};\n\nconst bundleRelativeUrl = (filename: string): string => {\n const specifier = JSON.stringify(`./${filename}`);\n\n return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;\n};\n\nconst renderAssetUrl = (\n filename: string,\n type: string,\n assetBase: string | undefined,\n): { runtime: string } | undefined => {\n if (type !== \"asset\") {\n return undefined;\n }\n\n if (assetBase === undefined) {\n return { runtime: bundleRelativeUrl(filename) };\n }\n\n return { runtime: executableRelativeUrl(posix.join(assetBase, filename)) };\n};\n\nfunction gtkxBuiltUrl(assetBase?: string): Plugin {\n return {\n name: \"gtkx:built-url\",\n apply: \"build\",\n\n config(userConfig) {\n if (userConfig.experimental?.renderBuiltUrl) {\n return;\n }\n\n return {\n experimental: {\n renderBuiltUrl(filename, { type }) {\n return renderAssetUrl(filename, type, assetBase);\n },\n },\n };\n },\n };\n}\n\nexport { gtkxBuiltUrl };\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from "vite";
2
+ declare const gtkxEnsureStore: () => Plugin;
3
+ export { gtkxEnsureStore };
4
+ //# sourceMappingURL=ensure-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-store.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/ensure-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAKnC,QAAA,MAAM,eAAe,QAAO,MAM1B,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ensureGenerated } from "../codegen/run-codegen.js";
2
+ const TEST_MODE = "test";
3
+ const gtkxEnsureStore = () => ({
4
+ name: "gtkx:ensure-store",
5
+ async config() {
6
+ await ensureGenerated(process.cwd(), { shouldAnnounce: true, mode: TEST_MODE });
7
+ },
8
+ });
9
+ export { gtkxEnsureStore };
10
+ //# sourceMappingURL=ensure-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-store.js","sourceRoot":"","sources":["../../src/vite-plugins/ensure-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,eAAe,GAAG,GAAW,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE,mBAAmB;IAEzB,KAAK,CAAC,MAAM;QACR,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACpF,CAAC;CACJ,CAAC,CAAC;AAEH,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { ensureGenerated } from \"../codegen/run-codegen.js\";\n\nconst TEST_MODE = \"test\";\n\nconst gtkxEnsureStore = (): Plugin => ({\n name: \"gtkx:ensure-store\",\n\n async config() {\n await ensureGenerated(process.cwd(), { shouldAnnounce: true, mode: TEST_MODE });\n },\n});\n\nexport { gtkxEnsureStore };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AA6C/C,iBAAS,SAAS,IAAI,MAAM,CA0B3B;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AA0C/C,iBAAS,SAAS,IAAI,MAAM,CA0B3B;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAUhF,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,cAAc,GAAG;IACnB,+BAA+B;IAC/B,mEAAmE;IACnE,mEAAmE;IACnE,gBAAgB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,aAAa,GAAG,CAAC,QAAuB,EAAgB,EAAE,CAC5D,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAiB,EAAE;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAE,KAAmB,EAAQ,EAAE;IAChE,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,SAAS,GAAG,CAAC,CAAC;IACtE,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,SAAS;IACd,MAAM,KAAK,GAAgB;QACvB,QAAQ,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,MAAkB;YACrB,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,aAAa,CAAC,OAAO;YACjB,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO;YACX,CAAC;YAED,OAAO,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;QAED,QAAQ;YACJ,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { info } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\n\ntype PluginState = {\n iconsDir: string | null;\n};\n\ntype PluginContext = {\n emitFile: (file: { type: \"asset\"; fileName: string; source: Buffer }) => void;\n};\n\nconst ICONS_DIR = \"icons\";\n\nconst XDG_ENV_BANNER = [\n \"process.env.XDG_DATA_DIRS = [\",\n \" decodeURIComponent(new URL(\\\".\\\", import.meta.url).pathname),\",\n \" process.env.XDG_DATA_DIRS || \\\"/usr/local/share:/usr/share\\\",\",\n \"].join(\\\":\\\");\",\n].join(\"\\n\");\n\nconst findIconFiles = (iconsDir: string | null): ListedFile[] =>\n iconsDir === null ? [] : listFilesRecursive(iconsDir);\n\nconst resolveIconsDir = (config: UserConfig): string | null => {\n const root = config.root ?? process.cwd();\n const dataDir = resolveDataDir(root);\n\n return dataDir === null ? null : join(root, dataDir, ICONS_DIR);\n};\n\nconst emitIcons = (ctx: PluginContext, icons: ListedFile[]): void => {\n for (const { absPath, rel } of icons) {\n ctx.emitFile({ type: \"asset\", fileName: join(ICONS_DIR, rel), source: readFileSync(absPath) });\n }\n\n if (icons.length > 0) {\n info(`Copied ${String(icons.length)} icon(s) into ${ICONS_DIR}/`);\n }\n};\n\nfunction gtkxIcons(): Plugin {\n const state: PluginState = {\n iconsDir: null,\n };\n\n return {\n name: \"gtkx:icons\",\n enforce: \"pre\",\n apply: \"build\",\n\n config(config: UserConfig) {\n state.iconsDir = resolveIconsDir(config);\n },\n\n outputOptions(options) {\n if (findIconFiles(state.iconsDir).length === 0) {\n return;\n }\n\n return prependBanner(options, XDG_ENV_BANNER);\n },\n\n buildEnd() {\n emitIcons(this, findIconFiles(state.iconsDir));\n },\n };\n}\n\nexport { gtkxIcons };\n"]}
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAMhF,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,cAAc,GAAG;IACnB,+BAA+B;IAC/B,mEAAmE;IACnE,mEAAmE;IACnE,gBAAgB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,aAAa,GAAG,CAAC,QAAuB,EAAgB,EAAE,CAC5D,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAiB,EAAE;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAiB,EAAE,KAAmB,EAAQ,EAAE;IAC/D,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,SAAS,GAAG,CAAC,CAAC;IACtE,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,SAAS;IACd,MAAM,KAAK,GAAgB;QACvB,QAAQ,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,MAAkB;YACrB,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,aAAa,CAAC,OAAO;YACjB,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO;YACX,CAAC;YAED,OAAO,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;QAED,QAAQ;YACJ,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { info } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AssetEmitter } from \"./asset-emitter.js\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\n\ntype PluginState = {\n iconsDir: string | null;\n};\n\nconst ICONS_DIR = \"icons\";\n\nconst XDG_ENV_BANNER = [\n \"process.env.XDG_DATA_DIRS = [\",\n \" decodeURIComponent(new URL(\\\".\\\", import.meta.url).pathname),\",\n \" process.env.XDG_DATA_DIRS || \\\"/usr/local/share:/usr/share\\\",\",\n \"].join(\\\":\\\");\",\n].join(\"\\n\");\n\nconst findIconFiles = (iconsDir: string | null): ListedFile[] =>\n iconsDir === null ? [] : listFilesRecursive(iconsDir);\n\nconst resolveIconsDir = (config: UserConfig): string | null => {\n const root = config.root ?? process.cwd();\n const dataDir = resolveDataDir(root);\n\n return dataDir === null ? null : join(root, dataDir, ICONS_DIR);\n};\n\nconst emitIcons = (ctx: AssetEmitter, icons: ListedFile[]): void => {\n for (const { absPath, rel } of icons) {\n ctx.emitFile({ type: \"asset\", fileName: join(ICONS_DIR, rel), source: readFileSync(absPath) });\n }\n\n if (icons.length > 0) {\n info(`Copied ${String(icons.length)} icon(s) into ${ICONS_DIR}/`);\n }\n};\n\nfunction gtkxIcons(): Plugin {\n const state: PluginState = {\n iconsDir: null,\n };\n\n return {\n name: \"gtkx:icons\",\n enforce: \"pre\",\n apply: \"build\",\n\n config(config: UserConfig) {\n state.iconsDir = resolveIconsDir(config);\n },\n\n outputOptions(options) {\n if (findIconFiles(state.iconsDir).length === 0) {\n return;\n }\n\n return prependBanner(options, XDG_ENV_BANNER);\n },\n\n buildEnd() {\n emitIcons(this, findIconFiles(state.iconsDir));\n },\n };\n}\n\nexport { gtkxIcons };\n"]}
@@ -1,5 +1,5 @@
1
+ import type { ConfigLoader } from "@gtkx/config";
1
2
  import type { Plugin } from "vite";
2
- import { type ConfigLoader } from "@gtkx/config/internal";
3
3
  declare function gtkxReactCompiler(loadConfig?: ConfigLoader): Plugin;
4
4
  export { gtkxReactCompiler };
5
5
  //# sourceMappingURL=react-compiler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-compiler.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/react-compiler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAA8B,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AAgD9E,iBAAS,iBAAiB,CAAC,UAAU,GAAE,YAAmC,GAAG,MAAM,CA6BlF;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"react-compiler.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/react-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAA8B,MAAM,MAAM,CAAC;AAmD/D,iBAAS,iBAAiB,CAAC,UAAU,GAAE,YAAmC,GAAG,MAAM,CA6BlF;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}