@gtkx/cli 2.0.0-beta.6 → 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 (114) hide show
  1. package/README.md +43 -40
  2. package/dist/cli.js +1 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/codegen/freshness.d.ts.map +1 -1
  5. package/dist/codegen/freshness.js +5 -1
  6. package/dist/codegen/freshness.js.map +1 -1
  7. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  8. package/dist/deploy/settings/libraries.js +2 -1
  9. package/dist/deploy/settings/libraries.js.map +1 -1
  10. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  11. package/dist/deploy/targets/flatpak-source.js +2 -0
  12. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  13. package/dist/dev/font-dir.d.ts +3 -0
  14. package/dist/dev/font-dir.d.ts.map +1 -0
  15. package/dist/dev/font-dir.js +12 -0
  16. package/dist/dev/font-dir.js.map +1 -0
  17. package/dist/dev/runner-main.d.ts.map +1 -1
  18. package/dist/dev/runner-main.js +2 -0
  19. package/dist/dev/runner-main.js.map +1 -1
  20. package/dist/internal/agent-rules.d.ts.map +1 -1
  21. package/dist/internal/agent-rules.js +6 -2
  22. package/dist/internal/agent-rules.js.map +1 -1
  23. package/dist/internal/banner.d.ts.map +1 -1
  24. package/dist/internal/banner.js +3 -0
  25. package/dist/internal/banner.js.map +1 -1
  26. package/dist/internal/font-path.d.ts +4 -0
  27. package/dist/internal/font-path.d.ts.map +1 -0
  28. package/dist/internal/font-path.js +12 -0
  29. package/dist/internal/font-path.js.map +1 -0
  30. package/dist/internal/font-staging.d.ts +3 -0
  31. package/dist/internal/font-staging.d.ts.map +1 -0
  32. package/dist/internal/font-staging.js +43 -0
  33. package/dist/internal/font-staging.js.map +1 -0
  34. package/dist/internal/source-imports.d.ts +2 -1
  35. package/dist/internal/source-imports.d.ts.map +1 -1
  36. package/dist/internal/source-imports.js +7 -2
  37. package/dist/internal/source-imports.js.map +1 -1
  38. package/dist/internal/xdg-banner.d.ts +4 -0
  39. package/dist/internal/xdg-banner.d.ts.map +1 -0
  40. package/dist/internal/xdg-banner.js +11 -0
  41. package/dist/internal/xdg-banner.js.map +1 -0
  42. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  43. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  44. package/dist/internal/xdg-data-dirs.js +1 -1
  45. package/dist/internal/xdg-data-dirs.js.map +1 -1
  46. package/dist/settings/schema.d.ts.map +1 -1
  47. package/dist/settings/schema.js +1 -6
  48. package/dist/settings/schema.js.map +1 -1
  49. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  50. package/dist/vite-plugins/asset-extensions.js +2 -0
  51. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  52. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  53. package/dist/vite-plugins/asset-imports.js +7 -2
  54. package/dist/vite-plugins/asset-imports.js.map +1 -1
  55. package/dist/vite-plugins/asset-specifier.d.ts +5 -1
  56. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
  57. package/dist/vite-plugins/asset-specifier.js +10 -1
  58. package/dist/vite-plugins/asset-specifier.js.map +1 -1
  59. package/dist/vite-plugins/css.d.ts.map +1 -1
  60. package/dist/vite-plugins/css.js +3 -2
  61. package/dist/vite-plugins/css.js.map +1 -1
  62. package/dist/vite-plugins/font-name.d.ts +3 -0
  63. package/dist/vite-plugins/font-name.d.ts.map +1 -0
  64. package/dist/vite-plugins/font-name.js +406 -0
  65. package/dist/vite-plugins/font-name.js.map +1 -0
  66. package/dist/vite-plugins/font-worker-env.d.ts +4 -0
  67. package/dist/vite-plugins/font-worker-env.d.ts.map +1 -0
  68. package/dist/vite-plugins/font-worker-env.js +22 -0
  69. package/dist/vite-plugins/font-worker-env.js.map +1 -0
  70. package/dist/vite-plugins/font.d.ts +4 -0
  71. package/dist/vite-plugins/font.d.ts.map +1 -0
  72. package/dist/vite-plugins/font.js +87 -0
  73. package/dist/vite-plugins/font.js.map +1 -0
  74. package/dist/vite-plugins/icons.d.ts.map +1 -1
  75. package/dist/vite-plugins/icons.js +3 -8
  76. package/dist/vite-plugins/icons.js.map +1 -1
  77. package/dist/vite-plugins/index.d.ts.map +1 -1
  78. package/dist/vite-plugins/index.js +2 -0
  79. package/dist/vite-plugins/index.js.map +1 -1
  80. package/dist/vite-plugins/resources.js +1 -1
  81. package/dist/vite-plugins/resources.js.map +1 -1
  82. package/dist/vite-plugins/undeclared-library.js +3 -3
  83. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  84. package/dist/vitest-plugin.d.ts.map +1 -1
  85. package/dist/vitest-plugin.js +2 -0
  86. package/dist/vitest-plugin.js.map +1 -1
  87. package/env.d.ts +9 -0
  88. package/package.json +14 -12
  89. package/src/cli.ts +1 -1
  90. package/src/codegen/freshness.ts +5 -1
  91. package/src/deploy/settings/libraries.ts +2 -1
  92. package/src/deploy/targets/flatpak-source.ts +2 -0
  93. package/src/dev/font-dir.ts +16 -0
  94. package/src/dev/runner-main.ts +2 -0
  95. package/src/internal/agent-rules.ts +6 -2
  96. package/src/internal/banner.ts +4 -0
  97. package/src/internal/font-path.ts +15 -0
  98. package/src/internal/font-staging.ts +57 -0
  99. package/src/internal/source-imports.ts +17 -2
  100. package/src/internal/xdg-banner.ts +13 -0
  101. package/src/internal/xdg-data-dirs.ts +1 -1
  102. package/src/settings/schema.ts +1 -8
  103. package/src/vite-plugins/asset-extensions.ts +2 -0
  104. package/src/vite-plugins/asset-imports.ts +9 -1
  105. package/src/vite-plugins/asset-specifier.ts +17 -0
  106. package/src/vite-plugins/css.ts +4 -2
  107. package/src/vite-plugins/font-name.ts +582 -0
  108. package/src/vite-plugins/font-worker-env.ts +29 -0
  109. package/src/vite-plugins/font.ts +147 -0
  110. package/src/vite-plugins/icons.ts +4 -10
  111. package/src/vite-plugins/index.ts +2 -0
  112. package/src/vite-plugins/resources.ts +1 -1
  113. package/src/vite-plugins/undeclared-library.ts +3 -3
  114. package/src/vitest-plugin.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/internal/banner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIlC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAAE,KAA2B,EAAmB,EAAE,CACxF,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAE1D,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAE,MAAc,EAAwB,EAAE;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhC,OAAO;QACH,GAAG,OAAO;QACV,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAEjF,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;QACjE,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAA2B,EAAU,EAAE;IACpE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC;IAExE,OAAO,8BAA8B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,8BAA8B,CAAC;AACjG,CAAC,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type { Rollup } from \"vite\";\nimport { posix } from \"node:path\";\n\ntype Banner = string | Rollup.AddonFunction;\n\nconst renderBanner = async (banner: Banner, chunk: Rollup.RenderedChunk): Promise<string> =>\n typeof banner === \"function\" ? banner(chunk) : banner;\n\nconst prependBanner = (options: Rollup.OutputOptions, banner: Banner): Rollup.OutputOptions => {\n const existing = options.banner;\n\n return {\n ...options,\n banner: async (chunk) => {\n const prefix = await renderBanner(banner, chunk);\n const suffix = existing === undefined ? \"\" : await renderBanner(existing, chunk);\n\n return suffix.length === 0 ? prefix : `${prefix}\\n${suffix}`;\n },\n };\n};\n\nconst outputRootUrlExpression = (chunk: Rollup.RenderedChunk): string => {\n const relativeRoot = posix.relative(posix.dirname(chunk.fileName), \".\");\n const specifier = relativeRoot.length === 0 ? \"./\" : `${relativeRoot}/`;\n\n return `decodeURIComponent(new URL(${JSON.stringify(specifier)}, import.meta.url).pathname)`;\n};\n\nexport { outputRootUrlExpression, prependBanner };\n"]}
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/internal/banner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIlC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAAE,KAA2B,EAAmB,EAAE,CACxF,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAE1D,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAE,MAAc,EAAwB,EAAE;IAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhC,OAAO;QACH,GAAG,OAAO;QACV,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAEjF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,MAAM,CAAC;YAClB,CAAC;YAED,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;QACjE,CAAC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAA2B,EAAU,EAAE;IACpE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC;IAExE,OAAO,8BAA8B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,8BAA8B,CAAC;AACjG,CAAC,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import type { Rollup } from \"vite\";\nimport { posix } from \"node:path\";\n\ntype Banner = string | Rollup.AddonFunction;\n\nconst renderBanner = async (banner: Banner, chunk: Rollup.RenderedChunk): Promise<string> =>\n typeof banner === \"function\" ? banner(chunk) : banner;\n\nconst prependBanner = (options: Rollup.OutputOptions, banner: Banner): Rollup.OutputOptions => {\n const existing = options.banner;\n\n return {\n ...options,\n banner: async (chunk) => {\n const prefix = await renderBanner(banner, chunk);\n const suffix = existing === undefined ? \"\" : await renderBanner(existing, chunk);\n\n if (prefix.length === 0) {\n return suffix;\n }\n\n return suffix.length === 0 ? prefix : `${prefix}\\n${suffix}`;\n },\n };\n};\n\nconst outputRootUrlExpression = (chunk: Rollup.RenderedChunk): string => {\n const relativeRoot = posix.relative(posix.dirname(chunk.fileName), \".\");\n const specifier = relativeRoot.length === 0 ? \"./\" : `${relativeRoot}/`;\n\n return `decodeURIComponent(new URL(${JSON.stringify(specifier)}, import.meta.url).pathname)`;\n};\n\nexport { outputRootUrlExpression, prependBanner };\n"]}
@@ -0,0 +1,4 @@
1
+ declare const FONTS_DIR = "fonts";
2
+ declare const fontFileName: (sourcePath: string, content: Buffer) => string;
3
+ export { fontFileName, FONTS_DIR };
4
+ //# sourceMappingURL=font-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-path.d.ts","sourceRoot":"","sources":["../../src/internal/font-path.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,SAAS,UAAU,CAAC;AAG1B,QAAA,MAAM,YAAY,GAAI,YAAY,MAAM,EAAE,SAAS,MAAM,KAAG,MAM3D,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { createHash } from "node:crypto";
2
+ import { basename, extname } from "node:path";
3
+ const FONTS_DIR = "fonts";
4
+ const DIGEST_LENGTH = 8;
5
+ const fontFileName = (sourcePath, content) => {
6
+ const extension = extname(sourcePath).toLowerCase();
7
+ const stem = basename(sourcePath, extname(sourcePath));
8
+ const digest = createHash("sha1").update(content).digest("hex").slice(0, DIGEST_LENGTH);
9
+ return `${stem}-${digest}${extension}`;
10
+ };
11
+ export { fontFileName, FONTS_DIR };
12
+ //# sourceMappingURL=font-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-path.js","sourceRoot":"","sources":["../../src/internal/font-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,SAAS,GAAG,OAAO,CAAC;AAC1B,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,OAAe,EAAU,EAAE;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAExF,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3C,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { basename, extname } from \"node:path\";\n\nconst FONTS_DIR = \"fonts\";\nconst DIGEST_LENGTH = 8;\n\nconst fontFileName = (sourcePath: string, content: Buffer): string => {\n const extension = extname(sourcePath).toLowerCase();\n const stem = basename(sourcePath, extname(sourcePath));\n const digest = createHash(\"sha1\").update(content).digest(\"hex\").slice(0, DIGEST_LENGTH);\n\n return `${stem}-${digest}${extension}`;\n};\n\nexport { fontFileName, FONTS_DIR };\n"]}
@@ -0,0 +1,3 @@
1
+ declare const stageProjectFonts: (root: string) => string | null;
2
+ export { stageProjectFonts };
3
+ //# sourceMappingURL=font-staging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-staging.d.ts","sourceRoot":"","sources":["../../src/internal/font-staging.ts"],"names":[],"mappings":"AAmCA,QAAA,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAmBlD,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { sortStrings } from "@gtkx/utils";
2
+ import { mkdirSync, mkdtempSync, readFileSync, symlinkSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { parseFontSpecifier } from "../vite-plugins/asset-specifier.js";
6
+ import { fontFileName, FONTS_DIR } from "./font-path.js";
7
+ import { discoverSourceImports, sourceDirFor } from "./source-imports.js";
8
+ import { removeTempDir } from "./staging-dir.js";
9
+ const FONT_STAGING_PREFIX = "gtkx-fonts-";
10
+ const isRelativeImport = (source) => source.startsWith("./") || source.startsWith("../");
11
+ const fontFileFor = ({ importer, source }) => {
12
+ const specifier = parseFontSpecifier(source);
13
+ return specifier === null || !isRelativeImport(source)
14
+ ? null
15
+ : resolve(dirname(importer), specifier.assetSource);
16
+ };
17
+ const findImportedFontFiles = (imports) => {
18
+ const files = imports
19
+ .map((entry) => fontFileFor(entry))
20
+ .filter((path) => path !== null);
21
+ return sortStrings(new Set(files));
22
+ };
23
+ const stageFont = (fontsDir, sourcePath) => {
24
+ const fileName = fontFileName(sourcePath, readFileSync(sourcePath));
25
+ symlinkSync(sourcePath, join(fontsDir, fileName), "file");
26
+ };
27
+ const stageProjectFonts = (root) => {
28
+ const fontFiles = findImportedFontFiles(discoverSourceImports(sourceDirFor(root)));
29
+ if (fontFiles.length === 0) {
30
+ return null;
31
+ }
32
+ const shareDir = mkdtempSync(join(tmpdir(), FONT_STAGING_PREFIX));
33
+ mkdirSync(join(shareDir, FONTS_DIR));
34
+ for (const sourcePath of fontFiles) {
35
+ stageFont(join(shareDir, FONTS_DIR), sourcePath);
36
+ }
37
+ process.once("exit", () => {
38
+ removeTempDir(shareDir);
39
+ });
40
+ return shareDir;
41
+ };
42
+ export { stageProjectFonts };
43
+ //# sourceMappingURL=font-staging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"font-staging.js","sourceRoot":"","sources":["../../src/internal/font-staging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAqB,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAE1C,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAE1G,MAAM,WAAW,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAgB,EAAiB,EAAE;IACtE,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO,SAAS,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAClD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAuB,EAAY,EAAE;IAChE,MAAM,KAAK,GAAG,OAAO;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAErD,OAAO,WAAW,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,UAAkB,EAAQ,EAAE;IAC7D,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IAEpE,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAiB,EAAE;IACtD,MAAM,SAAS,GAAG,qBAAqB,CAAC,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAClE,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAErC,KAAK,MAAM,UAAU,IAAI,SAAS,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import { sortStrings } from \"@gtkx/utils\";\nimport { mkdirSync, mkdtempSync, readFileSync, symlinkSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parseFontSpecifier } from \"../vite-plugins/asset-specifier.js\";\nimport { fontFileName, FONTS_DIR } from \"./font-path.js\";\nimport { discoverSourceImports, sourceDirFor, type SourceImport } from \"./source-imports.js\";\nimport { removeTempDir } from \"./staging-dir.js\";\n\nconst FONT_STAGING_PREFIX = \"gtkx-fonts-\";\n\nconst isRelativeImport = (source: string): boolean => source.startsWith(\"./\") || source.startsWith(\"../\");\n\nconst fontFileFor = ({ importer, source }: SourceImport): string | null => {\n const specifier = parseFontSpecifier(source);\n\n return specifier === null || !isRelativeImport(source)\n ? null\n : resolve(dirname(importer), specifier.assetSource);\n};\n\nconst findImportedFontFiles = (imports: SourceImport[]): string[] => {\n const files = imports\n .map((entry) => fontFileFor(entry))\n .filter((path): path is string => path !== null);\n\n return sortStrings(new Set(files));\n};\n\nconst stageFont = (fontsDir: string, sourcePath: string): void => {\n const fileName = fontFileName(sourcePath, readFileSync(sourcePath));\n\n symlinkSync(sourcePath, join(fontsDir, fileName), \"file\");\n};\n\nconst stageProjectFonts = (root: string): string | null => {\n const fontFiles = findImportedFontFiles(discoverSourceImports(sourceDirFor(root)));\n\n if (fontFiles.length === 0) {\n return null;\n }\n\n const shareDir = mkdtempSync(join(tmpdir(), FONT_STAGING_PREFIX));\n mkdirSync(join(shareDir, FONTS_DIR));\n\n for (const sourcePath of fontFiles) {\n stageFont(join(shareDir, FONTS_DIR), sourcePath);\n }\n\n process.once(\"exit\", () => {\n removeTempDir(shareDir);\n });\n\n return shareDir;\n};\n\nexport { stageProjectFonts };\n"]}
@@ -5,8 +5,9 @@ type SourceImport = {
5
5
  };
6
6
  type SourceLanguage = NonNullable<ParserOptions["lang"]>;
7
7
  declare const sourceLanguage: (path: string) => SourceLanguage | undefined;
8
+ declare const sourceDirFor: (root: string) => string;
8
9
  declare const discoverSourceFiles: (dir: string) => string[];
9
10
  declare const parseRuntimeImportsIn: (path: string) => SourceImport[] | null;
10
11
  declare const discoverSourceImports: (dir: string) => SourceImport[];
11
- export { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, type SourceImport, sourceLanguage };
12
+ export { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, sourceDirFor, sourceLanguage, type SourceImport, };
12
13
  //# sourceMappingURL=source-imports.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"source-imports.d.ts","sourceRoot":"","sources":["../../src/internal/source-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,MAAM,CAAC;AAM/D,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAYzD,QAAA,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,cAAc,GAAG,SAMvD,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,KAAK,MAAM,KAAG,MAAM,EAW5C,CAAC;AA+EN,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,YAAY,EAAE,GAAG,IACP,CAAC;AAKzD,QAAA,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,YAAY,EAKxD,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"source-imports.d.ts","sourceRoot":"","sources":["../../src/internal/source-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,MAAM,CAAC;AAM/D,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAYzD,QAAA,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,cAAc,GAAG,SAMvD,CAAC;AAIF,QAAA,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAIpC,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,KAAK,MAAM,KAAG,MAAM,EAW5C,CAAC;AA+EN,QAAA,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,YAAY,EAAE,GAAG,IACP,CAAC;AAKzD,QAAA,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,YAAY,EAKxD,CAAC;AAEF,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,KAAK,YAAY,GACpB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { sortStringsBy } from "@gtkx/utils";
2
- import { globSync, readFileSync } from "node:fs";
2
+ import { existsSync, globSync, readFileSync } from "node:fs";
3
3
  import { extname, join } from "node:path";
4
4
  import { parseSync, Visitor } from "vite";
5
5
  const SOURCE_LANGUAGES = new Map([
@@ -16,6 +16,11 @@ const sourceLanguage = (path) => {
16
16
  }
17
17
  return SOURCE_LANGUAGES.get(extname(path).toLowerCase());
18
18
  };
19
+ const SOURCE_DIR = "src";
20
+ const sourceDirFor = (root) => {
21
+ const sourceDir = join(root, SOURCE_DIR);
22
+ return existsSync(sourceDir) ? sourceDir : root;
23
+ };
19
24
  const discoverSourceFiles = (dir) => sortStringsBy(globSync("**/{*,.*}", {
20
25
  cwd: dir,
21
26
  exclude: ["**/{build,coverage,dist,node_modules,out-tsc}/**", "**/.gtkx-output-*/**"],
@@ -87,5 +92,5 @@ const discoverSourceImports = (dir) => {
87
92
  const imports = files.flatMap((path) => importsIn(path));
88
93
  return sortStringsBy(imports, importKey);
89
94
  };
90
- export { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, sourceLanguage };
95
+ export { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, sourceDirFor, sourceLanguage, };
91
96
  //# sourceMappingURL=source-imports.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"source-imports.js","sourceRoot":"","sources":["../../src/internal/source-imports.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ESTree, ParseResult, ParserOptions } from \"vite\";\nimport { sortStringsBy } from \"@gtkx/utils\";\nimport { globSync, readFileSync } from \"node:fs\";\nimport { extname, join } from \"node:path\";\nimport { parseSync, Visitor } from \"vite\";\n\ntype SourceImport = {\n importer: string;\n source: string;\n};\n\ntype SourceLanguage = NonNullable<ParserOptions[\"lang\"]>;\ntype ParsedModule = ParseResult[\"module\"];\n\nconst SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([\n [\".js\", \"jsx\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"jsx\"],\n [\".mts\", \"ts\"],\n [\".ts\", \"ts\"],\n [\".tsx\", \"tsx\"],\n]);\n\nconst sourceLanguage = (path: string): SourceLanguage | undefined => {\n if (path.endsWith(\".d.ts\") || path.endsWith(\".d.mts\")) {\n return undefined;\n }\n\n return SOURCE_LANGUAGES.get(extname(path).toLowerCase());\n};\n\nconst discoverSourceFiles = (dir: string): string[] =>\n sortStringsBy(\n globSync(\"**/{*,.*}\", {\n cwd: dir,\n exclude: [\"**/{build,coverage,dist,node_modules,out-tsc}/**\", \"**/.gtkx-output-*/**\"],\n withFileTypes: true,\n })\n .filter((entry) => entry.isFile())\n .map((entry) => join(entry.parentPath, entry.name))\n .filter((path) => sourceLanguage(path) !== undefined),\n (path) => path,\n );\n\nconst staticImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports.map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst staticRuntimeImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports\n .filter((statement) => statement.entries.length === 0 || statement.entries.some((entry) => !entry.isType))\n .map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .filter((entry) => !entry.isType)\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst templateImportSource = (node: ESTree.TemplateLiteral): string | null => {\n const [quasi] = node.quasis;\n\n return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;\n};\n\nconst literalImportSource = (node: ESTree.Expression): string | null => {\n if (node.type === \"TemplateLiteral\") {\n return templateImportSource(node);\n }\n\n return node.type === \"Literal\" && typeof node.value === \"string\" ? node.value : null;\n};\n\nconst collectDynamicImportSources = (program: ESTree.Program, found: string[]): void => {\n new Visitor({\n ImportExpression: (node) => {\n const source = literalImportSource(node.source);\n\n if (source !== null) {\n found.push(source);\n }\n },\n }).visit(program);\n};\n\nconst parseImportsInWith = (\n path: string,\n staticSources: (module: ParsedModule) => string[],\n): SourceImport[] | null => {\n const lang = sourceLanguage(path);\n\n if (lang === undefined) {\n return [];\n }\n\n let parsed: ParseResult;\n\n try {\n parsed = parseSync(path, readFileSync(path, \"utf8\"), { lang });\n } catch {\n return null;\n }\n\n if (parsed.errors.length > 0) {\n return null;\n }\n\n const sources = staticSources(parsed.module);\n collectDynamicImportSources(parsed.program, sources);\n\n return [...new Set(sources)].map((source) => ({ importer: path, source }));\n};\n\nconst parseImportsIn = (path: string): SourceImport[] | null => parseImportsInWith(path, staticImportSources);\n\nconst parseRuntimeImportsIn = (path: string): SourceImport[] | null =>\n parseImportsInWith(path, staticRuntimeImportSources);\n\nconst importsIn = (path: string): SourceImport[] => parseImportsIn(path) ?? [];\nconst importKey = (entry: SourceImport): string => `${entry.importer}\\0${entry.source}`;\n\nconst discoverSourceImports = (dir: string): SourceImport[] => {\n const files = discoverSourceFiles(dir);\n const imports = files.flatMap((path) => importsIn(path));\n\n return sortStringsBy(imports, importKey);\n};\n\nexport { discoverSourceFiles, discoverSourceImports, parseRuntimeImportsIn, type SourceImport, sourceLanguage };\n"]}
1
+ {"version":3,"file":"source-imports.js","sourceRoot":"","sources":["../../src/internal/source-imports.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAU1C,MAAM,gBAAgB,GAAgC,IAAI,GAAG,CAAC;IAC1D,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,IAAI,CAAC;IACd,CAAC,KAAK,EAAE,IAAI,CAAC;IACb,CAAC,MAAM,EAAE,KAAK,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,IAAY,EAA8B,EAAE;IAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEzC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAY,EAAE,CAClD,aAAa,CACT,QAAQ,CAAC,WAAW,EAAE;IAClB,GAAG,EAAE,GAAG;IACR,OAAO,EAAE,CAAC,kDAAkD,EAAE,sBAAsB,CAAC;IACrF,aAAa,EAAE,IAAI;CACtB,CAAC;KACG,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;KACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;KAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,EACzD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CACjB,CAAC;AAEN,MAAM,mBAAmB,GAAG,CAAC,MAAoB,EAAY,EAAE,CAAC;IAC5D,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;IACzE,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAC1C,SAAS,CAAC,OAAO;SACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;SAC1C,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAClE;CACJ,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,MAAoB,EAAY,EAAE,CAAC;IACnE,GAAG,MAAM,CAAC,aAAa;SAClB,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACzG,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;IACtD,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAC1C,SAAS,CAAC,OAAO;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;SAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;SAC1C,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAClE;CACJ,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,IAA4B,EAAiB,EAAE;IACzE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAE5B,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;AAC1F,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAuB,EAAiB,EAAE;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAClC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACzF,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,OAAuB,EAAE,KAAe,EAAQ,EAAE;IACnF,IAAI,OAAO,CAAC;QACR,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;KACJ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACvB,IAAY,EACZ,aAAiD,EAC5B,EAAE;IACvB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,MAAmB,CAAC;IAExB,IAAI,CAAC;QACD,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,2BAA2B,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAyB,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;AAE9G,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAyB,EAAE,CAClE,kBAAkB,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAC;AAEzD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAkB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/E,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAU,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;AAExF,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAkB,EAAE;IAC1D,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzD,OAAO,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,cAAc,GAEjB,CAAC","sourcesContent":["import type { ESTree, ParseResult, ParserOptions } from \"vite\";\nimport { sortStringsBy } from \"@gtkx/utils\";\nimport { existsSync, globSync, readFileSync } from \"node:fs\";\nimport { extname, join } from \"node:path\";\nimport { parseSync, Visitor } from \"vite\";\n\ntype SourceImport = {\n importer: string;\n source: string;\n};\n\ntype SourceLanguage = NonNullable<ParserOptions[\"lang\"]>;\ntype ParsedModule = ParseResult[\"module\"];\n\nconst SOURCE_LANGUAGES: Map<string, SourceLanguage> = new Map([\n [\".js\", \"jsx\"],\n [\".jsx\", \"jsx\"],\n [\".mjs\", \"jsx\"],\n [\".mts\", \"ts\"],\n [\".ts\", \"ts\"],\n [\".tsx\", \"tsx\"],\n]);\n\nconst sourceLanguage = (path: string): SourceLanguage | undefined => {\n if (path.endsWith(\".d.ts\") || path.endsWith(\".d.mts\")) {\n return undefined;\n }\n\n return SOURCE_LANGUAGES.get(extname(path).toLowerCase());\n};\n\nconst SOURCE_DIR = \"src\";\n\nconst sourceDirFor = (root: string): string => {\n const sourceDir = join(root, SOURCE_DIR);\n\n return existsSync(sourceDir) ? sourceDir : root;\n};\n\nconst discoverSourceFiles = (dir: string): string[] =>\n sortStringsBy(\n globSync(\"**/{*,.*}\", {\n cwd: dir,\n exclude: [\"**/{build,coverage,dist,node_modules,out-tsc}/**\", \"**/.gtkx-output-*/**\"],\n withFileTypes: true,\n })\n .filter((entry) => entry.isFile())\n .map((entry) => join(entry.parentPath, entry.name))\n .filter((path) => sourceLanguage(path) !== undefined),\n (path) => path,\n );\n\nconst staticImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports.map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst staticRuntimeImportSources = (module: ParsedModule): string[] => [\n ...module.staticImports\n .filter((statement) => statement.entries.length === 0 || statement.entries.some((entry) => !entry.isType))\n .map((statement) => statement.moduleRequest.value),\n ...module.staticExports.flatMap((statement) =>\n statement.entries\n .filter((entry) => !entry.isType)\n .map((entry) => entry.moduleRequest?.value)\n .filter((source): source is string => source !== undefined),\n ),\n];\n\nconst templateImportSource = (node: ESTree.TemplateLiteral): string | null => {\n const [quasi] = node.quasis;\n\n return quasi === undefined || node.expressions.length > 0 ? null : quasi.value.cooked;\n};\n\nconst literalImportSource = (node: ESTree.Expression): string | null => {\n if (node.type === \"TemplateLiteral\") {\n return templateImportSource(node);\n }\n\n return node.type === \"Literal\" && typeof node.value === \"string\" ? node.value : null;\n};\n\nconst collectDynamicImportSources = (program: ESTree.Program, found: string[]): void => {\n new Visitor({\n ImportExpression: (node) => {\n const source = literalImportSource(node.source);\n\n if (source !== null) {\n found.push(source);\n }\n },\n }).visit(program);\n};\n\nconst parseImportsInWith = (\n path: string,\n staticSources: (module: ParsedModule) => string[],\n): SourceImport[] | null => {\n const lang = sourceLanguage(path);\n\n if (lang === undefined) {\n return [];\n }\n\n let parsed: ParseResult;\n\n try {\n parsed = parseSync(path, readFileSync(path, \"utf8\"), { lang });\n } catch {\n return null;\n }\n\n if (parsed.errors.length > 0) {\n return null;\n }\n\n const sources = staticSources(parsed.module);\n collectDynamicImportSources(parsed.program, sources);\n\n return [...new Set(sources)].map((source) => ({ importer: path, source }));\n};\n\nconst parseImportsIn = (path: string): SourceImport[] | null => parseImportsInWith(path, staticImportSources);\n\nconst parseRuntimeImportsIn = (path: string): SourceImport[] | null =>\n parseImportsInWith(path, staticRuntimeImportSources);\n\nconst importsIn = (path: string): SourceImport[] => parseImportsIn(path) ?? [];\nconst importKey = (entry: SourceImport): string => `${entry.importer}\\0${entry.source}`;\n\nconst discoverSourceImports = (dir: string): SourceImport[] => {\n const files = discoverSourceFiles(dir);\n const imports = files.flatMap((path) => importsIn(path));\n\n return sortStringsBy(imports, importKey);\n};\n\nexport {\n discoverSourceFiles,\n discoverSourceImports,\n parseRuntimeImportsIn,\n sourceDirFor,\n sourceLanguage,\n type SourceImport,\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Rollup } from "vite";
2
+ declare const xdgDataDirsBanner: (chunk: Rollup.RenderedChunk) => string;
3
+ export { xdgDataDirsBanner };
4
+ //# sourceMappingURL=xdg-banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg-banner.d.ts","sourceRoot":"","sources":["../../src/internal/xdg-banner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,QAAA,MAAM,iBAAiB,GAAI,OAAO,MAAM,CAAC,aAAa,KAAG,MAM7C,CAAC;AAEb,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { outputRootUrlExpression } from "./banner.js";
2
+ import { XDG_DATA_DIRS_DEFAULT } from "./xdg-data-dirs.js";
3
+ const xdgDataDirsBanner = (chunk) => [
4
+ "globalThis.process.env.XDG_DATA_DIRS = (() => {",
5
+ ` const root = ${outputRootUrlExpression(chunk)};`,
6
+ ` const dirs = globalThis.process.env.XDG_DATA_DIRS || ${JSON.stringify(XDG_DATA_DIRS_DEFAULT)};`,
7
+ " return dirs.split(\":\").includes(root) ? dirs : `${root}:${dirs}`;",
8
+ "})();",
9
+ ].join("\n");
10
+ export { xdgDataDirsBanner };
11
+ //# sourceMappingURL=xdg-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xdg-banner.js","sourceRoot":"","sources":["../../src/internal/xdg-banner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,iBAAiB,GAAG,CAAC,KAA2B,EAAU,EAAE,CAAC;IAC/D,iDAAiD;IACjD,oBAAoB,uBAAuB,CAAC,KAAK,CAAC,GAAG;IACrD,4DAA4D,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,GAAG;IACpG,yEAAyE;IACzE,OAAO;CACV,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import type { Rollup } from \"vite\";\nimport { outputRootUrlExpression } from \"./banner.js\";\nimport { XDG_DATA_DIRS_DEFAULT } from \"./xdg-data-dirs.js\";\n\nconst xdgDataDirsBanner = (chunk: Rollup.RenderedChunk): string => [\n \"globalThis.process.env.XDG_DATA_DIRS = (() => {\",\n ` const root = ${outputRootUrlExpression(chunk)};`,\n ` const dirs = globalThis.process.env.XDG_DATA_DIRS || ${JSON.stringify(XDG_DATA_DIRS_DEFAULT)};`,\n \" return dirs.split(\\\":\\\").includes(root) ? dirs : `${root}:${dirs}`;\",\n \"})();\",\n].join(\"\\n\");\n\nexport { xdgDataDirsBanner };\n"]}
@@ -1,3 +1,4 @@
1
+ declare const XDG_DATA_DIRS_DEFAULT = "/usr/local/share:/usr/share";
1
2
  declare const prependXdgDataDir: (dir: string, existing: string | undefined) => string;
2
- export { prependXdgDataDir };
3
+ export { prependXdgDataDir, XDG_DATA_DIRS_DEFAULT };
3
4
  //# sourceMappingURL=xdg-data-dirs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"xdg-data-dirs.d.ts","sourceRoot":"","sources":["../../src/internal/xdg-data-dirs.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAQtE,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"xdg-data-dirs.d.ts","sourceRoot":"","sources":["../../src/internal/xdg-data-dirs.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,qBAAqB,gCAAgC,CAAC;AAE5D,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAQtE,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC"}
@@ -6,5 +6,5 @@ const prependXdgDataDir = (dir, existing) => {
6
6
  }
7
7
  return `${dir}:${base}`;
8
8
  };
9
- export { prependXdgDataDir };
9
+ export { prependXdgDataDir, XDG_DATA_DIRS_DEFAULT };
10
10
  //# sourceMappingURL=xdg-data-dirs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"xdg-data-dirs.js","sourceRoot":"","sources":["../../src/internal/xdg-data-dirs.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG,6BAA6B,CAAC;AAE5D,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,QAA4B,EAAU,EAAE;IAC5E,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["const XDG_DATA_DIRS_DEFAULT = \"/usr/local/share:/usr/share\";\n\nconst prependXdgDataDir = (dir: string, existing: string | undefined): string => {\n const base = existing === undefined || existing.length === 0 ? XDG_DATA_DIRS_DEFAULT : existing;\n\n if (base.split(\":\").includes(dir)) {\n return base;\n }\n\n return `${dir}:${base}`;\n};\n\nexport { prependXdgDataDir };\n"]}
1
+ {"version":3,"file":"xdg-data-dirs.js","sourceRoot":"","sources":["../../src/internal/xdg-data-dirs.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAAG,6BAA6B,CAAC;AAE5D,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,QAA4B,EAAU,EAAE;IAC5E,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC","sourcesContent":["const XDG_DATA_DIRS_DEFAULT = \"/usr/local/share:/usr/share\";\n\nconst prependXdgDataDir = (dir: string, existing: string | undefined): string => {\n const base = existing === undefined || existing.length === 0 ? XDG_DATA_DIRS_DEFAULT : existing;\n\n if (base.split(\":\").includes(dir)) {\n return base;\n }\n\n return `${dir}:${base}`;\n};\n\nexport { prependXdgDataDir, XDG_DATA_DIRS_DEFAULT };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"AAyBA,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,aAAa,iBAAiB,CAAC;AAMrC,QAAA,MAAM,gBAAgB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAUrE,CAAC;AAKF,QAAA,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,IAEpD,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MAAM,GAAG,IAY5E,CAAC;AAmGF,QAAA,MAAM,2BAA2B,GAAI,aAAa,MAAM,EAAE,KAAG,IAiB5D,CAAC;AAEF,QAAA,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAsB9D,CAAC;AAmDF,QAAA,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,eAYxC,CAAC;AAEF,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,aAAa,GAChB,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"AAyBA,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,aAAa,iBAAiB,CAAC;AAKrC,QAAA,MAAM,gBAAgB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,SAAS,KAAG,MAUrE,CAAC;AAKF,QAAA,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,KAAG,IAEpD,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MAAM,GAAG,IAY5E,CAAC;AA6FF,QAAA,MAAM,2BAA2B,GAAI,aAAa,MAAM,EAAE,KAAG,IAiB5D,CAAC;AAEF,QAAA,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAsB9D,CAAC;AAmDF,QAAA,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,eAYxC,CAAC;AAEF,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,aAAa,GAChB,CAAC"}
@@ -4,7 +4,7 @@ import { copyFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, realpat
4
4
  import { tmpdir } from "node:os";
5
5
  import { basename, dirname, join, relative, resolve } from "node:path";
6
6
  import { I18N_TYPES_FILENAME, i18nTypesPath } from "../i18n/types.js";
7
- import { discoverSourceImports } from "../internal/source-imports.js";
7
+ import { discoverSourceImports, sourceDirFor } from "../internal/source-imports.js";
8
8
  import { removeTempDir } from "../internal/staging-dir.js";
9
9
  import { isBareRelativeAsset, parseIconSpecifier, parseResourceSpecifier, } from "../vite-plugins/asset-specifier.js";
10
10
  import { compileSchemas } from "./compile.js";
@@ -12,7 +12,6 @@ import { parseSchemaXml, SchemaParseError } from "./parser.js";
12
12
  import { renderEnvModule } from "./render.js";
13
13
  const SCHEMA_SUFFIX = ".gschema.xml";
14
14
  const STAGED_NAME_LENGTH = 16;
15
- const SOURCE_DIR = "src";
16
15
  const RESOURCE_QUERY = "?resource=";
17
16
  const ICON_QUERY = "?icon=";
18
17
  const prependSchemaDir = (dir, existing) => {
@@ -41,10 +40,6 @@ const projectRelativeSchemaPath = (root, filePath) => {
41
40
  return isPathInside(projectRoot, path) ? toPosixPath(relative(projectRoot, path)) : null;
42
41
  };
43
42
  const getRelativeModuleSpecifier = (filePath) => `*/${basename(filePath)}`;
44
- const sourceDirFor = (root) => {
45
- const sourceDir = join(root, SOURCE_DIR);
46
- return existsSync(sourceDir) ? sourceDir : root;
47
- };
48
43
  const isRelativeImport = (source) => source.startsWith("./") || source.startsWith("../");
49
44
  const schemaFileFor = ({ importer, source }) => isRelativeImport(source) && source.endsWith(SCHEMA_SUFFIX) ? resolve(dirname(importer), source) : null;
50
45
  const findImportedSchemaFiles = (imports) => {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACH,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAqB,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACH,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAyB,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAO9C,MAAM,aAAa,GAAG,cAAc,CAAC;AACrC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,KAAK,CAAC;AACzB,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAE5B,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,QAA4B,EAAU,EAAE;IAC3E,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAU,EAAE,CAClD,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,aAAa,EAAE,CAAC;AAExG,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAQ,EAAE;IACxD,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAiB,EAAE;IAChF,IAAI,WAAmB,CAAC;IACxB,IAAI,IAAY,CAAC;IAEjB,IAAI,CAAC;QACD,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;AAE3F,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEzC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAE1G,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAgB,EAAiB,EAAE,CACxE,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3G,MAAM,uBAAuB,GAAG,CAAC,OAAuB,EAAY,EAAE;IAClE,MAAM,KAAK,GAAG,OAAO;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAErD,OAAO,WAAW,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAiB,EAAE;IAC5D,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAEzC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACX,4CAA4C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,8BAA8B,CACnG,CAAC;IACN,CAAC;IAED,OAAO,KAAK,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAiB,EAAE;IAC9D,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAElD,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,OAAO,MAAM,EAAE,YAAY,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACX,4CAA4C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,mCAAmC,CACxG,CAAC;IACN,CAAC;IAED,OAAO,IAAI,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAiB,EAAE;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,OAAO,MAAM,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEvC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACX,4CAA4C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,+BAA+B,CACpG,CAAC;IACN,CAAC;IAED,OAAO,IAAI,KAAK,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAC9B,OAAuB,EACoC,EAAE;IAC7D,MAAM,OAAO,GAAG,CAAC,YAA+C,EAAY,EAAE,CAC1E,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/G,OAAO;QACH,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC;QACvC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC;QACnC,SAAS,EAAE,OAAO,CAAC,uBAAuB,CAAC;KAC9C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IAC3C,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,WAAqB,EAAQ,EAAE;IAChE,MAAM,MAAM,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC9C,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5F,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACX,kCAAkC,KAAK,QAAQ,QAAQ,0CAA0C;gBACjG,+CAA+C,IAAI,uBAAuB,CAC7E,CAAC;QACN,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,IAAY,EAAiB,EAAE;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACrD,2BAA2B,CAAC,WAAW,CAAC,CAAC;IAEzC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACjC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,cAAc,CAAC,GAAG,CAAC,CAAC;IAEpB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,aAAa,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAEtG,MAAM,qBAAqB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAA2B,EAAE;IAC3F,IAAI,CAAC;QACD,OAAO,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,KAAK,YAAY,gBAAgB,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,YAAY,QAAQ,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEzE,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,WAAqB,EAAE,YAA0C,EAAsB,EAAE;IAClH,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEvE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAiB,EAAE;IACnD,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,OAAe,EAAW,EAAE;IAC/D,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE7B,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAe,EAAmB,EAAE;IACvD,MAAM,OAAO,GAAG,qBAAqB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACvD,2BAA2B,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEjD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,aAAa,GAChB,CAAC","sourcesContent":["import { isPathInside, sortStrings, toPosixPath, warn } from \"@gtkx/utils\";\nimport { createHash } from \"node:crypto\";\nimport {\n copyFileSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n realpathSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { I18N_TYPES_FILENAME, i18nTypesPath } from \"../i18n/types.js\";\nimport { discoverSourceImports, type SourceImport } from \"../internal/source-imports.js\";\nimport { removeTempDir } from \"../internal/staging-dir.js\";\nimport {\n isBareRelativeAsset,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"../vite-plugins/asset-specifier.js\";\nimport { compileSchemas } from \"./compile.js\";\nimport { type ParsedSchemaFile, parseSchemaXml, SchemaParseError } from \"./parser.js\";\nimport { renderEnvModule } from \"./render.js\";\n\ntype SchemaEnvResult = {\n path: string;\n isWritten: boolean;\n};\n\nconst SCHEMA_SUFFIX = \".gschema.xml\";\nconst STAGED_NAME_LENGTH = 16;\nconst SOURCE_DIR = \"src\";\nconst RESOURCE_QUERY = \"?resource=\";\nconst ICON_QUERY = \"?icon=\";\n\nconst prependSchemaDir = (dir: string, existing: string | undefined): string => {\n if (existing === undefined || existing.length === 0) {\n return dir;\n }\n\n if (existing.split(\":\").includes(dir)) {\n return existing;\n }\n\n return `${dir}:${existing}`;\n};\n\nconst stagedSchemaName = (filePath: string): string =>\n `${createHash(\"sha1\").update(filePath).digest(\"hex\").slice(0, STAGED_NAME_LENGTH)}${SCHEMA_SUFFIX}`;\n\nconst stageSchema = (dir: string, filePath: string): void => {\n copyFileSync(filePath, join(dir, stagedSchemaName(filePath)));\n};\n\nconst projectRelativeSchemaPath = (root: string, filePath: string): string | null => {\n let projectRoot: string;\n let path: string;\n\n try {\n projectRoot = realpathSync(root);\n path = realpathSync(filePath);\n } catch {\n return null;\n }\n\n return isPathInside(projectRoot, path) ? toPosixPath(relative(projectRoot, path)) : null;\n};\n\nconst getRelativeModuleSpecifier = (filePath: string): string => `*/${basename(filePath)}`;\n\nconst sourceDirFor = (root: string): string => {\n const sourceDir = join(root, SOURCE_DIR);\n\n return existsSync(sourceDir) ? sourceDir : root;\n};\n\nconst isRelativeImport = (source: string): boolean => source.startsWith(\"./\") || source.startsWith(\"../\");\n\nconst schemaFileFor = ({ importer, source }: SourceImport): string | null =>\n isRelativeImport(source) && source.endsWith(SCHEMA_SUFFIX) ? resolve(dirname(importer), source) : null;\n\nconst findImportedSchemaFiles = (imports: SourceImport[]): string[] => {\n const files = imports\n .map((entry) => schemaFileFor(entry))\n .filter((path): path is string => path !== null);\n\n return sortStrings(new Set(files));\n};\n\nconst blockedAssetSpecifier = (source: string): string | null => {\n if (!isBareRelativeAsset(source)) {\n return null;\n }\n\n const separator = source.lastIndexOf(\"/\");\n const name = source.slice(separator + 1);\n\n if (name.includes(\"*\")) {\n throw new Error(\n `Cannot generate an asset declaration for ${JSON.stringify(source)}: filenames cannot contain *`,\n );\n }\n\n return `*/${name}`;\n};\n\nconst resourceModuleSpecifier = (source: string): string | null => {\n const parsed = parseResourceSpecifier(source);\n const queryIndex = source.indexOf(RESOURCE_QUERY);\n\n if (queryIndex === -1 || typeof parsed?.resourcePath !== \"string\") {\n return null;\n }\n\n const query = source.slice(queryIndex);\n\n if (query.includes(\"*\")) {\n throw new Error(\n `Cannot generate an asset declaration for ${JSON.stringify(source)}: resource paths cannot contain *`,\n );\n }\n\n return `*${query}`;\n};\n\nconst iconModuleSpecifier = (source: string): string | null => {\n const parsed = parseIconSpecifier(source);\n const queryIndex = source.indexOf(ICON_QUERY);\n\n if (queryIndex === -1 || typeof parsed?.iconName !== \"string\") {\n return null;\n }\n\n const query = source.slice(queryIndex);\n\n if (query.includes(\"*\")) {\n throw new Error(\n `Cannot generate an asset declaration for ${JSON.stringify(source)}: icon names cannot contain *`,\n );\n }\n\n return `*${query}`;\n};\n\nconst findAssetModuleSpecifiers = (\n imports: SourceImport[],\n): { blocked: string[]; icons: string[]; resources: string[] } => {\n const collect = (getSpecifier: (source: string) => string | null): string[] =>\n sortStrings(new Set(imports.map((entry) => getSpecifier(entry.source)).filter((value) => value !== null)));\n\n return {\n blocked: collect(blockedAssetSpecifier),\n icons: collect(iconModuleSpecifier),\n resources: collect(resourceModuleSpecifier),\n };\n};\n\nconst canonicalPath = (path: string): string => {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n};\n\nconst assertUniqueSchemaBasenames = (schemaFiles: string[]): void => {\n const owners: Map<string, string> = new Map();\n const canonicalFiles = sortStrings(new Set(schemaFiles.map((path) => canonicalPath(path))));\n\n for (const filePath of canonicalFiles) {\n const name = basename(filePath);\n const owner = owners.get(name);\n\n if (owner !== undefined && owner !== filePath) {\n throw new Error(\n `Cannot generate types for both ${owner} and ${filePath}: relative GSettings schema imports are ` +\n `typed by basename, and both files are named ${name}. Rename one of them.`,\n );\n }\n\n owners.set(name, filePath);\n }\n};\n\nconst stageAndCompileProjectSchemas = (root: string): string | null => {\n const imports = discoverSourceImports(sourceDirFor(root));\n const schemaFiles = findImportedSchemaFiles(imports);\n assertUniqueSchemaBasenames(schemaFiles);\n\n if (schemaFiles.length === 0) {\n return null;\n }\n\n const dir = mkdtempSync(join(tmpdir(), \"gtkx-schemas-\"));\n\n for (const filePath of schemaFiles) {\n stageSchema(dir, filePath);\n }\n\n compileSchemas(dir);\n\n process.once(\"exit\", () => {\n removeTempDir(dir);\n });\n\n return dir;\n};\n\nconst schemaEnvPath = (rootDir: string): string => join(rootDir, \"node_modules\", \".gtkx\", \"env.d.ts\");\n\nconst parseSchemaFileOrWarn = (filePath: string, specifier: string): ParsedSchemaFile | null => {\n try {\n return parseSchemaXml(readFileSync(filePath, \"utf8\"), specifier);\n } catch (error) {\n if (!(error instanceof SchemaParseError)) {\n throw error;\n }\n\n warn(`Skipping ${filePath} in schema type generation: ${error.message}`);\n\n return null;\n }\n};\n\nconst parseProjectSchemas = (schemaFiles: string[], specifierFor: (filePath: string) => string): ParsedSchemaFile[] => {\n const parsed: ParsedSchemaFile[] = [];\n\n for (const filePath of schemaFiles) {\n const result = parseSchemaFileOrWarn(filePath, specifierFor(filePath));\n\n if (result !== null) {\n parsed.push(result);\n }\n }\n\n return parsed;\n};\n\nconst readFileOrNull = (path: string): string | null => {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n};\n\nconst didWriteChanges = (path: string, content: string): boolean => {\n if (readFileOrNull(path) === content) {\n return false;\n }\n\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n\n return true;\n};\n\nconst emitSchemaEnv = (rootDir: string): SchemaEnvResult => {\n const imports = discoverSourceImports(sourceDirFor(rootDir));\n const importedFiles = findImportedSchemaFiles(imports);\n assertUniqueSchemaBasenames(importedFiles);\n const imported = parseProjectSchemas(importedFiles, getRelativeModuleSpecifier);\n const assets = findAssetModuleSpecifiers(imports);\n const references = existsSync(i18nTypesPath(rootDir)) ? [`./${I18N_TYPES_FILENAME}`] : [];\n const content = renderEnvModule(imported, assets, { references });\n const path = schemaEnvPath(rootDir);\n const isWritten = didWriteChanges(path, content);\n\n return { path, isWritten };\n};\n\nexport {\n SCHEMA_SUFFIX,\n prependSchemaDir,\n stageSchema,\n assertUniqueSchemaBasenames,\n projectRelativeSchemaPath,\n stageAndCompileProjectSchemas,\n emitSchemaEnv,\n};\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/settings/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPathInside, sortStrings, toPosixPath, warn } from \"@gtkx/utils\";\nimport { createHash } from \"node:crypto\";\nimport {\n copyFileSync,\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n realpathSync,\n writeFileSync,\n} from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join, relative, resolve } from \"node:path\";\nimport { I18N_TYPES_FILENAME, i18nTypesPath } from \"../i18n/types.js\";\nimport { discoverSourceImports, sourceDirFor, type SourceImport } from \"../internal/source-imports.js\";\nimport { removeTempDir } from \"../internal/staging-dir.js\";\nimport {\n isBareRelativeAsset,\n parseIconSpecifier,\n parseResourceSpecifier,\n} from \"../vite-plugins/asset-specifier.js\";\nimport { compileSchemas } from \"./compile.js\";\nimport { type ParsedSchemaFile, parseSchemaXml, SchemaParseError } from \"./parser.js\";\nimport { renderEnvModule } from \"./render.js\";\n\ntype SchemaEnvResult = {\n path: string;\n isWritten: boolean;\n};\n\nconst SCHEMA_SUFFIX = \".gschema.xml\";\nconst STAGED_NAME_LENGTH = 16;\nconst RESOURCE_QUERY = \"?resource=\";\nconst ICON_QUERY = \"?icon=\";\n\nconst prependSchemaDir = (dir: string, existing: string | undefined): string => {\n if (existing === undefined || existing.length === 0) {\n return dir;\n }\n\n if (existing.split(\":\").includes(dir)) {\n return existing;\n }\n\n return `${dir}:${existing}`;\n};\n\nconst stagedSchemaName = (filePath: string): string =>\n `${createHash(\"sha1\").update(filePath).digest(\"hex\").slice(0, STAGED_NAME_LENGTH)}${SCHEMA_SUFFIX}`;\n\nconst stageSchema = (dir: string, filePath: string): void => {\n copyFileSync(filePath, join(dir, stagedSchemaName(filePath)));\n};\n\nconst projectRelativeSchemaPath = (root: string, filePath: string): string | null => {\n let projectRoot: string;\n let path: string;\n\n try {\n projectRoot = realpathSync(root);\n path = realpathSync(filePath);\n } catch {\n return null;\n }\n\n return isPathInside(projectRoot, path) ? toPosixPath(relative(projectRoot, path)) : null;\n};\n\nconst getRelativeModuleSpecifier = (filePath: string): string => `*/${basename(filePath)}`;\n\nconst isRelativeImport = (source: string): boolean => source.startsWith(\"./\") || source.startsWith(\"../\");\n\nconst schemaFileFor = ({ importer, source }: SourceImport): string | null =>\n isRelativeImport(source) && source.endsWith(SCHEMA_SUFFIX) ? resolve(dirname(importer), source) : null;\n\nconst findImportedSchemaFiles = (imports: SourceImport[]): string[] => {\n const files = imports\n .map((entry) => schemaFileFor(entry))\n .filter((path): path is string => path !== null);\n\n return sortStrings(new Set(files));\n};\n\nconst blockedAssetSpecifier = (source: string): string | null => {\n if (!isBareRelativeAsset(source)) {\n return null;\n }\n\n const separator = source.lastIndexOf(\"/\");\n const name = source.slice(separator + 1);\n\n if (name.includes(\"*\")) {\n throw new Error(\n `Cannot generate an asset declaration for ${JSON.stringify(source)}: filenames cannot contain *`,\n );\n }\n\n return `*/${name}`;\n};\n\nconst resourceModuleSpecifier = (source: string): string | null => {\n const parsed = parseResourceSpecifier(source);\n const queryIndex = source.indexOf(RESOURCE_QUERY);\n\n if (queryIndex === -1 || typeof parsed?.resourcePath !== \"string\") {\n return null;\n }\n\n const query = source.slice(queryIndex);\n\n if (query.includes(\"*\")) {\n throw new Error(\n `Cannot generate an asset declaration for ${JSON.stringify(source)}: resource paths cannot contain *`,\n );\n }\n\n return `*${query}`;\n};\n\nconst iconModuleSpecifier = (source: string): string | null => {\n const parsed = parseIconSpecifier(source);\n const queryIndex = source.indexOf(ICON_QUERY);\n\n if (queryIndex === -1 || typeof parsed?.iconName !== \"string\") {\n return null;\n }\n\n const query = source.slice(queryIndex);\n\n if (query.includes(\"*\")) {\n throw new Error(\n `Cannot generate an asset declaration for ${JSON.stringify(source)}: icon names cannot contain *`,\n );\n }\n\n return `*${query}`;\n};\n\nconst findAssetModuleSpecifiers = (\n imports: SourceImport[],\n): { blocked: string[]; icons: string[]; resources: string[] } => {\n const collect = (getSpecifier: (source: string) => string | null): string[] =>\n sortStrings(new Set(imports.map((entry) => getSpecifier(entry.source)).filter((value) => value !== null)));\n\n return {\n blocked: collect(blockedAssetSpecifier),\n icons: collect(iconModuleSpecifier),\n resources: collect(resourceModuleSpecifier),\n };\n};\n\nconst canonicalPath = (path: string): string => {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n};\n\nconst assertUniqueSchemaBasenames = (schemaFiles: string[]): void => {\n const owners: Map<string, string> = new Map();\n const canonicalFiles = sortStrings(new Set(schemaFiles.map((path) => canonicalPath(path))));\n\n for (const filePath of canonicalFiles) {\n const name = basename(filePath);\n const owner = owners.get(name);\n\n if (owner !== undefined && owner !== filePath) {\n throw new Error(\n `Cannot generate types for both ${owner} and ${filePath}: relative GSettings schema imports are ` +\n `typed by basename, and both files are named ${name}. Rename one of them.`,\n );\n }\n\n owners.set(name, filePath);\n }\n};\n\nconst stageAndCompileProjectSchemas = (root: string): string | null => {\n const imports = discoverSourceImports(sourceDirFor(root));\n const schemaFiles = findImportedSchemaFiles(imports);\n assertUniqueSchemaBasenames(schemaFiles);\n\n if (schemaFiles.length === 0) {\n return null;\n }\n\n const dir = mkdtempSync(join(tmpdir(), \"gtkx-schemas-\"));\n\n for (const filePath of schemaFiles) {\n stageSchema(dir, filePath);\n }\n\n compileSchemas(dir);\n\n process.once(\"exit\", () => {\n removeTempDir(dir);\n });\n\n return dir;\n};\n\nconst schemaEnvPath = (rootDir: string): string => join(rootDir, \"node_modules\", \".gtkx\", \"env.d.ts\");\n\nconst parseSchemaFileOrWarn = (filePath: string, specifier: string): ParsedSchemaFile | null => {\n try {\n return parseSchemaXml(readFileSync(filePath, \"utf8\"), specifier);\n } catch (error) {\n if (!(error instanceof SchemaParseError)) {\n throw error;\n }\n\n warn(`Skipping ${filePath} in schema type generation: ${error.message}`);\n\n return null;\n }\n};\n\nconst parseProjectSchemas = (schemaFiles: string[], specifierFor: (filePath: string) => string): ParsedSchemaFile[] => {\n const parsed: ParsedSchemaFile[] = [];\n\n for (const filePath of schemaFiles) {\n const result = parseSchemaFileOrWarn(filePath, specifierFor(filePath));\n\n if (result !== null) {\n parsed.push(result);\n }\n }\n\n return parsed;\n};\n\nconst readFileOrNull = (path: string): string | null => {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return null;\n }\n};\n\nconst didWriteChanges = (path: string, content: string): boolean => {\n if (readFileOrNull(path) === content) {\n return false;\n }\n\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n\n return true;\n};\n\nconst emitSchemaEnv = (rootDir: string): SchemaEnvResult => {\n const imports = discoverSourceImports(sourceDirFor(rootDir));\n const importedFiles = findImportedSchemaFiles(imports);\n assertUniqueSchemaBasenames(importedFiles);\n const imported = parseProjectSchemas(importedFiles, getRelativeModuleSpecifier);\n const assets = findAssetModuleSpecifiers(imports);\n const references = existsSync(i18nTypesPath(rootDir)) ? [`./${I18N_TYPES_FILENAME}`] : [];\n const content = renderEnvModule(imported, assets, { references });\n const path = schemaEnvPath(rootDir);\n const isWritten = didWriteChanges(path, content);\n\n return { path, isWritten };\n};\n\nexport {\n SCHEMA_SUFFIX,\n prependSchemaDir,\n stageSchema,\n assertUniqueSchemaBasenames,\n projectRelativeSchemaPath,\n stageAndCompileProjectSchemas,\n emitSchemaEnv,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AA0BA,QAAA,MAAM,QAAQ,QAAoE,CAAC;AACnF,QAAA,MAAM,aAAa,QAA6E,CAAC;AACjG,QAAA,MAAM,gBAAgB,QAAmE,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"asset-extensions.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AA4BA,QAAA,MAAM,QAAQ,QAAoE,CAAC;AACnF,QAAA,MAAM,aAAa,QAA6E,CAAC;AACjG,QAAA,MAAM,gBAAgB,QAAmE,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC"}
@@ -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",
@@ -1 +1 @@
1
- {"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACrB,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACjG,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"xpm\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nconst ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\nconst ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\nconst ASSET_MENTION_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})`, \"i\");\n\nexport { ASSET_MENTION_RE, ASSET_PATH_RE, ASSET_RE };\n"]}
1
+ {"version":3,"file":"asset-extensions.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-extensions.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG;IACrB,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACjG,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,QAAQ,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["const ASSET_EXTENSIONS = [\n \"png\",\n \"jpg\",\n \"jpeg\",\n \"gif\",\n \"svg\",\n \"xpm\",\n \"webp\",\n \"webm\",\n \"mp4\",\n \"ogg\",\n \"mp3\",\n \"wav\",\n \"flac\",\n \"aac\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"ttf\",\n \"otf\",\n \"ttc\",\n \"otc\",\n \"ico\",\n \"avif\",\n \"data\",\n \"gpa\",\n];\n\nconst ASSET_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})$`, \"i\");\nconst ASSET_PATH_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})(?:\\?.*)?$`, \"i\");\nconst ASSET_MENTION_RE = new RegExp(String.raw`\\.(?:${ASSET_EXTENSIONS.join(\"|\")})`, \"i\");\n\nexport { ASSET_MENTION_RE, ASSET_PATH_RE, ASSET_RE };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"asset-imports.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,MAAM,EAAE,MAAM,MAAM,CAAC;AA+HhD,iBAAS,gBAAgB,IAAI,MAAM,CASlC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"asset-imports.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,MAAM,EAAE,MAAM,MAAM,CAAC;AAuIhD,iBAAS,gBAAgB,IAAI,MAAM,CASlC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { parseSync } from "vite";
2
2
  import { sourceLanguage } from "../internal/source-imports.js";
3
3
  import { ASSET_MENTION_RE } from "./asset-extensions.js";
4
- import { isAssetSpecifier, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, } from "./asset-specifier.js";
4
+ import { isAssetSpecifier, isUrlSpecifier, parseFontSpecifier, parseIconSpecifier, parseResourceSpecifier, } from "./asset-specifier.js";
5
5
  import { RESOURCE_PATH_EXPORT } from "./resource-shared.js";
6
6
  import { stripQuery } from "./strip-query.js";
7
7
  const NODE_MODULES = /(?:^|\/)node_modules\//;
@@ -11,7 +11,9 @@ const RESOURCE_BINDING = JSON.stringify(RESOURCE_PATH_EXPORT);
11
11
  const QUERY_ADVICE = `A URL asset exports only its default filesystem path; import the default instead of ${RESOURCE_BINDING}.`;
12
12
  const RESOURCE_ADVICE = `A resource asset exports only its default GResource path and ${RESOURCE_BINDING}, and nothing else.`;
13
13
  const ICON_ADVICE = "An icon asset exports only its default icon-theme name, and nothing else.";
14
- const RELATIVE_ADVICE = "Add ?resource for a GResource, ?icon for a themed icon, or ?url for an emitted file.";
14
+ const FONT_ADVICE = "A font asset exports only its default font family name, and nothing else.";
15
+ const RELATIVE_ADVICE = "Add ?resource for a GResource, ?icon for a themed icon, ?font for a bundled font, or ?url for an " +
16
+ "emitted file.";
15
17
  const boundName = (entry) => {
16
18
  const { name } = entry.importName;
17
19
  if (name === null || name === DEFAULT_BINDING || entry.isType) {
@@ -48,6 +50,9 @@ const adviceFor = (source) => {
48
50
  if (parseIconSpecifier(source) !== null) {
49
51
  return ICON_ADVICE;
50
52
  }
53
+ if (parseFontSpecifier(source) !== null) {
54
+ return FONT_ADVICE;
55
+ }
51
56
  if (isUrlSpecifier(source)) {
52
57
  return QUERY_ADVICE;
53
58
  }
@@ -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 { 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"]}
1
+ {"version":3,"file":"asset-imports.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-imports.ts"],"names":[],"mappings":"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","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 parseFontSpecifier,\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 FONT_ADVICE = \"A font asset exports only its default font family name, and nothing else.\";\n\nconst RELATIVE_ADVICE =\n \"Add ?resource for a GResource, ?icon for a themed icon, ?font for a bundled font, or ?url for an \" +\n \"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 (parseFontSpecifier(source) !== null) {\n return FONT_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,10 +6,14 @@ type IconSpecifier = {
6
6
  assetSource: string;
7
7
  iconName: string | null;
8
8
  };
9
+ type FontSpecifier = {
10
+ assetSource: string;
11
+ };
9
12
  declare const isAssetSpecifier: (source: string) => boolean;
10
13
  declare const isBareRelativeAsset: (source: string) => boolean;
11
14
  declare const parseResourceSpecifier: (source: string) => ResourceSpecifier | null;
12
15
  declare const parseIconSpecifier: (source: string) => IconSpecifier | null;
16
+ declare const parseFontSpecifier: (source: string) => FontSpecifier | null;
13
17
  declare const isUrlSpecifier: (source: string) => boolean;
14
- export { isAssetSpecifier, isBareRelativeAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, };
18
+ export { isAssetSpecifier, isBareRelativeAsset, isUrlSpecifier, parseFontSpecifier, parseIconSpecifier, parseResourceSpecifier, };
15
19
  //# 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":"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
+ {"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;AAEF,KAAK,aAAa,GAAG;IACjB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AAcF,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,kBAAkB,GAAI,QAAQ,MAAM,KAAG,aAAa,GAAG,IAS5D,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,OAIxC,CAAC;AAEF,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,GACzB,CAAC"}
@@ -3,6 +3,7 @@ import { stripQuery } from "./strip-query.js";
3
3
  const RELATIVE_PREFIX_RE = /^\.\.?(?:\/|$)/;
4
4
  const RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;
5
5
  const ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;
6
+ const FONT_QUERY_RE = /^font$/;
6
7
  const URL_QUERY_RE = /(?:^|&)url(?:&|$)/;
7
8
  const getQuery = (source) => {
8
9
  const queryIndex = source.indexOf("?");
@@ -34,9 +35,17 @@ const parseIconSpecifier = (source) => {
34
35
  }
35
36
  return { assetSource, iconName: match[1] ?? null };
36
37
  };
38
+ const parseFontSpecifier = (source) => {
39
+ const query = getQuery(source);
40
+ const assetSource = stripQuery(source);
41
+ if (query === null || !ASSET_RE.test(assetSource) || !FONT_QUERY_RE.test(query)) {
42
+ return null;
43
+ }
44
+ return { assetSource };
45
+ };
37
46
  const isUrlSpecifier = (source) => {
38
47
  const query = getQuery(source);
39
48
  return query !== null && URL_QUERY_RE.test(query);
40
49
  };
41
- export { isAssetSpecifier, isBareRelativeAsset, isUrlSpecifier, parseIconSpecifier, parseResourceSpecifier, };
50
+ export { isAssetSpecifier, isBareRelativeAsset, isUrlSpecifier, parseFontSpecifier, parseIconSpecifier, parseResourceSpecifier, };
42
51
  //# 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,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
+ {"version":3,"file":"asset-specifier.js","sourceRoot":"","sources":["../../src/vite-plugins/asset-specifier.ts"],"names":[],"mappings":"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","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\ntype FontSpecifier = {\n assetSource: string;\n};\n\nconst RELATIVE_PREFIX_RE = /^\\.\\.?(?:\\/|$)/;\nconst RESOURCE_QUERY_RE = /^resource(?:=([^&#]+))?$/;\nconst ICON_QUERY_RE = /^icon(?:=([^&#]+))?$/;\nconst FONT_QUERY_RE = /^font$/;\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 parseFontSpecifier = (source: string): FontSpecifier | null => {\n const query = getQuery(source);\n const assetSource = stripQuery(source);\n\n if (query === null || !ASSET_RE.test(assetSource) || !FONT_QUERY_RE.test(query)) {\n return null;\n }\n\n return { assetSource };\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 parseFontSpecifier,\n parseIconSpecifier,\n parseResourceSpecifier,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAqCnC,iBAAS,OAAO,IAAI,MAAM,CAazB;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAuCnC,iBAAS,OAAO,IAAI,MAAM,CAazB;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -14,12 +14,13 @@ const resolveCssId = async (ctx, request) => {
14
14
  }
15
15
  return virtualId + INJECT_SUFFIX;
16
16
  };
17
- const loadInjectedCss = (id) => {
17
+ const loadInjectedCss = (ctx, id) => {
18
18
  if (!isVirtual(id) || !id.endsWith(INJECT_SUFFIX)) {
19
19
  return;
20
20
  }
21
21
  const filePath = fromVirtualId(id.slice(0, -INJECT_SUFFIX.length));
22
22
  const content = readFileSync(filePath, "utf8");
23
+ ctx.addWatchFile(filePath);
23
24
  return ["import { injectGlobal } from \"@gtkx/css\";", `injectGlobal(${JSON.stringify(content)});`].join("\n");
24
25
  };
25
26
  function gtkxCss() {
@@ -30,7 +31,7 @@ function gtkxCss() {
30
31
  return resolveCssId(this, { source, importer, options });
31
32
  },
32
33
  load(id) {
33
- return loadInjectedCss(id);
34
+ return loadInjectedCss(this, id);
34
35
  },
35
36
  };
36
37
  }