@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.
- package/README.md +1 -1
- package/dist/builder.d.ts +1 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -2
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +2 -1
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/reference.d.ts +17 -0
- package/dist/codegen/reference.d.ts.map +1 -0
- package/dist/codegen/reference.js +37 -0
- package/dist/codegen/reference.js.map +1 -0
- package/dist/codegen/report.d.ts.map +1 -1
- package/dist/codegen/report.js +17 -3
- package/dist/codegen/report.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +4 -0
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +93 -27
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/commands/codegen.js +1 -1
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +10 -16
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/mcp.d.ts +13 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +68 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/deploy/freedesktop/localize.d.ts +6 -0
- package/dist/deploy/freedesktop/localize.d.ts.map +1 -0
- package/dist/deploy/freedesktop/localize.js +107 -0
- package/dist/deploy/freedesktop/localize.js.map +1 -0
- package/dist/deploy/install-hints.d.ts.map +1 -1
- package/dist/deploy/install-hints.js +5 -0
- package/dist/deploy/install-hints.js.map +1 -1
- package/dist/deploy/notices/gtkx.js +1 -1
- package/dist/deploy/notices/gtkx.js.map +1 -1
- package/dist/deploy/notices/libraries.d.ts.map +1 -1
- package/dist/deploy/notices/libraries.js +2 -1
- package/dist/deploy/notices/libraries.js.map +1 -1
- package/dist/deploy/payload/launcher.d.ts.map +1 -1
- package/dist/deploy/payload/launcher.js +2 -0
- package/dist/deploy/payload/launcher.js.map +1 -1
- package/dist/deploy/payload/stage.d.ts +1 -1
- package/dist/deploy/payload/stage.d.ts.map +1 -1
- package/dist/deploy/payload/stage.js +20 -11
- package/dist/deploy/payload/stage.js.map +1 -1
- package/dist/deploy/run-deploy.d.ts.map +1 -1
- package/dist/deploy/run-deploy.js +87 -15
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/settings/libraries.d.ts.map +1 -1
- package/dist/deploy/settings/libraries.js +7 -9
- package/dist/deploy/settings/libraries.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +21 -10
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/deploy/tools.d.ts +6 -1
- package/dist/deploy/tools.d.ts.map +1 -1
- package/dist/deploy/tools.js +27 -4
- package/dist/deploy/tools.js.map +1 -1
- package/dist/dev/locale-dir.d.ts +3 -0
- package/dist/dev/locale-dir.d.ts.map +1 -0
- package/dist/dev/locale-dir.js +17 -0
- package/dist/dev/locale-dir.js.map +1 -0
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +4 -1
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/runner.d.ts.map +1 -1
- package/dist/dev/runner.js +6 -0
- package/dist/dev/runner.js.map +1 -1
- package/dist/dev/vite-dev-server.d.ts +1 -0
- package/dist/dev/vite-dev-server.d.ts.map +1 -1
- package/dist/dev/vite-dev-server.js.map +1 -1
- package/dist/i18n/binding-extractor.d.ts +30 -0
- package/dist/i18n/binding-extractor.d.ts.map +1 -0
- package/dist/i18n/binding-extractor.js +1324 -0
- package/dist/i18n/binding-extractor.js.map +1 -0
- package/dist/i18n/catalog-template.d.ts +3 -0
- package/dist/i18n/catalog-template.d.ts.map +1 -0
- package/dist/i18n/catalog-template.js +18 -0
- package/dist/i18n/catalog-template.js.map +1 -0
- package/dist/i18n/catalogs.d.ts +21 -0
- package/dist/i18n/catalogs.d.ts.map +1 -0
- package/dist/i18n/catalogs.js +139 -0
- package/dist/i18n/catalogs.js.map +1 -0
- package/dist/i18n/extractor-plugin.d.ts +8 -0
- package/dist/i18n/extractor-plugin.d.ts.map +1 -0
- package/dist/i18n/extractor-plugin.js +247 -0
- package/dist/i18n/extractor-plugin.js.map +1 -0
- package/dist/i18n/metadata-templates.d.ts +11 -0
- package/dist/i18n/metadata-templates.d.ts.map +1 -0
- package/dist/i18n/metadata-templates.js +11 -0
- package/dist/i18n/metadata-templates.js.map +1 -0
- package/dist/i18n/source-messages.d.ts +23 -0
- package/dist/i18n/source-messages.d.ts.map +1 -0
- package/dist/i18n/source-messages.js +403 -0
- package/dist/i18n/source-messages.js.map +1 -0
- package/dist/i18n/types.d.ts +10 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +108 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/internal/agent-rules.d.ts +7 -0
- package/dist/internal/agent-rules.d.ts.map +1 -0
- package/dist/internal/agent-rules.js +106 -0
- package/dist/internal/agent-rules.js.map +1 -0
- package/dist/internal/docs-elements.d.ts +8 -0
- package/dist/internal/docs-elements.d.ts.map +1 -0
- package/dist/internal/docs-elements.js +12 -0
- package/dist/internal/docs-elements.js.map +1 -0
- package/dist/internal/source-imports.d.ts +5 -1
- package/dist/internal/source-imports.d.ts.map +1 -1
- package/dist/internal/source-imports.js +25 -47
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/mcp/client-config.d.ts +22 -0
- package/dist/mcp/client-config.d.ts.map +1 -0
- package/dist/mcp/client-config.js +94 -0
- package/dist/mcp/client-config.js.map +1 -0
- package/dist/mcp/client.d.ts +0 -1
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +11 -39
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/handlers.d.ts +2 -1
- package/dist/mcp/handlers.d.ts.map +1 -1
- package/dist/mcp/handlers.js.map +1 -1
- package/dist/settings/render.d.ts +4 -1
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +11 -2
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +3 -1
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/animated.d.ts +5 -0
- package/dist/vite-plugins/animated.d.ts.map +1 -0
- package/dist/vite-plugins/animated.js +325 -0
- package/dist/vite-plugins/animated.js.map +1 -0
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +4 -14
- package/dist/vite-plugins/asset-imports.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts +5 -0
- package/dist/vite-plugins/i18n.d.ts.map +1 -0
- package/dist/vite-plugins/i18n.js +88 -0
- package/dist/vite-plugins/i18n.js.map +1 -0
- package/dist/vite-plugins/index.d.ts +1 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +5 -1
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/resources.d.ts.map +1 -1
- package/dist/vite-plugins/resources.js +12 -57
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/self-contained.d.ts.map +1 -1
- package/dist/vite-plugins/self-contained.js +128 -135
- package/dist/vite-plugins/self-contained.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +2 -2
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +2 -1
- package/dist/vite-plugins/settings.js.map +1 -1
- package/package.json +11 -9
- package/src/builder.ts +3 -2
- package/src/cli.ts +5 -0
- package/src/codegen/freshness.ts +2 -1
- package/src/codegen/reference.ts +59 -0
- package/src/codegen/report.ts +18 -3
- package/src/codegen/run-codegen.ts +134 -31
- package/src/commands/codegen.ts +1 -1
- package/src/commands/docs.ts +10 -28
- package/src/commands/mcp.ts +81 -0
- package/src/deploy/freedesktop/localize.ts +144 -0
- package/src/deploy/install-hints.ts +5 -0
- package/src/deploy/notices/gtkx.ts +1 -1
- package/src/deploy/notices/libraries.ts +2 -1
- package/src/deploy/payload/launcher.ts +2 -0
- package/src/deploy/payload/stage.ts +35 -10
- package/src/deploy/run-deploy.ts +128 -13
- package/src/deploy/settings/libraries.ts +7 -10
- package/src/deploy/targets/flatpak-source.ts +33 -10
- package/src/deploy/tools.ts +36 -3
- package/src/dev/locale-dir.ts +22 -0
- package/src/dev/runner-main.ts +4 -1
- package/src/dev/runner.ts +8 -0
- package/src/dev/vite-dev-server.ts +1 -0
- package/src/i18n/binding-extractor.ts +1969 -0
- package/src/i18n/catalog-template.ts +24 -0
- package/src/i18n/catalogs.ts +216 -0
- package/src/i18n/extractor-plugin.ts +413 -0
- package/src/i18n/metadata-templates.ts +29 -0
- package/src/i18n/source-messages.ts +608 -0
- package/src/i18n/types.ts +154 -0
- package/src/internal/agent-rules.ts +135 -0
- package/src/internal/docs-elements.ts +21 -0
- package/src/internal/source-imports.ts +31 -60
- package/src/mcp/client-config.ts +130 -0
- package/src/mcp/client.ts +17 -44
- package/src/mcp/handlers.ts +7 -6
- package/src/settings/render.ts +16 -2
- package/src/settings/schema.ts +3 -1
- package/src/vite-plugins/animated.ts +486 -0
- package/src/vite-plugins/asset-imports.ts +5 -17
- package/src/vite-plugins/i18n.ts +146 -0
- package/src/vite-plugins/index.ts +5 -0
- package/src/vite-plugins/resources.ts +12 -74
- package/src/vite-plugins/self-contained.ts +150 -169
- package/src/vite-plugins/settings-worker-env.ts +2 -2
- 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,
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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);
|