@gtkx/cli 1.2.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +6 -4
  2. package/dist/builder.d.ts +0 -1
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js +6 -6
  5. package/dist/builder.js.map +1 -1
  6. package/dist/codegen/freshness.js +1 -1
  7. package/dist/codegen/freshness.js.map +1 -1
  8. package/dist/codegen/run-codegen.d.ts +2 -2
  9. package/dist/codegen/run-codegen.d.ts.map +1 -1
  10. package/dist/codegen/run-codegen.js +28 -9
  11. package/dist/codegen/run-codegen.js.map +1 -1
  12. package/dist/commands/build.d.ts +0 -4
  13. package/dist/commands/build.d.ts.map +1 -1
  14. package/dist/commands/build.js +0 -5
  15. package/dist/commands/build.js.map +1 -1
  16. package/dist/commands/codegen.d.ts.map +1 -1
  17. package/dist/commands/codegen.js +1 -3
  18. package/dist/commands/codegen.js.map +1 -1
  19. package/dist/commands/docs.d.ts.map +1 -1
  20. package/dist/commands/docs.js +3 -0
  21. package/dist/commands/docs.js.map +1 -1
  22. package/dist/deploy/depends.d.ts +2 -2
  23. package/dist/deploy/depends.d.ts.map +1 -1
  24. package/dist/deploy/depends.js +30 -15
  25. package/dist/deploy/depends.js.map +1 -1
  26. package/dist/deploy/nfpm/config.js +1 -1
  27. package/dist/deploy/nfpm/config.js.map +1 -1
  28. package/dist/deploy/node-runtime/elf.d.ts +1 -1
  29. package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
  30. package/dist/deploy/node-runtime/elf.js +2 -2
  31. package/dist/deploy/node-runtime/elf.js.map +1 -1
  32. package/dist/deploy/node-runtime/index.js +2 -2
  33. package/dist/deploy/node-runtime/index.js.map +1 -1
  34. package/dist/deploy/notices/collect.d.ts +3 -1
  35. package/dist/deploy/notices/collect.d.ts.map +1 -1
  36. package/dist/deploy/notices/collect.js +2 -2
  37. package/dist/deploy/notices/collect.js.map +1 -1
  38. package/dist/deploy/notices/packages.d.ts +2 -1
  39. package/dist/deploy/notices/packages.d.ts.map +1 -1
  40. package/dist/deploy/notices/packages.js +4 -27
  41. package/dist/deploy/notices/packages.js.map +1 -1
  42. package/dist/deploy/payload/icons.d.ts +7 -3
  43. package/dist/deploy/payload/icons.d.ts.map +1 -1
  44. package/dist/deploy/payload/icons.js +46 -28
  45. package/dist/deploy/payload/icons.js.map +1 -1
  46. package/dist/deploy/payload/stage.d.ts.map +1 -1
  47. package/dist/deploy/payload/stage.js +3 -2
  48. package/dist/deploy/payload/stage.js.map +1 -1
  49. package/dist/deploy/run-deploy.d.ts.map +1 -1
  50. package/dist/deploy/run-deploy.js +63 -11
  51. package/dist/deploy/run-deploy.js.map +1 -1
  52. package/dist/deploy/settings/build-manifest.d.ts +9 -0
  53. package/dist/deploy/settings/build-manifest.d.ts.map +1 -0
  54. package/dist/deploy/settings/build-manifest.js +80 -0
  55. package/dist/deploy/settings/build-manifest.js.map +1 -0
  56. package/dist/deploy/settings/index.d.ts.map +1 -1
  57. package/dist/deploy/settings/index.js +9 -3
  58. package/dist/deploy/settings/index.js.map +1 -1
  59. package/dist/deploy/settings/libraries.d.ts +8 -0
  60. package/dist/deploy/settings/libraries.d.ts.map +1 -0
  61. package/dist/deploy/settings/libraries.js +39 -0
  62. package/dist/deploy/settings/libraries.js.map +1 -0
  63. package/dist/deploy/settings/paths.d.ts +3 -0
  64. package/dist/deploy/settings/paths.d.ts.map +1 -1
  65. package/dist/deploy/settings/paths.js +6 -32
  66. package/dist/deploy/settings/paths.js.map +1 -1
  67. package/dist/deploy/targets/appimage.d.ts.map +1 -1
  68. package/dist/deploy/targets/appimage.js +19 -13
  69. package/dist/deploy/targets/appimage.js.map +1 -1
  70. package/dist/deploy/targets/flatpak-manifest.d.ts +2 -1
  71. package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -1
  72. package/dist/deploy/targets/flatpak-manifest.js +5 -1
  73. package/dist/deploy/targets/flatpak-manifest.js.map +1 -1
  74. package/dist/deploy/targets/flatpak-pnpm.js +4 -4
  75. package/dist/deploy/targets/flatpak-pnpm.js.map +1 -1
  76. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  77. package/dist/deploy/targets/flatpak-source.js +9 -6
  78. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  79. package/dist/deploy/types.d.ts +4 -4
  80. package/dist/deploy/types.d.ts.map +1 -1
  81. package/dist/deploy/types.js.map +1 -1
  82. package/dist/dev/icon-dir.d.ts +1 -1
  83. package/dist/dev/icon-dir.d.ts.map +1 -1
  84. package/dist/dev/icon-dir.js +20 -7
  85. package/dist/dev/icon-dir.js.map +1 -1
  86. package/dist/dev/runner-deps.d.ts.map +1 -1
  87. package/dist/dev/runner-deps.js +5 -1
  88. package/dist/dev/runner-deps.js.map +1 -1
  89. package/dist/dev/runner-main.js +4 -4
  90. package/dist/dev/runner-main.js.map +1 -1
  91. package/dist/dev/runner.d.ts +1 -1
  92. package/dist/dev/runner.d.ts.map +1 -1
  93. package/dist/dev/runner.js +1 -1
  94. package/dist/dev/runner.js.map +1 -1
  95. package/dist/dev/schema-dir.d.ts +1 -1
  96. package/dist/dev/schema-dir.d.ts.map +1 -1
  97. package/dist/dev/schema-dir.js +3 -1
  98. package/dist/dev/schema-dir.js.map +1 -1
  99. package/dist/internal/build-manifest.d.ts +20 -0
  100. package/dist/internal/build-manifest.d.ts.map +1 -0
  101. package/dist/internal/build-manifest.js +6 -0
  102. package/dist/internal/build-manifest.js.map +1 -0
  103. package/dist/internal/icon-path.d.ts +13 -0
  104. package/dist/internal/icon-path.d.ts.map +1 -0
  105. package/dist/internal/icon-path.js +86 -0
  106. package/dist/internal/icon-path.js.map +1 -0
  107. package/dist/internal/source-imports.d.ts +8 -0
  108. package/dist/internal/source-imports.d.ts.map +1 -0
  109. package/dist/internal/source-imports.js +144 -0
  110. package/dist/internal/source-imports.js.map +1 -0
  111. package/dist/mcp/widget-properties.d.ts.map +1 -1
  112. package/dist/mcp/widget-properties.js +3 -12
  113. package/dist/mcp/widget-properties.js.map +1 -1
  114. package/dist/settings/render.d.ts +7 -1
  115. package/dist/settings/render.d.ts.map +1 -1
  116. package/dist/settings/render.js +69 -20
  117. package/dist/settings/render.js.map +1 -1
  118. package/dist/settings/schema.d.ts +4 -3
  119. package/dist/settings/schema.d.ts.map +1 -1
  120. package/dist/settings/schema.js +122 -15
  121. package/dist/settings/schema.js.map +1 -1
  122. package/dist/vite-plugins/asset-emitter.d.ts +1 -1
  123. package/dist/vite-plugins/asset-emitter.d.ts.map +1 -1
  124. package/dist/vite-plugins/asset-emitter.js.map +1 -1
  125. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  126. package/dist/vite-plugins/asset-extensions.js +1 -0
  127. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  128. package/dist/vite-plugins/asset-imports.d.ts +2 -1
  129. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  130. package/dist/vite-plugins/asset-imports.js +37 -16
  131. package/dist/vite-plugins/asset-imports.js.map +1 -1
  132. package/dist/vite-plugins/asset-specifier.d.ts +13 -1
  133. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
  134. package/dist/vite-plugins/asset-specifier.js +39 -1
  135. package/dist/vite-plugins/asset-specifier.js.map +1 -1
  136. package/dist/vite-plugins/build-manifest.d.ts +5 -0
  137. package/dist/vite-plugins/build-manifest.d.ts.map +1 -0
  138. package/dist/vite-plugins/{bundled-packages.js → build-manifest.js} +20 -14
  139. package/dist/vite-plugins/build-manifest.js.map +1 -0
  140. package/dist/vite-plugins/built-url.d.ts +1 -1
  141. package/dist/vite-plugins/built-url.d.ts.map +1 -1
  142. package/dist/vite-plugins/built-url.js +37 -24
  143. package/dist/vite-plugins/built-url.js.map +1 -1
  144. package/dist/vite-plugins/icons.d.ts +2 -1
  145. package/dist/vite-plugins/icons.d.ts.map +1 -1
  146. package/dist/vite-plugins/icons.js +25 -12
  147. package/dist/vite-plugins/icons.js.map +1 -1
  148. package/dist/vite-plugins/index.d.ts +2 -1
  149. package/dist/vite-plugins/index.d.ts.map +1 -1
  150. package/dist/vite-plugins/index.js +7 -5
  151. package/dist/vite-plugins/index.js.map +1 -1
  152. package/dist/vite-plugins/native.d.ts.map +1 -1
  153. package/dist/vite-plugins/native.js +23 -4
  154. package/dist/vite-plugins/native.js.map +1 -1
  155. package/dist/vite-plugins/resource-init-module.d.ts +7 -3
  156. package/dist/vite-plugins/resource-init-module.d.ts.map +1 -1
  157. package/dist/vite-plugins/resource-init-module.js +39 -14
  158. package/dist/vite-plugins/resource-init-module.js.map +1 -1
  159. package/dist/vite-plugins/resource-shared.d.ts +3 -1
  160. package/dist/vite-plugins/resource-shared.d.ts.map +1 -1
  161. package/dist/vite-plugins/resource-shared.js +3 -1
  162. package/dist/vite-plugins/resource-shared.js.map +1 -1
  163. package/dist/vite-plugins/resources.d.ts +1 -1
  164. package/dist/vite-plugins/resources.d.ts.map +1 -1
  165. package/dist/vite-plugins/resources.js +922 -86
  166. package/dist/vite-plugins/resources.js.map +1 -1
  167. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  168. package/dist/vite-plugins/settings-worker-env.js +6 -3
  169. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  170. package/dist/vite-plugins/settings.d.ts +3 -1
  171. package/dist/vite-plugins/settings.d.ts.map +1 -1
  172. package/dist/vite-plugins/settings.js +63 -23
  173. package/dist/vite-plugins/settings.js.map +1 -1
  174. package/dist/vite-plugins/store-links.js +1 -1
  175. package/dist/vite-plugins/store-links.js.map +1 -1
  176. package/dist/vite-plugins/undeclared-library.d.ts.map +1 -1
  177. package/dist/vite-plugins/undeclared-library.js +25 -13
  178. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  179. package/env.d.ts +11 -192
  180. package/package.json +14 -14
  181. package/src/builder.ts +6 -7
  182. package/src/codegen/freshness.ts +1 -1
  183. package/src/codegen/run-codegen.ts +33 -10
  184. package/src/commands/build.ts +0 -5
  185. package/src/commands/codegen.ts +1 -3
  186. package/src/commands/docs.ts +3 -0
  187. package/src/deploy/depends.ts +47 -18
  188. package/src/deploy/nfpm/config.ts +1 -1
  189. package/src/deploy/node-runtime/elf.ts +3 -3
  190. package/src/deploy/node-runtime/index.ts +2 -2
  191. package/src/deploy/notices/collect.ts +4 -2
  192. package/src/deploy/notices/packages.ts +5 -43
  193. package/src/deploy/payload/icons.ts +64 -34
  194. package/src/deploy/payload/stage.ts +5 -2
  195. package/src/deploy/run-deploy.ts +87 -12
  196. package/src/deploy/settings/build-manifest.ts +122 -0
  197. package/src/deploy/settings/index.ts +9 -4
  198. package/src/deploy/settings/libraries.ts +57 -0
  199. package/src/deploy/settings/paths.ts +10 -47
  200. package/src/deploy/targets/appimage.ts +32 -15
  201. package/src/deploy/targets/flatpak-manifest.ts +7 -1
  202. package/src/deploy/targets/flatpak-pnpm.ts +4 -4
  203. package/src/deploy/targets/flatpak-source.ts +9 -10
  204. package/src/deploy/types.ts +4 -4
  205. package/src/dev/icon-dir.ts +31 -7
  206. package/src/dev/runner-deps.ts +5 -1
  207. package/src/dev/runner-main.ts +4 -4
  208. package/src/dev/runner.ts +2 -2
  209. package/src/dev/schema-dir.ts +3 -1
  210. package/src/internal/build-manifest.ts +32 -0
  211. package/src/internal/icon-path.ts +127 -0
  212. package/src/internal/source-imports.ts +200 -0
  213. package/src/mcp/widget-properties.ts +3 -14
  214. package/src/settings/render.ts +99 -21
  215. package/src/settings/schema.ts +190 -17
  216. package/src/vite-plugins/asset-emitter.ts +1 -1
  217. package/src/vite-plugins/asset-extensions.ts +1 -0
  218. package/src/vite-plugins/asset-imports.ts +60 -19
  219. package/src/vite-plugins/asset-specifier.ts +73 -1
  220. package/src/vite-plugins/{bundled-packages.ts → build-manifest.ts} +30 -19
  221. package/src/vite-plugins/built-url.ts +49 -28
  222. package/src/vite-plugins/icons.ts +33 -14
  223. package/src/vite-plugins/index.ts +12 -5
  224. package/src/vite-plugins/native.ts +31 -4
  225. package/src/vite-plugins/resource-init-module.ts +44 -15
  226. package/src/vite-plugins/resource-shared.ts +4 -0
  227. package/src/vite-plugins/resources.ts +1459 -100
  228. package/src/vite-plugins/settings-worker-env.ts +7 -3
  229. package/src/vite-plugins/settings.ts +89 -21
  230. package/src/vite-plugins/store-links.ts +1 -1
  231. package/src/vite-plugins/undeclared-library.ts +31 -13
  232. package/dist/vite-plugins/bundled-packages.d.ts +0 -5
  233. package/dist/vite-plugins/bundled-packages.d.ts.map +0 -1
  234. package/dist/vite-plugins/bundled-packages.js.map +0 -1
@@ -1,14 +1,14 @@
1
1
  import { isRecord, sortStringsBy } from "@gtkx/utils";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { dirname, join, relative, resolve } from "node:path";
4
+ import { BUILD_MANIFEST_FILENAME, BUILD_MANIFEST_FORMAT_VERSION, BUILD_MANIFEST_GENERATOR, } from "../internal/build-manifest.js";
4
5
  import { stripQuery } from "./strip-query.js";
5
- const BUNDLED_PACKAGES_FILENAME = "gtkx-packages.json";
6
- const MANIFEST_FILENAME = "package.json";
6
+ const PACKAGE_MANIFEST_FILENAME = "package.json";
7
7
  const DEFAULT_OUT_DIR = "dist";
8
8
  const JSON_INDENT = 4;
9
9
  const identityIn = (dir) => {
10
10
  try {
11
- const parsed = JSON.parse(readFileSync(join(dir, MANIFEST_FILENAME), "utf8"));
11
+ const parsed = JSON.parse(readFileSync(join(dir, PACKAGE_MANIFEST_FILENAME), "utf8"));
12
12
  if (!isRecord(parsed) || typeof parsed.name !== "string") {
13
13
  return null;
14
14
  }
@@ -30,34 +30,40 @@ const packageForModule = (id) => {
30
30
  const path = stripQuery(id);
31
31
  return path.startsWith("/") ? packageIn(dirname(path)) : null;
32
32
  };
33
- const keyFor = (entry) => `${entry.name}@${entry.version ?? ""}`;
33
+ const packageKey = (entry) => `${entry.name}@${entry.version ?? ""}`;
34
34
  const relativeTo = (outDir, entry) => ({
35
35
  ...entry,
36
36
  dir: relative(outDir, entry.dir),
37
37
  });
38
- const renderPackages = (outDir, ids) => {
38
+ const packagesFor = (outDir, ids) => {
39
39
  const found = ids.map((id) => packageForModule(id)).filter((entry) => entry !== null);
40
- const unique = new Map(found.map((entry) => [keyFor(entry), entry]));
41
- const packages = sortStringsBy(unique.values(), keyFor).map((entry) => relativeTo(outDir, entry));
42
- return `${JSON.stringify({ packages }, null, JSON_INDENT)}\n`;
40
+ const unique = new Map(found.map((entry) => [packageKey(entry), entry]));
41
+ return sortStringsBy(unique.values(), packageKey).map((entry) => relativeTo(outDir, entry));
43
42
  };
44
- function gtkxBundledPackages(root) {
43
+ const renderManifest = (manifest) => `${JSON.stringify(manifest, null, JSON_INDENT)}\n`;
44
+ function gtkxBuildManifest(root, collector) {
45
45
  const state = { outDir: join(root, DEFAULT_OUT_DIR) };
46
46
  return {
47
- name: "gtkx:bundled-packages",
47
+ name: "gtkx:build-manifest",
48
48
  apply: "build",
49
49
  configResolved(config) {
50
50
  state.outDir = resolve(config.root, config.build.outDir);
51
51
  },
52
52
  generateBundle(_options, bundle) {
53
53
  const ids = Object.values(bundle).flatMap((output) => (output.type === "chunk" ? output.moduleIds : []));
54
+ const manifest = {
55
+ generator: BUILD_MANIFEST_GENERATOR,
56
+ formatVersion: BUILD_MANIFEST_FORMAT_VERSION,
57
+ schemas: collector.schemas,
58
+ packages: packagesFor(state.outDir, ids),
59
+ };
54
60
  this.emitFile({
55
61
  type: "asset",
56
- fileName: BUNDLED_PACKAGES_FILENAME,
57
- source: renderPackages(state.outDir, ids),
62
+ fileName: BUILD_MANIFEST_FILENAME,
63
+ source: renderManifest(manifest),
58
64
  });
59
65
  },
60
66
  };
61
67
  }
62
- export { BUNDLED_PACKAGES_FILENAME, gtkxBundledPackages };
63
- //# sourceMappingURL=bundled-packages.js.map
68
+ export { gtkxBuildManifest };
69
+ //# sourceMappingURL=build-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-manifest.js","sourceRoot":"","sources":["../../src/vite-plugins/build-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { isRecord, sortStringsBy } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport {\n BUILD_MANIFEST_FILENAME,\n BUILD_MANIFEST_FORMAT_VERSION,\n BUILD_MANIFEST_GENERATOR,\n type BuildManifest,\n type BuildManifestCollector,\n type RecordedPackage,\n} from \"../internal/build-manifest.js\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype PackageIdentity = {\n name: string;\n version: string | null;\n};\n\ntype ManifestState = {\n outDir: string;\n};\n\nconst PACKAGE_MANIFEST_FILENAME = \"package.json\";\nconst DEFAULT_OUT_DIR = \"dist\";\nconst JSON_INDENT = 4;\n\nconst identityIn = (dir: string): PackageIdentity | null => {\n try {\n const parsed: unknown = JSON.parse(readFileSync(join(dir, PACKAGE_MANIFEST_FILENAME), \"utf8\"));\n\n if (!isRecord(parsed) || typeof parsed.name !== \"string\") {\n return null;\n }\n\n return { name: parsed.name, version: typeof parsed.version === \"string\" ? parsed.version : null };\n } catch {\n return null;\n }\n};\n\nconst packageIn = (dir: string): RecordedPackage | null => {\n const identity = identityIn(dir);\n\n if (identity !== null) {\n return { ...identity, dir };\n }\n\n const parent = dirname(dir);\n\n return parent === dir ? null : packageIn(parent);\n};\n\nconst packageForModule = (id: string): RecordedPackage | null => {\n const path = stripQuery(id);\n\n return path.startsWith(\"/\") ? packageIn(dirname(path)) : null;\n};\n\nconst packageKey = (entry: RecordedPackage): string => `${entry.name}@${entry.version ?? \"\"}`;\n\nconst relativeTo = (outDir: string, entry: RecordedPackage): RecordedPackage => ({\n ...entry,\n dir: relative(outDir, entry.dir),\n});\n\nconst packagesFor = (outDir: string, ids: string[]): RecordedPackage[] => {\n const found = ids.map((id) => packageForModule(id)).filter((entry) => entry !== null);\n const unique: Map<string, RecordedPackage> = new Map(found.map((entry) => [packageKey(entry), entry]));\n\n return sortStringsBy(unique.values(), packageKey).map((entry) => relativeTo(outDir, entry));\n};\n\nconst renderManifest = (manifest: BuildManifest): string => `${JSON.stringify(manifest, null, JSON_INDENT)}\\n`;\n\nfunction gtkxBuildManifest(root: string, collector: BuildManifestCollector): Plugin {\n const state: ManifestState = { outDir: join(root, DEFAULT_OUT_DIR) };\n\n return {\n name: \"gtkx:build-manifest\",\n apply: \"build\",\n\n configResolved(config) {\n state.outDir = resolve(config.root, config.build.outDir);\n },\n\n generateBundle(_options, bundle) {\n const ids = Object.values(bundle).flatMap((output) => (output.type === \"chunk\" ? output.moduleIds : []));\n\n const manifest: BuildManifest = {\n generator: BUILD_MANIFEST_GENERATOR,\n formatVersion: BUILD_MANIFEST_FORMAT_VERSION,\n schemas: collector.schemas,\n packages: packagesFor(state.outDir, ids),\n };\n\n this.emitFile({\n type: \"asset\",\n fileName: BUILD_MANIFEST_FILENAME,\n source: renderManifest(manifest),\n });\n },\n };\n}\n\nexport { gtkxBuildManifest };\n"]}
@@ -1,4 +1,4 @@
1
1
  import type { Plugin } from "vite";
2
- declare function gtkxBuiltUrl(assetBase?: string): Plugin;
2
+ declare function gtkxBuiltUrl(): Plugin;
3
3
  export { gtkxBuiltUrl };
4
4
  //# sourceMappingURL=built-url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAkCnC,iBAAS,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBhD;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"built-url.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAyD/C,iBAAS,YAAY,IAAI,MAAM,CAiB9B;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,38 +1,51 @@
1
- import { posix } from "node:path";
2
- const EXECUTABLE_URL_BASE = "`file://${process.execPath}`";
3
- const LEADING_SLASHES = /^\/+/;
4
- const executableRelativeUrl = (target) => {
5
- const specifier = JSON.stringify(target.replace(LEADING_SLASHES, "./"));
6
- return `decodeURIComponent(new URL(${specifier}, ${EXECUTABLE_URL_BASE}).pathname)`;
7
- };
1
+ import { existsSync } from "node:fs";
2
+ import { isAbsolute } from "node:path";
3
+ import { stripQuery } from "./strip-query.js";
4
+ const URL_QUERY_RE = /\?url(?:&t=\d+)?$/;
8
5
  const bundleRelativeUrl = (filename) => {
9
6
  const specifier = JSON.stringify(`./${filename}`);
10
7
  return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;
11
8
  };
12
- const renderAssetUrl = (filename, type, assetBase) => {
9
+ const renderAssetUrl = (filename, type) => {
13
10
  if (type !== "asset") {
14
11
  return undefined;
15
12
  }
16
- if (assetBase === undefined) {
17
- return { runtime: bundleRelativeUrl(filename) };
13
+ return { runtime: bundleRelativeUrl(filename) };
14
+ };
15
+ const configureBuiltUrl = (userConfig, command) => {
16
+ if (command !== "build" || userConfig.experimental?.renderBuiltUrl) {
17
+ return undefined;
18
+ }
19
+ return {
20
+ experimental: {
21
+ renderBuiltUrl(filename, { type }) {
22
+ return renderAssetUrl(filename, type);
23
+ },
24
+ },
25
+ };
26
+ };
27
+ const loadDevFileUrl = (ctx, state, id) => {
28
+ if (state.isBuild || !URL_QUERY_RE.test(id)) {
29
+ return undefined;
30
+ }
31
+ const file = stripQuery(id);
32
+ if (!isAbsolute(file) || !existsSync(file)) {
33
+ return undefined;
18
34
  }
19
- return { runtime: executableRelativeUrl(posix.join(assetBase, filename)) };
35
+ ctx.addWatchFile(file);
36
+ return `export default ${JSON.stringify(file)};`;
20
37
  };
21
- function gtkxBuiltUrl(assetBase) {
38
+ function gtkxBuiltUrl() {
39
+ const state = { isBuild: false };
22
40
  return {
23
41
  name: "gtkx:built-url",
24
- apply: "build",
25
- config(userConfig) {
26
- if (userConfig.experimental?.renderBuiltUrl) {
27
- return;
28
- }
29
- return {
30
- experimental: {
31
- renderBuiltUrl(filename, { type }) {
32
- return renderAssetUrl(filename, type, assetBase);
33
- },
34
- },
35
- };
42
+ enforce: "pre",
43
+ config: (userConfig, { command }) => configureBuiltUrl(userConfig, command),
44
+ configResolved(config) {
45
+ state.isBuild = config.command === "build";
46
+ },
47
+ load(id) {
48
+ return loadDevFileUrl(this, state, id);
36
49
  },
37
50
  };
38
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAC3D,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAU,EAAE;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC;IAExE,OAAO,8BAA8B,SAAS,KAAK,mBAAmB,aAAa,CAAC;AACxF,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAElD,OAAO,8BAA8B,SAAS,8BAA8B,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,QAAgB,EAChB,IAAY,EACZ,SAA6B,EACE,EAAE;IACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,SAAkB;IACpC,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,UAAU;YACb,IAAI,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;gBAC1C,OAAO;YACX,CAAC;YAED,OAAO;gBACH,YAAY,EAAE;oBACV,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;wBAC7B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACrD,CAAC;iBACJ;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { posix } from \"node:path\";\n\nconst EXECUTABLE_URL_BASE = \"`file://${process.execPath}`\";\nconst LEADING_SLASHES = /^\\/+/;\n\nconst executableRelativeUrl = (target: string): string => {\n const specifier = JSON.stringify(target.replace(LEADING_SLASHES, \"./\"));\n\n return `decodeURIComponent(new URL(${specifier}, ${EXECUTABLE_URL_BASE}).pathname)`;\n};\n\nconst bundleRelativeUrl = (filename: string): string => {\n const specifier = JSON.stringify(`./${filename}`);\n\n return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;\n};\n\nconst renderAssetUrl = (\n filename: string,\n type: string,\n assetBase: string | undefined,\n): { runtime: string } | undefined => {\n if (type !== \"asset\") {\n return undefined;\n }\n\n if (assetBase === undefined) {\n return { runtime: bundleRelativeUrl(filename) };\n }\n\n return { runtime: executableRelativeUrl(posix.join(assetBase, filename)) };\n};\n\nfunction gtkxBuiltUrl(assetBase?: string): Plugin {\n return {\n name: \"gtkx:built-url\",\n apply: \"build\",\n\n config(userConfig) {\n if (userConfig.experimental?.renderBuiltUrl) {\n return;\n }\n\n return {\n experimental: {\n renderBuiltUrl(filename, { type }) {\n return renderAssetUrl(filename, type, assetBase);\n },\n },\n };\n },\n };\n}\n\nexport { gtkxBuiltUrl };\n"]}
1
+ {"version":3,"file":"built-url.js","sourceRoot":"","sources":["../../src/vite-plugins/built-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAElD,OAAO,8BAA8B,SAAS,8BAA8B,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,QAAgB,EAChB,IAAY,EACmB,EAAE;IACjC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,UAAsB,EAAE,OAAe,EAA0B,EAAE;IAC1F,IAAI,OAAO,KAAK,OAAO,IAAI,UAAU,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,YAAY,EAAE;YACV,cAAc,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;gBAC7B,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;SACJ;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,GAAiB,EAAE,KAAkB,EAAE,EAAU,EAAsB,EAAE;IAC7F,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACrD,CAAC,CAAC;AAEF,SAAS,YAAY;IACjB,MAAM,KAAK,GAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAE9C,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,KAAK;QAEd,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC;QAE3E,cAAc,CAAC,MAAM;YACjB,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,EAAE;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute } from \"node:path\";\nimport { stripQuery } from \"./strip-query.js\";\n\ntype PluginState = { isBuild: boolean };\ntype WatchContext = { addWatchFile: (file: string) => void };\n\nconst URL_QUERY_RE = /\\?url(?:&t=\\d+)?$/;\n\nconst bundleRelativeUrl = (filename: string): string => {\n const specifier = JSON.stringify(`./${filename}`);\n\n return `decodeURIComponent(new URL(${specifier}, import.meta.url).pathname)`;\n};\n\nconst renderAssetUrl = (\n filename: string,\n type: string,\n): { runtime: string } | undefined => {\n if (type !== \"asset\") {\n return undefined;\n }\n\n return { runtime: bundleRelativeUrl(filename) };\n};\n\nconst configureBuiltUrl = (userConfig: UserConfig, command: string): UserConfig | undefined => {\n if (command !== \"build\" || userConfig.experimental?.renderBuiltUrl) {\n return undefined;\n }\n\n return {\n experimental: {\n renderBuiltUrl(filename, { type }) {\n return renderAssetUrl(filename, type);\n },\n },\n };\n};\n\nconst loadDevFileUrl = (ctx: WatchContext, state: PluginState, id: string): string | undefined => {\n if (state.isBuild || !URL_QUERY_RE.test(id)) {\n return undefined;\n }\n\n const file = stripQuery(id);\n\n if (!isAbsolute(file) || !existsSync(file)) {\n return undefined;\n }\n\n ctx.addWatchFile(file);\n\n return `export default ${JSON.stringify(file)};`;\n};\n\nfunction gtkxBuiltUrl(): Plugin {\n const state: PluginState = { isBuild: false };\n\n return {\n name: \"gtkx:built-url\",\n enforce: \"pre\",\n\n config: (userConfig, { command }) => configureBuiltUrl(userConfig, command),\n\n configResolved(config) {\n state.isBuild = config.command === \"build\";\n },\n\n load(id) {\n return loadDevFileUrl(this, state, id);\n },\n };\n}\n\nexport { gtkxBuiltUrl };\n"]}
@@ -1,4 +1,5 @@
1
+ import type { ConfigLoader } from "@gtkx/config";
1
2
  import type { Plugin } from "vite";
2
- declare function gtkxIcons(): Plugin;
3
+ declare function gtkxIcons(loadConfig?: ConfigLoader): Plugin;
3
4
  export { gtkxIcons };
4
5
  //# sourceMappingURL=icons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AA0C/C,iBAAS,SAAS,IAAI,MAAM,CA0B3B;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AA2D/C,iBAAS,SAAS,CAAC,UAAU,GAAE,YAAmC,GAAG,MAAM,CA2B1E;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1,8 +1,9 @@
1
+ import { createConfigLoader } from "@gtkx/config/internal";
1
2
  import { info } from "@gtkx/utils";
2
3
  import { readFileSync } from "node:fs";
3
4
  import { join } from "node:path";
4
5
  import { prependBanner } from "../internal/banner.js";
5
- import { resolveDataDir } from "../internal/data-dir.js";
6
+ import { relativeIconPath, resolveApplicationIcon, } from "../internal/icon-path.js";
6
7
  import { listFilesRecursive } from "../internal/list-files.js";
7
8
  const ICONS_DIR = "icons";
8
9
  const XDG_ENV_BANNER = [
@@ -11,11 +12,22 @@ const XDG_ENV_BANNER = [
11
12
  " process.env.XDG_DATA_DIRS || \"/usr/local/share:/usr/share\",",
12
13
  "].join(\":\");",
13
14
  ].join("\n");
14
- const findIconFiles = (iconsDir) => iconsDir === null ? [] : listFilesRecursive(iconsDir);
15
- const resolveIconsDir = (config) => {
16
- const root = config.root ?? process.cwd();
17
- const dataDir = resolveDataDir(root);
18
- return dataDir === null ? null : join(root, dataDir, ICONS_DIR);
15
+ const findIconFiles = (state) => {
16
+ if (state.source.kind === "theme") {
17
+ return listFilesRecursive(state.source.path);
18
+ }
19
+ if (state.source.kind === "none") {
20
+ return [];
21
+ }
22
+ return [{
23
+ absPath: state.source.path,
24
+ rel: relativeIconPath(state.applicationId, state.source.path),
25
+ }];
26
+ };
27
+ const applyUserConfig = async (state, config, loadConfig) => {
28
+ const { config: gtkxConfig, root } = await loadConfig.load(config.root ?? process.cwd());
29
+ state.applicationId = gtkxConfig.applicationId;
30
+ state.source = resolveApplicationIcon(root, gtkxConfig.applicationId, gtkxConfig.applicationIcon);
19
31
  };
20
32
  const emitIcons = (ctx, icons) => {
21
33
  for (const { absPath, rel } of icons) {
@@ -25,25 +37,26 @@ const emitIcons = (ctx, icons) => {
25
37
  info(`Copied ${String(icons.length)} icon(s) into ${ICONS_DIR}/`);
26
38
  }
27
39
  };
28
- function gtkxIcons() {
40
+ function gtkxIcons(loadConfig = createConfigLoader()) {
29
41
  const state = {
30
- iconsDir: null,
42
+ applicationId: "",
43
+ source: { kind: "none" },
31
44
  };
32
45
  return {
33
46
  name: "gtkx:icons",
34
47
  enforce: "pre",
35
48
  apply: "build",
36
- config(config) {
37
- state.iconsDir = resolveIconsDir(config);
49
+ async config(config) {
50
+ await applyUserConfig(state, config, loadConfig);
38
51
  },
39
52
  outputOptions(options) {
40
- if (findIconFiles(state.iconsDir).length === 0) {
53
+ if (findIconFiles(state).length === 0) {
41
54
  return;
42
55
  }
43
56
  return prependBanner(options, XDG_ENV_BANNER);
44
57
  },
45
58
  buildEnd() {
46
- emitIcons(this, findIconFiles(state.iconsDir));
59
+ emitIcons(this, findIconFiles(state));
47
60
  },
48
61
  };
49
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAMhF,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,cAAc,GAAG;IACnB,+BAA+B;IAC/B,mEAAmE;IACnE,mEAAmE;IACnE,gBAAgB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,aAAa,GAAG,CAAC,QAAuB,EAAgB,EAAE,CAC5D,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE1D,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAiB,EAAE;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAiB,EAAE,KAAmB,EAAQ,EAAE;IAC/D,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,SAAS,GAAG,CAAC,CAAC;IACtE,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,SAAS;IACd,MAAM,KAAK,GAAgB;QACvB,QAAQ,EAAE,IAAI;KACjB,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QAEd,MAAM,CAAC,MAAkB;YACrB,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAED,aAAa,CAAC,OAAO;YACjB,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO;YACX,CAAC;YAED,OAAO,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;QAED,QAAQ;YACJ,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { info } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AssetEmitter } from \"./asset-emitter.js\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\n\ntype PluginState = {\n iconsDir: string | null;\n};\n\nconst ICONS_DIR = \"icons\";\n\nconst XDG_ENV_BANNER = [\n \"process.env.XDG_DATA_DIRS = [\",\n \" decodeURIComponent(new URL(\\\".\\\", import.meta.url).pathname),\",\n \" process.env.XDG_DATA_DIRS || \\\"/usr/local/share:/usr/share\\\",\",\n \"].join(\\\":\\\");\",\n].join(\"\\n\");\n\nconst findIconFiles = (iconsDir: string | null): ListedFile[] =>\n iconsDir === null ? [] : listFilesRecursive(iconsDir);\n\nconst resolveIconsDir = (config: UserConfig): string | null => {\n const root = config.root ?? process.cwd();\n const dataDir = resolveDataDir(root);\n\n return dataDir === null ? null : join(root, dataDir, ICONS_DIR);\n};\n\nconst emitIcons = (ctx: AssetEmitter, icons: ListedFile[]): void => {\n for (const { absPath, rel } of icons) {\n ctx.emitFile({ type: \"asset\", fileName: join(ICONS_DIR, rel), source: readFileSync(absPath) });\n }\n\n if (icons.length > 0) {\n info(`Copied ${String(icons.length)} icon(s) into ${ICONS_DIR}/`);\n }\n};\n\nfunction gtkxIcons(): Plugin {\n const state: PluginState = {\n iconsDir: null,\n };\n\n return {\n name: \"gtkx:icons\",\n enforce: \"pre\",\n apply: \"build\",\n\n config(config: UserConfig) {\n state.iconsDir = resolveIconsDir(config);\n },\n\n outputOptions(options) {\n if (findIconFiles(state.iconsDir).length === 0) {\n return;\n }\n\n return prependBanner(options, XDG_ENV_BANNER);\n },\n\n buildEnd() {\n emitIcons(this, findIconFiles(state.iconsDir));\n },\n };\n}\n\nexport { gtkxIcons };\n"]}
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/vite-plugins/icons.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACH,gBAAgB,EAChB,sBAAsB,GAEzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAmB,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAOhF,MAAM,SAAS,GAAG,OAAO,CAAC;AAE1B,MAAM,cAAc,GAAG;IACnB,+BAA+B;IAC/B,mEAAmE;IACnE,mEAAmE;IACnE,gBAAgB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,aAAa,GAAG,CAAC,KAAkB,EAAgB,EAAE;IACvD,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,CAAC;YACJ,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YAC1B,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;SAChE,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,KAAkB,EAAE,MAAkB,EAAE,UAAwB,EAAiB,EAAE;IAC9G,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzF,KAAK,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;IAC/C,KAAK,CAAC,MAAM,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;AACtG,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAiB,EAAE,KAAmB,EAAQ,EAAE;IAC/D,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,SAAS,GAAG,CAAC,CAAC;IACtE,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,SAAS,CAAC,aAA2B,kBAAkB,EAAE;IAC9D,MAAM,KAAK,GAAgB;QACvB,aAAa,EAAE,EAAE;QACjB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC3B,CAAC;IAEF,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QAEd,KAAK,CAAC,MAAM,CAAC,MAAkB;YAC3B,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QAED,aAAa,CAAC,OAAO;YACjB,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO;YACX,CAAC;YAED,OAAO,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;QAED,QAAQ;YACJ,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { Plugin, UserConfig } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport { info } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AssetEmitter } from \"./asset-emitter.js\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport {\n relativeIconPath,\n resolveApplicationIcon,\n type ResolvedApplicationIcon,\n} from \"../internal/icon-path.js\";\nimport { type ListedFile, listFilesRecursive } from \"../internal/list-files.js\";\n\ntype PluginState = {\n applicationId: string;\n source: ResolvedApplicationIcon;\n};\n\nconst ICONS_DIR = \"icons\";\n\nconst XDG_ENV_BANNER = [\n \"process.env.XDG_DATA_DIRS = [\",\n \" decodeURIComponent(new URL(\\\".\\\", import.meta.url).pathname),\",\n \" process.env.XDG_DATA_DIRS || \\\"/usr/local/share:/usr/share\\\",\",\n \"].join(\\\":\\\");\",\n].join(\"\\n\");\n\nconst findIconFiles = (state: PluginState): ListedFile[] => {\n if (state.source.kind === \"theme\") {\n return listFilesRecursive(state.source.path);\n }\n\n if (state.source.kind === \"none\") {\n return [];\n }\n\n return [{\n absPath: state.source.path,\n rel: relativeIconPath(state.applicationId, state.source.path),\n }];\n};\n\nconst applyUserConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader): Promise<void> => {\n const { config: gtkxConfig, root } = await loadConfig.load(config.root ?? process.cwd());\n state.applicationId = gtkxConfig.applicationId;\n state.source = resolveApplicationIcon(root, gtkxConfig.applicationId, gtkxConfig.applicationIcon);\n};\n\nconst emitIcons = (ctx: AssetEmitter, icons: ListedFile[]): void => {\n for (const { absPath, rel } of icons) {\n ctx.emitFile({ type: \"asset\", fileName: join(ICONS_DIR, rel), source: readFileSync(absPath) });\n }\n\n if (icons.length > 0) {\n info(`Copied ${String(icons.length)} icon(s) into ${ICONS_DIR}/`);\n }\n};\n\nfunction gtkxIcons(loadConfig: ConfigLoader = createConfigLoader()): Plugin {\n const state: PluginState = {\n applicationId: \"\",\n source: { kind: \"none\" },\n };\n\n return {\n name: \"gtkx:icons\",\n enforce: \"pre\",\n apply: \"build\",\n\n async config(config: UserConfig) {\n await applyUserConfig(state, config, loadConfig);\n },\n\n outputOptions(options) {\n if (findIconFiles(state).length === 0) {\n return;\n }\n\n return prependBanner(options, XDG_ENV_BANNER);\n },\n\n buildEnd() {\n emitIcons(this, findIconFiles(state));\n },\n };\n}\n\nexport { gtkxIcons };\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { Plugin } from "vite";
2
- declare const gtkxVitePlugins: (mode?: string) => Plugin[];
2
+ import type { BuildManifestCollector } from "../internal/build-manifest.js";
3
+ declare const gtkxVitePlugins: (mode?: string, entryPath?: string, buildManifest?: BuildManifestCollector) => Plugin[];
3
4
  export { gtkxVitePlugins };
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAYnC,QAAA,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MAAM,EAc9C,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAW5E,QAAA,MAAM,eAAe,GACjB,OAAO,MAAM,EACb,YAAY,MAAM,EAClB,gBAAgB,sBAAsB,KACvC,MAAM,EAeR,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { createConfigLoader } from "@gtkx/config/internal";
2
2
  import createConfigPlugin from "@gtkx/config/vite-plugin";
3
3
  import { gtkxAssetImports } from "./asset-imports.js";
4
+ import { gtkxBuiltUrl } from "./built-url.js";
4
5
  import { gtkxCss } from "./css.js";
5
6
  import { gtkxIcons } from "./icons.js";
6
7
  import { gtkxReactCompiler } from "./react-compiler.js";
@@ -8,16 +9,17 @@ import { gtkxResources } from "./resources.js";
8
9
  import { gtkxSettings } from "./settings.js";
9
10
  import { gtkxStoreLinks } from "./store-links.js";
10
11
  import { gtkxUndeclaredLibrary } from "./undeclared-library.js";
11
- const gtkxVitePlugins = (mode) => {
12
+ const gtkxVitePlugins = (mode, entryPath, buildManifest) => {
12
13
  const loadConfig = createConfigLoader(mode === undefined ? {} : { mode });
13
14
  return [
14
15
  createConfigPlugin({ name: "gtkx:config", loadConfig }),
15
16
  gtkxStoreLinks(),
16
17
  gtkxUndeclaredLibrary(loadConfig),
17
- gtkxSettings(),
18
- gtkxIcons(),
19
- gtkxAssetImports(),
20
- gtkxResources(loadConfig),
18
+ gtkxSettings(loadConfig, buildManifest),
19
+ gtkxIcons(loadConfig),
20
+ gtkxAssetImports(loadConfig),
21
+ gtkxBuiltUrl(),
22
+ gtkxResources(loadConfig, entryPath),
21
23
  gtkxCss(),
22
24
  gtkxReactCompiler(loadConfig),
23
25
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,eAAe,GAAG,CAAC,IAAa,EAAY,EAAE;IAChD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,OAAO;QACH,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;QACvD,cAAc,EAAE;QAChB,qBAAqB,CAAC,UAAU,CAAC;QACjC,YAAY,EAAE;QACd,SAAS,EAAE;QACX,gBAAgB,EAAE;QAClB,aAAa,CAAC,UAAU,CAAC;QACzB,OAAO,EAAE;QACT,iBAAiB,CAAC,UAAU,CAAC;KAChC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport createConfigPlugin from \"@gtkx/config/vite-plugin\";\nimport { gtkxAssetImports } from \"./asset-imports.js\";\nimport { gtkxCss } from \"./css.js\";\nimport { gtkxIcons } from \"./icons.js\";\nimport { gtkxReactCompiler } from \"./react-compiler.js\";\nimport { gtkxResources } from \"./resources.js\";\nimport { gtkxSettings } from \"./settings.js\";\nimport { gtkxStoreLinks } from \"./store-links.js\";\nimport { gtkxUndeclaredLibrary } from \"./undeclared-library.js\";\n\nconst gtkxVitePlugins = (mode?: string): Plugin[] => {\n const loadConfig = createConfigLoader(mode === undefined ? {} : { mode });\n\n return [\n createConfigPlugin({ name: \"gtkx:config\", loadConfig }),\n gtkxStoreLinks(),\n gtkxUndeclaredLibrary(loadConfig),\n gtkxSettings(),\n gtkxIcons(),\n gtkxAssetImports(),\n gtkxResources(loadConfig),\n gtkxCss(),\n gtkxReactCompiler(loadConfig),\n ];\n};\n\nexport { gtkxVitePlugins };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite-plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,eAAe,GAAG,CACpB,IAAa,EACb,SAAkB,EAClB,aAAsC,EAC9B,EAAE;IACV,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,OAAO;QACH,kBAAkB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;QACvD,cAAc,EAAE;QAChB,qBAAqB,CAAC,UAAU,CAAC;QACjC,YAAY,CAAC,UAAU,EAAE,aAAa,CAAC;QACvC,SAAS,CAAC,UAAU,CAAC;QACrB,gBAAgB,CAAC,UAAU,CAAC;QAC5B,YAAY,EAAE;QACd,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC;QACpC,OAAO,EAAE;QACT,iBAAiB,CAAC,UAAU,CAAC;KAChC,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Plugin } from \"vite\";\nimport { createConfigLoader } from \"@gtkx/config/internal\";\nimport createConfigPlugin from \"@gtkx/config/vite-plugin\";\nimport type { BuildManifestCollector } from \"../internal/build-manifest.js\";\nimport { gtkxAssetImports } from \"./asset-imports.js\";\nimport { gtkxBuiltUrl } from \"./built-url.js\";\nimport { gtkxCss } from \"./css.js\";\nimport { gtkxIcons } from \"./icons.js\";\nimport { gtkxReactCompiler } from \"./react-compiler.js\";\nimport { gtkxResources } from \"./resources.js\";\nimport { gtkxSettings } from \"./settings.js\";\nimport { gtkxStoreLinks } from \"./store-links.js\";\nimport { gtkxUndeclaredLibrary } from \"./undeclared-library.js\";\n\nconst gtkxVitePlugins = (\n mode?: string,\n entryPath?: string,\n buildManifest?: BuildManifestCollector,\n): Plugin[] => {\n const loadConfig = createConfigLoader(mode === undefined ? {} : { mode });\n\n return [\n createConfigPlugin({ name: \"gtkx:config\", loadConfig }),\n gtkxStoreLinks(),\n gtkxUndeclaredLibrary(loadConfig),\n gtkxSettings(loadConfig, buildManifest),\n gtkxIcons(loadConfig),\n gtkxAssetImports(loadConfig),\n gtkxBuiltUrl(),\n gtkxResources(loadConfig, entryPath),\n gtkxCss(),\n gtkxReactCompiler(loadConfig),\n ];\n};\n\nexport { gtkxVitePlugins };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAqDnC,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BxC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA2EnC,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgCxC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -4,6 +4,7 @@ import { arch, platform } from "node:os";
4
4
  import { dirname, join } from "node:path";
5
5
  import { stripQuery } from "./strip-query.js";
6
6
  const EMITTED_BINDING_SPECIFIER = "./gtkx.node";
7
+ const BINDING_FILENAME = "gtkx.node";
7
8
  function resolveBinaryPath(projectRequire, currentArch) {
8
9
  const nativeRoot = dirname(projectRequire.resolve("@gtkx/native/package.json"));
9
10
  const localBinary = join(nativeRoot, `native.linux-${currentArch}-gnu.node`);
@@ -20,7 +21,7 @@ function resolvePlatformBinary(projectRequire) {
20
21
  }
21
22
  return readFileSync(resolveBinaryPath(projectRequire, currentArch));
22
23
  }
23
- function rewriteLoader(code) {
24
+ function rewriteLoader(code, bindingReferenceId) {
24
25
  const idents = [];
25
26
  for (const match of code.matchAll(/export\s*\{\s*([A-Za-z0-9_$]+)\s*\}/g)) {
26
27
  const ident = match[1];
@@ -31,14 +32,28 @@ function rewriteLoader(code) {
31
32
  const bindings = idents.join(", ");
32
33
  return [
33
34
  "import { createRequire as __gtkxCreateRequire } from \"node:module\";",
34
- `const __gtkxNative = __gtkxCreateRequire(import.meta.url)(${JSON.stringify(EMITTED_BINDING_SPECIFIER)});`,
35
+ "import { fileURLToPath as __gtkxFileURLToPath } from \"node:url\";",
36
+ `const __gtkxNativeLocation = import.meta.ROLLUP_FILE_URL_${bindingReferenceId};`,
37
+ "const __gtkxNativePath = __gtkxNativeLocation.startsWith(\"file:\") " +
38
+ "? __gtkxFileURLToPath(__gtkxNativeLocation) : __gtkxNativeLocation;",
39
+ "const __gtkxNative = __gtkxCreateRequire(import.meta.url)(__gtkxNativePath);",
35
40
  `const { ${bindings} } = __gtkxNative;`,
36
41
  `export { ${bindings} };`,
37
42
  ].join("\n");
38
43
  }
44
+ const transformLoader = (code, id, loaderPath, bindingReferenceId) => {
45
+ if (stripQuery(id) !== loaderPath) {
46
+ return null;
47
+ }
48
+ if (bindingReferenceId === null) {
49
+ throw new Error("Cannot render the native loader before its binary has been emitted");
50
+ }
51
+ return rewriteLoader(code, bindingReferenceId);
52
+ };
39
53
  function gtkxNative(root) {
40
54
  const projectRequire = createRequire(join(root, "package.json"));
41
55
  let cachedLoaderPath;
56
+ let bindingReferenceId = null;
42
57
  const loaderPath = () => {
43
58
  cachedLoaderPath ??= join(dirname(projectRequire.resolve("@gtkx/native/package.json")), "index.js");
44
59
  return cachedLoaderPath;
@@ -48,13 +63,17 @@ function gtkxNative(root) {
48
63
  enforce: "pre",
49
64
  apply: "build",
50
65
  buildStart() {
51
- this.emitFile({ type: "asset", fileName: "gtkx.node", source: resolvePlatformBinary(projectRequire) });
66
+ bindingReferenceId = this.emitFile({
67
+ type: "asset",
68
+ fileName: BINDING_FILENAME,
69
+ source: resolvePlatformBinary(projectRequire),
70
+ });
52
71
  },
53
72
  resolveId(id) {
54
73
  return id === EMITTED_BINDING_SPECIFIER ? { id, external: true } : null;
55
74
  },
56
75
  transform(code, id) {
57
- return stripQuery(id) === loaderPath() ? rewriteLoader(code) : null;
76
+ return transformLoader(code, id, loaderPath(), bindingReferenceId);
58
77
  },
59
78
  };
60
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/vite-plugins/native.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { arch, platform } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { stripQuery } from \"./strip-query.js\";\n\nconst EMITTED_BINDING_SPECIFIER = \"./gtkx.node\";\n\nfunction resolveBinaryPath(projectRequire: ReturnType<typeof createRequire>, currentArch: string): string {\n const nativeRoot = dirname(projectRequire.resolve(\"@gtkx/native/package.json\"));\n const localBinary = join(nativeRoot, `native.linux-${currentArch}-gnu.node`);\n\n return existsSync(localBinary) ? localBinary : projectRequire.resolve(`@gtkx/native-linux-${currentArch}-gnu`);\n}\n\nfunction resolvePlatformBinary(projectRequire: ReturnType<typeof createRequire>): Buffer {\n const currentPlatform = platform();\n\n if (currentPlatform !== \"linux\") {\n throw new Error(`Unsupported build platform: ${currentPlatform}, only Linux is supported`);\n }\n\n const currentArch = arch();\n\n if (currentArch !== \"x64\" && currentArch !== \"arm64\") {\n throw new Error(`Unsupported build architecture: ${currentArch}, only x64 and arm64 are supported`);\n }\n\n return readFileSync(resolveBinaryPath(projectRequire, currentArch));\n}\n\nfunction rewriteLoader(code: string): string {\n const idents: string[] = [];\n\n for (const match of code.matchAll(/export\\s*\\{\\s*([A-Za-z0-9_$]+)\\s*\\}/g)) {\n const ident = match[1];\n\n if (ident) {\n idents.push(ident);\n }\n }\n\n const bindings = idents.join(\", \");\n\n return [\n \"import { createRequire as __gtkxCreateRequire } from \\\"node:module\\\";\",\n `const __gtkxNative = __gtkxCreateRequire(import.meta.url)(${JSON.stringify(EMITTED_BINDING_SPECIFIER)});`,\n `const { ${bindings} } = __gtkxNative;`,\n `export { ${bindings} };`,\n ].join(\"\\n\");\n}\n\nfunction gtkxNative(root: string): Plugin {\n const projectRequire = createRequire(join(root, \"package.json\"));\n let cachedLoaderPath: string | undefined;\n\n const loaderPath = (): string => {\n cachedLoaderPath ??= join(dirname(projectRequire.resolve(\"@gtkx/native/package.json\")), \"index.js\");\n\n return cachedLoaderPath;\n };\n\n return {\n name: \"gtkx:native\",\n enforce: \"pre\",\n apply: \"build\",\n\n buildStart() {\n this.emitFile({ type: \"asset\", fileName: \"gtkx.node\", source: resolvePlatformBinary(projectRequire) });\n },\n\n resolveId(id) {\n return id === EMITTED_BINDING_SPECIFIER ? { id, external: true } : null;\n },\n\n transform(code, id) {\n return stripQuery(id) === loaderPath() ? rewriteLoader(code) : null;\n },\n };\n}\n\nexport { gtkxNative };\n"]}
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/vite-plugins/native.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin } from \"vite\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { arch, platform } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { stripQuery } from \"./strip-query.js\";\n\nconst EMITTED_BINDING_SPECIFIER = \"./gtkx.node\";\nconst BINDING_FILENAME = \"gtkx.node\";\n\nfunction resolveBinaryPath(projectRequire: ReturnType<typeof createRequire>, currentArch: string): string {\n const nativeRoot = dirname(projectRequire.resolve(\"@gtkx/native/package.json\"));\n const localBinary = join(nativeRoot, `native.linux-${currentArch}-gnu.node`);\n\n return existsSync(localBinary) ? localBinary : projectRequire.resolve(`@gtkx/native-linux-${currentArch}-gnu`);\n}\n\nfunction resolvePlatformBinary(projectRequire: ReturnType<typeof createRequire>): Buffer {\n const currentPlatform = platform();\n\n if (currentPlatform !== \"linux\") {\n throw new Error(`Unsupported build platform: ${currentPlatform}, only Linux is supported`);\n }\n\n const currentArch = arch();\n\n if (currentArch !== \"x64\" && currentArch !== \"arm64\") {\n throw new Error(`Unsupported build architecture: ${currentArch}, only x64 and arm64 are supported`);\n }\n\n return readFileSync(resolveBinaryPath(projectRequire, currentArch));\n}\n\nfunction rewriteLoader(code: string, bindingReferenceId: string): string {\n const idents: string[] = [];\n\n for (const match of code.matchAll(/export\\s*\\{\\s*([A-Za-z0-9_$]+)\\s*\\}/g)) {\n const ident = match[1];\n\n if (ident) {\n idents.push(ident);\n }\n }\n\n const bindings = idents.join(\", \");\n\n return [\n \"import { createRequire as __gtkxCreateRequire } from \\\"node:module\\\";\",\n \"import { fileURLToPath as __gtkxFileURLToPath } from \\\"node:url\\\";\",\n `const __gtkxNativeLocation = import.meta.ROLLUP_FILE_URL_${bindingReferenceId};`,\n \"const __gtkxNativePath = __gtkxNativeLocation.startsWith(\\\"file:\\\") \" +\n \"? __gtkxFileURLToPath(__gtkxNativeLocation) : __gtkxNativeLocation;\",\n \"const __gtkxNative = __gtkxCreateRequire(import.meta.url)(__gtkxNativePath);\",\n `const { ${bindings} } = __gtkxNative;`,\n `export { ${bindings} };`,\n ].join(\"\\n\");\n}\n\nconst transformLoader = (\n code: string,\n id: string,\n loaderPath: string,\n bindingReferenceId: string | null,\n): string | null => {\n if (stripQuery(id) !== loaderPath) {\n return null;\n }\n\n if (bindingReferenceId === null) {\n throw new Error(\"Cannot render the native loader before its binary has been emitted\");\n }\n\n return rewriteLoader(code, bindingReferenceId);\n};\n\nfunction gtkxNative(root: string): Plugin {\n const projectRequire = createRequire(join(root, \"package.json\"));\n let cachedLoaderPath: string | undefined;\n let bindingReferenceId: string | null = null;\n\n const loaderPath = (): string => {\n cachedLoaderPath ??= join(dirname(projectRequire.resolve(\"@gtkx/native/package.json\")), \"index.js\");\n\n return cachedLoaderPath;\n };\n\n return {\n name: \"gtkx:native\",\n enforce: \"pre\",\n apply: \"build\",\n\n buildStart() {\n bindingReferenceId = this.emitFile({\n type: \"asset\",\n fileName: BINDING_FILENAME,\n source: resolvePlatformBinary(projectRequire),\n });\n },\n\n resolveId(id) {\n return id === EMITTED_BINDING_SPECIFIER ? { id, external: true } : null;\n },\n\n transform(code, id) {\n return transformLoader(code, id, loaderPath(), bindingReferenceId);\n },\n };\n}\n\nexport { gtkxNative };\n"]}
@@ -1,6 +1,10 @@
1
- declare const renderInitModule: (options: {
2
- isBuild: boolean;
1
+ type InitModuleOptions = {
2
+ isBuild: true;
3
+ bundleReferenceId: string;
4
+ } | {
5
+ isBuild: false;
3
6
  devBundlePath: string;
4
- }) => string;
7
+ };
8
+ declare const renderInitModule: (options: InitModuleOptions) => string;
5
9
  export { renderInitModule };
6
10
  //# sourceMappingURL=resource-init-module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-init-module.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/resource-init-module.ts"],"names":[],"mappings":"AAqDA,QAAA,MAAM,gBAAgB,GAAI,SAAS;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,KAAG,MACS,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"resource-init-module.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/resource-init-module.ts"],"names":[],"mappings":"AAEA,KAAK,iBAAiB,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AA+E9C,QAAA,MAAM,gBAAgB,GAAI,SAAS,iBAAiB,KAAG,MAC4D,CAAC;AAEpH,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,13 +1,27 @@
1
- import { BUNDLE_FILENAME, REFRESH_EXPORT } from "./resource-shared.js";
2
- const buildInitModuleSource = () => [
3
- "import { dirname, join } from \"node:path\";",
1
+ import { REFRESH_EXPORT, REGISTER_REFRESH_EXPORT } from "./resource-shared.js";
2
+ const refreshCallbackSource = () => [
3
+ "const refreshCallbacks = new Map();",
4
+ "",
5
+ `export function ${REGISTER_REFRESH_EXPORT}(key, callback) {`,
6
+ " refreshCallbacks.set(key, callback);",
7
+ " callback();",
8
+ "}",
9
+ "",
10
+ "function runRefreshCallbacks() {",
11
+ " for (const callback of refreshCallbacks.values()) callback();",
12
+ "}",
13
+ ];
14
+ const buildInitModuleSource = (bundleReferenceId) => [
4
15
  "import { fileURLToPath } from \"node:url\";",
5
16
  "import { Resource, resourcesRegister } from \"@gtkx/gi/gio\";",
6
17
  "",
7
- "const bundleDir = dirname(fileURLToPath(import.meta.url));",
8
- `const resource = Resource.load(join(bundleDir, ${JSON.stringify(BUNDLE_FILENAME)}));`,
18
+ `const bundleLocation = import.meta.ROLLUP_FILE_URL_${bundleReferenceId};`,
19
+ "const bundlePath = bundleLocation.startsWith(\"file:\") ? fileURLToPath(bundleLocation) : bundleLocation;",
20
+ "const resource = Resource.load(bundlePath);",
9
21
  "resourcesRegister(resource);",
10
22
  "",
23
+ ...refreshCallbackSource(),
24
+ "",
11
25
  "export function ensureRegistered() {}",
12
26
  `export function ${REFRESH_EXPORT}() {}`,
13
27
  ].join("\n");
@@ -27,25 +41,36 @@ const devInitModuleSource = (bundlePath) => {
27
41
  " current = next;",
28
42
  "}",
29
43
  "",
44
+ "function unregister() {",
45
+ " if (!current) return;",
46
+ " resourcesUnregister(current);",
47
+ " current = null;",
48
+ " lastSig = \"\";",
49
+ "}",
50
+ "",
51
+ ...refreshCallbackSource(),
52
+ "",
30
53
  "export function ensureRegistered() {",
31
- ` if (!existsSync(${bundlePathLiteral})) return;`,
54
+ ` if (!existsSync(${bundlePathLiteral})) {`,
55
+ " unregister();",
56
+ " return;",
57
+ " }",
32
58
  ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,
33
59
  " const sig = size + \":\" + mtimeMs;",
34
- " if (sig === lastSig) return;",
35
- " register();",
36
- " lastSig = sig;",
60
+ " if (sig !== lastSig) {",
61
+ " register();",
62
+ " lastSig = sig;",
63
+ " }",
37
64
  "}",
38
65
  "",
39
66
  "ensureRegistered();",
40
67
  "",
41
68
  `export function ${REFRESH_EXPORT}() {`,
42
- ` if (!existsSync(${bundlePathLiteral})) return;`,
43
- " register();",
44
- ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,
45
- " lastSig = size + \":\" + mtimeMs;",
69
+ " ensureRegistered();",
70
+ " runRefreshCallbacks();",
46
71
  "}",
47
72
  ].join("\n");
48
73
  };
49
- const renderInitModule = (options) => options.isBuild ? buildInitModuleSource() : devInitModuleSource(options.devBundlePath);
74
+ const renderInitModule = (options) => options.isBuild ? buildInitModuleSource(options.bundleReferenceId) : devInitModuleSource(options.devBundlePath);
50
75
  export { renderInitModule };
51
76
  //# sourceMappingURL=resource-init-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource-init-module.js","sourceRoot":"","sources":["../../src/vite-plugins/resource-init-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,qBAAqB,GAAG,GAAW,EAAE,CACvC;IACI,8CAA8C;IAC9C,6CAA6C;IAC7C,+DAA+D;IAC/D,EAAE;IACF,4DAA4D;IAC5D,kDAAkD,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK;IACtF,8BAA8B;IAC9B,EAAE;IACF,uCAAuC;IACvC,mBAAmB,cAAc,OAAO;CAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjB,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAU,EAAE;IACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAErD,OAAO;QACH,mDAAmD;QACnD,oFAAoF;QACpF,EAAE;QACF,qBAAqB;QACrB,qBAAqB;QACrB,EAAE;QACF,uBAAuB;QACvB,kCAAkC,iBAAiB,IAAI;QACvD,gDAAgD;QAChD,8BAA8B;QAC9B,qBAAqB;QACrB,GAAG;QACH,EAAE;QACF,sCAAsC;QACtC,uBAAuB,iBAAiB,YAAY;QACpD,0CAA0C,iBAAiB,IAAI;QAC/D,yCAAyC;QACzC,kCAAkC;QAClC,iBAAiB;QACjB,oBAAoB;QACpB,GAAG;QACH,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,mBAAmB,cAAc,MAAM;QACvC,uBAAuB,iBAAiB,YAAY;QACpD,iBAAiB;QACjB,0CAA0C,iBAAiB,IAAI;QAC/D,uCAAuC;QACvC,GAAG;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAoD,EAAU,EAAE,CACtF,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import { BUNDLE_FILENAME, REFRESH_EXPORT } from \"./resource-shared.js\";\n\nconst buildInitModuleSource = (): string =>\n [\n \"import { dirname, join } from \\\"node:path\\\";\",\n \"import { fileURLToPath } from \\\"node:url\\\";\",\n \"import { Resource, resourcesRegister } from \\\"@gtkx/gi/gio\\\";\",\n \"\",\n \"const bundleDir = dirname(fileURLToPath(import.meta.url));\",\n `const resource = Resource.load(join(bundleDir, ${JSON.stringify(BUNDLE_FILENAME)}));`,\n \"resourcesRegister(resource);\",\n \"\",\n \"export function ensureRegistered() {}\",\n `export function ${REFRESH_EXPORT}() {}`,\n ].join(\"\\n\");\n\nconst devInitModuleSource = (bundlePath: string): string => {\n const bundlePathLiteral = JSON.stringify(bundlePath);\n\n return [\n \"import { existsSync, statSync } from \\\"node:fs\\\";\",\n \"import { Resource, resourcesRegister, resourcesUnregister } from \\\"@gtkx/gi/gio\\\";\",\n \"\",\n \"let current = null;\",\n \"let lastSig = \\\"\\\";\",\n \"\",\n \"function register() {\",\n ` const next = Resource.load(${bundlePathLiteral});`,\n \" if (current) resourcesUnregister(current);\",\n \" resourcesRegister(next);\",\n \" current = next;\",\n \"}\",\n \"\",\n \"export function ensureRegistered() {\",\n ` if (!existsSync(${bundlePathLiteral})) return;`,\n ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,\n \" const sig = size + \\\":\\\" + mtimeMs;\",\n \" if (sig === lastSig) return;\",\n \" register();\",\n \" lastSig = sig;\",\n \"}\",\n \"\",\n \"ensureRegistered();\",\n \"\",\n `export function ${REFRESH_EXPORT}() {`,\n ` if (!existsSync(${bundlePathLiteral})) return;`,\n \" register();\",\n ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,\n \" lastSig = size + \\\":\\\" + mtimeMs;\",\n \"}\",\n ].join(\"\\n\");\n};\n\nconst renderInitModule = (options: { isBuild: boolean; devBundlePath: string }): string =>\n options.isBuild ? buildInitModuleSource() : devInitModuleSource(options.devBundlePath);\n\nexport { renderInitModule };\n"]}
1
+ {"version":3,"file":"resource-init-module.js","sourceRoot":"","sources":["../../src/vite-plugins/resource-init-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAK/E,MAAM,qBAAqB,GAAG,GAAa,EAAE,CAAC;IAC1C,qCAAqC;IACrC,EAAE;IACF,mBAAmB,uBAAuB,mBAAmB;IAC7D,0CAA0C;IAC1C,iBAAiB;IACjB,GAAG;IACH,EAAE;IACF,kCAAkC;IAClC,mEAAmE;IACnE,GAAG;CACN,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,iBAAyB,EAAU,EAAE,CAChE;IACI,6CAA6C;IAC7C,+DAA+D;IAC/D,EAAE;IACF,sDAAsD,iBAAiB,GAAG;IAC1E,2GAA2G;IAC3G,6CAA6C;IAC7C,8BAA8B;IAC9B,EAAE;IACF,GAAG,qBAAqB,EAAE;IAC1B,EAAE;IACF,uCAAuC;IACvC,mBAAmB,cAAc,OAAO;CAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjB,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAU,EAAE;IACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAErD,OAAO;QACH,mDAAmD;QACnD,oFAAoF;QACpF,EAAE;QACF,qBAAqB;QACrB,qBAAqB;QACrB,EAAE;QACF,uBAAuB;QACvB,kCAAkC,iBAAiB,IAAI;QACvD,gDAAgD;QAChD,8BAA8B;QAC9B,qBAAqB;QACrB,GAAG;QACH,EAAE;QACF,yBAAyB;QACzB,2BAA2B;QAC3B,mCAAmC;QACnC,qBAAqB;QACrB,qBAAqB;QACrB,GAAG;QACH,EAAE;QACF,GAAG,qBAAqB,EAAE;QAC1B,EAAE;QACF,sCAAsC;QACtC,uBAAuB,iBAAiB,MAAM;QAC9C,uBAAuB;QACvB,iBAAiB;QACjB,OAAO;QACP,0CAA0C,iBAAiB,IAAI;QAC/D,yCAAyC;QACzC,4BAA4B;QAC5B,qBAAqB;QACrB,wBAAwB;QACxB,OAAO;QACP,GAAG;QACH,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,mBAAmB,cAAc,MAAM;QACvC,yBAAyB;QACzB,4BAA4B;QAC5B,GAAG;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAA0B,EAAU,EAAE,CAC5D,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AAEpH,OAAO,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import { REFRESH_EXPORT, REGISTER_REFRESH_EXPORT } from \"./resource-shared.js\";\n\ntype InitModuleOptions = { isBuild: true; bundleReferenceId: string } |\n { isBuild: false; devBundlePath: string };\n\nconst refreshCallbackSource = (): string[] => [\n \"const refreshCallbacks = new Map();\",\n \"\",\n `export function ${REGISTER_REFRESH_EXPORT}(key, callback) {`,\n \" refreshCallbacks.set(key, callback);\",\n \" callback();\",\n \"}\",\n \"\",\n \"function runRefreshCallbacks() {\",\n \" for (const callback of refreshCallbacks.values()) callback();\",\n \"}\",\n];\n\nconst buildInitModuleSource = (bundleReferenceId: string): string =>\n [\n \"import { fileURLToPath } from \\\"node:url\\\";\",\n \"import { Resource, resourcesRegister } from \\\"@gtkx/gi/gio\\\";\",\n \"\",\n `const bundleLocation = import.meta.ROLLUP_FILE_URL_${bundleReferenceId};`,\n \"const bundlePath = bundleLocation.startsWith(\\\"file:\\\") ? fileURLToPath(bundleLocation) : bundleLocation;\",\n \"const resource = Resource.load(bundlePath);\",\n \"resourcesRegister(resource);\",\n \"\",\n ...refreshCallbackSource(),\n \"\",\n \"export function ensureRegistered() {}\",\n `export function ${REFRESH_EXPORT}() {}`,\n ].join(\"\\n\");\n\nconst devInitModuleSource = (bundlePath: string): string => {\n const bundlePathLiteral = JSON.stringify(bundlePath);\n\n return [\n \"import { existsSync, statSync } from \\\"node:fs\\\";\",\n \"import { Resource, resourcesRegister, resourcesUnregister } from \\\"@gtkx/gi/gio\\\";\",\n \"\",\n \"let current = null;\",\n \"let lastSig = \\\"\\\";\",\n \"\",\n \"function register() {\",\n ` const next = Resource.load(${bundlePathLiteral});`,\n \" if (current) resourcesUnregister(current);\",\n \" resourcesRegister(next);\",\n \" current = next;\",\n \"}\",\n \"\",\n \"function unregister() {\",\n \" if (!current) return;\",\n \" resourcesUnregister(current);\",\n \" current = null;\",\n \" lastSig = \\\"\\\";\",\n \"}\",\n \"\",\n ...refreshCallbackSource(),\n \"\",\n \"export function ensureRegistered() {\",\n ` if (!existsSync(${bundlePathLiteral})) {`,\n \" unregister();\",\n \" return;\",\n \" }\",\n ` const { size, mtimeMs } = statSync(${bundlePathLiteral});`,\n \" const sig = size + \\\":\\\" + mtimeMs;\",\n \" if (sig !== lastSig) {\",\n \" register();\",\n \" lastSig = sig;\",\n \" }\",\n \"}\",\n \"\",\n \"ensureRegistered();\",\n \"\",\n `export function ${REFRESH_EXPORT}() {`,\n \" ensureRegistered();\",\n \" runRefreshCallbacks();\",\n \"}\",\n ].join(\"\\n\");\n};\n\nconst renderInitModule = (options: InitModuleOptions): string =>\n options.isBuild ? buildInitModuleSource(options.bundleReferenceId) : devInitModuleSource(options.devBundlePath);\n\nexport { renderInitModule };\n"]}