@gtkx/cli 2.0.0-beta.1 → 2.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/dist/builder.d.ts +1 -0
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +17 -5
  4. package/dist/builder.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +9 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/codegen/reference.d.ts.map +1 -1
  10. package/dist/codegen/reference.js +1 -0
  11. package/dist/codegen/reference.js.map +1 -1
  12. package/dist/codegen/run-codegen.d.ts +4 -2
  13. package/dist/codegen/run-codegen.d.ts.map +1 -1
  14. package/dist/codegen/run-codegen.js +15 -16
  15. package/dist/codegen/run-codegen.js.map +1 -1
  16. package/dist/codegen/store-resolver.d.ts +2 -1
  17. package/dist/codegen/store-resolver.d.ts.map +1 -1
  18. package/dist/codegen/store-resolver.js +4 -3
  19. package/dist/codegen/store-resolver.js.map +1 -1
  20. package/dist/commands/build.d.ts +5 -0
  21. package/dist/commands/build.d.ts.map +1 -1
  22. package/dist/commands/build.js +83 -10
  23. package/dist/commands/build.js.map +1 -1
  24. package/dist/commands/codegen.d.ts +1 -0
  25. package/dist/commands/codegen.d.ts.map +1 -1
  26. package/dist/commands/codegen.js +6 -5
  27. package/dist/commands/codegen.js.map +1 -1
  28. package/dist/commands/deploy.d.ts +1 -0
  29. package/dist/commands/deploy.d.ts.map +1 -1
  30. package/dist/commands/deploy.js +4 -2
  31. package/dist/commands/deploy.js.map +1 -1
  32. package/dist/commands/dev.d.ts +9 -0
  33. package/dist/commands/dev.d.ts.map +1 -1
  34. package/dist/commands/dev.js +29 -4
  35. package/dist/commands/dev.js.map +1 -1
  36. package/dist/commands/docs.d.ts.map +1 -1
  37. package/dist/commands/docs.js +1 -0
  38. package/dist/commands/docs.js.map +1 -1
  39. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
  40. package/dist/deploy/freedesktop/metainfo.js +41 -2
  41. package/dist/deploy/freedesktop/metainfo.js.map +1 -1
  42. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  43. package/dist/deploy/freedesktop/validate.js +10 -4
  44. package/dist/deploy/freedesktop/validate.js.map +1 -1
  45. package/dist/deploy/nfpm/config.d.ts +3 -2
  46. package/dist/deploy/nfpm/config.d.ts.map +1 -1
  47. package/dist/deploy/nfpm/config.js +7 -4
  48. package/dist/deploy/nfpm/config.js.map +1 -1
  49. package/dist/deploy/nfpm/contents.d.ts.map +1 -1
  50. package/dist/deploy/nfpm/contents.js +8 -0
  51. package/dist/deploy/nfpm/contents.js.map +1 -1
  52. package/dist/deploy/node-runtime/elf.d.ts +2 -1
  53. package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
  54. package/dist/deploy/node-runtime/elf.js +32 -5
  55. package/dist/deploy/node-runtime/elf.js.map +1 -1
  56. package/dist/deploy/node-runtime/index.d.ts +2 -1
  57. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  58. package/dist/deploy/node-runtime/index.js +75 -5
  59. package/dist/deploy/node-runtime/index.js.map +1 -1
  60. package/dist/deploy/notices/node-runtime.js +2 -2
  61. package/dist/deploy/notices/node-runtime.js.map +1 -1
  62. package/dist/deploy/payload/launcher.d.ts.map +1 -1
  63. package/dist/deploy/payload/launcher.js +14 -1
  64. package/dist/deploy/payload/launcher.js.map +1 -1
  65. package/dist/deploy/payload/stage.js +1 -1
  66. package/dist/deploy/payload/stage.js.map +1 -1
  67. package/dist/deploy/run-deploy.d.ts +1 -0
  68. package/dist/deploy/run-deploy.d.ts.map +1 -1
  69. package/dist/deploy/run-deploy.js +100 -14
  70. package/dist/deploy/run-deploy.js.map +1 -1
  71. package/dist/deploy/settings/build-manifest.d.ts +6 -1
  72. package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
  73. package/dist/deploy/settings/build-manifest.js +15 -4
  74. package/dist/deploy/settings/build-manifest.js.map +1 -1
  75. package/dist/deploy/settings/extra-files.d.ts +1 -1
  76. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  77. package/dist/deploy/settings/extra-files.js +22 -1
  78. package/dist/deploy/settings/extra-files.js.map +1 -1
  79. package/dist/deploy/settings/index.d.ts +1 -0
  80. package/dist/deploy/settings/index.d.ts.map +1 -1
  81. package/dist/deploy/settings/index.js +2 -1
  82. package/dist/deploy/settings/index.js.map +1 -1
  83. package/dist/deploy/settings/paths.d.ts +2 -1
  84. package/dist/deploy/settings/paths.d.ts.map +1 -1
  85. package/dist/deploy/settings/paths.js +113 -5
  86. package/dist/deploy/settings/paths.js.map +1 -1
  87. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  88. package/dist/deploy/targets/flatpak-source.js +11 -2
  89. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  90. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -1
  91. package/dist/deploy/targets/nfpm-target.js +12 -7
  92. package/dist/deploy/targets/nfpm-target.js.map +1 -1
  93. package/dist/deploy/types.d.ts +1 -0
  94. package/dist/deploy/types.d.ts.map +1 -1
  95. package/dist/deploy/types.js.map +1 -1
  96. package/dist/dev/entry-env.d.ts +2 -1
  97. package/dist/dev/entry-env.d.ts.map +1 -1
  98. package/dist/dev/entry-env.js +2 -1
  99. package/dist/dev/entry-env.js.map +1 -1
  100. package/dist/dev/headless.d.ts +3 -0
  101. package/dist/dev/headless.d.ts.map +1 -0
  102. package/dist/dev/headless.js +35 -0
  103. package/dist/dev/headless.js.map +1 -0
  104. package/dist/dev/runner-deps.d.ts +1 -1
  105. package/dist/dev/runner-deps.d.ts.map +1 -1
  106. package/dist/dev/runner-deps.js +3 -3
  107. package/dist/dev/runner-deps.js.map +1 -1
  108. package/dist/dev/runner-main.d.ts.map +1 -1
  109. package/dist/dev/runner-main.js +8 -3
  110. package/dist/dev/runner-main.js.map +1 -1
  111. package/dist/dev/supervisor.d.ts +1 -0
  112. package/dist/dev/supervisor.d.ts.map +1 -1
  113. package/dist/dev/supervisor.js +4 -3
  114. package/dist/dev/supervisor.js.map +1 -1
  115. package/dist/i18n/catalogs.d.ts.map +1 -1
  116. package/dist/i18n/catalogs.js +1 -0
  117. package/dist/i18n/catalogs.js.map +1 -1
  118. package/dist/i18n/source-messages.d.ts.map +1 -1
  119. package/dist/i18n/source-messages.js +960 -8
  120. package/dist/i18n/source-messages.js.map +1 -1
  121. package/dist/internal/build-manifest.d.ts +5 -2
  122. package/dist/internal/build-manifest.d.ts.map +1 -1
  123. package/dist/internal/build-manifest.js +15 -2
  124. package/dist/internal/build-manifest.js.map +1 -1
  125. package/dist/internal/build-output.d.ts +8 -0
  126. package/dist/internal/build-output.d.ts.map +1 -0
  127. package/dist/internal/build-output.js +79 -0
  128. package/dist/internal/build-output.js.map +1 -0
  129. package/dist/internal/docs-elements.d.ts +1 -0
  130. package/dist/internal/docs-elements.d.ts.map +1 -1
  131. package/dist/internal/docs-elements.js +5 -4
  132. package/dist/internal/docs-elements.js.map +1 -1
  133. package/dist/internal/entry-arg.d.ts +4 -1
  134. package/dist/internal/entry-arg.d.ts.map +1 -1
  135. package/dist/internal/entry-arg.js +7 -1
  136. package/dist/internal/entry-arg.js.map +1 -1
  137. package/dist/internal/errors.d.ts +2 -1
  138. package/dist/internal/errors.d.ts.map +1 -1
  139. package/dist/internal/errors.js +1 -1
  140. package/dist/internal/errors.js.map +1 -1
  141. package/dist/internal/output-directory.d.ts +15 -0
  142. package/dist/internal/output-directory.d.ts.map +1 -0
  143. package/dist/internal/output-directory.js +490 -0
  144. package/dist/internal/output-directory.js.map +1 -0
  145. package/dist/internal/parent-process.d.ts +12 -0
  146. package/dist/internal/parent-process.d.ts.map +1 -0
  147. package/dist/internal/parent-process.js +74 -0
  148. package/dist/internal/parent-process.js.map +1 -0
  149. package/dist/internal/prepare-project.d.ts +2 -0
  150. package/dist/internal/prepare-project.d.ts.map +1 -1
  151. package/dist/internal/prepare-project.js +3 -3
  152. package/dist/internal/prepare-project.js.map +1 -1
  153. package/dist/internal/source-imports.js +1 -1
  154. package/dist/internal/source-imports.js.map +1 -1
  155. package/dist/mcp/client.js +2 -2
  156. package/dist/mcp/client.js.map +1 -1
  157. package/dist/vite-plugins/build-manifest.d.ts +5 -1
  158. package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
  159. package/dist/vite-plugins/build-manifest.js +2 -1
  160. package/dist/vite-plugins/build-manifest.js.map +1 -1
  161. package/dist/vite-plugins/ensure-store.d.ts +1 -1
  162. package/dist/vite-plugins/ensure-store.d.ts.map +1 -1
  163. package/dist/vite-plugins/ensure-store.js +2 -2
  164. package/dist/vite-plugins/ensure-store.js.map +1 -1
  165. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  166. package/dist/vite-plugins/i18n.js +58 -6
  167. package/dist/vite-plugins/i18n.js.map +1 -1
  168. package/dist/vite-plugins/index.d.ts +8 -1
  169. package/dist/vite-plugins/index.d.ts.map +1 -1
  170. package/dist/vite-plugins/index.js +6 -2
  171. package/dist/vite-plugins/index.js.map +1 -1
  172. package/dist/vite-plugins/native.d.ts.map +1 -1
  173. package/dist/vite-plugins/native.js +0 -4
  174. package/dist/vite-plugins/native.js.map +1 -1
  175. package/dist/vite-plugins/self-contained.d.ts.map +1 -1
  176. package/dist/vite-plugins/self-contained.js +159 -158
  177. package/dist/vite-plugins/self-contained.js.map +1 -1
  178. package/dist/vite-plugins/settings-worker-env.d.ts +1 -1
  179. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  180. package/dist/vite-plugins/settings-worker-env.js +2 -2
  181. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  182. package/dist/vitest-plugin.d.ts +2 -1
  183. package/dist/vitest-plugin.d.ts.map +1 -1
  184. package/dist/vitest-plugin.js +6 -6
  185. package/dist/vitest-plugin.js.map +1 -1
  186. package/package.json +10 -9
  187. package/src/builder.ts +18 -5
  188. package/src/cli.ts +9 -1
  189. package/src/codegen/reference.ts +1 -0
  190. package/src/codegen/run-codegen.ts +17 -19
  191. package/src/codegen/store-resolver.ts +5 -3
  192. package/src/commands/build.ts +13 -2
  193. package/src/commands/codegen.ts +6 -5
  194. package/src/commands/deploy.ts +4 -2
  195. package/src/commands/dev.ts +38 -4
  196. package/src/commands/docs.ts +1 -0
  197. package/src/deploy/freedesktop/metainfo.ts +73 -21
  198. package/src/deploy/freedesktop/validate.ts +12 -4
  199. package/src/deploy/nfpm/config.ts +13 -4
  200. package/src/deploy/nfpm/contents.ts +8 -0
  201. package/src/deploy/node-runtime/elf.ts +43 -5
  202. package/src/deploy/node-runtime/index.ts +107 -6
  203. package/src/deploy/notices/node-runtime.ts +2 -2
  204. package/src/deploy/payload/launcher.ts +20 -1
  205. package/src/deploy/payload/stage.ts +1 -1
  206. package/src/deploy/run-deploy.ts +56 -16
  207. package/src/deploy/settings/build-manifest.ts +28 -3
  208. package/src/deploy/settings/extra-files.ts +26 -2
  209. package/src/deploy/settings/index.ts +3 -1
  210. package/src/deploy/settings/paths.ts +70 -5
  211. package/src/deploy/targets/flatpak-source.ts +13 -2
  212. package/src/deploy/targets/nfpm-target.ts +13 -6
  213. package/src/deploy/types.ts +1 -0
  214. package/src/dev/entry-env.ts +2 -1
  215. package/src/dev/headless.ts +40 -0
  216. package/src/dev/runner-deps.ts +3 -3
  217. package/src/dev/runner-main.ts +10 -3
  218. package/src/dev/supervisor.ts +6 -3
  219. package/src/i18n/catalogs.ts +1 -0
  220. package/src/i18n/source-messages.ts +1429 -28
  221. package/src/internal/build-manifest.ts +25 -1
  222. package/src/internal/build-output.ts +113 -0
  223. package/src/internal/docs-elements.ts +10 -4
  224. package/src/internal/entry-arg.ts +8 -1
  225. package/src/internal/errors.ts +1 -1
  226. package/src/internal/output-directory.ts +699 -0
  227. package/src/internal/parent-process.ts +110 -0
  228. package/src/internal/prepare-project.ts +5 -5
  229. package/src/internal/source-imports.ts +1 -1
  230. package/src/mcp/client.ts +2 -2
  231. package/src/vite-plugins/build-manifest.ts +7 -1
  232. package/src/vite-plugins/ensure-store.ts +2 -2
  233. package/src/vite-plugins/i18n.ts +83 -5
  234. package/src/vite-plugins/index.ts +14 -7
  235. package/src/vite-plugins/native.ts +0 -5
  236. package/src/vite-plugins/self-contained.ts +184 -185
  237. package/src/vite-plugins/settings-worker-env.ts +2 -2
  238. package/src/vitest-plugin.ts +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"self-contained.js","sourceRoot":"","sources":["../../src/vite-plugins/self-contained.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ESTree, Plugin, VisitorObject } from \"vite\";\nimport { isBuiltin } from \"node:module\";\nimport { posix } from \"node:path\";\nimport { parseSync, Visitor } from \"vite\";\n\ntype Bindings = {\n declarations: Map<string, number>;\n factories: Set<string>;\n requires: Set<string>;\n urls: Set<string>;\n};\n\ntype Scan = {\n bindings: Bindings;\n calls: ESTree.CallExpression[];\n sources: string[];\n};\n\ntype Chunk = {\n fileName: string;\n code: string;\n};\n\ntype PatternItem =\n | ESTree.BindingPattern |\n ESTree.BindingProperty |\n ESTree.BindingRestElement |\n ESTree.FormalParameterRest |\n ESTree.TSParameterProperty |\n null;\n\nconst REQUIRE_FACTORY = \"createRequire\";\nconst REQUIRE_BINDING = \"require\";\nconst RESOLVE_PROPERTY = \"resolve\";\nconst MODULE_BUILTIN = \"node:module\";\nconst OUTPUT_DIRECTORY = \".\";\nconst RELATIVE_SPECIFIER = /^\\.\\.?(?:\\/|$)/;\n\nconst exportName = (name: ESTree.ModuleExportName): string | null => (name.type === \"Identifier\" ? name.name : null);\nconst referenceName = (node: ESTree.Argument): string | null => (node.type === \"Identifier\" ? node.name : null);\n\nconst countName = (declarations: Map<string, number>, name: string | null): void => {\n if (name !== null) {\n declarations.set(name, (declarations.get(name) ?? 0) + 1);\n }\n};\n\nconst boundPattern = (item: PatternItem): ESTree.BindingPattern | null => {\n if (item === null) {\n return null;\n }\n\n if (item.type === \"Property\") {\n return item.value;\n }\n\n if (item.type === \"RestElement\") {\n return item.argument;\n }\n\n return item.type === \"TSParameterProperty\" ? item.parameter : item;\n};\n\nconst countPatterns = (declarations: Map<string, number>, items: PatternItem[]): void => {\n for (const item of items) {\n countPattern(declarations, boundPattern(item));\n }\n};\n\nconst countPattern = (declarations: Map<string, number>, pattern: ESTree.BindingPattern | null): void => {\n if (pattern === null) {\n return;\n }\n\n if (pattern.type === \"Identifier\") {\n countName(declarations, pattern.name);\n\n return;\n }\n\n if (pattern.type === \"AssignmentPattern\") {\n countPattern(declarations, pattern.left);\n\n return;\n }\n\n countPatterns(declarations, pattern.type === \"ObjectPattern\" ? pattern.properties : pattern.elements);\n};\n\nconst countFunction = (\n declarations: Map<string, number>,\n node: ESTree.ArrowFunctionExpression | ESTree.Function,\n): void => {\n countPattern(declarations, node.id);\n countPatterns(declarations, node.params);\n};\n\nconst declarationVisitor = (declarations: Map<string, number>): VisitorObject => ({\n ArrowFunctionExpression: (node) => {\n countFunction(declarations, node);\n },\n CatchClause: (node) => {\n countPattern(declarations, node.param);\n },\n ClassDeclaration: (node) => {\n countPattern(declarations, node.id);\n },\n ClassExpression: (node) => {\n countPattern(declarations, node.id);\n },\n ExportSpecifier: (node) => {\n countName(declarations, exportName(node.local));\n },\n FunctionDeclaration: (node) => {\n countFunction(declarations, node);\n },\n FunctionExpression: (node) => {\n countFunction(declarations, node);\n },\n ImportDefaultSpecifier: (node) => {\n countPattern(declarations, node.local);\n },\n ImportNamespaceSpecifier: (node) => {\n countPattern(declarations, node.local);\n },\n ImportSpecifier: (node) => {\n countPattern(declarations, node.local);\n },\n VariableDeclarator: (node) => {\n countPattern(declarations, node.id);\n },\n});\n\nconst isUnshadowed = (name: string, bindings: Bindings): boolean => (bindings.declarations.get(name) ?? 0) <= 1;\n\nconst templateString = (node: ESTree.TemplateLiteral): string | null => {\n const [quasi] = node.quasis;\n\n return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;\n};\n\nconst literalString = (node: ESTree.Argument | null): string | null => {\n if (node?.type === \"TemplateLiteral\") {\n return templateString(node);\n }\n\n return node?.type === \"Literal\" && typeof node.value === \"string\" ? node.value : null;\n};\n\nconst isMetaUrl = (node: ESTree.Argument, bindings: Bindings): boolean => {\n if (node.type === \"MemberExpression\") {\n return node.object.type === \"MetaProperty\";\n }\n\n const name = referenceName(node);\n\n return name !== null && bindings.urls.has(name) && isUnshadowed(name, bindings);\n};\n\nconst hasMetaUrl = (node: ESTree.CallExpression, bindings: Bindings): boolean =>\n node.arguments.some((argument) => isMetaUrl(argument, bindings));\n\nconst isRequireName = (name: string | null, bindings: Bindings): boolean =>\n name !== null && (name === REQUIRE_BINDING || bindings.requires.has(name)) && isUnshadowed(name, bindings);\n\nconst isFactoryName = (name: string | null, bindings: Bindings): boolean =>\n name !== null && (name === REQUIRE_FACTORY || bindings.factories.has(name)) && isUnshadowed(name, bindings);\n\nconst isRequireFactory = (node: ESTree.Argument, bindings: Bindings): boolean =>\n node.type === \"CallExpression\" &&\n (isFactoryName(referenceName(node.callee), bindings) || hasMetaUrl(node, bindings));\n\nconst isResolveTarget = (object: ESTree.Expression, bindings: Bindings): boolean =>\n object.type === \"MetaProperty\" ||\n isRequireName(referenceName(object), bindings) ||\n isRequireFactory(object, bindings);\n\nconst isResolveMember = (callee: ESTree.Expression, bindings: Bindings): boolean =>\n callee.type === \"MemberExpression\" &&\n !callee.computed &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === RESOLVE_PROPERTY &&\n isResolveTarget(callee.object, bindings);\n\nconst isResolvingCall = (call: ESTree.CallExpression, bindings: Bindings): boolean =>\n hasMetaUrl(call, bindings) ||\n isRequireName(referenceName(call.callee), bindings) ||\n isRequireFactory(call.callee, bindings) ||\n isResolveMember(call.callee, bindings);\n\nconst collectFactories = (node: ESTree.ImportDeclaration, bindings: Bindings): void => {\n if (node.source.value !== MODULE_BUILTIN) {\n return;\n }\n\n for (const specifier of node.specifiers) {\n if (specifier.type === \"ImportSpecifier\" && exportName(specifier.imported) === REQUIRE_FACTORY) {\n bindings.factories.add(specifier.local.name);\n }\n }\n};\n\nconst collectBinding = (node: ESTree.VariableDeclarator, bindings: Bindings): void => {\n const { id, init } = node;\n\n if (init === null || id.type !== \"Identifier\") {\n return;\n }\n\n if (isMetaUrl(init, bindings)) {\n bindings.urls.add(id.name);\n }\n\n if (isRequireFactory(init, bindings)) {\n bindings.requires.add(id.name);\n }\n};\n\nconst collectSource = (scan: Scan, source: string | null): void => {\n if (source !== null) {\n scan.sources.push(source);\n }\n};\n\nconst collectCall = (scan: Scan, node: ESTree.CallExpression): void => {\n if (node.arguments.some((argument) => literalString(argument) !== null)) {\n scan.calls.push(node);\n }\n};\n\nconst scanVisitor = (scan: Scan): VisitorObject => ({\n CallExpression: (node) => {\n collectCall(scan, node);\n },\n ExportAllDeclaration: (node) => {\n collectSource(scan, node.source.value);\n },\n ExportNamedDeclaration: (node) => {\n collectSource(scan, node.source?.value ?? null);\n },\n ImportDeclaration: (node) => {\n collectFactories(node, scan.bindings);\n collectSource(scan, node.source.value);\n },\n ImportExpression: (node) => {\n collectSource(scan, literalString(node.source));\n },\n VariableDeclarator: (node) => {\n collectBinding(node, scan.bindings);\n },\n});\n\nconst scanChunk = (chunk: Chunk): Scan => {\n const scan: Scan = {\n bindings: { declarations: new Map(), factories: new Set(), requires: new Set(), urls: new Set() },\n calls: [],\n sources: [],\n };\n\n const { program } = parseSync(chunk.fileName, chunk.code);\n new Visitor(declarationVisitor(scan.bindings.declarations)).visit(program);\n new Visitor(scanVisitor(scan)).visit(program);\n\n return scan;\n};\n\nconst callSpecifiers = (scan: Scan): string[] =>\n scan.calls\n .filter((call) => isResolvingCall(call, scan.bindings))\n .flatMap((call) => call.arguments)\n .map((argument) => literalString(argument))\n .filter((specifier) => specifier !== null);\n\nconst isReachable = (specifier: string, directory: string, emitted: Set<string>): boolean => {\n if (isBuiltin(specifier)) {\n return true;\n }\n\n if (!RELATIVE_SPECIFIER.test(specifier)) {\n return false;\n }\n\n const target = posix.normalize(posix.join(directory, specifier));\n\n return target === OUTPUT_DIRECTORY || emitted.has(target);\n};\n\nconst unreachableSpecifiers = (chunk: Chunk, emitted: Set<string>): string[] => {\n const scan = scanChunk(chunk);\n const directory = posix.dirname(chunk.fileName);\n\n return new Set([...scan.sources, ...callSpecifiers(scan)])\n .values()\n .filter((specifier) => !isReachable(specifier, directory, emitted))\n .toArray()\n .toSorted((left, right) => left.localeCompare(right));\n};\n\nconst assertSelfContained = (chunk: Chunk, emitted: Set<string>): void => {\n const specifiers = unreachableSpecifiers(chunk, emitted);\n\n if (specifiers.length === 0) {\n return;\n }\n\n throw new Error(\n [\n `${chunk.fileName} resolves ${specifiers.join(\", \")} at runtime,`,\n \"so the built app only starts where that resolution succeeds from wherever it was installed.\",\n \"The artifact may resolve node: builtins and the files the build emits beside it, nothing else:\",\n \"bundle the module, emit the file, or read the data at build time.\",\n ].join(\" \"),\n );\n};\n\nfunction gtkxSelfContained(): Plugin {\n return {\n name: \"gtkx:self-contained\",\n apply: \"build\",\n\n generateBundle(_options, bundle) {\n const emitted = new Set(Object.keys(bundle));\n\n for (const output of Object.values(bundle)) {\n if (output.type === \"chunk\") {\n assertSelfContained({ fileName: output.fileName, code: output.code }, emitted);\n }\n }\n },\n };\n}\n\nexport { gtkxSelfContained };\n"]}
1
+ {"version":3,"file":"self-contained.js","sourceRoot":"","sources":["../../src/vite-plugins/self-contained.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { type NodePath, parseSync, type Scope, traverse } from \"@babel/core\";\nimport { isBuiltin } from \"node:module\";\nimport { posix } from \"node:path\";\n\ntype BindingKind = \"factory\" | \"module\" | \"require\" | \"url\";\n\ntype ResolvedBinding = NonNullable<ReturnType<Scope[\"getBinding\"]>>;\n\ntype Scan = {\n sources: string[];\n};\n\ntype Chunk = {\n fileName: string;\n code: string;\n};\n\nconst REQUIRE_FACTORY = \"createRequire\";\nconst REQUIRE_BINDING = \"require\";\nconst RESOLVE_PROPERTY = \"resolve\";\nconst URL_PROPERTY = \"url\";\nconst MODULE_BUILTINS = new Set([\"module\", \"node:module\"]);\nconst OUTPUT_DIRECTORY = \".\";\nconst RELATIVE_SPECIFIER = /^\\.\\.?(?:\\/|$)/;\n\nconst importedName = (path: NodePath): string | null => {\n if (!path.isImportSpecifier()) {\n return null;\n }\n\n const { imported } = path.node;\n\n return imported.type === \"Identifier\" ? imported.name : imported.value;\n};\n\nconst importKind = (path: NodePath): BindingKind | null => {\n const declaration = path.parentPath;\n\n if (!declaration.isImportDeclaration() || !MODULE_BUILTINS.has(declaration.node.source.value)) {\n return null;\n }\n\n if (importedName(path) === REQUIRE_FACTORY) {\n return \"factory\";\n }\n\n return path.isImportNamespaceSpecifier() || path.isImportDefaultSpecifier() ? \"module\" : null;\n};\n\nconst memberName = (path: NodePath): string | null => {\n if (!path.isMemberExpression()) {\n return null;\n }\n\n const property = path.get(\"property\");\n\n if (path.node.computed) {\n return property.isStringLiteral() ? property.node.value : null;\n }\n\n return property.isIdentifier() ? property.node.name : null;\n};\n\nconst isImportMeta = (path: NodePath): boolean =>\n path.isMetaProperty() && path.node.meta.name === \"import\" && path.node.property.name === \"meta\";\n\nconst isDirectMetaUrl = (path: NodePath): boolean => {\n if (!path.isMemberExpression() || memberName(path) !== URL_PROPERTY) {\n return false;\n }\n\n const object = path.get(\"object\");\n\n return isImportMeta(object);\n};\n\nconst bindingKind = (binding: ResolvedBinding, seen: Set<ResolvedBinding>): BindingKind | null => {\n if (seen.has(binding)) {\n return null;\n }\n\n const next = new Set(seen).add(binding);\n const imported = importKind(binding.path);\n\n if (imported !== null) {\n return imported;\n }\n\n if (!binding.path.isVariableDeclarator()) {\n return null;\n }\n\n const initializer = binding.path.get(\"init\");\n\n return initializer.node === null ? null : expressionKind(initializer, next);\n};\n\nconst nameKind = (scope: Scope, name: string, seen: Set<ResolvedBinding>): BindingKind | null => {\n const binding = scope.getBinding(name);\n\n if (binding !== undefined) {\n return bindingKind(binding, seen);\n }\n\n if (name === REQUIRE_FACTORY) {\n return \"factory\";\n }\n\n return name === REQUIRE_BINDING ? \"require\" : null;\n};\n\nconst isModuleExpression = (path: NodePath, seen: Set<ResolvedBinding>): boolean => {\n if (path.isIdentifier()) {\n return nameKind(path.scope, path.node.name, seen) === \"module\";\n }\n\n if (!path.isCallExpression()) {\n return false;\n }\n\n const [source] = path.get(\"arguments\");\n const callee = path.get(\"callee\");\n const sourceName = source === undefined ? null : literalString(source);\n\n return (\n sourceName !== null &&\n MODULE_BUILTINS.has(sourceName) &&\n isRequireExpression(callee, seen)\n );\n};\n\nconst isFactoryExpression = (path: NodePath, seen: Set<ResolvedBinding>): boolean => {\n if (path.isIdentifier()) {\n return nameKind(path.scope, path.node.name, seen) === \"factory\";\n }\n\n if (!path.isMemberExpression() || memberName(path) !== REQUIRE_FACTORY) {\n return false;\n }\n\n return isModuleExpression(path.get(\"object\"), seen);\n};\n\nconst isRequireFactoryCall = (path: NodePath, seen: Set<ResolvedBinding>): boolean => {\n if (!path.isCallExpression()) {\n return false;\n }\n\n const callee = path.get(\"callee\");\n\n return isFactoryExpression(callee, seen);\n};\n\nconst expressionKind = (path: NodePath, seen: Set<ResolvedBinding>): BindingKind | null => {\n if (isDirectMetaUrl(path)) {\n return \"url\";\n }\n\n if (path.isIdentifier()) {\n return nameKind(path.scope, path.node.name, seen);\n }\n\n if (isFactoryExpression(path, seen)) {\n return \"factory\";\n }\n\n if (isModuleExpression(path, seen)) {\n return \"module\";\n }\n\n return isRequireFactoryCall(path, seen) ? \"require\" : null;\n};\n\nconst isMetaUrl = (path: NodePath): boolean =>\n isDirectMetaUrl(path) ||\n (path.isIdentifier() && nameKind(path.scope, path.node.name, new Set()) === \"url\");\n\nconst isRequireExpression = (path: NodePath, seen: Set<ResolvedBinding> = new Set()): boolean =>\n isRequireFactoryCall(path, seen) ||\n (path.isIdentifier() && nameKind(path.scope, path.node.name, seen) === \"require\");\n\nconst hasMetaUrlArgument = (path: NodePath): boolean => {\n if (!path.isCallExpression()) {\n return false;\n }\n\n return path.get(\"arguments\").some((argument) => isMetaUrl(argument));\n};\n\nconst isResolveMember = (path: NodePath): boolean => {\n if (!path.isMemberExpression() || memberName(path) !== RESOLVE_PROPERTY) {\n return false;\n }\n\n const object = path.get(\"object\");\n\n return isImportMeta(object) || isRequireExpression(object);\n};\n\nconst isResolvingCall = (path: NodePath): boolean => {\n if (!path.isCallExpression()) {\n return false;\n }\n\n const callee = path.get(\"callee\");\n\n return hasMetaUrlArgument(path) || isRequireExpression(callee) || isResolveMember(callee);\n};\n\nconst literalString = (path: NodePath): string | null => {\n if (path.isStringLiteral()) {\n return path.node.value;\n }\n\n if (!path.isTemplateLiteral() || path.node.expressions.length > 0) {\n return null;\n }\n\n return path.node.quasis[0]?.value.cooked ?? null;\n};\n\nconst collectSource = (scan: Scan, source: string | null): void => {\n if (source !== null) {\n scan.sources.push(source);\n }\n};\n\nconst collectCallSources = (scan: Scan, path: NodePath): void => {\n if (!isResolvingCall(path) || !path.isCallExpression()) {\n return;\n }\n\n for (const argument of path.get(\"arguments\")) {\n collectSource(scan, literalString(argument));\n }\n};\n\nconst scanChunk = (chunk: Chunk): Scan => {\n const scan: Scan = { sources: [] };\n const ast = parseSync(chunk.code, {\n ast: true,\n babelrc: false,\n configFile: false,\n filename: chunk.fileName,\n sourceType: \"module\",\n });\n\n if (ast === null) {\n throw new Error(`Cannot inspect ${chunk.fileName}`);\n }\n\n traverse(ast, {\n CallExpression: (path) => {\n collectCallSources(scan, path);\n },\n ExportAllDeclaration: (path) => {\n collectSource(scan, path.node.source.value);\n },\n ExportNamedDeclaration: (path) => {\n collectSource(scan, path.node.source?.value ?? null);\n },\n ImportDeclaration: (path) => {\n collectSource(scan, path.node.source.value);\n },\n ImportExpression: (path) => {\n collectSource(scan, literalString(path.get(\"source\")));\n },\n });\n\n return scan;\n};\n\nconst isReachable = (specifier: string, directory: string, emitted: Set<string>): boolean => {\n if (isBuiltin(specifier)) {\n return true;\n }\n\n if (!RELATIVE_SPECIFIER.test(specifier)) {\n return false;\n }\n\n const target = posix.normalize(posix.join(directory, specifier));\n\n return target === OUTPUT_DIRECTORY || emitted.has(target);\n};\n\nconst unreachableSpecifiers = (chunk: Chunk, emitted: Set<string>): string[] => {\n const directory = posix.dirname(chunk.fileName);\n\n return new Set(scanChunk(chunk).sources)\n .values()\n .filter((specifier) => !isReachable(specifier, directory, emitted))\n .toArray()\n .toSorted((left, right) => left.localeCompare(right));\n};\n\nconst assertSelfContained = (chunk: Chunk, emitted: Set<string>): void => {\n const specifiers = unreachableSpecifiers(chunk, emitted);\n\n if (specifiers.length === 0) {\n return;\n }\n\n throw new Error(\n [\n `${chunk.fileName} resolves ${specifiers.join(\", \")} at runtime,`,\n \"so the built app only starts where that resolution succeeds from wherever it was installed.\",\n \"The artifact may resolve node: builtins and the files the build emits beside it, nothing else:\",\n \"bundle the module, emit the file, or read the data at build time.\",\n ].join(\" \"),\n );\n};\n\nfunction gtkxSelfContained(): Plugin {\n return {\n name: \"gtkx:self-contained\",\n apply: \"build\",\n\n generateBundle(_options, bundle) {\n const emitted = new Set(Object.keys(bundle));\n\n for (const output of Object.values(bundle)) {\n if (output.type === \"chunk\") {\n assertSelfContained({ fileName: output.fileName, code: output.code }, emitted);\n }\n }\n },\n };\n}\n\nexport { gtkxSelfContained };\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { Plugin } from "vitest/config";
2
- declare function gtkxSettingsWorkerEnv(): Plugin;
2
+ declare function gtkxSettingsWorkerEnv(configFile?: string): Plugin;
3
3
  export { gtkxSettingsWorkerEnv };
4
4
  //# sourceMappingURL=settings-worker-env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-worker-env.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,iBAAS,qBAAqB,IAAI,MAAM,CAwBvC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"settings-worker-env.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,iBAAS,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAwB1D;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { createConfigLoader } from "@gtkx/config/internal";
2
2
  import { prependSchemaDir, stageAndCompileProjectSchemas } from "../settings/schema.js";
3
- function gtkxSettingsWorkerEnv() {
4
- const loadConfig = createConfigLoader();
3
+ function gtkxSettingsWorkerEnv(configFile) {
4
+ const loadConfig = createConfigLoader({ configFile });
5
5
  return {
6
6
  name: "gtkx:settings-worker-env",
7
7
  enforce: "pre",
@@ -1 +1 @@
1
- {"version":3,"file":"settings-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,SAAS,qBAAqB;IAC1B,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,OAAO;QACH,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,MAAM,CAAC,MAAkB;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEvD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAEtC,OAAO;gBACH,IAAI,EAAE;oBACF,GAAG,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;iBACzF;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC","sourcesContent":["import type { UserConfig } from \"vite\";\nimport type { Plugin } from \"vitest/config\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { prependSchemaDir, stageAndCompileProjectSchemas } from \"../settings/schema.js\";\n\nfunction gtkxSettingsWorkerEnv(): Plugin {\n const loadConfig = createConfigLoader();\n\n return {\n name: \"gtkx:settings-worker-env\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n const dir = stageAndCompileProjectSchemas(loaded.root);\n\n if (dir === null) {\n return;\n }\n\n process.env.GTKX_DEV_SCHEMA_DIR = dir;\n\n return {\n test: {\n env: { GSETTINGS_SCHEMA_DIR: prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR) },\n },\n };\n },\n };\n}\n\nexport { gtkxSettingsWorkerEnv };\n"]}
1
+ {"version":3,"file":"settings-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,SAAS,qBAAqB,CAAC,UAAmB;IAC9C,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEtD,OAAO;QACH,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,MAAM,CAAC,MAAkB;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,6BAA6B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEvD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAEtC,OAAO;gBACH,IAAI,EAAE;oBACF,GAAG,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;iBACzF;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC","sourcesContent":["import type { UserConfig } from \"vite\";\nimport type { Plugin } from \"vitest/config\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { prependSchemaDir, stageAndCompileProjectSchemas } from \"../settings/schema.js\";\n\nfunction gtkxSettingsWorkerEnv(configFile?: string): Plugin {\n const loadConfig = createConfigLoader({ configFile });\n\n return {\n name: \"gtkx:settings-worker-env\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n const dir = stageAndCompileProjectSchemas(loaded.root);\n\n if (dir === null) {\n return;\n }\n\n process.env.GTKX_DEV_SCHEMA_DIR = dir;\n\n return {\n test: {\n env: { GSETTINGS_SCHEMA_DIR: prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR) },\n },\n };\n },\n };\n}\n\nexport { gtkxSettingsWorkerEnv };\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { Plugin } from "vite";
2
+ import { type PluginOptions } from "@gtkx/vitest";
2
3
  /**
3
4
  * Vite plugin stack for testing a GTKX application: the generated bindings the tests import,
4
5
  * the plugins the app is built with, the project's compiled GSettings schemas exposed to every
@@ -6,6 +7,6 @@ import type { Plugin } from "vite";
6
7
  *
7
8
  * @returns The plugins to spread into a Vitest config.
8
9
  */
9
- declare const gtkx: () => Plugin[];
10
+ declare const gtkx: (options?: PluginOptions) => Plugin[];
10
11
  export default gtkx;
11
12
  //# sourceMappingURL=vitest-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-plugin.d.ts","sourceRoot":"","sources":["../src/vitest-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC;;;;;;GAMG;AACH,QAAA,MAAM,IAAI,QAAO,MAAM,EAKtB,CAAC;AAEF,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"vitest-plugin.d.ts","sourceRoot":"","sources":["../src/vitest-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAK9D;;;;;;GAMG;AACH,QAAA,MAAM,IAAI,GAAI,UAAS,aAAkB,KAAG,MAAM,EAKjD,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,4 +1,4 @@
1
- import gtkxVitest from "@gtkx/vitest";
1
+ import gtkxVitest, {} from "@gtkx/vitest";
2
2
  import { gtkxEnsureStore } from "./vite-plugins/ensure-store.js";
3
3
  import { gtkxVitePlugins } from "./vite-plugins/index.js";
4
4
  import { gtkxSettingsWorkerEnv } from "./vite-plugins/settings-worker-env.js";
@@ -9,11 +9,11 @@ import { gtkxSettingsWorkerEnv } from "./vite-plugins/settings-worker-env.js";
9
9
  *
10
10
  * @returns The plugins to spread into a Vitest config.
11
11
  */
12
- const gtkx = () => [
13
- gtkxEnsureStore(),
14
- ...gtkxVitePlugins(),
15
- gtkxSettingsWorkerEnv(),
16
- gtkxVitest(),
12
+ const gtkx = (options = {}) => [
13
+ gtkxEnsureStore(options.configFile),
14
+ ...gtkxVitePlugins({ configFile: options.configFile }),
15
+ gtkxSettingsWorkerEnv(options.configFile),
16
+ gtkxVitest(options),
17
17
  ];
18
18
  export default gtkx;
19
19
  //# sourceMappingURL=vitest-plugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-plugin.js","sourceRoot":"","sources":["../src/vitest-plugin.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,IAAI,GAAG,GAAa,EAAE,CAAC;IACzB,eAAe,EAAE;IACjB,GAAG,eAAe,EAAE;IACpB,qBAAqB,EAAE;IACvB,UAAU,EAAE;CACf,CAAC;AAEF,eAAe,IAAI,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport gtkxVitest from \"@gtkx/vitest\";\nimport { gtkxEnsureStore } from \"./vite-plugins/ensure-store.js\";\nimport { gtkxVitePlugins } from \"./vite-plugins/index.js\";\nimport { gtkxSettingsWorkerEnv } from \"./vite-plugins/settings-worker-env.js\";\n\n/**\n * Vite plugin stack for testing a GTKX application: the generated bindings the tests import,\n * the plugins the app is built with, the project's compiled GSettings schemas exposed to every\n * test worker, and a headless display per worker.\n *\n * @returns The plugins to spread into a Vitest config.\n */\nconst gtkx = (): Plugin[] => [\n gtkxEnsureStore(),\n ...gtkxVitePlugins(),\n gtkxSettingsWorkerEnv(),\n gtkxVitest(),\n];\n\nexport default gtkx;\n"]}
1
+ {"version":3,"file":"vitest-plugin.js","sourceRoot":"","sources":["../src/vitest-plugin.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,EAAE,EAAsB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,IAAI,GAAG,CAAC,UAAyB,EAAE,EAAY,EAAE,CAAC;IACpD,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC;IACnC,GAAG,eAAe,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;IACtD,qBAAqB,CAAC,OAAO,CAAC,UAAU,CAAC;IACzC,UAAU,CAAC,OAAO,CAAC;CACtB,CAAC;AAEF,eAAe,IAAI,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport gtkxVitest, { type PluginOptions } from \"@gtkx/vitest\";\nimport { gtkxEnsureStore } from \"./vite-plugins/ensure-store.js\";\nimport { gtkxVitePlugins } from \"./vite-plugins/index.js\";\nimport { gtkxSettingsWorkerEnv } from \"./vite-plugins/settings-worker-env.js\";\n\n/**\n * Vite plugin stack for testing a GTKX application: the generated bindings the tests import,\n * the plugins the app is built with, the project's compiled GSettings schemas exposed to every\n * test worker, and a headless display per worker.\n *\n * @returns The plugins to spread into a Vitest config.\n */\nconst gtkx = (options: PluginOptions = {}): Plugin[] => [\n gtkxEnsureStore(options.configFile),\n ...gtkxVitePlugins({ configFile: options.configFile }),\n gtkxSettingsWorkerEnv(options.configFile),\n gtkxVitest(options),\n];\n\nexport default gtkx;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtkx/cli",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.0-beta.3",
4
4
  "description": "GTK app toolchain for React: scaffold, dev server, build, docs.",
5
5
  "keywords": [
6
6
  "gtkx",
@@ -70,16 +70,17 @@
70
70
  "dependencies": {
71
71
  "@babel/core": "^8.0.1",
72
72
  "@babel/preset-typescript": "^8.0.1",
73
- "@gtkx/codegen": "2.0.0-beta.1",
74
- "@gtkx/config": "2.0.0-beta.1",
75
- "@gtkx/mcp": "2.0.0-beta.1",
76
- "@gtkx/runtime": "2.0.0-beta.1",
77
- "@gtkx/utils": "2.0.0-beta.1",
78
- "@gtkx/vitest": "2.0.0-beta.1",
73
+ "@gtkx/codegen": "2.0.0-beta.3",
74
+ "@gtkx/config": "2.0.0-beta.3",
75
+ "@gtkx/mcp": "2.0.0-beta.3",
76
+ "@gtkx/native": "2.0.0-beta.3",
77
+ "@gtkx/runtime": "2.0.0-beta.3",
78
+ "@gtkx/utils": "2.0.0-beta.3",
79
+ "@gtkx/vitest": "2.0.0-beta.3",
79
80
  "@swc/core": "^1.16.1",
80
81
  "babel-plugin-react-compiler": "^1.0.0",
81
82
  "citty": "^0.2.2",
82
- "create-gtkx": "2.0.0-beta.1",
83
+ "create-gtkx": "2.0.0-beta.3",
83
84
  "fast-xml-builder": "^1.3.1",
84
85
  "fast-xml-parser": "^5.11.1",
85
86
  "hosted-git-info": "^10.1.1",
@@ -89,7 +90,7 @@
89
90
  "yaml": "^2.9.0"
90
91
  },
91
92
  "devDependencies": {
92
- "@gtkx/testing": "2.0.0-beta.1",
93
+ "@gtkx/testing": "2.0.0-beta.3",
93
94
  "@types/babel__core": "^7.20.5",
94
95
  "@types/hosted-git-info": "^3.0.5",
95
96
  "@types/react-refresh": "^0.14.7",
package/src/builder.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { join, posix } from "node:path";
1
+ import { loadConfig } from "@gtkx/config";
2
+ import { join, posix, relative, resolve } from "node:path";
2
3
  import { type InlineConfig, mergeConfig, build as viteBuild } from "vite";
3
- import { createBuildManifestCollector } from "./internal/build-manifest.js";
4
+ import { configDigest, createBuildManifestCollector } from "./internal/build-manifest.js";
4
5
  import { gtkxBuildManifest } from "./vite-plugins/build-manifest.js";
5
6
  import { BUNDLE_FILENAME, ESM_EXTENSION } from "./vite-plugins/esm-extension.js";
6
7
  import { gtkxVitePlugins } from "./vite-plugins/index.js";
@@ -10,6 +11,7 @@ import { gtkxWorker } from "./vite-plugins/worker.js";
10
11
 
11
12
  type BuildOptions = {
12
13
  entry: string;
14
+ configFile?: string | undefined;
13
15
  shouldPreserveI18nMetadata?: boolean | undefined;
14
16
  vite?: InlineConfig | undefined;
15
17
  };
@@ -34,16 +36,27 @@ const buildDefaults: InlineConfig = {
34
36
 
35
37
  const build = async (options: BuildOptions): Promise<string> => {
36
38
  const { entry, shouldPreserveI18nMetadata = true, vite: viteConfig } = options;
37
- const root = viteConfig?.root ?? process.cwd();
39
+ const root = resolve(viteConfig?.root ?? process.cwd());
38
40
  const assetsDir = viteConfig?.build?.assetsDir ?? DEFAULT_ASSETS_DIR;
39
41
  const buildManifest = createBuildManifestCollector();
42
+ const loadedConfig = await loadConfig(root, { mode: BUILD_MODE, configFile: options.configFile });
43
+ const buildConfigIdentity = {
44
+ configFile: posix.normalize(relative(root, loadedConfig.configFile).replaceAll("\\", "/")),
45
+ configDigest: configDigest(loadedConfig.config),
46
+ };
40
47
 
41
48
  const forced: InlineConfig = {
42
49
  plugins: [
43
- ...gtkxVitePlugins(BUILD_MODE, entry, buildManifest, shouldPreserveI18nMetadata),
50
+ ...gtkxVitePlugins({
51
+ mode: BUILD_MODE,
52
+ entryPath: entry,
53
+ buildManifest,
54
+ shouldPreserveI18nMetadata,
55
+ configFile: options.configFile,
56
+ }),
44
57
  gtkxWorker(),
45
58
  gtkxNative(root),
46
- gtkxBuildManifest(root, buildManifest),
59
+ gtkxBuildManifest(root, buildManifest, buildConfigIdentity),
47
60
  gtkxSelfContained(),
48
61
  ],
49
62
  build: {
package/src/cli.ts CHANGED
@@ -1,7 +1,15 @@
1
+ import { assertSupportedNodeVersion } from "@gtkx/config/internal";
1
2
  import { defineCommand, runMain } from "citty";
2
3
  import packageManifest from "../package.json" with { type: "json" };
3
4
  import { splitApplicationArgs } from "./internal/application-args.js";
4
- import { withErrorBoundary } from "./internal/errors.js";
5
+ import { printError, withErrorBoundary } from "./internal/errors.js";
6
+ import "./internal/parent-process.js";
7
+
8
+ try {
9
+ assertSupportedNodeVersion();
10
+ } catch (error) {
11
+ printError(error);
12
+ }
5
13
 
6
14
  const version = packageManifest.version;
7
15
  const { cliArgs } = splitApplicationArgs(process.argv.slice(2));
@@ -38,6 +38,7 @@ const writeReference = async (options: WriteReferenceOptions): Promise<Reference
38
38
  basePath: REFERENCE_PATH,
39
39
  linkStyle: "file",
40
40
  props: builtin.props,
41
+ acceptedChildTypes: builtin.acceptedChildTypes,
41
42
  omittedProps: mergeOmittedProps(builtin.omittedProps, resolveOmittedProps(config.elements)),
42
43
  isForced: options.isForced === true,
43
44
  });
@@ -24,6 +24,7 @@ import { type CodegenContext, type CodegenStore, resolveCodegenContext } from ".
24
24
  type RunCodegenOptions = {
25
25
  cwd?: string;
26
26
  mode?: string | undefined;
27
+ configFile?: string | undefined;
27
28
  isForced?: boolean;
28
29
  inputs?: CodegenInputs;
29
30
  resolved?: LoadedConfig;
@@ -58,6 +59,7 @@ type PreparedCodegen = CodegenInputs & { isForced: boolean };
58
59
  type EnsureGeneratedOptions = {
59
60
  shouldAnnounce?: boolean;
60
61
  mode?: string;
62
+ configFile?: string | undefined;
61
63
  shouldPreserveI18nMetadata?: boolean | undefined;
62
64
  };
63
65
 
@@ -84,6 +86,7 @@ const codegenOptions = ({ store, libraries, girPath, elements }: CodegenOptionsI
84
86
  storeDir: store.giStoreDir,
85
87
  linkDir: store.giLinkDir,
86
88
  version: store.runtimeVersion,
89
+ owner: store.owner,
87
90
  },
88
91
  jsx:
89
92
  store.react === null
@@ -92,6 +95,7 @@ const codegenOptions = ({ store, libraries, girPath, elements }: CodegenOptionsI
92
95
  storeDir: store.jsxStoreDir,
93
96
  linkDir: store.jsxLinkDir,
94
97
  version: store.react.version,
98
+ owner: store.owner,
95
99
  },
96
100
  userComponents: resolveElementComponents(elements),
97
101
  userProps: resolveElementProps(elements),
@@ -109,14 +113,6 @@ const disabledCodegenResult = (configFile: string): RunCodegenResult => ({
109
113
  libraries: [],
110
114
  });
111
115
 
112
- const clearGeneratedStores = (store: CodegenStore): void => {
113
- removeStores(
114
- store.react === null
115
- ? [store.giStoreDir, store.giLinkDir]
116
- : [store.giStoreDir, store.giLinkDir, store.jsxStoreDir, store.jsxLinkDir],
117
- );
118
- };
119
-
120
116
  const prepareCodegen = (options: RunCodegenOptions, cwd: string, config: Config): PreparedCodegen => {
121
117
  const { girPath, libraries, store } = options.inputs ?? resolveCodegenInputs(cwd, config);
122
118
 
@@ -131,7 +127,10 @@ const prepareCodegen = (options: RunCodegenOptions, cwd: string, config: Config)
131
127
 
132
128
  const runCodegen = async (options: RunCodegenOptions = {}): Promise<RunCodegenResult> => {
133
129
  const cwd = options.cwd ?? process.cwd();
134
- const { config, configFile } = options.resolved ?? (await loadConfig(cwd, { mode: options.mode }));
130
+ const { config, configFile } = options.resolved ?? (await loadConfig(cwd, {
131
+ mode: options.mode,
132
+ configFile: options.configFile,
133
+ }));
135
134
  await syncI18n(cwd, config.applicationId, options.shouldPreserveI18nMetadata);
136
135
  emitSchemaEnv(cwd);
137
136
 
@@ -143,10 +142,6 @@ const runCodegen = async (options: RunCodegenOptions = {}): Promise<RunCodegenRe
143
142
 
144
143
  const { girPath, libraries, store, isForced } = prepareCodegen(options, cwd, config);
145
144
 
146
- if (options.isForced) {
147
- clearGeneratedStores(store);
148
- }
149
-
150
145
  const result = await runCodegenCore({
151
146
  ...codegenOptions({ store, libraries, girPath, elements: config.elements }),
152
147
  isForced,
@@ -190,9 +185,9 @@ const syncI18n = async (
190
185
  await emitI18nTypes(root);
191
186
  };
192
187
 
193
- const isCodegenDisabled = async (cwd: string, mode?: string): Promise<boolean> => {
188
+ const isCodegenDisabled = async (cwd: string, mode?: string, configFile?: string): Promise<boolean> => {
194
189
  try {
195
- const { config } = await loadConfig(cwd, { mode });
190
+ const { config } = await loadConfig(cwd, { mode, configFile });
196
191
 
197
192
  return config.codegen === false;
198
193
  } catch {
@@ -257,18 +252,21 @@ const ensureGeneratedIn = async (
257
252
 
258
253
  /* eslint-disable-next-line unicorn/consistent-boolean-name -- the boolean reports whether codegen ran */
259
254
  const ensureGenerated = async (cwd: string, options: EnsureGeneratedOptions = {}): Promise<boolean> =>
260
- isPreflightSkipped(options) ? false : generate(await resolveCodegenContext(cwd, options.mode), options);
255
+ isPreflightSkipped(options)
256
+ ? false
257
+ : generate(await resolveCodegenContext(cwd, options.mode, options.configFile), options);
261
258
 
262
259
  const resolveConfigWatch = async (
263
260
  cwd: string,
264
261
  mode?: string,
262
+ configFile?: string,
265
263
  ): Promise<{ paths: string[]; regenerate: () => Promise<void> }> => {
266
- const { configFile, root } = await loadConfig(cwd, { mode });
264
+ const loaded = await loadConfig(cwd, { mode, configFile });
267
265
 
268
266
  return {
269
- paths: [resolve(root, configFile)],
267
+ paths: [resolve(loaded.root, loaded.configFile)],
270
268
  regenerate: async () => {
271
- await runCodegen({ cwd: root, mode });
269
+ await runCodegen({ cwd: loaded.root, mode, configFile: loaded.configFile });
272
270
  },
273
271
  };
274
272
  };
@@ -1,6 +1,6 @@
1
1
  import { resolveStore } from "@gtkx/codegen";
2
2
  import { type Config, loadConfig } from "@gtkx/config";
3
- import { existsSync } from "node:fs";
3
+ import { existsSync, realpathSync } from "node:fs";
4
4
  import { createRequire } from "node:module";
5
5
  import { dirname, join } from "node:path";
6
6
  import { pathToFileURL } from "node:url";
@@ -11,6 +11,7 @@ type CodegenStore = {
11
11
  jsxStoreDir: string;
12
12
  jsxLinkDir: string;
13
13
  runtimeVersion: string;
14
+ owner: string;
14
15
  react: CodegenReactPackage | null;
15
16
  };
16
17
 
@@ -54,6 +55,7 @@ const resolveCodegenStore = (dir: string): CodegenStore => {
54
55
  jsxStoreDir: store.jsx?.storeDir ?? siblingStore(store.gi.storeDir),
55
56
  jsxLinkDir: store.jsx?.linkDir ?? siblingStore(store.gi.linkDir),
56
57
  runtimeVersion: store.gi.version,
58
+ owner: store.gi.owner ?? realpathSync(dir),
57
59
  react:
58
60
  hasReactRuntime && store.jsx !== null
59
61
  ? { version: store.jsx.version }
@@ -61,8 +63,8 @@ const resolveCodegenStore = (dir: string): CodegenStore => {
61
63
  };
62
64
  };
63
65
 
64
- const resolveCodegenContext = async (cwd: string, mode?: string): Promise<CodegenContext> => {
65
- const { config, configFile } = await loadConfig(cwd, { mode });
66
+ const resolveCodegenContext = async (cwd: string, mode?: string, selectedConfig?: string): Promise<CodegenContext> => {
67
+ const { config, configFile } = await loadConfig(cwd, { mode, configFile: selectedConfig });
66
68
 
67
69
  return { root: cwd, config, configFile };
68
70
  };
@@ -1,7 +1,8 @@
1
1
  import { info } from "@gtkx/utils";
2
2
  import { defineCommand } from "citty";
3
3
  import { build as buildApp } from "../builder.js";
4
- import { entryArg } from "../internal/entry-arg.js";
4
+ import { prepareBuildOutDir, resolveBuildOutDir } from "../internal/build-output.js";
5
+ import { configArg, entryArg } from "../internal/entry-arg.js";
5
6
  import { prepareProject } from "../internal/prepare-project.js";
6
7
 
7
8
  const BUILD_MODE = "production";
@@ -13,18 +14,28 @@ const build = defineCommand({
13
14
  },
14
15
  args: {
15
16
  ...entryArg,
17
+ ...configArg,
18
+ out: {
19
+ type: "string",
20
+ description: "Output directory below the project root (default: dist)",
21
+ },
16
22
  },
17
23
  async run({ args }) {
18
- const { cwd, entry } = await prepareProject(args, BUILD_MODE);
24
+ const { cwd, entry, configFile } = await prepareProject(args, BUILD_MODE);
25
+ const outDir = resolveBuildOutDir(cwd, args.out);
26
+ using preparedOutput = prepareBuildOutDir(cwd, outDir);
19
27
  info(`Building ${entry}`);
20
28
 
21
29
  const bundlePath = await buildApp({
22
30
  entry,
31
+ configFile,
23
32
  vite: {
24
33
  root: cwd,
34
+ build: { outDir: preparedOutput.path, emptyOutDir: false },
25
35
  },
26
36
  });
27
37
 
38
+ preparedOutput.commit();
28
39
  info(`Build complete: ${bundlePath}`);
29
40
  },
30
41
  });
@@ -2,7 +2,7 @@ import { info } from "@gtkx/utils";
2
2
  import { defineCommand } from "citty";
3
3
  import { formatCodegenResult } from "../codegen/report.js";
4
4
  import { ensureGenerated, isCodegenDisabled, runCodegen } from "../codegen/run-codegen.js";
5
- import { cwdArg, resolveCwd } from "../internal/entry-arg.js";
5
+ import { configArg, cwdArg, resolveCwd } from "../internal/entry-arg.js";
6
6
 
7
7
  const FORCED_WHILE_DISABLED_MESSAGE =
8
8
  "codegen is disabled for this project, so --force has no store to regenerate here. " +
@@ -20,29 +20,30 @@ const codegen = defineCommand({
20
20
  description: "Wipe the generated store and regenerate unconditionally (recover a corrupted store)",
21
21
  default: false,
22
22
  },
23
+ ...configArg,
23
24
  ...cwdArg,
24
25
  },
25
26
  async run({ args }) {
26
27
  const cwd = resolveCwd(args);
27
- const isDisabled = await isCodegenDisabled(cwd);
28
+ const isDisabled = await isCodegenDisabled(cwd, undefined, args.config);
28
29
  checkForce(isDisabled, args.force);
29
30
 
30
31
  if (isDisabled) {
31
- await runCodegen({ cwd });
32
+ await runCodegen({ cwd, configFile: args.config });
32
33
  info("codegen: disabled for this project; reusing an installed binding store");
33
34
 
34
35
  return;
35
36
  }
36
37
 
37
38
  if (!args.force) {
38
- const isRan = await ensureGenerated(cwd);
39
+ const isRan = await ensureGenerated(cwd, { configFile: args.config });
39
40
  info(isRan ? "codegen: regenerated stale bindings" : "codegen: bindings up to date");
40
41
 
41
42
  return;
42
43
  }
43
44
 
44
45
  const startedAt = Date.now();
45
- const result = await runCodegen({ cwd, isForced: true });
46
+ const result = await runCodegen({ cwd, configFile: args.config, isForced: true });
46
47
  const lines = formatCodegenResult(result, Date.now() - startedAt);
47
48
 
48
49
  for (const line of lines) {
@@ -1,7 +1,7 @@
1
1
  import { defineCommand } from "citty";
2
2
  import { KNOWN_NAMES } from "../deploy/registry.js";
3
3
  import { runDeploy } from "../deploy/run-deploy.js";
4
- import { entryArg } from "../internal/entry-arg.js";
4
+ import { configArg, entryArg } from "../internal/entry-arg.js";
5
5
  import { resolveProject } from "../internal/prepare-project.js";
6
6
 
7
7
  const DEPLOY_MODE = "production";
@@ -13,6 +13,7 @@ const deploy = defineCommand({
13
13
  },
14
14
  args: {
15
15
  ...entryArg,
16
+ ...configArg,
16
17
  target: {
17
18
  type: "string",
18
19
  description: `Comma-separated package formats to build (${KNOWN_NAMES})`,
@@ -31,11 +32,12 @@ const deploy = defineCommand({
31
32
  },
32
33
  },
33
34
  async run({ args }) {
34
- const { cwd, entry } = await resolveProject(args, DEPLOY_MODE);
35
+ const { cwd, entry, configFile } = await resolveProject(args, DEPLOY_MODE);
35
36
 
36
37
  await runDeploy({
37
38
  entry,
38
39
  cwd,
40
+ configFile,
39
41
  targets: args.target,
40
42
  outDir: args.out,
41
43
  shouldPrintManifests: args["print-manifests"] === true,
@@ -1,8 +1,11 @@
1
+ import { armParentDeath } from "@gtkx/native/internal";
1
2
  import { defineCommand } from "citty";
2
3
  import { resolveConfigWatch } from "../codegen/run-codegen.js";
4
+ import { startHeadlessDevDisplay } from "../dev/headless.js";
3
5
  import { type DevWatch, runDevSupervisor } from "../dev/supervisor.js";
4
6
  import { splitApplicationArgs } from "../internal/application-args.js";
5
- import { entryArg } from "../internal/entry-arg.js";
7
+ import { configArg, entryArg } from "../internal/entry-arg.js";
8
+ import { getInitialProcessGroupOwner, initialParentId } from "../internal/parent-process.js";
6
9
  import { prepareProject } from "../internal/prepare-project.js";
7
10
 
8
11
  const DEV_MODE = "development";
@@ -14,12 +17,43 @@ const dev = defineCommand({
14
17
  },
15
18
  args: {
16
19
  ...entryArg,
20
+ ...configArg,
21
+ headless: {
22
+ type: "boolean",
23
+ description: "Run on an isolated headless Wayland display",
24
+ },
25
+ size: {
26
+ type: "string",
27
+ description: "Headless display size as WIDTHxHEIGHT",
28
+ },
17
29
  },
18
30
  async run({ args }) {
19
- const { cwd, entry: entryPath } = await prepareProject(args, DEV_MODE);
20
- const watch: DevWatch | undefined = await resolveConfigWatch(cwd, DEV_MODE);
31
+ const initialProcessGroupOwner = getInitialProcessGroupOwner();
32
+
33
+ if (
34
+ !armParentDeath(
35
+ initialParentId,
36
+ initialProcessGroupOwner?.pid,
37
+ initialProcessGroupOwner?.startTime,
38
+ )
39
+ ) {
40
+ throw new Error("The process that launched gtkx dev exited during startup");
41
+ }
42
+
43
+ if (args.size !== undefined && !args.headless) {
44
+ throw new Error("--size requires --headless");
45
+ }
46
+
47
+ const { cwd, entry: entryPath, configFile } = await prepareProject(args, DEV_MODE);
48
+ const watch: DevWatch | undefined = await resolveConfigWatch(cwd, DEV_MODE, configFile);
21
49
  const { applicationArgs } = splitApplicationArgs(process.argv.slice(2));
22
- await runDevSupervisor({ entryPath, cwd, args: applicationArgs, watch });
50
+ const stopHeadless = args.headless ? await startHeadlessDevDisplay(args.size) : undefined;
51
+
52
+ try {
53
+ await runDevSupervisor({ entryPath, cwd, configFile, args: applicationArgs, watch });
54
+ } finally {
55
+ stopHeadless?.();
56
+ }
23
57
  },
24
58
  });
25
59
 
@@ -68,6 +68,7 @@ const docs = defineCommand({
68
68
  outDir,
69
69
  basePath: args["base-path"],
70
70
  props: builtin.props,
71
+ acceptedChildTypes: builtin.acceptedChildTypes,
71
72
  omittedProps: mergeOmittedProps(builtin.omittedProps, resolveOmittedProps(config.elements)),
72
73
  isForced: args.force,
73
74
  });