@gtkx/cli 1.6.0 → 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.
- package/README.md +5 -5
- package/dist/builder.d.ts +1 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +17 -5
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +45 -16
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/reference.d.ts.map +1 -1
- package/dist/codegen/reference.js +1 -7
- package/dist/codegen/reference.js.map +1 -1
- package/dist/codegen/report.d.ts.map +1 -1
- package/dist/codegen/report.js +5 -16
- package/dist/codegen/report.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +7 -7
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +35 -107
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +1 -2
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js +10 -19
- package/dist/codegen/store-resolver.js.map +1 -1
- package/dist/commands/build.d.ts +5 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +83 -10
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts +1 -0
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +6 -5
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/deploy.d.ts +1 -0
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +4 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +19 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +5 -15
- package/dist/commands/docs.js.map +1 -1
- package/dist/deploy/freedesktop/copyright.d.ts.map +1 -1
- package/dist/deploy/freedesktop/copyright.js +2 -13
- package/dist/deploy/freedesktop/copyright.js.map +1 -1
- package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
- package/dist/deploy/freedesktop/metainfo.js +41 -2
- package/dist/deploy/freedesktop/metainfo.js.map +1 -1
- package/dist/deploy/freedesktop/xml.d.ts.map +1 -1
- package/dist/deploy/freedesktop/xml.js +21 -25
- package/dist/deploy/freedesktop/xml.js.map +1 -1
- package/dist/deploy/nfpm/config.d.ts.map +1 -1
- package/dist/deploy/nfpm/config.js +5 -2
- package/dist/deploy/nfpm/config.js.map +1 -1
- package/dist/deploy/nfpm/contents.d.ts.map +1 -1
- package/dist/deploy/nfpm/contents.js +8 -0
- package/dist/deploy/nfpm/contents.js.map +1 -1
- package/dist/deploy/node-runtime/elf.d.ts +2 -1
- package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
- package/dist/deploy/node-runtime/elf.js +32 -5
- package/dist/deploy/node-runtime/elf.js.map +1 -1
- package/dist/deploy/node-runtime/index.d.ts +2 -1
- package/dist/deploy/node-runtime/index.d.ts.map +1 -1
- package/dist/deploy/node-runtime/index.js +73 -4
- package/dist/deploy/node-runtime/index.js.map +1 -1
- package/dist/deploy/node-runtime/license.d.ts.map +1 -1
- package/dist/deploy/node-runtime/license.js +2 -9
- package/dist/deploy/node-runtime/license.js.map +1 -1
- package/dist/deploy/notices/node-runtime.js +2 -2
- package/dist/deploy/notices/node-runtime.js.map +1 -1
- package/dist/deploy/notices/packages.d.ts.map +1 -1
- package/dist/deploy/notices/packages.js +3 -10
- package/dist/deploy/notices/packages.js.map +1 -1
- package/dist/deploy/payload/copy-tree.d.ts.map +1 -1
- package/dist/deploy/payload/copy-tree.js +3 -3
- package/dist/deploy/payload/copy-tree.js.map +1 -1
- package/dist/deploy/payload/launcher.d.ts.map +1 -1
- package/dist/deploy/payload/launcher.js +14 -1
- package/dist/deploy/payload/launcher.js.map +1 -1
- package/dist/deploy/payload/stage.d.ts.map +1 -1
- package/dist/deploy/payload/stage.js +2 -4
- package/dist/deploy/payload/stage.js.map +1 -1
- package/dist/deploy/run-deploy.d.ts +1 -0
- package/dist/deploy/run-deploy.d.ts.map +1 -1
- package/dist/deploy/run-deploy.js +100 -14
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/settings/build-manifest.d.ts +6 -1
- package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
- package/dist/deploy/settings/build-manifest.js +17 -17
- package/dist/deploy/settings/build-manifest.js.map +1 -1
- package/dist/deploy/settings/extra-files.d.ts +1 -1
- package/dist/deploy/settings/extra-files.d.ts.map +1 -1
- package/dist/deploy/settings/extra-files.js +22 -1
- package/dist/deploy/settings/extra-files.js.map +1 -1
- package/dist/deploy/settings/index.d.ts +1 -0
- package/dist/deploy/settings/index.d.ts.map +1 -1
- package/dist/deploy/settings/index.js +2 -1
- package/dist/deploy/settings/index.js.map +1 -1
- package/dist/deploy/settings/libraries.d.ts.map +1 -1
- package/dist/deploy/settings/libraries.js +2 -19
- package/dist/deploy/settings/libraries.js.map +1 -1
- package/dist/deploy/settings/paths.d.ts +2 -2
- package/dist/deploy/settings/paths.d.ts.map +1 -1
- package/dist/deploy/settings/paths.js +110 -12
- package/dist/deploy/settings/paths.js.map +1 -1
- package/dist/deploy/settings/screenshots.d.ts.map +1 -1
- package/dist/deploy/settings/screenshots.js +6 -31
- package/dist/deploy/settings/screenshots.js.map +1 -1
- package/dist/deploy/targets/flatpak-pnpm.js +4 -4
- package/dist/deploy/targets/flatpak-pnpm.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +15 -6
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/deploy/targets/flatpak-sources.js +1 -1
- package/dist/deploy/targets/flatpak-sources.js.map +1 -1
- package/dist/deploy/types.d.ts +1 -0
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/types.js.map +1 -1
- package/dist/dev/headless.d.ts +3 -0
- package/dist/dev/headless.d.ts.map +1 -0
- package/dist/dev/headless.js +35 -0
- package/dist/dev/headless.js.map +1 -0
- package/dist/dev/runner-deps.js +1 -1
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +1 -2
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/dev/schema-dir.d.ts +1 -1
- package/dist/dev/schema-dir.d.ts.map +1 -1
- package/dist/dev/schema-dir.js +2 -4
- package/dist/dev/schema-dir.js.map +1 -1
- package/dist/i18n/catalogs.d.ts.map +1 -1
- package/dist/i18n/catalogs.js +2 -1
- package/dist/i18n/catalogs.js.map +1 -1
- package/dist/i18n/metadata-templates.d.ts.map +1 -1
- package/dist/i18n/metadata-templates.js +2 -1
- package/dist/i18n/metadata-templates.js.map +1 -1
- package/dist/i18n/source-messages.d.ts +3 -21
- package/dist/i18n/source-messages.d.ts.map +1 -1
- package/dist/i18n/source-messages.js +900 -85
- package/dist/i18n/source-messages.js.map +1 -1
- package/dist/i18n/types.d.ts +6 -7
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/i18n/types.js +83 -96
- package/dist/i18n/types.js.map +1 -1
- package/dist/internal/build-manifest.d.ts +5 -2
- package/dist/internal/build-manifest.d.ts.map +1 -1
- package/dist/internal/build-manifest.js +15 -2
- package/dist/internal/build-manifest.js.map +1 -1
- package/dist/internal/build-output.d.ts +8 -0
- package/dist/internal/build-output.d.ts.map +1 -0
- package/dist/internal/build-output.js +69 -0
- package/dist/internal/build-output.js.map +1 -0
- package/dist/internal/docs-elements.js +2 -2
- package/dist/internal/docs-elements.js.map +1 -1
- package/dist/internal/entry-arg.d.ts +4 -1
- package/dist/internal/entry-arg.d.ts.map +1 -1
- package/dist/internal/entry-arg.js +7 -1
- package/dist/internal/entry-arg.js.map +1 -1
- package/dist/internal/icon-path.d.ts.map +1 -1
- package/dist/internal/icon-path.js +5 -16
- package/dist/internal/icon-path.js.map +1 -1
- package/dist/internal/output-directory.d.ts +15 -0
- package/dist/internal/output-directory.d.ts.map +1 -0
- package/dist/internal/output-directory.js +490 -0
- package/dist/internal/output-directory.js.map +1 -0
- package/dist/internal/prepare-project.d.ts +2 -0
- package/dist/internal/prepare-project.d.ts.map +1 -1
- package/dist/internal/prepare-project.js +3 -3
- package/dist/internal/prepare-project.js.map +1 -1
- package/dist/internal/source-imports.d.ts.map +1 -1
- package/dist/internal/source-imports.js +10 -41
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/mcp/client.js +2 -2
- package/dist/mcp/client.js.map +1 -1
- package/dist/settings/render.d.ts +0 -1
- package/dist/settings/render.d.ts.map +1 -1
- package/dist/settings/render.js +1 -11
- package/dist/settings/render.js.map +1 -1
- package/dist/settings/schema.d.ts +2 -2
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +21 -62
- package/dist/settings/schema.js.map +1 -1
- package/dist/vite-plugins/asset-imports.d.ts +1 -2
- package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
- package/dist/vite-plugins/asset-imports.js +19 -32
- package/dist/vite-plugins/asset-imports.js.map +1 -1
- package/dist/vite-plugins/asset-specifier.d.ts +1 -3
- package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
- package/dist/vite-plugins/asset-specifier.js +1 -4
- package/dist/vite-plugins/asset-specifier.js.map +1 -1
- package/dist/vite-plugins/build-manifest.d.ts +5 -1
- package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
- package/dist/vite-plugins/build-manifest.js +2 -1
- package/dist/vite-plugins/build-manifest.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts.map +1 -1
- package/dist/vite-plugins/i18n.js +59 -6
- package/dist/vite-plugins/i18n.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +8 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +8 -6
- 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 +32 -97
- 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 +159 -158
- package/dist/vite-plugins/self-contained.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +2 -4
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts +1 -2
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +8 -14
- package/dist/vite-plugins/settings.js.map +1 -1
- package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
- package/dist/vite-plugins/undeclared-library.js +10 -13
- package/dist/vite-plugins/undeclared-library.js.map +1 -1
- package/dist/vite-plugins/worker.d.ts.map +1 -1
- package/dist/vite-plugins/worker.js +0 -1
- package/dist/vite-plugins/worker.js.map +1 -1
- package/package.json +21 -15
- package/src/builder.ts +18 -5
- package/src/cli.ts +3 -0
- package/src/codegen/freshness.ts +66 -17
- package/src/codegen/reference.ts +1 -8
- package/src/codegen/report.ts +5 -21
- package/src/codegen/run-codegen.ts +42 -151
- package/src/codegen/store-resolver.ts +10 -26
- package/src/commands/build.ts +13 -2
- package/src/commands/codegen.ts +6 -5
- package/src/commands/deploy.ts +4 -2
- package/src/commands/dev.ts +20 -1
- package/src/commands/docs.ts +5 -17
- package/src/deploy/freedesktop/copyright.ts +2 -14
- package/src/deploy/freedesktop/metainfo.ts +73 -21
- package/src/deploy/freedesktop/xml.ts +24 -32
- package/src/deploy/nfpm/config.ts +5 -2
- package/src/deploy/nfpm/contents.ts +8 -0
- package/src/deploy/node-runtime/elf.ts +43 -5
- package/src/deploy/node-runtime/index.ts +105 -5
- package/src/deploy/node-runtime/license.ts +2 -8
- package/src/deploy/notices/node-runtime.ts +2 -2
- package/src/deploy/notices/packages.ts +3 -11
- package/src/deploy/payload/copy-tree.ts +3 -4
- package/src/deploy/payload/launcher.ts +20 -1
- package/src/deploy/payload/stage.ts +3 -7
- package/src/deploy/run-deploy.ts +56 -16
- package/src/deploy/settings/build-manifest.ts +30 -17
- package/src/deploy/settings/extra-files.ts +26 -2
- package/src/deploy/settings/index.ts +3 -1
- package/src/deploy/settings/libraries.ts +1 -22
- package/src/deploy/settings/paths.ts +68 -13
- package/src/deploy/settings/screenshots.ts +8 -46
- package/src/deploy/targets/flatpak-pnpm.ts +4 -4
- package/src/deploy/targets/flatpak-source.ts +17 -6
- package/src/deploy/targets/flatpak-sources.ts +1 -1
- package/src/deploy/types.ts +1 -0
- package/src/dev/headless.ts +40 -0
- package/src/dev/runner-deps.ts +1 -1
- package/src/dev/runner-main.ts +1 -2
- package/src/dev/schema-dir.ts +2 -4
- package/src/i18n/catalogs.ts +2 -1
- package/src/i18n/metadata-templates.ts +2 -1
- package/src/i18n/source-messages.ts +1442 -262
- package/src/i18n/types.ts +97 -131
- package/src/internal/build-manifest.ts +25 -1
- package/src/internal/build-output.ts +99 -0
- package/src/internal/docs-elements.ts +2 -2
- package/src/internal/entry-arg.ts +8 -1
- package/src/internal/icon-path.ts +6 -19
- package/src/internal/output-directory.ts +699 -0
- package/src/internal/prepare-project.ts +5 -5
- package/src/internal/source-imports.ts +14 -50
- package/src/mcp/client.ts +2 -2
- package/src/settings/render.ts +1 -13
- package/src/settings/schema.ts +19 -81
- package/src/vite-plugins/asset-imports.ts +20 -44
- package/src/vite-plugins/asset-specifier.ts +0 -5
- package/src/vite-plugins/build-manifest.ts +7 -1
- package/src/vite-plugins/i18n.ts +87 -5
- package/src/vite-plugins/index.ts +16 -11
- package/src/vite-plugins/resources.ts +37 -140
- package/src/vite-plugins/self-contained.ts +184 -185
- package/src/vite-plugins/settings-worker-env.ts +2 -4
- package/src/vite-plugins/settings.ts +11 -20
- package/src/vite-plugins/undeclared-library.ts +14 -20
- package/src/vite-plugins/worker.ts +0 -1
- package/dist/i18n/binding-extractor.d.ts +0 -30
- package/dist/i18n/binding-extractor.d.ts.map +0 -1
- package/dist/i18n/binding-extractor.js +0 -1324
- package/dist/i18n/binding-extractor.js.map +0 -1
- package/dist/i18n/extractor-plugin.d.ts +0 -8
- package/dist/i18n/extractor-plugin.d.ts.map +0 -1
- package/dist/i18n/extractor-plugin.js +0 -247
- package/dist/i18n/extractor-plugin.js.map +0 -1
- package/dist/internal/data-dir.d.ts +0 -4
- package/dist/internal/data-dir.d.ts.map +0 -1
- package/dist/internal/data-dir.js +0 -52
- package/dist/internal/data-dir.js.map +0 -1
- package/dist/vite-plugins/animated.d.ts +0 -5
- package/dist/vite-plugins/animated.d.ts.map +0 -1
- package/dist/vite-plugins/animated.js +0 -325
- package/dist/vite-plugins/animated.js.map +0 -1
- package/src/i18n/binding-extractor.ts +0 -1969
- package/src/i18n/extractor-plugin.ts +0 -413
- package/src/internal/data-dir.ts +0 -70
- package/src/vite-plugins/animated.ts +0 -486
|
@@ -1,24 +1,17 @@
|
|
|
1
|
-
import { createConfigLoader, resolveFuture } from "@gtkx/config/internal";
|
|
2
1
|
import { parseSync } from "vite";
|
|
3
2
|
import { sourceLanguage } from "../internal/source-imports.js";
|
|
4
3
|
import { ASSET_MENTION_RE } from "./asset-extensions.js";
|
|
5
|
-
import {
|
|
4
|
+
import { isAssetSpecifier, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, } from "./asset-specifier.js";
|
|
6
5
|
import { RESOURCE_PATH_EXPORT } from "./resource-shared.js";
|
|
7
6
|
import { stripQuery } from "./strip-query.js";
|
|
8
7
|
const NODE_MODULES = /(?:^|\/)node_modules\//;
|
|
9
8
|
const VIRTUAL_PREFIX = "\0";
|
|
10
9
|
const DEFAULT_BINDING = "default";
|
|
11
10
|
const RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);
|
|
12
|
-
const DATA_IMPORT_EXAMPLE = `"${DATA_PREFIX}<path>"`;
|
|
13
|
-
const URL_FALLBACK = ", or import the default for the asset URL.";
|
|
14
|
-
const BUNDLE_ADVICE = `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a "resource://" default, and ` +
|
|
15
|
-
"nothing else.";
|
|
16
11
|
const QUERY_ADVICE = `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;
|
|
17
12
|
const RESOURCE_ADVICE = `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;
|
|
18
13
|
const ICON_ADVICE = "An icon asset exports only its default icon-theme name, and nothing else.";
|
|
19
|
-
const RELATIVE_ADVICE =
|
|
20
|
-
`${RESOURCE_BINDING}; move the file under the data directory and import it as ` +
|
|
21
|
-
`${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;
|
|
14
|
+
const RELATIVE_ADVICE = "Add ?resource for a GResource, ?icon for a themed icon, or ?url for an emitted file.";
|
|
22
15
|
const boundName = (entry) => {
|
|
23
16
|
const { name } = entry.importName;
|
|
24
17
|
if (name === null || name === DEFAULT_BINDING || entry.isType) {
|
|
@@ -40,33 +33,32 @@ const bindings = (parsed) => [
|
|
|
40
33
|
...parsed.staticImports.flatMap((statement) => importBindings(statement)),
|
|
41
34
|
...parsed.staticExports.flatMap((statement) => exportBindings(statement)),
|
|
42
35
|
];
|
|
43
|
-
const isBacked = ({ name, source }
|
|
36
|
+
const isBacked = ({ name, source }) => {
|
|
44
37
|
if (name !== RESOURCE_PATH_EXPORT) {
|
|
45
38
|
return false;
|
|
46
39
|
}
|
|
47
|
-
return
|
|
40
|
+
return parseResourceSpecifier(source) !== null;
|
|
48
41
|
};
|
|
49
42
|
const isCheckedSpecifier = (source) => isAssetSpecifier(source) || isUrlSpecifier(source);
|
|
50
|
-
const unbackedBinding = (parsed
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return isV2 ? v2BundleAdvice(source) : BUNDLE_ADVICE;
|
|
43
|
+
const unbackedBinding = (parsed) => bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding));
|
|
44
|
+
const adviceFor = (source) => {
|
|
45
|
+
if (parseResourceSpecifier(source) !== null) {
|
|
46
|
+
return RESOURCE_ADVICE;
|
|
47
|
+
}
|
|
48
|
+
if (parseIconSpecifier(source) !== null) {
|
|
49
|
+
return ICON_ADVICE;
|
|
58
50
|
}
|
|
59
51
|
if (isUrlSpecifier(source)) {
|
|
60
52
|
return QUERY_ADVICE;
|
|
61
53
|
}
|
|
62
|
-
return
|
|
54
|
+
return RELATIVE_ADVICE;
|
|
63
55
|
};
|
|
64
|
-
const unbackedBindingError = (path, binding
|
|
56
|
+
const unbackedBindingError = (path, binding) => new Error(`${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +
|
|
65
57
|
"gtkx build rejects and gtkx dev would bind as undefined. " +
|
|
66
|
-
|
|
58
|
+
adviceFor(binding.source));
|
|
67
59
|
const isCheckedSource = (path) => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);
|
|
68
60
|
const hasCheckedAssetMention = (code) => ASSET_MENTION_RE.test(code) || code.includes("?url");
|
|
69
|
-
const checkAssetImports = (code, id
|
|
61
|
+
const checkAssetImports = (code, id) => {
|
|
70
62
|
const path = stripQuery(id);
|
|
71
63
|
const lang = sourceLanguage(path);
|
|
72
64
|
if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {
|
|
@@ -76,22 +68,17 @@ const checkAssetImports = (code, id, isV2) => {
|
|
|
76
68
|
if (parsed.errors.length > 0) {
|
|
77
69
|
return;
|
|
78
70
|
}
|
|
79
|
-
const binding = unbackedBinding(parsed.module
|
|
71
|
+
const binding = unbackedBinding(parsed.module);
|
|
80
72
|
if (binding !== undefined) {
|
|
81
|
-
throw unbackedBindingError(path, binding
|
|
73
|
+
throw unbackedBindingError(path, binding);
|
|
82
74
|
}
|
|
83
75
|
};
|
|
84
|
-
function gtkxAssetImports(
|
|
85
|
-
const state = { isV2: false };
|
|
76
|
+
function gtkxAssetImports() {
|
|
86
77
|
return {
|
|
87
78
|
name: "gtkx:asset-imports",
|
|
88
79
|
enforce: "pre",
|
|
89
|
-
async config(config) {
|
|
90
|
-
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
91
|
-
state.isV2 = resolveFuture(loaded.config.future).isResourceImported;
|
|
92
|
-
},
|
|
93
80
|
transform(code, id) {
|
|
94
|
-
checkAssetImports(code, id
|
|
81
|
+
checkAssetImports(code, id);
|
|
95
82
|
},
|
|
96
83
|
};
|
|
97
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { ParseResult, Plugin, UserConfig } from \"vite\";\nimport { createConfigLoader, resolveFuture } from \"@gtkx/config/internal\";\nimport { parseSync } from \"vite\";\nimport { sourceLanguage } from \"../internal/source-imports.js\";\nimport { ASSET_MENTION_RE } from \"./asset-extensions.js\";\nimport {\n DATA_PREFIX,\n isAssetSpecifier,\n isDataAsset,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"./asset-specifier.js\";\nimport { RESOURCE_PATH_EXPORT } from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ParsedModule = ParseResult[\"module\"];\ntype ImportStatement = ParsedModule[\"staticImports\"][number];\ntype ExportStatement = ParsedModule[\"staticExports\"][number];\ntype ExportEntry = ExportStatement[\"entries\"][number];\ntype BindingEntry = { importName: { name: string | null }; isType: boolean };\ntype NamedBinding = { name: string; source: string };\ntype PluginState = { isV2: boolean };\n\nconst NODE_MODULES = /(?:^|\\/)node_modules\\//;\nconst VIRTUAL_PREFIX = \"\\0\";\nconst DEFAULT_BINDING = \"default\";\nconst RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);\nconst DATA_IMPORT_EXAMPLE = `\"${DATA_PREFIX}<path>\"`;\nconst URL_FALLBACK = \", or import the default for the asset URL.\";\n\nconst BUNDLE_ADVICE =\n `An asset staged into the GResource bundle exports ${RESOURCE_BINDING} and a \"resource://\" default, and ` +\n \"nothing else.\";\n\nconst QUERY_ADVICE =\n `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;\n\nconst RESOURCE_ADVICE =\n `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;\n\nconst ICON_ADVICE = \"An icon asset exports only its default icon-theme name, and nothing else.\";\n\nconst RELATIVE_ADVICE =\n `Only assets imported through \"${DATA_PREFIX}\" are staged into the GResource bundle and export ` +\n `${RESOURCE_BINDING}; move the file under the data directory and import it as ` +\n `${DATA_IMPORT_EXAMPLE}${URL_FALLBACK}`;\n\nconst boundName = (entry: BindingEntry): string | null => {\n const { name } = entry.importName;\n\n if (name === null || name === DEFAULT_BINDING || entry.isType) {\n return null;\n }\n\n return name;\n};\n\nconst importBindings = (statement: ImportStatement): NamedBinding[] =>\n statement.entries\n .map((entry) => boundName(entry))\n .filter((name) => name !== null)\n .map((name) => ({ name, source: statement.moduleRequest.value }));\n\nconst exportBinding = (entry: ExportEntry): NamedBinding | null => {\n const name = boundName(entry);\n const source = entry.moduleRequest?.value;\n\n return name === null || source === undefined ? null : { name, source };\n};\n\nconst exportBindings = (statement: ExportStatement): NamedBinding[] =>\n statement.entries.map((entry) => exportBinding(entry)).filter((binding) => binding !== null);\n\nconst bindings = (parsed: ParsedModule): NamedBinding[] => [\n ...parsed.staticImports.flatMap((statement) => importBindings(statement)),\n ...parsed.staticExports.flatMap((statement) => exportBindings(statement)),\n];\n\nconst isBacked = ({ name, source }: NamedBinding, isV2: boolean): boolean => {\n if (name !== RESOURCE_PATH_EXPORT) {\n return false;\n }\n\n return isV2 ? parseResourceSpecifier(source) !== null : isDataAsset(source);\n};\n\nconst isCheckedSpecifier = (source: string): boolean => isAssetSpecifier(source) || isUrlSpecifier(source);\n\nconst unbackedBinding = (parsed: ParsedModule, isV2: boolean): NamedBinding | undefined =>\n bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding, isV2));\n\nconst isBundledResource = (source: string, isV2: boolean): boolean =>\n isV2\n ? parseResourceSpecifier(source) !== null || parseIconSpecifier(source) !== null\n : isDataAsset(source);\n\nconst v2BundleAdvice = (source: string): string =>\n parseIconSpecifier(source) === null ? RESOURCE_ADVICE : ICON_ADVICE;\n\nconst bundleAdvice = (source: string, isV2: boolean): string => {\n if (isBundledResource(source, isV2)) {\n return isV2 ? v2BundleAdvice(source) : BUNDLE_ADVICE;\n }\n\n if (isUrlSpecifier(source)) {\n return QUERY_ADVICE;\n }\n\n return source.startsWith(DATA_PREFIX) ? QUERY_ADVICE : RELATIVE_ADVICE;\n};\n\nconst unbackedBindingError = (path: string, binding: NamedBinding, isV2: boolean): Error =>\n new Error(\n `${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +\n \"gtkx build rejects and gtkx dev would bind as undefined. \" +\n bundleAdvice(binding.source, isV2),\n );\n\nconst isCheckedSource = (path: string): boolean => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);\nconst hasCheckedAssetMention = (code: string): boolean => ASSET_MENTION_RE.test(code) || code.includes(\"?url\");\n\nconst checkAssetImports = (code: string, id: string, isV2: boolean): void => {\n const path = stripQuery(id);\n const lang = sourceLanguage(path);\n\n if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {\n return;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n if (parsed.errors.length > 0) {\n return;\n }\n\n const binding = unbackedBinding(parsed.module, isV2);\n\n if (binding !== undefined) {\n throw unbackedBindingError(path, binding, isV2);\n }\n};\n\nfunction gtkxAssetImports(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = { isV2: false };\n\n return {\n name: \"gtkx:asset-imports\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isV2 = resolveFuture(loaded.config.future).isResourceImported;\n },\n\n transform(code, id) {\n checkAssetImports(code, id, state.isV2);\n },\n };\n}\n\nexport { gtkxAssetImports };\n"]}
|
|
1
|
+
{"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAS9C,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAC9C,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAE9D,MAAM,YAAY,GACd,uFAAuF,gBAAgB,GAAG,CAAC;AAE/G,MAAM,eAAe,GACjB,gEAAgE,gBAAgB,qBAAqB,CAAC;AAE1G,MAAM,WAAW,GAAG,2EAA2E,CAAC;AAEhG,MAAM,eAAe,GACjB,sFAAsF,CAAC;AAE3F,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAiB,EAAE;IACrD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;IAElC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAA0B,EAAkB,EAAE,CAClE,SAAS,CAAC,OAAO;KACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;KAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAE1E,MAAM,aAAa,GAAG,CAAC,KAAkB,EAAuB,EAAE;IAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;IAE1C,OAAO,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAA0B,EAAkB,EAAE,CAClE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;AAEjG,MAAM,QAAQ,GAAG,CAAC,MAAoB,EAAkB,EAAE,CAAC;IACvD,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzE,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAgB,EAAW,EAAE;IACzD,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,sBAAsB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AAE3G,MAAM,eAAe,GAAG,CAAC,MAAoB,EAA4B,EAAE,CACvE,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAEjG,MAAM,SAAS,GAAG,CAAC,MAAc,EAAU,EAAE;IACzC,IAAI,sBAAsB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,OAAO,eAAe,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,OAAqB,EAAS,EAAE,CACxE,IAAI,KAAK,CACL,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU;IACpG,2DAA2D;IAC3D,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAC5B,CAAC;AAEN,MAAM,eAAe,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChH,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAE/G,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,EAAU,EAAQ,EAAE;IACzD,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,gBAAgB;IACrB,OAAO;QACH,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YACd,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import type { ParseResult, Plugin } from \"vite\";\nimport { parseSync } from \"vite\";\nimport { sourceLanguage } from \"../internal/source-imports.js\";\nimport { ASSET_MENTION_RE } from \"./asset-extensions.js\";\nimport {\n isAssetSpecifier,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"./asset-specifier.js\";\nimport { RESOURCE_PATH_EXPORT } from \"./resource-shared.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ParsedModule = ParseResult[\"module\"];\ntype ImportStatement = ParsedModule[\"staticImports\"][number];\ntype ExportStatement = ParsedModule[\"staticExports\"][number];\ntype ExportEntry = ExportStatement[\"entries\"][number];\ntype BindingEntry = { importName: { name: string | null }; isType: boolean };\ntype NamedBinding = { name: string; source: string };\n\nconst NODE_MODULES = /(?:^|\\/)node_modules\\//;\nconst VIRTUAL_PREFIX = \"\\0\";\nconst DEFAULT_BINDING = \"default\";\nconst RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);\n\nconst QUERY_ADVICE =\n `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;\n\nconst RESOURCE_ADVICE =\n `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;\n\nconst ICON_ADVICE = \"An icon asset exports only its default icon-theme name, and nothing else.\";\n\nconst RELATIVE_ADVICE =\n \"Add ?resource for a GResource, ?icon for a themed icon, or ?url for an emitted file.\";\n\nconst boundName = (entry: BindingEntry): string | null => {\n const { name } = entry.importName;\n\n if (name === null || name === DEFAULT_BINDING || entry.isType) {\n return null;\n }\n\n return name;\n};\n\nconst importBindings = (statement: ImportStatement): NamedBinding[] =>\n statement.entries\n .map((entry) => boundName(entry))\n .filter((name) => name !== null)\n .map((name) => ({ name, source: statement.moduleRequest.value }));\n\nconst exportBinding = (entry: ExportEntry): NamedBinding | null => {\n const name = boundName(entry);\n const source = entry.moduleRequest?.value;\n\n return name === null || source === undefined ? null : { name, source };\n};\n\nconst exportBindings = (statement: ExportStatement): NamedBinding[] =>\n statement.entries.map((entry) => exportBinding(entry)).filter((binding) => binding !== null);\n\nconst bindings = (parsed: ParsedModule): NamedBinding[] => [\n ...parsed.staticImports.flatMap((statement) => importBindings(statement)),\n ...parsed.staticExports.flatMap((statement) => exportBindings(statement)),\n];\n\nconst isBacked = ({ name, source }: NamedBinding): boolean => {\n if (name !== RESOURCE_PATH_EXPORT) {\n return false;\n }\n\n return parseResourceSpecifier(source) !== null;\n};\n\nconst isCheckedSpecifier = (source: string): boolean => isAssetSpecifier(source) || isUrlSpecifier(source);\n\nconst unbackedBinding = (parsed: ParsedModule): NamedBinding | undefined =>\n bindings(parsed).find((binding) => isCheckedSpecifier(binding.source) && !isBacked(binding));\n\nconst adviceFor = (source: string): string => {\n if (parseResourceSpecifier(source) !== null) {\n return RESOURCE_ADVICE;\n }\n\n if (parseIconSpecifier(source) !== null) {\n return ICON_ADVICE;\n }\n\n if (isUrlSpecifier(source)) {\n return QUERY_ADVICE;\n }\n\n return RELATIVE_ADVICE;\n};\n\nconst unbackedBindingError = (path: string, binding: NamedBinding): Error =>\n new Error(\n `${path}: ${JSON.stringify(binding.source)} does not export ${JSON.stringify(binding.name)}, which ` +\n \"gtkx build rejects and gtkx dev would bind as undefined. \" +\n adviceFor(binding.source),\n );\n\nconst isCheckedSource = (path: string): boolean => !path.startsWith(VIRTUAL_PREFIX) && !NODE_MODULES.test(path);\nconst hasCheckedAssetMention = (code: string): boolean => ASSET_MENTION_RE.test(code) || code.includes(\"?url\");\n\nconst checkAssetImports = (code: string, id: string): void => {\n const path = stripQuery(id);\n const lang = sourceLanguage(path);\n\n if (lang === undefined || !isCheckedSource(path) || !hasCheckedAssetMention(code)) {\n return;\n }\n\n const parsed = parseSync(path, code, { lang });\n\n if (parsed.errors.length > 0) {\n return;\n }\n\n const binding = unbackedBinding(parsed.module);\n\n if (binding !== undefined) {\n throw unbackedBindingError(path, binding);\n }\n};\n\nfunction gtkxAssetImports(): Plugin {\n return {\n name: \"gtkx:asset-imports\",\n enforce: \"pre\",\n\n transform(code, id) {\n checkAssetImports(code, id);\n },\n };\n}\n\nexport { gtkxAssetImports };\n"]}
|
|
@@ -6,12 +6,10 @@ type IconSpecifier = {
|
|
|
6
6
|
assetSource: string;
|
|
7
7
|
iconName: string | null;
|
|
8
8
|
};
|
|
9
|
-
declare const DATA_PREFIX = "#data/";
|
|
10
9
|
declare const isAssetSpecifier: (source: string) => boolean;
|
|
11
|
-
declare const isDataAsset: (source: string) => boolean;
|
|
12
10
|
declare const isBareRelativeAsset: (source: string) => boolean;
|
|
13
11
|
declare const parseResourceSpecifier: (source: string) => ResourceSpecifier | null;
|
|
14
12
|
declare const parseIconSpecifier: (source: string) => IconSpecifier | null;
|
|
15
13
|
declare const isUrlSpecifier: (source: string) => boolean;
|
|
16
|
-
export {
|
|
14
|
+
export { isAssetSpecifier, isBareRelativeAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, };
|
|
17
15
|
//# sourceMappingURL=asset-specifier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-specifier.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"asset-specifier.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"AAGA,KAAK,iBAAiB,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,aAAa,GAAG;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAaF,QAAA,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,OAAqC,CAAC;AAEjF,QAAA,MAAM,mBAAmB,GAAI,QAAQ,MAAM,KAAG,OAC2C,CAAC;AAE1F,QAAA,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,iBAAiB,GAAG,IAepE,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,QAAQ,MAAM,KAAG,aAAa,GAAG,IAe5D,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAIxC,CAAC;AAEF,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,GACzB,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { DATA_IMPORT_PREFIX } from "../internal/data-dir.js";
|
|
2
1
|
import { ASSET_PATH_RE, ASSET_RE } from "./asset-extensions.js";
|
|
3
2
|
import { stripQuery } from "./strip-query.js";
|
|
4
|
-
const DATA_PREFIX = `${DATA_IMPORT_PREFIX}/`;
|
|
5
3
|
const RELATIVE_PREFIX_RE = /^\.\.?(?:\/|$)/;
|
|
6
4
|
const RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;
|
|
7
5
|
const ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;
|
|
@@ -11,7 +9,6 @@ const getQuery = (source) => {
|
|
|
11
9
|
return queryIndex === -1 ? null : source.slice(queryIndex + 1);
|
|
12
10
|
};
|
|
13
11
|
const isAssetSpecifier = (source) => ASSET_PATH_RE.test(source);
|
|
14
|
-
const isDataAsset = (source) => source.startsWith(DATA_PREFIX) && ASSET_RE.test(source);
|
|
15
12
|
const isBareRelativeAsset = (source) => getQuery(source) === null && RELATIVE_PREFIX_RE.test(source) && ASSET_RE.test(source);
|
|
16
13
|
const parseResourceSpecifier = (source) => {
|
|
17
14
|
const query = getQuery(source);
|
|
@@ -41,5 +38,5 @@ const isUrlSpecifier = (source) => {
|
|
|
41
38
|
const query = getQuery(source);
|
|
42
39
|
return query !== null && URL_QUERY_RE.test(query);
|
|
43
40
|
};
|
|
44
|
-
export {
|
|
41
|
+
export { isAssetSpecifier, isBareRelativeAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, };
|
|
45
42
|
//# sourceMappingURL=asset-specifier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-specifier.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"asset-specifier.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAY9C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAC5C,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AACrD,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAiB,EAAE;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEvC,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEjF,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAW,EAAE,CACpD,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE1F,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAA4B,EAAE;IACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAwB,EAAE;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,MAAc,EAAW,EAAE;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,KAAK,KAAK,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,GACzB,CAAC","sourcesContent":["import { ASSET_PATH_RE, ASSET_RE } from \"./asset-extensions.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype ResourceSpecifier = {\n assetSource: string;\n resourcePath: string | null;\n};\n\ntype IconSpecifier = {\n assetSource: string;\n iconName: string | null;\n};\n\nconst RELATIVE_PREFIX_RE = /^\\.\\.?(?:\\/|$)/;\nconst RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;\nconst ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;\nconst URL_QUERY_RE = /(?:^|&)url(?:&|$)/;\n\nconst getQuery = (source: string): string | null => {\n const queryIndex = source.indexOf(\"?\");\n\n return queryIndex === -1 ? null : source.slice(queryIndex + 1);\n};\n\nconst isAssetSpecifier = (source: string): boolean => ASSET_PATH_RE.test(source);\n\nconst isBareRelativeAsset = (source: string): boolean =>\n getQuery(source) === null && RELATIVE_PREFIX_RE.test(source) && ASSET_RE.test(source);\n\nconst parseResourceSpecifier = (source: string): ResourceSpecifier | null => {\n const query = getQuery(source);\n const assetSource = stripQuery(source);\n\n if (query === null || !ASSET_RE.test(assetSource)) {\n return null;\n }\n\n const match = RESOURCE_QUERY_RE.exec(query);\n\n if (match === null) {\n return null;\n }\n\n return { assetSource, resourcePath: match[1] ?? null };\n};\n\nconst parseIconSpecifier = (source: string): IconSpecifier | null => {\n const query = getQuery(source);\n const assetSource = stripQuery(source);\n\n if (query === null || !ASSET_RE.test(assetSource)) {\n return null;\n }\n\n const match = ICON_QUERY_RE.exec(query);\n\n if (match === null) {\n return null;\n }\n\n return { assetSource, iconName: match[1] ?? null };\n};\n\nconst isUrlSpecifier = (source: string): boolean => {\n const query = getQuery(source);\n\n return query !== null && URL_QUERY_RE.test(query);\n};\n\nexport {\n isAssetSpecifier,\n isBareRelativeAsset,\n isUrlSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n};\n"]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
import { type BuildManifestCollector } from "../internal/build-manifest.js";
|
|
3
|
-
|
|
3
|
+
type BuildConfigIdentity = {
|
|
4
|
+
configFile: string;
|
|
5
|
+
configDigest: string;
|
|
6
|
+
};
|
|
7
|
+
declare function gtkxBuildManifest(root: string, collector: BuildManifestCollector, identity: BuildConfigIdentity): Plugin;
|
|
4
8
|
export { gtkxBuildManifest };
|
|
5
9
|
//# sourceMappingURL=build-manifest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-manifest.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,EAKH,KAAK,sBAAsB,EAE9B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"build-manifest.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,OAAO,EAKH,KAAK,sBAAsB,EAE9B,MAAM,+BAA+B,CAAC;AAYvC,KAAK,mBAAmB,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC;AAsDF,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CA6BjH;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -41,7 +41,7 @@ const packagesFor = (outDir, ids) => {
|
|
|
41
41
|
return sortStringsBy(unique.values(), packageKey).map((entry) => relativeTo(outDir, entry));
|
|
42
42
|
};
|
|
43
43
|
const renderManifest = (manifest) => `${JSON.stringify(manifest, null, JSON_INDENT)}\n`;
|
|
44
|
-
function gtkxBuildManifest(root, collector) {
|
|
44
|
+
function gtkxBuildManifest(root, collector, identity) {
|
|
45
45
|
const state = { outDir: join(root, DEFAULT_OUT_DIR) };
|
|
46
46
|
return {
|
|
47
47
|
name: "gtkx:build-manifest",
|
|
@@ -54,6 +54,7 @@ function gtkxBuildManifest(root, collector) {
|
|
|
54
54
|
const manifest = {
|
|
55
55
|
generator: BUILD_MANIFEST_GENERATOR,
|
|
56
56
|
formatVersion: BUILD_MANIFEST_FORMAT_VERSION,
|
|
57
|
+
...identity,
|
|
57
58
|
schemas: collector.schemas,
|
|
58
59
|
packages: packagesFor(state.outDir, ids),
|
|
59
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-manifest.js","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACH,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,GAI3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-manifest.js","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { isRecord, sortStringsBy } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport {\n BUILD_MANIFEST_FILENAME,\n BUILD_MANIFEST_FORMAT_VERSION,\n BUILD_MANIFEST_GENERATOR,\n type BuildManifest,\n type BuildManifestCollector,\n type RecordedPackage,\n} from \"../internal/build-manifest.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype PackageIdentity = {\n name: string;\n version: string | null;\n};\n\ntype ManifestState = {\n outDir: string;\n};\n\ntype BuildConfigIdentity = {\n configFile: string;\n configDigest: string;\n};\n\nconst PACKAGE_MANIFEST_FILENAME = \"package.json\";\nconst DEFAULT_OUT_DIR = \"dist\";\nconst JSON_INDENT = 4;\n\nconst identityIn = (dir: string): PackageIdentity | null => {\n try {\n const parsed: unknown = JSON.parse(readFileSync(join(dir, PACKAGE_MANIFEST_FILENAME), \"utf8\"));\n\n if (!isRecord(parsed) || typeof parsed.name !== \"string\") {\n return null;\n }\n\n return { name: parsed.name, version: typeof parsed.version === \"string\" ? parsed.version : null };\n } catch {\n return null;\n }\n};\n\nconst packageIn = (dir: string): RecordedPackage | null => {\n const identity = identityIn(dir);\n\n if (identity !== null) {\n return { ...identity, dir };\n }\n\n const parent = dirname(dir);\n\n return parent === dir ? null : packageIn(parent);\n};\n\nconst packageForModule = (id: string): RecordedPackage | null => {\n const path = stripQuery(id);\n\n return path.startsWith(\"/\") ? packageIn(dirname(path)) : null;\n};\n\nconst packageKey = (entry: RecordedPackage): string => `${entry.name}@${entry.version ?? \"\"}`;\n\nconst relativeTo = (outDir: string, entry: RecordedPackage): RecordedPackage => ({\n ...entry,\n dir: relative(outDir, entry.dir),\n});\n\nconst packagesFor = (outDir: string, ids: string[]): RecordedPackage[] => {\n const found = ids.map((id) => packageForModule(id)).filter((entry) => entry !== null);\n const unique: Map<string, RecordedPackage> = new Map(found.map((entry) => [packageKey(entry), entry]));\n\n return sortStringsBy(unique.values(), packageKey).map((entry) => relativeTo(outDir, entry));\n};\n\nconst renderManifest = (manifest: BuildManifest): string => `${JSON.stringify(manifest, null, JSON_INDENT)}\\n`;\n\nfunction gtkxBuildManifest(root: string, collector: BuildManifestCollector, identity: BuildConfigIdentity): Plugin {\n const state: ManifestState = { outDir: join(root, DEFAULT_OUT_DIR) };\n\n return {\n name: \"gtkx:build-manifest\",\n apply: \"build\",\n\n configResolved(config) {\n state.outDir = resolve(config.root, config.build.outDir);\n },\n\n generateBundle(_options, bundle) {\n const ids = Object.values(bundle).flatMap((output) => (output.type === \"chunk\" ? output.moduleIds : []));\n\n const manifest: BuildManifest = {\n generator: BUILD_MANIFEST_GENERATOR,\n formatVersion: BUILD_MANIFEST_FORMAT_VERSION,\n ...identity,\n schemas: collector.schemas,\n packages: packagesFor(state.outDir, ids),\n };\n\n this.emitFile({\n type: \"asset\",\n fileName: BUILD_MANIFEST_FILENAME,\n source: renderManifest(manifest),\n });\n },\n };\n}\n\nexport { gtkxBuildManifest };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAyKnD,QAAA,MAAM,QAAQ,GACV,WAAW,MAAM,EACjB,aAAY,YAAmC,EAC/C,wCAAqC,KACtC,MAmDF,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
|
+
import { isPathWithin, toPosixPath } from "@gtkx/utils";
|
|
2
3
|
import { existsSync, mkdirSync } from "node:fs";
|
|
3
4
|
import { createRequire } from "node:module";
|
|
4
5
|
import { dirname, join, posix, relative, resolve } from "node:path";
|
|
5
6
|
import { compileCatalogs, LOCALE_DIRNAME, resolveCatalogProject, synchronizeCatalogs, } from "../i18n/catalogs.js";
|
|
6
7
|
import { extractSourceCatalog } from "../i18n/source-messages.js";
|
|
7
|
-
import {
|
|
8
|
+
import { emitI18nTypes } from "../i18n/types.js";
|
|
9
|
+
import { discoverSourceFiles, sourceLanguage } from "../internal/source-imports.js";
|
|
8
10
|
import { stripQuery } from "./strip-query.js";
|
|
9
11
|
const BOOTSTRAP_SPECIFIER = "@gtkx/i18n/bootstrap";
|
|
10
12
|
const LOCALE_URL_PLACEHOLDER = "__GTKX_BUNDLE_LOCALE_DIR__";
|
|
@@ -14,7 +16,7 @@ const isI18nLocaleModule = (state, id) => {
|
|
|
14
16
|
if (state.i18nRoot.length === 0) {
|
|
15
17
|
return false;
|
|
16
18
|
}
|
|
17
|
-
const path = relative(state.i18nRoot, stripQuery(id))
|
|
19
|
+
const path = toPosixPath(relative(state.i18nRoot, stripQuery(id)));
|
|
18
20
|
return LOCALE_MODULE_PATHS.has(path);
|
|
19
21
|
};
|
|
20
22
|
const markLocaleUrl = (code) => code.replace(LOCALE_URL_PATTERN, () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`);
|
|
@@ -50,7 +52,7 @@ const buildCatalogs = (state) => {
|
|
|
50
52
|
mkdirSync(state.outDir, { recursive: true });
|
|
51
53
|
compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));
|
|
52
54
|
};
|
|
53
|
-
const extractProjectMessages = async (state, shouldPreserveMetadataMessages) => {
|
|
55
|
+
const extractProjectMessages = async (state, shouldPreserveMetadataMessages, shouldSynchronizeCatalogs) => {
|
|
54
56
|
const project = state.project;
|
|
55
57
|
if (project === null) {
|
|
56
58
|
return;
|
|
@@ -58,15 +60,66 @@ const extractProjectMessages = async (state, shouldPreserveMetadataMessages) =>
|
|
|
58
60
|
const srcDir = join(project.root, "src");
|
|
59
61
|
const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);
|
|
60
62
|
await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);
|
|
61
|
-
|
|
63
|
+
if (shouldSynchronizeCatalogs) {
|
|
64
|
+
synchronizeCatalogs(project);
|
|
65
|
+
}
|
|
66
|
+
await emitI18nTypes(project.root);
|
|
67
|
+
};
|
|
68
|
+
const settleExtraction = async (pending) => {
|
|
69
|
+
try {
|
|
70
|
+
await pending;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const queueExtraction = (state, shouldPreserveMetadataMessages, shouldSynchronizeCatalogs) => {
|
|
77
|
+
const prior = state.extraction;
|
|
78
|
+
const pending = (async () => {
|
|
79
|
+
await settleExtraction(prior);
|
|
80
|
+
await extractProjectMessages(state, shouldPreserveMetadataMessages, shouldSynchronizeCatalogs);
|
|
81
|
+
})();
|
|
82
|
+
state.extraction = pending;
|
|
83
|
+
return pending;
|
|
84
|
+
};
|
|
85
|
+
const isProjectSource = (state, path) => {
|
|
86
|
+
const project = state.project;
|
|
87
|
+
if (project === null || sourceLanguage(path) === undefined) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const srcDir = join(project.root, "src");
|
|
91
|
+
const sourceRoot = existsSync(srcDir) ? srcDir : project.root;
|
|
92
|
+
return isPathWithin(sourceRoot, path);
|
|
93
|
+
};
|
|
94
|
+
const refreshProjectMessages = async (state, shouldPreserveMetadataMessages, reportError) => {
|
|
95
|
+
try {
|
|
96
|
+
await queueExtraction(state, shouldPreserveMetadataMessages, false);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
reportError(error instanceof Error ? error.message : String(error));
|
|
100
|
+
}
|
|
62
101
|
};
|
|
63
102
|
const gtkxI18n = (entryPath, loadConfig = createConfigLoader(), shouldPreserveMetadataMessages = true) => {
|
|
64
|
-
const state = {
|
|
103
|
+
const state = {
|
|
104
|
+
entryPath,
|
|
105
|
+
extraction: Promise.resolve(),
|
|
106
|
+
i18nRoot: "",
|
|
107
|
+
outDir: "",
|
|
108
|
+
project: null,
|
|
109
|
+
};
|
|
65
110
|
return {
|
|
66
111
|
name: "gtkx:i18n",
|
|
67
112
|
enforce: "pre",
|
|
68
113
|
configResolved: (config) => applyResolvedConfig(state, config, loadConfig),
|
|
69
|
-
buildStart: () =>
|
|
114
|
+
buildStart: () => queueExtraction(state, shouldPreserveMetadataMessages, true),
|
|
115
|
+
hotUpdate(options) {
|
|
116
|
+
if (!isProjectSource(state, options.file)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
return refreshProjectMessages(state, shouldPreserveMetadataMessages, (message) => {
|
|
120
|
+
options.server.config.logger.error(message);
|
|
121
|
+
});
|
|
122
|
+
},
|
|
70
123
|
transform(code, id) {
|
|
71
124
|
if (isI18nLocaleModule(state, id)) {
|
|
72
125
|
return markLocaleUrl(code);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport {\n type CatalogProject,\n compileCatalogs,\n LOCALE_DIRNAME,\n resolveCatalogProject,\n synchronizeCatalogs,\n} from \"../i18n/catalogs.js\";\nimport { extractSourceCatalog } from \"../i18n/source-messages.js\";\nimport { discoverSourceFiles } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype I18nState = {\n entryPath: string;\n i18nRoot: string;\n outDir: string;\n project: CatalogProject | null;\n};\n\nconst BOOTSTRAP_SPECIFIER = \"@gtkx/i18n/bootstrap\";\nconst LOCALE_URL_PLACEHOLDER = \"__GTKX_BUNDLE_LOCALE_DIR__\";\nconst LOCALE_MODULE_PATHS = new Set([\"dist/locale.js\", \"src/locale.ts\"]);\nconst LOCALE_URL_PATTERN = /new URL\\(([\"'])locale\\1,\\s*import\\.meta\\.url\\)/;\n\nconst isI18nLocaleModule = (state: I18nState, id: string): boolean => {\n if (state.i18nRoot.length === 0) {\n return false;\n }\n\n const path = relative(state.i18nRoot, stripQuery(id)).replaceAll(\"\\\\\", \"/\");\n\n return LOCALE_MODULE_PATHS.has(path);\n};\n\nconst markLocaleUrl = (code: string): string =>\n code.replace(\n LOCALE_URL_PATTERN,\n () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`,\n );\n\nconst localeUrlForChunk = (fileName: string): string => {\n const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);\n\n return path.length === 0 ? \".\" : path;\n};\n\nconst rebaseLocaleUrl = (state: I18nState, code: string, fileName: string, moduleIds: string[]): string | null => {\n if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {\n return null;\n }\n\n const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);\n\n if (!code.includes(placeholder)) {\n throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);\n }\n\n return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));\n};\n\nconst applyResolvedConfig = async (\n state: I18nState,\n config: ResolvedConfig,\n loadConfig: ConfigLoader,\n): Promise<void> => {\n state.entryPath = resolve(config.root, state.entryPath);\n state.outDir = resolve(config.root, config.build.outDir);\n const application = await loadConfig.resolve(config.root);\n state.project = resolveCatalogProject(config.root, application.applicationId);\n\n if (state.project !== null) {\n const projectRequire = createRequire(resolve(config.root, \"package.json\"));\n state.i18nRoot = dirname(projectRequire.resolve(\"@gtkx/i18n/package.json\"));\n }\n};\n\nconst buildCatalogs = (state: I18nState): void => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n mkdirSync(state.outDir, { recursive: true });\n compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));\n};\n\nconst extractProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n): Promise<void> => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);\n await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);\n synchronizeCatalogs(project);\n};\n\nconst gtkxI18n = (\n entryPath: string,\n loadConfig: ConfigLoader = createConfigLoader(),\n shouldPreserveMetadataMessages = true,\n): Plugin => {\n const state: I18nState = { entryPath, i18nRoot: \"\", outDir: \"\", project: null };\n\n return {\n name: \"gtkx:i18n\",\n enforce: \"pre\",\n\n configResolved: (config) => applyResolvedConfig(state, config, loadConfig),\n\n buildStart: () => extractProjectMessages(state, shouldPreserveMetadataMessages),\n\n transform(code, id) {\n if (isI18nLocaleModule(state, id)) {\n return markLocaleUrl(code);\n }\n\n if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {\n return;\n }\n\n return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\\n${code}`;\n },\n\n renderChunk(code, chunk) {\n return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);\n },\n\n generateBundle() {\n buildCatalogs(state);\n },\n };\n};\n\nexport { gtkxI18n };\n"]}
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/vite-plugins/i18n.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, ResolvedConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { isPathWithin, toPosixPath } from \"@gtkx/utils\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, posix, relative, resolve } from \"node:path\";\nimport {\n type CatalogProject,\n compileCatalogs,\n LOCALE_DIRNAME,\n resolveCatalogProject,\n synchronizeCatalogs,\n} from \"../i18n/catalogs.js\";\nimport { extractSourceCatalog } from \"../i18n/source-messages.js\";\nimport { emitI18nTypes } from \"../i18n/types.js\";\nimport { discoverSourceFiles, sourceLanguage } from \"../internal/source-imports.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype I18nState = {\n entryPath: string;\n i18nRoot: string;\n outDir: string;\n project: CatalogProject | null;\n extraction: Promise<void>;\n};\n\nconst BOOTSTRAP_SPECIFIER = \"@gtkx/i18n/bootstrap\";\nconst LOCALE_URL_PLACEHOLDER = \"__GTKX_BUNDLE_LOCALE_DIR__\";\nconst LOCALE_MODULE_PATHS = new Set([\"dist/locale.js\", \"src/locale.ts\"]);\nconst LOCALE_URL_PATTERN = /new URL\\(([\"'])locale\\1,\\s*import\\.meta\\.url\\)/;\n\nconst isI18nLocaleModule = (state: I18nState, id: string): boolean => {\n if (state.i18nRoot.length === 0) {\n return false;\n }\n\n const path = toPosixPath(relative(state.i18nRoot, stripQuery(id)));\n\n return LOCALE_MODULE_PATHS.has(path);\n};\n\nconst markLocaleUrl = (code: string): string =>\n code.replace(\n LOCALE_URL_PATTERN,\n () => `new URL(${JSON.stringify(LOCALE_URL_PLACEHOLDER)}, import.meta.url)`,\n );\n\nconst localeUrlForChunk = (fileName: string): string => {\n const path = posix.relative(posix.dirname(fileName), LOCALE_DIRNAME);\n\n return path.length === 0 ? \".\" : path;\n};\n\nconst rebaseLocaleUrl = (state: I18nState, code: string, fileName: string, moduleIds: string[]): string | null => {\n if (moduleIds.every((id) => !isI18nLocaleModule(state, id))) {\n return null;\n }\n\n const placeholder = JSON.stringify(LOCALE_URL_PLACEHOLDER);\n\n if (!code.includes(placeholder)) {\n throw new Error(`Unable to locate the @gtkx/i18n locale fallback in ${fileName}`);\n }\n\n return code.replace(placeholder, () => JSON.stringify(localeUrlForChunk(fileName)));\n};\n\nconst applyResolvedConfig = async (\n state: I18nState,\n config: ResolvedConfig,\n loadConfig: ConfigLoader,\n): Promise<void> => {\n state.entryPath = resolve(config.root, state.entryPath);\n state.outDir = resolve(config.root, config.build.outDir);\n const application = await loadConfig.resolve(config.root);\n state.project = resolveCatalogProject(config.root, application.applicationId);\n\n if (state.project !== null) {\n const projectRequire = createRequire(resolve(config.root, \"package.json\"));\n state.i18nRoot = dirname(projectRequire.resolve(\"@gtkx/i18n/package.json\"));\n }\n};\n\nconst buildCatalogs = (state: I18nState): void => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n mkdirSync(state.outDir, { recursive: true });\n compileCatalogs(project, resolve(state.outDir, LOCALE_DIRNAME));\n};\n\nconst extractProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs: boolean,\n): Promise<void> => {\n const project = state.project;\n\n if (project === null) {\n return;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceFiles = discoverSourceFiles(existsSync(srcDir) ? srcDir : project.root);\n await extractSourceCatalog(project, sourceFiles, shouldPreserveMetadataMessages);\n\n if (shouldSynchronizeCatalogs) {\n synchronizeCatalogs(project);\n }\n\n await emitI18nTypes(project.root);\n};\n\nconst settleExtraction = async (pending: Promise<void>): Promise<void> => {\n try {\n await pending;\n } catch {\n return;\n }\n};\n\nconst queueExtraction = (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n shouldSynchronizeCatalogs: boolean,\n): Promise<void> => {\n const prior = state.extraction;\n const pending = (async (): Promise<void> => {\n await settleExtraction(prior);\n await extractProjectMessages(\n state,\n shouldPreserveMetadataMessages,\n shouldSynchronizeCatalogs,\n );\n })();\n\n state.extraction = pending;\n\n return pending;\n};\n\nconst isProjectSource = (state: I18nState, path: string): boolean => {\n const project = state.project;\n\n if (project === null || sourceLanguage(path) === undefined) {\n return false;\n }\n\n const srcDir = join(project.root, \"src\");\n const sourceRoot = existsSync(srcDir) ? srcDir : project.root;\n\n return isPathWithin(sourceRoot, path);\n};\n\nconst refreshProjectMessages = async (\n state: I18nState,\n shouldPreserveMetadataMessages: boolean,\n reportError: (message: string) => void,\n): Promise<void> => {\n try {\n await queueExtraction(state, shouldPreserveMetadataMessages, false);\n } catch (error) {\n reportError(error instanceof Error ? error.message : String(error));\n }\n};\n\nconst gtkxI18n = (\n entryPath: string,\n loadConfig: ConfigLoader = createConfigLoader(),\n shouldPreserveMetadataMessages = true,\n): Plugin => {\n const state: I18nState = {\n entryPath,\n extraction: Promise.resolve(),\n i18nRoot: \"\",\n outDir: \"\",\n project: null,\n };\n\n return {\n name: \"gtkx:i18n\",\n enforce: \"pre\",\n\n configResolved: (config) => applyResolvedConfig(state, config, loadConfig),\n\n buildStart: () => queueExtraction(state, shouldPreserveMetadataMessages, true),\n\n hotUpdate(options) {\n if (!isProjectSource(state, options.file)) {\n return;\n }\n\n return refreshProjectMessages(\n state,\n shouldPreserveMetadataMessages,\n (message) => {\n options.server.config.logger.error(message);\n },\n );\n },\n\n transform(code, id) {\n if (isI18nLocaleModule(state, id)) {\n return markLocaleUrl(code);\n }\n\n if (state.project === null || resolve(stripQuery(id)) !== state.entryPath) {\n return;\n }\n\n return `import ${JSON.stringify(BOOTSTRAP_SPECIFIER)};\\n${code}`;\n },\n\n renderChunk(code, chunk) {\n return rebaseLocaleUrl(state, code, chunk.fileName, chunk.moduleIds);\n },\n\n generateBundle() {\n buildCatalogs(state);\n },\n };\n};\n\nexport { gtkxI18n };\n"]}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
import type { BuildManifestCollector } from "../internal/build-manifest.js";
|
|
3
|
-
|
|
3
|
+
type GtkxVitePluginOptions = {
|
|
4
|
+
buildManifest?: BuildManifestCollector | undefined;
|
|
5
|
+
configFile?: string | undefined;
|
|
6
|
+
entryPath?: string | undefined;
|
|
7
|
+
mode?: string | undefined;
|
|
8
|
+
shouldPreserveI18nMetadata?: boolean | undefined;
|
|
9
|
+
};
|
|
10
|
+
declare const gtkxVitePlugins: (options?: GtkxVitePluginOptions) => Plugin[];
|
|
4
11
|
export { gtkxVitePlugins };
|
|
5
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAY5E,KAAK,qBAAqB,GAAG;IACzB,aAAa,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,UAAS,qBAA0B,KAAG,MAAM,EAoBpE,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { createConfigLoader } from "@gtkx/config/internal";
|
|
2
2
|
import createConfigPlugin from "@gtkx/config/vite-plugin";
|
|
3
|
-
import { gtkxAnimated } from "./animated.js";
|
|
4
3
|
import { gtkxAssetImports } from "./asset-imports.js";
|
|
5
4
|
import { gtkxBuiltUrl } from "./built-url.js";
|
|
6
5
|
import { gtkxCss } from "./css.js";
|
|
@@ -11,20 +10,23 @@ import { gtkxResources } from "./resources.js";
|
|
|
11
10
|
import { gtkxSettings } from "./settings.js";
|
|
12
11
|
import { gtkxStoreLinks } from "./store-links.js";
|
|
13
12
|
import { gtkxUndeclaredLibrary } from "./undeclared-library.js";
|
|
14
|
-
const gtkxVitePlugins = (
|
|
15
|
-
const
|
|
13
|
+
const gtkxVitePlugins = (options = {}) => {
|
|
14
|
+
const { buildManifest, configFile, entryPath, mode, shouldPreserveI18nMetadata = true } = options;
|
|
15
|
+
const loadConfig = createConfigLoader({
|
|
16
|
+
...(mode !== undefined && { mode }),
|
|
17
|
+
...(configFile !== undefined && { configFile }),
|
|
18
|
+
});
|
|
16
19
|
return [
|
|
17
20
|
createConfigPlugin({ name: "gtkx:config", loadConfig }),
|
|
18
21
|
...(entryPath === undefined ? [] : [gtkxI18n(entryPath, loadConfig, shouldPreserveI18nMetadata)]),
|
|
19
22
|
gtkxStoreLinks(),
|
|
20
23
|
gtkxUndeclaredLibrary(loadConfig),
|
|
21
|
-
gtkxSettings(
|
|
24
|
+
gtkxSettings(buildManifest),
|
|
22
25
|
gtkxIcons(loadConfig),
|
|
23
|
-
gtkxAssetImports(
|
|
26
|
+
gtkxAssetImports(),
|
|
24
27
|
gtkxBuiltUrl(),
|
|
25
28
|
gtkxResources(loadConfig, entryPath),
|
|
26
29
|
gtkxCss(),
|
|
27
|
-
gtkxAnimated(loadConfig),
|
|
28
30
|
gtkxReactCompiler(loadConfig),
|
|
29
31
|
];
|
|
30
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAUhE,MAAM,eAAe,GAAG,CAAC,UAAiC,EAAE,EAAY,EAAE;IACtE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,0BAA0B,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAClG,MAAM,UAAU,GAAG,kBAAkB,CAAC;QAClC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC;KAClD,CAAC,CAAC;IAEH,OAAO;QACH,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;QACvD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC,CAAC;QACjG,cAAc,EAAE;QAChB,qBAAqB,CAAC,UAAU,CAAC;QACjC,YAAY,CAAC,aAAa,CAAC;QAC3B,SAAS,CAAC,UAAU,CAAC;QACrB,gBAAgB,EAAE;QAClB,YAAY,EAAE;QACd,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC;QACpC,OAAO,EAAE;QACT,iBAAiB,CAAC,UAAU,CAAC;KAChC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport createConfigPlugin from \"@gtkx/config/vite-plugin\";\nimport type { BuildManifestCollector } from \"../internal/build-manifest.js\";\nimport { gtkxAssetImports } from \"./asset-imports.js\";\nimport { gtkxBuiltUrl } from \"./built-url.js\";\nimport { gtkxCss } from \"./css.js\";\nimport { gtkxI18n } from \"./i18n.js\";\nimport { gtkxIcons } from \"./icons.js\";\nimport { gtkxReactCompiler } from \"./react-compiler.js\";\nimport { gtkxResources } from \"./resources.js\";\nimport { gtkxSettings } from \"./settings.js\";\nimport { gtkxStoreLinks } from \"./store-links.js\";\nimport { gtkxUndeclaredLibrary } from \"./undeclared-library.js\";\n\ntype GtkxVitePluginOptions = {\n buildManifest?: BuildManifestCollector | undefined;\n configFile?: string | undefined;\n entryPath?: string | undefined;\n mode?: string | undefined;\n shouldPreserveI18nMetadata?: boolean | undefined;\n};\n\nconst gtkxVitePlugins = (options: GtkxVitePluginOptions = {}): Plugin[] => {\n const { buildManifest, configFile, entryPath, mode, shouldPreserveI18nMetadata = true } = options;\n const loadConfig = createConfigLoader({\n ...(mode !== undefined && { mode }),\n ...(configFile !== undefined && { configFile }),\n });\n\n return [\n createConfigPlugin({ name: \"gtkx:config\", loadConfig }),\n ...(entryPath === undefined ? [] : [gtkxI18n(entryPath, loadConfig, shouldPreserveI18nMetadata)]),\n gtkxStoreLinks(),\n gtkxUndeclaredLibrary(loadConfig),\n gtkxSettings(buildManifest),\n gtkxIcons(loadConfig),\n gtkxAssetImports(),\n gtkxBuiltUrl(),\n gtkxResources(loadConfig, entryPath),\n gtkxCss(),\n gtkxReactCompiler(loadConfig),\n ];\n};\n\nexport { gtkxVitePlugins };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAc,MAAM,EAAuD,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAc,MAAM,EAAuD,MAAM,MAAM,CAAC;AAo/CpG,iBAAS,aAAa,CAAC,UAAU,GAAE,YAAmC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBlG;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|