@gtkx/cli 1.4.0 → 1.6.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 (206) hide show
  1. package/README.md +1 -1
  2. package/dist/builder.d.ts +1 -0
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js +2 -2
  5. package/dist/builder.js.map +1 -1
  6. package/dist/cli.js +4 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/codegen/freshness.d.ts.map +1 -1
  9. package/dist/codegen/freshness.js +2 -1
  10. package/dist/codegen/freshness.js.map +1 -1
  11. package/dist/codegen/reference.d.ts +17 -0
  12. package/dist/codegen/reference.d.ts.map +1 -0
  13. package/dist/codegen/reference.js +37 -0
  14. package/dist/codegen/reference.js.map +1 -0
  15. package/dist/codegen/report.d.ts.map +1 -1
  16. package/dist/codegen/report.js +17 -3
  17. package/dist/codegen/report.js.map +1 -1
  18. package/dist/codegen/run-codegen.d.ts +4 -0
  19. package/dist/codegen/run-codegen.d.ts.map +1 -1
  20. package/dist/codegen/run-codegen.js +93 -27
  21. package/dist/codegen/run-codegen.js.map +1 -1
  22. package/dist/commands/codegen.js +1 -1
  23. package/dist/commands/codegen.js.map +1 -1
  24. package/dist/commands/docs.d.ts.map +1 -1
  25. package/dist/commands/docs.js +10 -16
  26. package/dist/commands/docs.js.map +1 -1
  27. package/dist/commands/mcp.d.ts +13 -0
  28. package/dist/commands/mcp.d.ts.map +1 -0
  29. package/dist/commands/mcp.js +68 -0
  30. package/dist/commands/mcp.js.map +1 -0
  31. package/dist/deploy/freedesktop/localize.d.ts +6 -0
  32. package/dist/deploy/freedesktop/localize.d.ts.map +1 -0
  33. package/dist/deploy/freedesktop/localize.js +107 -0
  34. package/dist/deploy/freedesktop/localize.js.map +1 -0
  35. package/dist/deploy/install-hints.d.ts.map +1 -1
  36. package/dist/deploy/install-hints.js +5 -0
  37. package/dist/deploy/install-hints.js.map +1 -1
  38. package/dist/deploy/notices/gtkx.js +1 -1
  39. package/dist/deploy/notices/gtkx.js.map +1 -1
  40. package/dist/deploy/notices/libraries.d.ts.map +1 -1
  41. package/dist/deploy/notices/libraries.js +2 -1
  42. package/dist/deploy/notices/libraries.js.map +1 -1
  43. package/dist/deploy/payload/launcher.d.ts.map +1 -1
  44. package/dist/deploy/payload/launcher.js +2 -0
  45. package/dist/deploy/payload/launcher.js.map +1 -1
  46. package/dist/deploy/payload/stage.d.ts +1 -1
  47. package/dist/deploy/payload/stage.d.ts.map +1 -1
  48. package/dist/deploy/payload/stage.js +20 -11
  49. package/dist/deploy/payload/stage.js.map +1 -1
  50. package/dist/deploy/run-deploy.d.ts.map +1 -1
  51. package/dist/deploy/run-deploy.js +87 -15
  52. package/dist/deploy/run-deploy.js.map +1 -1
  53. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  54. package/dist/deploy/settings/libraries.js +7 -9
  55. package/dist/deploy/settings/libraries.js.map +1 -1
  56. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  57. package/dist/deploy/targets/flatpak-source.js +21 -10
  58. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  59. package/dist/deploy/tools.d.ts +6 -1
  60. package/dist/deploy/tools.d.ts.map +1 -1
  61. package/dist/deploy/tools.js +27 -4
  62. package/dist/deploy/tools.js.map +1 -1
  63. package/dist/dev/locale-dir.d.ts +3 -0
  64. package/dist/dev/locale-dir.d.ts.map +1 -0
  65. package/dist/dev/locale-dir.js +17 -0
  66. package/dist/dev/locale-dir.js.map +1 -0
  67. package/dist/dev/runner-main.d.ts.map +1 -1
  68. package/dist/dev/runner-main.js +4 -1
  69. package/dist/dev/runner-main.js.map +1 -1
  70. package/dist/dev/runner.d.ts.map +1 -1
  71. package/dist/dev/runner.js +6 -0
  72. package/dist/dev/runner.js.map +1 -1
  73. package/dist/dev/vite-dev-server.d.ts +1 -0
  74. package/dist/dev/vite-dev-server.d.ts.map +1 -1
  75. package/dist/dev/vite-dev-server.js.map +1 -1
  76. package/dist/i18n/binding-extractor.d.ts +30 -0
  77. package/dist/i18n/binding-extractor.d.ts.map +1 -0
  78. package/dist/i18n/binding-extractor.js +1324 -0
  79. package/dist/i18n/binding-extractor.js.map +1 -0
  80. package/dist/i18n/catalog-template.d.ts +3 -0
  81. package/dist/i18n/catalog-template.d.ts.map +1 -0
  82. package/dist/i18n/catalog-template.js +18 -0
  83. package/dist/i18n/catalog-template.js.map +1 -0
  84. package/dist/i18n/catalogs.d.ts +21 -0
  85. package/dist/i18n/catalogs.d.ts.map +1 -0
  86. package/dist/i18n/catalogs.js +139 -0
  87. package/dist/i18n/catalogs.js.map +1 -0
  88. package/dist/i18n/extractor-plugin.d.ts +8 -0
  89. package/dist/i18n/extractor-plugin.d.ts.map +1 -0
  90. package/dist/i18n/extractor-plugin.js +247 -0
  91. package/dist/i18n/extractor-plugin.js.map +1 -0
  92. package/dist/i18n/metadata-templates.d.ts +11 -0
  93. package/dist/i18n/metadata-templates.d.ts.map +1 -0
  94. package/dist/i18n/metadata-templates.js +11 -0
  95. package/dist/i18n/metadata-templates.js.map +1 -0
  96. package/dist/i18n/source-messages.d.ts +23 -0
  97. package/dist/i18n/source-messages.d.ts.map +1 -0
  98. package/dist/i18n/source-messages.js +403 -0
  99. package/dist/i18n/source-messages.js.map +1 -0
  100. package/dist/i18n/types.d.ts +10 -0
  101. package/dist/i18n/types.d.ts.map +1 -0
  102. package/dist/i18n/types.js +108 -0
  103. package/dist/i18n/types.js.map +1 -0
  104. package/dist/internal/agent-rules.d.ts +7 -0
  105. package/dist/internal/agent-rules.d.ts.map +1 -0
  106. package/dist/internal/agent-rules.js +106 -0
  107. package/dist/internal/agent-rules.js.map +1 -0
  108. package/dist/internal/docs-elements.d.ts +8 -0
  109. package/dist/internal/docs-elements.d.ts.map +1 -0
  110. package/dist/internal/docs-elements.js +12 -0
  111. package/dist/internal/docs-elements.js.map +1 -0
  112. package/dist/internal/source-imports.d.ts +5 -1
  113. package/dist/internal/source-imports.d.ts.map +1 -1
  114. package/dist/internal/source-imports.js +25 -47
  115. package/dist/internal/source-imports.js.map +1 -1
  116. package/dist/mcp/client-config.d.ts +22 -0
  117. package/dist/mcp/client-config.d.ts.map +1 -0
  118. package/dist/mcp/client-config.js +94 -0
  119. package/dist/mcp/client-config.js.map +1 -0
  120. package/dist/mcp/client.d.ts +0 -1
  121. package/dist/mcp/client.d.ts.map +1 -1
  122. package/dist/mcp/client.js +11 -39
  123. package/dist/mcp/client.js.map +1 -1
  124. package/dist/mcp/handlers.d.ts +2 -1
  125. package/dist/mcp/handlers.d.ts.map +1 -1
  126. package/dist/mcp/handlers.js.map +1 -1
  127. package/dist/settings/render.d.ts +4 -1
  128. package/dist/settings/render.d.ts.map +1 -1
  129. package/dist/settings/render.js +11 -2
  130. package/dist/settings/render.js.map +1 -1
  131. package/dist/settings/schema.d.ts.map +1 -1
  132. package/dist/settings/schema.js +3 -1
  133. package/dist/settings/schema.js.map +1 -1
  134. package/dist/vite-plugins/animated.d.ts +5 -0
  135. package/dist/vite-plugins/animated.d.ts.map +1 -0
  136. package/dist/vite-plugins/animated.js +325 -0
  137. package/dist/vite-plugins/animated.js.map +1 -0
  138. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  139. package/dist/vite-plugins/asset-imports.js +4 -14
  140. package/dist/vite-plugins/asset-imports.js.map +1 -1
  141. package/dist/vite-plugins/i18n.d.ts +5 -0
  142. package/dist/vite-plugins/i18n.d.ts.map +1 -0
  143. package/dist/vite-plugins/i18n.js +88 -0
  144. package/dist/vite-plugins/i18n.js.map +1 -0
  145. package/dist/vite-plugins/index.d.ts +1 -1
  146. package/dist/vite-plugins/index.d.ts.map +1 -1
  147. package/dist/vite-plugins/index.js +5 -1
  148. package/dist/vite-plugins/index.js.map +1 -1
  149. package/dist/vite-plugins/resources.d.ts.map +1 -1
  150. package/dist/vite-plugins/resources.js +12 -57
  151. package/dist/vite-plugins/resources.js.map +1 -1
  152. package/dist/vite-plugins/self-contained.d.ts.map +1 -1
  153. package/dist/vite-plugins/self-contained.js +128 -135
  154. package/dist/vite-plugins/self-contained.js.map +1 -1
  155. package/dist/vite-plugins/settings-worker-env.js +2 -2
  156. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  157. package/dist/vite-plugins/settings.d.ts.map +1 -1
  158. package/dist/vite-plugins/settings.js +2 -1
  159. package/dist/vite-plugins/settings.js.map +1 -1
  160. package/package.json +11 -9
  161. package/src/builder.ts +3 -2
  162. package/src/cli.ts +5 -0
  163. package/src/codegen/freshness.ts +2 -1
  164. package/src/codegen/reference.ts +59 -0
  165. package/src/codegen/report.ts +18 -3
  166. package/src/codegen/run-codegen.ts +134 -31
  167. package/src/commands/codegen.ts +1 -1
  168. package/src/commands/docs.ts +10 -28
  169. package/src/commands/mcp.ts +81 -0
  170. package/src/deploy/freedesktop/localize.ts +144 -0
  171. package/src/deploy/install-hints.ts +5 -0
  172. package/src/deploy/notices/gtkx.ts +1 -1
  173. package/src/deploy/notices/libraries.ts +2 -1
  174. package/src/deploy/payload/launcher.ts +2 -0
  175. package/src/deploy/payload/stage.ts +35 -10
  176. package/src/deploy/run-deploy.ts +128 -13
  177. package/src/deploy/settings/libraries.ts +7 -10
  178. package/src/deploy/targets/flatpak-source.ts +33 -10
  179. package/src/deploy/tools.ts +36 -3
  180. package/src/dev/locale-dir.ts +22 -0
  181. package/src/dev/runner-main.ts +4 -1
  182. package/src/dev/runner.ts +8 -0
  183. package/src/dev/vite-dev-server.ts +1 -0
  184. package/src/i18n/binding-extractor.ts +1969 -0
  185. package/src/i18n/catalog-template.ts +24 -0
  186. package/src/i18n/catalogs.ts +216 -0
  187. package/src/i18n/extractor-plugin.ts +413 -0
  188. package/src/i18n/metadata-templates.ts +29 -0
  189. package/src/i18n/source-messages.ts +608 -0
  190. package/src/i18n/types.ts +154 -0
  191. package/src/internal/agent-rules.ts +135 -0
  192. package/src/internal/docs-elements.ts +21 -0
  193. package/src/internal/source-imports.ts +31 -60
  194. package/src/mcp/client-config.ts +130 -0
  195. package/src/mcp/client.ts +17 -44
  196. package/src/mcp/handlers.ts +7 -6
  197. package/src/settings/render.ts +16 -2
  198. package/src/settings/schema.ts +3 -1
  199. package/src/vite-plugins/animated.ts +486 -0
  200. package/src/vite-plugins/asset-imports.ts +5 -17
  201. package/src/vite-plugins/i18n.ts +146 -0
  202. package/src/vite-plugins/index.ts +5 -0
  203. package/src/vite-plugins/resources.ts +12 -74
  204. package/src/vite-plugins/self-contained.ts +150 -169
  205. package/src/vite-plugins/settings-worker-env.ts +2 -2
  206. package/src/vite-plugins/settings.ts +2 -1
@@ -0,0 +1,146 @@
1
+ import type { ConfigLoader } from "@gtkx/config";
2
+ import type { Plugin, ResolvedConfig } from "vite";
3
+ import { createConfigLoader } from "@gtkx/config/internal";
4
+ import { existsSync, mkdirSync } from "node:fs";
5
+ import { createRequire } from "node:module";
6
+ import { dirname, join, posix, relative, resolve } from "node:path";
7
+ import {
8
+ type CatalogProject,
9
+ compileCatalogs,
10
+ LOCALE_DIRNAME,
11
+ resolveCatalogProject,
12
+ synchronizeCatalogs,
13
+ } from "../i18n/catalogs.js";
14
+ import { extractSourceCatalog } from "../i18n/source-messages.js";
15
+ import { discoverSourceFiles } from "../internal/source-imports.js";
16
+ import { stripQuery } from "./strip-query.js";
17
+
18
+ type I18nState = {
19
+ entryPath: string;
20
+ i18nRoot: string;
21
+ outDir: string;
22
+ project: CatalogProject | null;
23
+ };
24
+
25
+ const BOOTSTRAP_SPECIFIER = "@gtkx/i18n/bootstrap";
26
+ const LOCALE_URL_PLACEHOLDER = "__GTKX_BUNDLE_LOCALE_DIR__";
27
+ const LOCALE_MODULE_PATHS = new Set(["dist/locale.js", "src/locale.ts"]);
28
+ const LOCALE_URL_PATTERN = /new URL\((["'])locale\1,\s*import\.meta\.url\)/;
29
+
30
+ const isI18nLocaleModule = (state: I18nState, id: string): boolean => {
31
+ if (state.i18nRoot.length === 0) {
32
+ return false;
33
+ }
34
+
35
+ const path = relative(state.i18nRoot, stripQuery(id)).replaceAll("\\", "/");
36
+
37
+ return LOCALE_MODULE_PATHS.has(path);
38
+ };
39
+
40
+ const markLocaleUrl = (code: string): string =>
41
+ code.replace(
42
+ LOCALE_URL_PATTERN,
43
+ () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`,
44
+ );
45
+
46
+ const localeUrlForChunk = (fileName: string): string => {
47
+ const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);
48
+
49
+ return path.length === 0 ? "." : path;
50
+ };
51
+
52
+ const rebaseLocaleUrl = (state: I18nState, code: string, fileName: string, moduleIds: string[]): string | null => {
53
+ if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {
54
+ return null;
55
+ }
56
+
57
+ const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);
58
+
59
+ if (!code.includes(placeholder)) {
60
+ throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);
61
+ }
62
+
63
+ return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));
64
+ };
65
+
66
+ const applyResolvedConfig = async (
67
+ state: I18nState,
68
+ config: ResolvedConfig,
69
+ loadConfig: ConfigLoader,
70
+ ): Promise<void> => {
71
+ state.entryPath = resolve(config.root, state.entryPath);
72
+ state.outDir = resolve(config.root, config.build.outDir);
73
+ const application = await loadConfig.resolve(config.root);
74
+ state.project = resolveCatalogProject(config.root, application.applicationId);
75
+
76
+ if (state.project !== null) {
77
+ const projectRequire = createRequire(resolve(config.root, "package.json"));
78
+ state.i18nRoot = dirname(projectRequire.resolve("@gtkx/i18n/package.json"));
79
+ }
80
+ };
81
+
82
+ const buildCatalogs = (state: I18nState): void => {
83
+ const project = state.project;
84
+
85
+ if (project === null) {
86
+ return;
87
+ }
88
+
89
+ mkdirSync(state.outDir, { recursive: true });
90
+ compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));
91
+ };
92
+
93
+ const extractProjectMessages = async (
94
+ state: I18nState,
95
+ shouldPreserveMetadataMessages: boolean,
96
+ ): Promise<void> => {
97
+ const project = state.project;
98
+
99
+ if (project === null) {
100
+ return;
101
+ }
102
+
103
+ const srcDir = join(project.root, "src");
104
+ const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);
105
+ await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
106
+ synchronizeCatalogs(project);
107
+ };
108
+
109
+ const gtkxI18n = (
110
+ entryPath: string,
111
+ loadConfig: ConfigLoader = createConfigLoader(),
112
+ shouldPreserveMetadataMessages = true,
113
+ ): Plugin => {
114
+ const state: I18nState = { entryPath, i18nRoot: "", outDir: "", project: null };
115
+
116
+ return {
117
+ name: "gtkx:i18n",
118
+ enforce: "pre",
119
+
120
+ configResolved: (config) => applyResolvedConfig(state, config, loadConfig),
121
+
122
+ buildStart: () => extractProjectMessages(state, shouldPreserveMetadataMessages),
123
+
124
+ transform(code, id) {
125
+ if (isI18nLocaleModule(state, id)) {
126
+ return markLocaleUrl(code);
127
+ }
128
+
129
+ if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {
130
+ return;
131
+ }
132
+
133
+ return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\n${code}`;
134
+ },
135
+
136
+ renderChunk(code, chunk) {
137
+ return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);
138
+ },
139
+
140
+ generateBundle() {
141
+ buildCatalogs(state);
142
+ },
143
+ };
144
+ };
145
+
146
+ export { gtkxI18n };
@@ -2,9 +2,11 @@ import type { Plugin } from "vite";
2
2
  import { createConfigLoader } from "@gtkx/config/internal";
3
3
  import createConfigPlugin from "@gtkx/config/vite-plugin";
4
4
  import type { BuildManifestCollector } from "../internal/build-manifest.js";
5
+ import { gtkxAnimated } from "./animated.js";
5
6
  import { gtkxAssetImports } from "./asset-imports.js";
6
7
  import { gtkxBuiltUrl } from "./built-url.js";
7
8
  import { gtkxCss } from "./css.js";
9
+ import { gtkxI18n } from "./i18n.js";
8
10
  import { gtkxIcons } from "./icons.js";
9
11
  import { gtkxReactCompiler } from "./react-compiler.js";
10
12
  import { gtkxResources } from "./resources.js";
@@ -16,11 +18,13 @@ const gtkxVitePlugins = (
16
18
  mode?: string,
17
19
  entryPath?: string,
18
20
  buildManifest?: BuildManifestCollector,
21
+ shouldPreserveI18nMetadata = true,
19
22
  ): Plugin[] => {
20
23
  const loadConfig = createConfigLoader(mode === undefined ? {} : { mode });
21
24
 
22
25
  return [
23
26
  createConfigPlugin({ name: "gtkx:config", loadConfig }),
27
+ ...(entryPath === undefined ? [] : [gtkxI18n(entryPath, loadConfig, shouldPreserveI18nMetadata)]),
24
28
  gtkxStoreLinks(),
25
29
  gtkxUndeclaredLibrary(loadConfig),
26
30
  gtkxSettings(loadConfig, buildManifest),
@@ -29,6 +33,7 @@ const gtkxVitePlugins = (
29
33
  gtkxBuiltUrl(),
30
34
  gtkxResources(loadConfig, entryPath),
31
35
  gtkxCss(),
36
+ gtkxAnimated(loadConfig),
32
37
  gtkxReactCompiler(loadConfig),
33
38
  ];
34
39
  };
@@ -1,6 +1,6 @@
1
1
  import type { ConfigLoader } from "@gtkx/config";
2
- import type { ModuleNode, ParserOptions, Plugin, ResolvedConfig, Rolldown, UserConfig, ViteDevServer } from "vite";
3
- import { createConfigLoader, resourceBasePath } from "@gtkx/config/internal";
2
+ import type { ModuleNode, Plugin, ResolvedConfig, Rolldown, UserConfig, ViteDevServer } from "vite";
3
+ import { createConfigLoader, resolveFuture, resourceBasePath } from "@gtkx/config/internal";
4
4
  import { error, info, isRecord, sortStrings } from "@gtkx/utils";
5
5
  import { copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
6
  import { basename, dirname, extname, isAbsolute, join, posix, relative, sep } from "node:path";
@@ -8,7 +8,7 @@ import { parseSync } from "vite";
8
8
  import { resolveDataDir } from "../internal/data-dir.js";
9
9
  import { type ListedFile, listFilesRecursive } from "../internal/list-files.js";
10
10
  import { runCliTool } from "../internal/run-cli-tool.js";
11
- import { parseRuntimeImportsIn, type SourceImport } from "../internal/source-imports.js";
11
+ import { parseRuntimeImportsIn, type SourceImport, sourceLanguage } from "../internal/source-imports.js";
12
12
  import { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } from "../internal/staging-dir.js";
13
13
  import { ASSET_RE } from "./asset-extensions.js";
14
14
  import {
@@ -46,7 +46,6 @@ type PluginState = {
46
46
  isBuild: boolean;
47
47
  isV2: boolean;
48
48
  entries: Map<string, ResourceEntry>;
49
- entryImporters: Map<string, Set<string>>;
50
49
  bundledSpecifiers: Map<string, Set<string>>;
51
50
  moduleDependencies: Map<string, Set<string>>;
52
51
  prunedDependencies: Map<string, Set<string>>;
@@ -62,7 +61,6 @@ type PluginState = {
62
61
  dataDir: string | null;
63
62
  bundleReferenceId: string | null;
64
63
  iconOwners: Map<string, ResourceEntry>;
65
- iconImporters: Map<string, Set<string>>;
66
64
  };
67
65
 
68
66
  type ResolveContext = {
@@ -103,7 +101,6 @@ type RetainedIconModuleId = {
103
101
  };
104
102
 
105
103
  type ResourceModuleId = string | RetainedIconModuleId;
106
- type SourceLanguage = NonNullable<ParserOptions["lang"]>;
107
104
 
108
105
  type ImporterReconciliation = {
109
106
  currentBundled: Set<string>;
@@ -167,17 +164,6 @@ const STOCK_ICON_CONTEXTS: Set<string> = new Set([
167
164
  const ICON_SIZE_RE = /^([1-9]\d*)x\1(?:@[1-9]\d*)?$/;
168
165
  const RESERVED_ICON_NAMES: Set<string> = new Set(["", ".", ".."]);
169
166
 
170
- const SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([
171
- [".cjs", "jsx"],
172
- [".cts", "ts"],
173
- [".js", "jsx"],
174
- [".jsx", "jsx"],
175
- [".mjs", "jsx"],
176
- [".mts", "ts"],
177
- [".ts", "ts"],
178
- [".tsx", "tsx"],
179
- ]);
180
-
181
167
  const toForwardSlashes = (value: string): string => value.replaceAll(/[/\\]/g, "/");
182
168
 
183
169
  const isWithin = (root: string, path: string): boolean => {
@@ -331,7 +317,7 @@ const derivedIconEntry = (
331
317
  };
332
318
 
333
319
  const hasSideEffectIconImport = (code: string, id: string): boolean => {
334
- const lang = SOURCE_LANGUAGES.get(extname(stripQuery(id)).toLowerCase());
320
+ const lang = sourceLanguage(stripQuery(id));
335
321
 
336
322
  if (lang === undefined || !code.includes("?icon")) {
337
323
  return false;
@@ -466,16 +452,6 @@ const registerDevAsset = (state: PluginState): void => {
466
452
 
467
453
  const importerKey = (importer: string): string => stripQuery(importer);
468
454
 
469
- const claimEntry = (state: PluginState, resourcePath: string, importer: string | undefined): void => {
470
- if (importer === undefined) {
471
- return;
472
- }
473
-
474
- const importers = state.entryImporters.get(resourcePath) ?? new Set<string>();
475
- importers.add(importerKey(importer));
476
- state.entryImporters.set(resourcePath, importers);
477
- };
478
-
479
455
  const trackBundledSpecifier = (state: PluginState, importer: string | undefined, source: string): void => {
480
456
  if (importer === undefined) {
481
457
  return;
@@ -487,23 +463,13 @@ const trackBundledSpecifier = (state: PluginState, importer: string | undefined,
487
463
  state.bundledSpecifiers.set(key, specifiers);
488
464
  };
489
465
 
490
- const claimIcon = (state: PluginState, iconIdentity: string, importer: string | undefined): void => {
491
- if (importer === undefined) {
492
- return;
493
- }
494
-
495
- const importers = state.iconImporters.get(iconIdentity) ?? new Set<string>();
496
- importers.add(importerKey(importer));
497
- state.iconImporters.set(iconIdentity, importers);
498
- };
499
-
500
466
  const createResourceEntry = (sourcePath: string, resourcePath: string): ResourceEntry => ({
501
467
  sourcePath,
502
468
  stagedRelPath: resourcePath.replace(/^\/+/, ""),
503
469
  resourcePath,
504
470
  });
505
471
 
506
- const activateEntry = (state: PluginState, entry: ResourceEntry, importer?: string): ResourceEntry => {
472
+ const activateEntry = (state: PluginState, entry: ResourceEntry): ResourceEntry => {
507
473
  const existing = state.entries.get(entry.resourcePath);
508
474
 
509
475
  if (existing !== undefined) {
@@ -514,14 +480,11 @@ const activateEntry = (state: PluginState, entry: ResourceEntry, importer?: stri
514
480
  );
515
481
  }
516
482
 
517
- claimEntry(state, entry.resourcePath, importer);
518
-
519
483
  return existing;
520
484
  }
521
485
 
522
486
  state.entries.set(entry.resourcePath, entry);
523
487
  state.sourcePaths.add(entry.sourcePath);
524
- claimEntry(state, entry.resourcePath, importer);
525
488
 
526
489
  return entry;
527
490
  };
@@ -611,16 +574,6 @@ const declareResolvedIcon = (
611
574
  }
612
575
  };
613
576
 
614
- const activateIcon = (
615
- state: PluginState,
616
- importer: string | undefined,
617
- iconIdentity: string,
618
- entry: ResourceEntry,
619
- ): void => {
620
- state.iconOwners.set(iconIdentity, entry);
621
- claimIcon(state, iconIdentity, importer);
622
- };
623
-
624
577
  const registerEntry = (
625
578
  state: PluginState,
626
579
  absPath: string,
@@ -638,7 +591,7 @@ const registerEntry = (
638
591
  }
639
592
  }
640
593
 
641
- return activateEntry(state, entry, importer);
594
+ return activateEntry(state, entry);
642
595
  };
643
596
 
644
597
  const registerIconEntry = (
@@ -658,7 +611,7 @@ const registerIconEntry = (
658
611
  declareResolvedIcon(state, importer, derived.iconIdentity, entry);
659
612
 
660
613
  if (shouldActivate) {
661
- activateIcon(state, importer, derived.iconIdentity, entry);
614
+ state.iconOwners.set(derived.iconIdentity, entry);
662
615
  }
663
616
 
664
617
  return entry;
@@ -941,9 +894,7 @@ const bundledSpecifiersIn = (imports: SourceImport[]): Set<string> =>
941
894
  .map((entry) => entry.source),
942
895
  );
943
896
 
944
- const isSourceModule = (file: string): boolean =>
945
- !file.endsWith(".d.ts") && !file.endsWith(".d.cts") && !file.endsWith(".d.mts") &&
946
- SOURCE_LANGUAGES.has(extname(file).toLowerCase());
897
+ const isSourceModule = (file: string): boolean => sourceLanguage(file) !== undefined;
947
898
 
948
899
  const isBundledSource = (source: string): boolean =>
949
900
  parseResourceSpecifier(source) !== null || parseIconSpecifier(source) !== null;
@@ -1153,7 +1104,6 @@ const isImporterActive = (state: PluginState, importer: string): boolean =>
1153
1104
 
1154
1105
  const activateDeclaredIcon = (
1155
1106
  state: PluginState,
1156
- importer: string,
1157
1107
  iconIdentity: string,
1158
1108
  entry: ResourceEntry,
1159
1109
  ): void => {
@@ -1165,9 +1115,7 @@ const activateDeclaredIcon = (
1165
1115
  );
1166
1116
  }
1167
1117
 
1168
- const activeEntry = activateEntry(state, entry, importer);
1169
- state.iconOwners.set(iconIdentity, activeEntry);
1170
- claimIcon(state, iconIdentity, importer);
1118
+ state.iconOwners.set(iconIdentity, activateEntry(state, entry));
1171
1119
  };
1172
1120
 
1173
1121
  const activateDeclaredEntries = (state: PluginState, importer: string): void => {
@@ -1175,7 +1123,7 @@ const activateDeclaredEntries = (state: PluginState, importer: string): void =>
1175
1123
 
1176
1124
  for (const entry of entries) {
1177
1125
  if (isDeclaredSourceAvailable(state, entry.sourcePath)) {
1178
- activateEntry(state, entry, importer);
1126
+ activateEntry(state, entry);
1179
1127
  }
1180
1128
  }
1181
1129
  };
@@ -1185,7 +1133,7 @@ const activateDeclaredIcons = (state: PluginState, importer: string): void => {
1185
1133
 
1186
1134
  for (const [iconIdentity, entry] of icons) {
1187
1135
  if (isDeclaredSourceAvailable(state, entry.sourcePath)) {
1188
- activateDeclaredIcon(state, importer, iconIdentity, entry);
1136
+ activateDeclaredIcon(state, iconIdentity, entry);
1189
1137
  }
1190
1138
  }
1191
1139
  };
@@ -1200,15 +1148,11 @@ const activateDeclaredClaims = (state: PluginState, active: Set<string>): void =
1200
1148
  const rebuildActiveClaims = (state: PluginState): void => {
1201
1149
  const previous = {
1202
1150
  entries: state.entries,
1203
- entryImporters: state.entryImporters,
1204
- iconImporters: state.iconImporters,
1205
1151
  iconOwners: state.iconOwners,
1206
1152
  sourcePaths: state.sourcePaths,
1207
1153
  };
1208
1154
 
1209
1155
  state.entries = new Map();
1210
- state.entryImporters = new Map();
1211
- state.iconImporters = new Map();
1212
1156
  state.iconOwners = new Map();
1213
1157
  state.sourcePaths = new Set();
1214
1158
 
@@ -1216,8 +1160,6 @@ const rebuildActiveClaims = (state: PluginState): void => {
1216
1160
  activateDeclaredClaims(state, activeImporterKeys(state));
1217
1161
  } catch (error_) {
1218
1162
  state.entries = previous.entries;
1219
- state.entryImporters = previous.entryImporters;
1220
- state.iconImporters = previous.iconImporters;
1221
1163
  state.iconOwners = previous.iconOwners;
1222
1164
  state.sourcePaths = previous.sourcePaths;
1223
1165
  throw error_;
@@ -1381,7 +1323,6 @@ const prepareReconciliation = async (
1381
1323
 
1382
1324
  const commitReconciliation = (state: PluginState, candidate: PluginState): void => {
1383
1325
  state.entries = candidate.entries;
1384
- state.entryImporters = candidate.entryImporters;
1385
1326
  state.bundledSpecifiers = candidate.bundledSpecifiers;
1386
1327
  state.moduleDependencies = candidate.moduleDependencies;
1387
1328
  state.prunedDependencies = candidate.prunedDependencies;
@@ -1390,7 +1331,6 @@ const commitReconciliation = (state: PluginState, candidate: PluginState): void
1390
1331
  state.missingSourcePaths = candidate.missingSourcePaths;
1391
1332
  state.sourcePaths = candidate.sourcePaths;
1392
1333
  state.iconOwners = candidate.iconOwners;
1393
- state.iconImporters = candidate.iconImporters;
1394
1334
  };
1395
1335
 
1396
1336
  const reconcileV2Importer = async (ctx: ResolveContext, state: PluginState, id: string): Promise<void> => {
@@ -1413,7 +1353,7 @@ const resolveResourceConfig = async (state: PluginState, config: UserConfig, loa
1413
1353
  const loaded = await loadConfig.load(config.root ?? process.cwd());
1414
1354
  state.prefix = resourceBasePath(loaded.config.applicationId);
1415
1355
  state.root = loaded.root;
1416
- state.isV2 = loaded.config.future?.v2ResourceImports === true;
1356
+ state.isV2 = resolveFuture(loaded.config.future).isResourceImported;
1417
1357
 
1418
1358
  return {
1419
1359
  assetsInclude: [ASSET_RE],
@@ -1691,7 +1631,6 @@ function gtkxResources(loadConfig: ConfigLoader = createConfigLoader(), entryPat
1691
1631
  isBuild: false,
1692
1632
  isV2: false,
1693
1633
  entries: new Map(),
1694
- entryImporters: new Map(),
1695
1634
  bundledSpecifiers: new Map(),
1696
1635
  moduleDependencies: new Map(),
1697
1636
  prunedDependencies: new Map(),
@@ -1707,7 +1646,6 @@ function gtkxResources(loadConfig: ConfigLoader = createConfigLoader(), entryPat
1707
1646
  dataDir: null,
1708
1647
  bundleReferenceId: null,
1709
1648
  iconOwners: new Map(),
1710
- iconImporters: new Map(),
1711
1649
  };
1712
1650
 
1713
1651
  return createResourcesPlugin(state, loadConfig);