@gtkx/cli 2.0.0-beta.5 → 2.0.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +43 -40
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +28 -8
  4. package/dist/builder.js.map +1 -1
  5. package/dist/cli.js +1 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/codegen/freshness.d.ts.map +1 -1
  8. package/dist/codegen/freshness.js +5 -1
  9. package/dist/codegen/freshness.js.map +1 -1
  10. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  11. package/dist/deploy/freedesktop/validate.js +6 -1
  12. package/dist/deploy/freedesktop/validate.js.map +1 -1
  13. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  14. package/dist/deploy/settings/libraries.js +2 -1
  15. package/dist/deploy/settings/libraries.js.map +1 -1
  16. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  17. package/dist/deploy/targets/flatpak-source.js +2 -0
  18. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  19. package/dist/dev/font-dir.d.ts +3 -0
  20. package/dist/dev/font-dir.d.ts.map +1 -0
  21. package/dist/dev/font-dir.js +12 -0
  22. package/dist/dev/font-dir.js.map +1 -0
  23. package/dist/dev/runner-main.d.ts.map +1 -1
  24. package/dist/dev/runner-main.js +2 -0
  25. package/dist/dev/runner-main.js.map +1 -1
  26. package/dist/internal/agent-rules.d.ts.map +1 -1
  27. package/dist/internal/agent-rules.js +7 -2
  28. package/dist/internal/agent-rules.js.map +1 -1
  29. package/dist/internal/banner.d.ts +4 -2
  30. package/dist/internal/banner.d.ts.map +1 -1
  31. package/dist/internal/banner.js +19 -5
  32. package/dist/internal/banner.js.map +1 -1
  33. package/dist/internal/font-path.d.ts +4 -0
  34. package/dist/internal/font-path.d.ts.map +1 -0
  35. package/dist/internal/font-path.js +12 -0
  36. package/dist/internal/font-path.js.map +1 -0
  37. package/dist/internal/font-staging.d.ts +3 -0
  38. package/dist/internal/font-staging.d.ts.map +1 -0
  39. package/dist/internal/font-staging.js +43 -0
  40. package/dist/internal/font-staging.js.map +1 -0
  41. package/dist/internal/source-imports.d.ts +2 -1
  42. package/dist/internal/source-imports.d.ts.map +1 -1
  43. package/dist/internal/source-imports.js +7 -2
  44. package/dist/internal/source-imports.js.map +1 -1
  45. package/dist/internal/xdg-banner.d.ts +4 -0
  46. package/dist/internal/xdg-banner.d.ts.map +1 -0
  47. package/dist/internal/xdg-banner.js +11 -0
  48. package/dist/internal/xdg-banner.js.map +1 -0
  49. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  50. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  51. package/dist/internal/xdg-data-dirs.js +1 -1
  52. package/dist/internal/xdg-data-dirs.js.map +1 -1
  53. package/dist/settings/schema.d.ts.map +1 -1
  54. package/dist/settings/schema.js +1 -6
  55. package/dist/settings/schema.js.map +1 -1
  56. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  57. package/dist/vite-plugins/asset-extensions.js +2 -0
  58. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  59. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  60. package/dist/vite-plugins/asset-imports.js +7 -2
  61. package/dist/vite-plugins/asset-imports.js.map +1 -1
  62. package/dist/vite-plugins/asset-specifier.d.ts +5 -1
  63. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
  64. package/dist/vite-plugins/asset-specifier.js +10 -1
  65. package/dist/vite-plugins/asset-specifier.js.map +1 -1
  66. package/dist/vite-plugins/css.d.ts.map +1 -1
  67. package/dist/vite-plugins/css.js +3 -2
  68. package/dist/vite-plugins/css.js.map +1 -1
  69. package/dist/vite-plugins/font-name.d.ts +3 -0
  70. package/dist/vite-plugins/font-name.d.ts.map +1 -0
  71. package/dist/vite-plugins/font-name.js +406 -0
  72. package/dist/vite-plugins/font-name.js.map +1 -0
  73. package/dist/vite-plugins/font-worker-env.d.ts +4 -0
  74. package/dist/vite-plugins/font-worker-env.d.ts.map +1 -0
  75. package/dist/vite-plugins/font-worker-env.js +22 -0
  76. package/dist/vite-plugins/font-worker-env.js.map +1 -0
  77. package/dist/vite-plugins/font.d.ts +4 -0
  78. package/dist/vite-plugins/font.d.ts.map +1 -0
  79. package/dist/vite-plugins/font.js +87 -0
  80. package/dist/vite-plugins/font.js.map +1 -0
  81. package/dist/vite-plugins/icons.d.ts.map +1 -1
  82. package/dist/vite-plugins/icons.js +2 -7
  83. package/dist/vite-plugins/icons.js.map +1 -1
  84. package/dist/vite-plugins/index.d.ts.map +1 -1
  85. package/dist/vite-plugins/index.js +2 -0
  86. package/dist/vite-plugins/index.js.map +1 -1
  87. package/dist/vite-plugins/resources.js +1 -1
  88. package/dist/vite-plugins/resources.js.map +1 -1
  89. package/dist/vite-plugins/settings.d.ts.map +1 -1
  90. package/dist/vite-plugins/settings.js +6 -6
  91. package/dist/vite-plugins/settings.js.map +1 -1
  92. package/dist/vite-plugins/undeclared-library.js +3 -3
  93. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  94. package/dist/vitest-plugin.d.ts.map +1 -1
  95. package/dist/vitest-plugin.js +2 -0
  96. package/dist/vitest-plugin.js.map +1 -1
  97. package/env.d.ts +9 -0
  98. package/package.json +14 -12
  99. package/src/builder.ts +28 -8
  100. package/src/cli.ts +1 -1
  101. package/src/codegen/freshness.ts +5 -1
  102. package/src/deploy/freedesktop/validate.ts +8 -1
  103. package/src/deploy/settings/libraries.ts +2 -1
  104. package/src/deploy/targets/flatpak-source.ts +2 -0
  105. package/src/dev/font-dir.ts +16 -0
  106. package/src/dev/runner-main.ts +2 -0
  107. package/src/internal/agent-rules.ts +7 -2
  108. package/src/internal/banner.ts +27 -6
  109. package/src/internal/font-path.ts +15 -0
  110. package/src/internal/font-staging.ts +57 -0
  111. package/src/internal/source-imports.ts +17 -2
  112. package/src/internal/xdg-banner.ts +13 -0
  113. package/src/internal/xdg-data-dirs.ts +1 -1
  114. package/src/settings/schema.ts +1 -8
  115. package/src/vite-plugins/asset-extensions.ts +2 -0
  116. package/src/vite-plugins/asset-imports.ts +9 -1
  117. package/src/vite-plugins/asset-specifier.ts +17 -0
  118. package/src/vite-plugins/css.ts +4 -2
  119. package/src/vite-plugins/font-name.ts +582 -0
  120. package/src/vite-plugins/font-worker-env.ts +29 -0
  121. package/src/vite-plugins/font.ts +147 -0
  122. package/src/vite-plugins/icons.ts +2 -8
  123. package/src/vite-plugins/index.ts +2 -0
  124. package/src/vite-plugins/resources.ts +1 -1
  125. package/src/vite-plugins/settings.ts +7 -7
  126. package/src/vite-plugins/undeclared-library.ts +3 -3
  127. package/src/vitest-plugin.ts +2 -0
@@ -0,0 +1,13 @@
1
+ import type { Rollup } from "vite";
2
+ import { outputRootUrlExpression } from "./banner.js";
3
+ import { XDG_DATA_DIRS_DEFAULT } from "./xdg-data-dirs.js";
4
+
5
+ const xdgDataDirsBanner = (chunk: Rollup.RenderedChunk): string => [
6
+ "globalThis.process.env.XDG_DATA_DIRS = (() => {",
7
+ ` const root = ${outputRootUrlExpression(chunk)};`,
8
+ ` const dirs = globalThis.process.env.XDG_DATA_DIRS || ${JSON.stringify(XDG_DATA_DIRS_DEFAULT)};`,
9
+ " return dirs.split(\":\").includes(root) ? dirs : `${root}:${dirs}`;",
10
+ "})();",
11
+ ].join("\n");
12
+
13
+ export { xdgDataDirsBanner };
@@ -10,4 +10,4 @@ const prependXdgDataDir = (dir: string, existing: string | undefined): string =>
10
10
  return `${dir}:${base}`;
11
11
  };
12
12
 
13
- export { prependXdgDataDir };
13
+ export { prependXdgDataDir, XDG_DATA_DIRS_DEFAULT };
@@ -12,7 +12,7 @@ import {
12
12
  import { tmpdir } from "node:os";
13
13
  import { basename, dirname, join, relative, resolve } from "node:path";
14
14
  import { I18N_TYPES_FILENAME, i18nTypesPath } from "../i18n/types.js";
15
- import { discoverSourceImports, type SourceImport } from "../internal/source-imports.js";
15
+ import { discoverSourceImports, sourceDirFor, type SourceImport } from "../internal/source-imports.js";
16
16
  import { removeTempDir } from "../internal/staging-dir.js";
17
17
  import {
18
18
  isBareRelativeAsset,
@@ -30,7 +30,6 @@ type SchemaEnvResult = {
30
30
 
31
31
  const SCHEMA_SUFFIX = ".gschema.xml";
32
32
  const STAGED_NAME_LENGTH = 16;
33
- const SOURCE_DIR = "src";
34
33
  const RESOURCE_QUERY = "?resource=";
35
34
  const ICON_QUERY = "?icon=";
36
35
 
@@ -69,12 +68,6 @@ const projectRelativeSchemaPath = (root: string, filePath: string): string | nul
69
68
 
70
69
  const getRelativeModuleSpecifier = (filePath: string): string => `*/${basename(filePath)}`;
71
70
 
72
- const sourceDirFor = (root: string): string => {
73
- const sourceDir = join(root, SOURCE_DIR);
74
-
75
- return existsSync(sourceDir) ? sourceDir : root;
76
- };
77
-
78
71
  const isRelativeImport = (source: string): boolean => source.startsWith("./") || source.startsWith("../");
79
72
 
80
73
  const schemaFileFor = ({ importer, source }: SourceImport): string | null =>
@@ -18,6 +18,8 @@ const ASSET_EXTENSIONS = [
18
18
  "eot",
19
19
  "ttf",
20
20
  "otf",
21
+ "ttc",
22
+ "otc",
21
23
  "ico",
22
24
  "avif",
23
25
  "data",
@@ -5,6 +5,7 @@ import { ASSET_MENTION_RE } from "./asset-extensions.js";
5
5
  import {
6
6
  isAssetSpecifier,
7
7
  isUrlSpecifier,
8
+ parseFontSpecifier,
8
9
  parseIconSpecifier,
9
10
  parseResourceSpecifier,
10
11
  } from "./asset-specifier.js";
@@ -31,8 +32,11 @@ const RESOURCE_ADVICE =
31
32
 
32
33
  const ICON_ADVICE = "An icon asset exports only its default icon-theme name, and nothing else.";
33
34
 
35
+ const FONT_ADVICE = "A font asset exports only its default font family name, and nothing else.";
36
+
34
37
  const RELATIVE_ADVICE =
35
- "Add ?resource for a GResource, ?icon for a themed icon, or ?url for an emitted file.";
38
+ "Add ?resource for a GResource, ?icon for a themed icon, ?font for a bundled font, or ?url for an " +
39
+ "emitted file.";
36
40
 
37
41
  const boundName = (entry: BindingEntry): string | null => {
38
42
  const { name } = entry.importName;
@@ -87,6 +91,10 @@ const adviceFor = (source: string): string => {
87
91
  return ICON_ADVICE;
88
92
  }
89
93
 
94
+ if (parseFontSpecifier(source) !== null) {
95
+ return FONT_ADVICE;
96
+ }
97
+
90
98
  if (isUrlSpecifier(source)) {
91
99
  return QUERY_ADVICE;
92
100
  }
@@ -11,9 +11,14 @@ type IconSpecifier = {
11
11
  iconName: string | null;
12
12
  };
13
13
 
14
+ type FontSpecifier = {
15
+ assetSource: string;
16
+ };
17
+
14
18
  const RELATIVE_PREFIX_RE = /^\.\.?(?:\/|$)/;
15
19
  const RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;
16
20
  const ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;
21
+ const FONT_QUERY_RE = /^font$/;
17
22
  const URL_QUERY_RE = /(?:^|&)url(?:&|$)/;
18
23
 
19
24
  const getQuery = (source: string): string | null => {
@@ -61,6 +66,17 @@ const parseIconSpecifier = (source: string): IconSpecifier | null => {
61
66
  return { assetSource, iconName: match[1] ?? null };
62
67
  };
63
68
 
69
+ const parseFontSpecifier = (source: string): FontSpecifier | null => {
70
+ const query = getQuery(source);
71
+ const assetSource = stripQuery(source);
72
+
73
+ if (query === null || !ASSET_RE.test(assetSource) || !FONT_QUERY_RE.test(query)) {
74
+ return null;
75
+ }
76
+
77
+ return { assetSource };
78
+ };
79
+
64
80
  const isUrlSpecifier = (source: string): boolean => {
65
81
  const query = getQuery(source);
66
82
 
@@ -71,6 +87,7 @@ export {
71
87
  isAssetSpecifier,
72
88
  isBareRelativeAsset,
73
89
  isUrlSpecifier,
90
+ parseFontSpecifier,
74
91
  parseIconSpecifier,
75
92
  parseResourceSpecifier,
76
93
  };
@@ -4,6 +4,7 @@ import { createVirtualNamespace } from "./virtual-module.js";
4
4
 
5
5
  type CssResolveContext = Parameters<typeof resolveToVirtual>[0];
6
6
  type CssResolveRequest = Parameters<typeof resolveToVirtual>[1];
7
+ type CssLoadContext = { addWatchFile: (file: string) => void };
7
8
 
8
9
  const CSS_RE = /\.css$/i;
9
10
  const INJECT_SUFFIX = "?inject";
@@ -24,13 +25,14 @@ const resolveCssId = async (ctx: CssResolveContext, request: CssResolveRequest):
24
25
  return virtualId + INJECT_SUFFIX;
25
26
  };
26
27
 
27
- const loadInjectedCss = (id: string): string | undefined => {
28
+ const loadInjectedCss = (ctx: CssLoadContext, id: string): string | undefined => {
28
29
  if (!isVirtual(id) || !id.endsWith(INJECT_SUFFIX)) {
29
30
  return;
30
31
  }
31
32
 
32
33
  const filePath = fromVirtualId(id.slice(0, -INJECT_SUFFIX.length));
33
34
  const content = readFileSync(filePath, "utf8");
35
+ ctx.addWatchFile(filePath);
34
36
 
35
37
  return ["import { injectGlobal } from \"@gtkx/css\";", `injectGlobal(${JSON.stringify(content)});`].join("\n");
36
38
  };
@@ -45,7 +47,7 @@ function gtkxCss(): Plugin {
45
47
  },
46
48
 
47
49
  load(id) {
48
- return loadInjectedCss(id);
50
+ return loadInjectedCss(this, id);
49
51
  },
50
52
  };
51
53
  }