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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) 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.js +2 -0
  6. package/dist/cli.js.map +1 -1
  7. package/dist/codegen/run-codegen.d.ts +4 -2
  8. package/dist/codegen/run-codegen.d.ts.map +1 -1
  9. package/dist/codegen/run-codegen.js +13 -8
  10. package/dist/codegen/run-codegen.js.map +1 -1
  11. package/dist/codegen/store-resolver.d.ts +1 -1
  12. package/dist/codegen/store-resolver.d.ts.map +1 -1
  13. package/dist/codegen/store-resolver.js +2 -2
  14. package/dist/codegen/store-resolver.js.map +1 -1
  15. package/dist/commands/build.d.ts +5 -0
  16. package/dist/commands/build.d.ts.map +1 -1
  17. package/dist/commands/build.js +83 -10
  18. package/dist/commands/build.js.map +1 -1
  19. package/dist/commands/codegen.d.ts +1 -0
  20. package/dist/commands/codegen.d.ts.map +1 -1
  21. package/dist/commands/codegen.js +6 -5
  22. package/dist/commands/codegen.js.map +1 -1
  23. package/dist/commands/deploy.d.ts +1 -0
  24. package/dist/commands/deploy.d.ts.map +1 -1
  25. package/dist/commands/deploy.js +4 -2
  26. package/dist/commands/deploy.js.map +1 -1
  27. package/dist/commands/dev.d.ts +8 -0
  28. package/dist/commands/dev.d.ts.map +1 -1
  29. package/dist/commands/dev.js +19 -1
  30. package/dist/commands/dev.js.map +1 -1
  31. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
  32. package/dist/deploy/freedesktop/metainfo.js +41 -2
  33. package/dist/deploy/freedesktop/metainfo.js.map +1 -1
  34. package/dist/deploy/nfpm/config.d.ts.map +1 -1
  35. package/dist/deploy/nfpm/config.js +5 -2
  36. package/dist/deploy/nfpm/config.js.map +1 -1
  37. package/dist/deploy/nfpm/contents.d.ts.map +1 -1
  38. package/dist/deploy/nfpm/contents.js +8 -0
  39. package/dist/deploy/nfpm/contents.js.map +1 -1
  40. package/dist/deploy/node-runtime/elf.d.ts +2 -1
  41. package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
  42. package/dist/deploy/node-runtime/elf.js +32 -5
  43. package/dist/deploy/node-runtime/elf.js.map +1 -1
  44. package/dist/deploy/node-runtime/index.d.ts +2 -1
  45. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  46. package/dist/deploy/node-runtime/index.js +73 -4
  47. package/dist/deploy/node-runtime/index.js.map +1 -1
  48. package/dist/deploy/notices/node-runtime.js +2 -2
  49. package/dist/deploy/notices/node-runtime.js.map +1 -1
  50. package/dist/deploy/payload/launcher.d.ts.map +1 -1
  51. package/dist/deploy/payload/launcher.js +14 -1
  52. package/dist/deploy/payload/launcher.js.map +1 -1
  53. package/dist/deploy/payload/stage.js +1 -1
  54. package/dist/deploy/payload/stage.js.map +1 -1
  55. package/dist/deploy/run-deploy.d.ts +1 -0
  56. package/dist/deploy/run-deploy.d.ts.map +1 -1
  57. package/dist/deploy/run-deploy.js +100 -14
  58. package/dist/deploy/run-deploy.js.map +1 -1
  59. package/dist/deploy/settings/build-manifest.d.ts +6 -1
  60. package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
  61. package/dist/deploy/settings/build-manifest.js +15 -4
  62. package/dist/deploy/settings/build-manifest.js.map +1 -1
  63. package/dist/deploy/settings/extra-files.d.ts +1 -1
  64. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  65. package/dist/deploy/settings/extra-files.js +22 -1
  66. package/dist/deploy/settings/extra-files.js.map +1 -1
  67. package/dist/deploy/settings/index.d.ts +1 -0
  68. package/dist/deploy/settings/index.d.ts.map +1 -1
  69. package/dist/deploy/settings/index.js +2 -1
  70. package/dist/deploy/settings/index.js.map +1 -1
  71. package/dist/deploy/settings/paths.d.ts +2 -1
  72. package/dist/deploy/settings/paths.d.ts.map +1 -1
  73. package/dist/deploy/settings/paths.js +113 -5
  74. package/dist/deploy/settings/paths.js.map +1 -1
  75. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  76. package/dist/deploy/targets/flatpak-source.js +11 -2
  77. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  78. package/dist/deploy/types.d.ts +1 -0
  79. package/dist/deploy/types.d.ts.map +1 -1
  80. package/dist/deploy/types.js.map +1 -1
  81. package/dist/dev/headless.d.ts +3 -0
  82. package/dist/dev/headless.d.ts.map +1 -0
  83. package/dist/dev/headless.js +35 -0
  84. package/dist/dev/headless.js.map +1 -0
  85. package/dist/dev/runner-deps.js +1 -1
  86. package/dist/dev/runner-deps.js.map +1 -1
  87. package/dist/i18n/source-messages.d.ts.map +1 -1
  88. package/dist/i18n/source-messages.js +835 -1
  89. package/dist/i18n/source-messages.js.map +1 -1
  90. package/dist/internal/build-manifest.d.ts +5 -2
  91. package/dist/internal/build-manifest.d.ts.map +1 -1
  92. package/dist/internal/build-manifest.js +15 -2
  93. package/dist/internal/build-manifest.js.map +1 -1
  94. package/dist/internal/build-output.d.ts +8 -0
  95. package/dist/internal/build-output.d.ts.map +1 -0
  96. package/dist/internal/build-output.js +69 -0
  97. package/dist/internal/build-output.js.map +1 -0
  98. package/dist/internal/entry-arg.d.ts +4 -1
  99. package/dist/internal/entry-arg.d.ts.map +1 -1
  100. package/dist/internal/entry-arg.js +7 -1
  101. package/dist/internal/entry-arg.js.map +1 -1
  102. package/dist/internal/output-directory.d.ts +15 -0
  103. package/dist/internal/output-directory.d.ts.map +1 -0
  104. package/dist/internal/output-directory.js +490 -0
  105. package/dist/internal/output-directory.js.map +1 -0
  106. package/dist/internal/prepare-project.d.ts +2 -0
  107. package/dist/internal/prepare-project.d.ts.map +1 -1
  108. package/dist/internal/prepare-project.js +3 -3
  109. package/dist/internal/prepare-project.js.map +1 -1
  110. package/dist/internal/source-imports.js +1 -1
  111. package/dist/internal/source-imports.js.map +1 -1
  112. package/dist/mcp/client.js +2 -2
  113. package/dist/mcp/client.js.map +1 -1
  114. package/dist/vite-plugins/build-manifest.d.ts +5 -1
  115. package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
  116. package/dist/vite-plugins/build-manifest.js +2 -1
  117. package/dist/vite-plugins/build-manifest.js.map +1 -1
  118. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  119. package/dist/vite-plugins/i18n.js +58 -6
  120. package/dist/vite-plugins/i18n.js.map +1 -1
  121. package/dist/vite-plugins/index.d.ts +8 -1
  122. package/dist/vite-plugins/index.d.ts.map +1 -1
  123. package/dist/vite-plugins/index.js +6 -2
  124. package/dist/vite-plugins/index.js.map +1 -1
  125. package/dist/vite-plugins/self-contained.d.ts.map +1 -1
  126. package/dist/vite-plugins/self-contained.js +159 -158
  127. package/dist/vite-plugins/self-contained.js.map +1 -1
  128. package/package.json +9 -9
  129. package/src/builder.ts +18 -5
  130. package/src/cli.ts +3 -0
  131. package/src/codegen/run-codegen.ts +15 -7
  132. package/src/codegen/store-resolver.ts +2 -2
  133. package/src/commands/build.ts +13 -2
  134. package/src/commands/codegen.ts +6 -5
  135. package/src/commands/deploy.ts +4 -2
  136. package/src/commands/dev.ts +20 -1
  137. package/src/deploy/freedesktop/metainfo.ts +73 -21
  138. package/src/deploy/nfpm/config.ts +5 -2
  139. package/src/deploy/nfpm/contents.ts +8 -0
  140. package/src/deploy/node-runtime/elf.ts +43 -5
  141. package/src/deploy/node-runtime/index.ts +105 -5
  142. package/src/deploy/notices/node-runtime.ts +2 -2
  143. package/src/deploy/payload/launcher.ts +20 -1
  144. package/src/deploy/payload/stage.ts +1 -1
  145. package/src/deploy/run-deploy.ts +56 -16
  146. package/src/deploy/settings/build-manifest.ts +28 -3
  147. package/src/deploy/settings/extra-files.ts +26 -2
  148. package/src/deploy/settings/index.ts +3 -1
  149. package/src/deploy/settings/paths.ts +70 -5
  150. package/src/deploy/targets/flatpak-source.ts +13 -2
  151. package/src/deploy/types.ts +1 -0
  152. package/src/dev/headless.ts +40 -0
  153. package/src/dev/runner-deps.ts +1 -1
  154. package/src/i18n/source-messages.ts +1220 -2
  155. package/src/internal/build-manifest.ts +25 -1
  156. package/src/internal/build-output.ts +99 -0
  157. package/src/internal/entry-arg.ts +8 -1
  158. package/src/internal/output-directory.ts +699 -0
  159. package/src/internal/prepare-project.ts +5 -5
  160. package/src/internal/source-imports.ts +1 -1
  161. package/src/mcp/client.ts +2 -2
  162. package/src/vite-plugins/build-manifest.ts +7 -1
  163. package/src/vite-plugins/i18n.ts +86 -5
  164. package/src/vite-plugins/index.ts +14 -7
  165. package/src/vite-plugins/self-contained.ts +184 -185
@@ -2,22 +2,22 @@ import { ensureGeneratedIn } from "../codegen/run-codegen.js";
2
2
  import { type CodegenContext, resolveCodegenContext } from "../codegen/store-resolver.js";
3
3
  import { resolveCwd, resolveEntry } from "./entry-arg.js";
4
4
 
5
- type ProjectArgs = { entry?: string; cwd?: string };
6
- type PreparedProject = { cwd: string; entry: string };
5
+ type ProjectArgs = { entry?: string; cwd?: string; config?: string };
6
+ type PreparedProject = { cwd: string; entry: string; configFile: string };
7
7
  type ResolvedProject = PreparedProject & { context: CodegenContext };
8
8
 
9
9
  const resolveProject = async (args: ProjectArgs, mode: string): Promise<ResolvedProject> => {
10
10
  const cwd = resolveCwd(args);
11
- const context = await resolveCodegenContext(cwd, mode);
11
+ const context = await resolveCodegenContext(cwd, mode, args.config);
12
12
 
13
- return { cwd, entry: resolveEntry(cwd, args.entry), context };
13
+ return { cwd, entry: resolveEntry(cwd, args.entry), configFile: context.configFile, context };
14
14
  };
15
15
 
16
16
  const prepareProject = async (args: ProjectArgs, mode: string): Promise<PreparedProject> => {
17
17
  const { cwd, entry, context } = await resolveProject(args, mode);
18
18
  await ensureGeneratedIn(context, { shouldAnnounce: true, mode });
19
19
 
20
- return { cwd, entry };
20
+ return { cwd, entry, configFile: context.configFile };
21
21
  };
22
22
 
23
23
  export { prepareProject, resolveProject };
@@ -33,7 +33,7 @@ const discoverSourceFiles = (dir: string): string[] =>
33
33
  sortStringsBy(
34
34
  globSync("**/{*,.*}", {
35
35
  cwd: dir,
36
- exclude: ["**/{build,coverage,dist,node_modules,out-tsc}/**"],
36
+ exclude: ["**/{build,coverage,dist,node_modules,out-tsc}/**", "**/.gtkx-output-*/**"],
37
37
  withFileTypes: true,
38
38
  })
39
39
  .filter((entry) => entry.isFile())
package/src/mcp/client.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as Gio from "@gtkx/gi/gio";
2
2
  import * as Gtk from "@gtkx/gi/gtk";
3
3
  import {
4
- DEFAULT_SOCKET_PATH,
5
4
  isConnectionClosedError,
6
5
  type JSONRPCRequest,
7
6
  ProtocolConnection,
7
+ resolveMcpSocketPath,
8
8
  type Result,
9
9
  } from "@gtkx/mcp/internal";
10
10
  import { error, errorMessage, info, normalizeError } from "@gtkx/utils";
@@ -65,7 +65,7 @@ class McpClient {
65
65
  private registry = new WidgetRegistry();
66
66
 
67
67
  constructor(options: McpClientOptions) {
68
- this.socketPath = options.socketPath ?? DEFAULT_SOCKET_PATH;
68
+ this.socketPath = resolveMcpSocketPath(options.socketPath);
69
69
  this.applicationId = options.applicationId;
70
70
  }
71
71
 
@@ -21,6 +21,11 @@ type ManifestState = {
21
21
  outDir: string;
22
22
  };
23
23
 
24
+ type BuildConfigIdentity = {
25
+ configFile: string;
26
+ configDigest: string;
27
+ };
28
+
24
29
  const PACKAGE_MANIFEST_FILENAME = "package.json";
25
30
  const DEFAULT_OUT_DIR = "dist";
26
31
  const JSON_INDENT = 4;
@@ -73,7 +78,7 @@ const packagesFor = (outDir: string, ids: string[]): RecordedPackage[] => {
73
78
 
74
79
  const renderManifest = (manifest: BuildManifest): string => `${JSON.stringify(manifest, null, JSON_INDENT)}\n`;
75
80
 
76
- function gtkxBuildManifest(root: string, collector: BuildManifestCollector): Plugin {
81
+ function gtkxBuildManifest(root: string, collector: BuildManifestCollector, identity: BuildConfigIdentity): Plugin {
77
82
  const state: ManifestState = { outDir: join(root, DEFAULT_OUT_DIR) };
78
83
 
79
84
  return {
@@ -90,6 +95,7 @@ function gtkxBuildManifest(root: string, collector: BuildManifestCollector): Plu
90
95
  const manifest: BuildManifest = {
91
96
  generator: BUILD_MANIFEST_GENERATOR,
92
97
  formatVersion: BUILD_MANIFEST_FORMAT_VERSION,
98
+ ...identity,
93
99
  schemas: collector.schemas,
94
100
  packages: packagesFor(state.outDir, ids),
95
101
  };
@@ -1,7 +1,7 @@
1
1
  import type { ConfigLoader } from "@gtkx/config";
2
2
  import type { Plugin, ResolvedConfig } from "vite";
3
3
  import { createConfigLoader } from "@gtkx/config/internal";
4
- import { toPosixPath } from "@gtkx/utils";
4
+ import { isPathWithin, toPosixPath } from "@gtkx/utils";
5
5
  import { existsSync, mkdirSync } from "node:fs";
6
6
  import { createRequire } from "node:module";
7
7
  import { dirname, join, posix, relative, resolve } from "node:path";
@@ -13,7 +13,8 @@ import {
13
13
  synchronizeCatalogs,
14
14
  } from "../i18n/catalogs.js";
15
15
  import { extractSourceCatalog } from "../i18n/source-messages.js";
16
- import { discoverSourceFiles } from "../internal/source-imports.js";
16
+ import { emitI18nTypes } from "../i18n/types.js";
17
+ import { discoverSourceFiles, sourceLanguage } from "../internal/source-imports.js";
17
18
  import { stripQuery } from "./strip-query.js";
18
19
 
19
20
  type I18nState = {
@@ -21,6 +22,7 @@ type I18nState = {
21
22
  i18nRoot: string;
22
23
  outDir: string;
23
24
  project: CatalogProject | null;
25
+ extraction: Promise<void>;
24
26
  };
25
27
 
26
28
  const BOOTSTRAP_SPECIFIER = "@gtkx/i18n/bootstrap";
@@ -94,6 +96,7 @@ const buildCatalogs = (state: I18nState): void => {
94
96
  const extractProjectMessages = async (
95
97
  state: I18nState,
96
98
  shouldPreserveMetadataMessages: boolean,
99
+ shouldSynchronizeCatalogs: boolean,
97
100
  ): Promise<void> => {
98
101
  const project = state.project;
99
102
 
@@ -104,7 +107,65 @@ const extractProjectMessages = async (
104
107
  const srcDir = join(project.root, "src");
105
108
  const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);
106
109
  await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
107
- synchronizeCatalogs(project);
110
+
111
+ if (shouldSynchronizeCatalogs) {
112
+ synchronizeCatalogs(project);
113
+ }
114
+
115
+ await emitI18nTypes(project.root);
116
+ };
117
+
118
+ const settleExtraction = async (pending: Promise<void>): Promise<void> => {
119
+ try {
120
+ await pending;
121
+ } catch {
122
+ return;
123
+ }
124
+ };
125
+
126
+ const queueExtraction = (
127
+ state: I18nState,
128
+ shouldPreserveMetadataMessages: boolean,
129
+ shouldSynchronizeCatalogs: boolean,
130
+ ): Promise<void> => {
131
+ const prior = state.extraction;
132
+ const pending = (async (): Promise<void> => {
133
+ await settleExtraction(prior);
134
+ await extractProjectMessages(
135
+ state,
136
+ shouldPreserveMetadataMessages,
137
+ shouldSynchronizeCatalogs,
138
+ );
139
+ })();
140
+
141
+ state.extraction = pending;
142
+
143
+ return pending;
144
+ };
145
+
146
+ const isProjectSource = (state: I18nState, path: string): boolean => {
147
+ const project = state.project;
148
+
149
+ if (project === null || sourceLanguage(path) === undefined) {
150
+ return false;
151
+ }
152
+
153
+ const srcDir = join(project.root, "src");
154
+ const sourceRoot = existsSync(srcDir) ? srcDir : project.root;
155
+
156
+ return isPathWithin(sourceRoot, path);
157
+ };
158
+
159
+ const refreshProjectMessages = async (
160
+ state: I18nState,
161
+ shouldPreserveMetadataMessages: boolean,
162
+ reportError: (message: string) => void,
163
+ ): Promise<void> => {
164
+ try {
165
+ await queueExtraction(state, shouldPreserveMetadataMessages, false);
166
+ } catch (error) {
167
+ reportError(error instanceof Error ? error.message : String(error));
168
+ }
108
169
  };
109
170
 
110
171
  const gtkxI18n = (
@@ -112,7 +173,13 @@ const gtkxI18n = (
112
173
  loadConfig: ConfigLoader = createConfigLoader(),
113
174
  shouldPreserveMetadataMessages = true,
114
175
  ): Plugin => {
115
- const state: I18nState = { entryPath, i18nRoot: "", outDir: "", project: null };
176
+ const state: I18nState = {
177
+ entryPath,
178
+ extraction: Promise.resolve(),
179
+ i18nRoot: "",
180
+ outDir: "",
181
+ project: null,
182
+ };
116
183
 
117
184
  return {
118
185
  name: "gtkx:i18n",
@@ -120,7 +187,21 @@ const gtkxI18n = (
120
187
 
121
188
  configResolved: (config) => applyResolvedConfig(state, config, loadConfig),
122
189
 
123
- buildStart: () => extractProjectMessages(state, shouldPreserveMetadataMessages),
190
+ buildStart: () => queueExtraction(state, shouldPreserveMetadataMessages, true),
191
+
192
+ hotUpdate(options) {
193
+ if (!isProjectSource(state, options.file)) {
194
+ return;
195
+ }
196
+
197
+ return refreshProjectMessages(
198
+ state,
199
+ shouldPreserveMetadataMessages,
200
+ (message) => {
201
+ options.server.config.logger.error(message);
202
+ },
203
+ );
204
+ },
124
205
 
125
206
  transform(code, id) {
126
207
  if (isI18nLocaleModule(state, id)) {
@@ -13,13 +13,20 @@ import { gtkxSettings } from "./settings.js";
13
13
  import { gtkxStoreLinks } from "./store-links.js";
14
14
  import { gtkxUndeclaredLibrary } from "./undeclared-library.js";
15
15
 
16
- const gtkxVitePlugins = (
17
- mode?: string,
18
- entryPath?: string,
19
- buildManifest?: BuildManifestCollector,
20
- shouldPreserveI18nMetadata = true,
21
- ): Plugin[] => {
22
- const loadConfig = createConfigLoader(mode === undefined ? {} : { mode });
16
+ type GtkxVitePluginOptions = {
17
+ buildManifest?: BuildManifestCollector | undefined;
18
+ configFile?: string | undefined;
19
+ entryPath?: string | undefined;
20
+ mode?: string | undefined;
21
+ shouldPreserveI18nMetadata?: boolean | undefined;
22
+ };
23
+
24
+ const gtkxVitePlugins = (options: GtkxVitePluginOptions = {}): Plugin[] => {
25
+ const { buildManifest, configFile, entryPath, mode, shouldPreserveI18nMetadata = true } = options;
26
+ const loadConfig = createConfigLoader({
27
+ ...(mode !== undefined && { mode }),
28
+ ...(configFile !== undefined && { configFile }),
29
+ });
23
30
 
24
31
  return [
25
32
  createConfigPlugin({ name: "gtkx:config", loadConfig }),