@gtkx/cli 2.0.0-beta.6 → 2.0.0-beta.8

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 (205) 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/commands/deploy.d.ts +4 -0
  8. package/dist/commands/deploy.d.ts.map +1 -1
  9. package/dist/commands/deploy.js +6 -0
  10. package/dist/commands/deploy.js.map +1 -1
  11. package/dist/deploy/download.d.ts +7 -3
  12. package/dist/deploy/download.d.ts.map +1 -1
  13. package/dist/deploy/download.js +19 -15
  14. package/dist/deploy/download.js.map +1 -1
  15. package/dist/deploy/native-addon.d.ts +5 -0
  16. package/dist/deploy/native-addon.d.ts.map +1 -0
  17. package/dist/deploy/native-addon.js +134 -0
  18. package/dist/deploy/native-addon.js.map +1 -0
  19. package/dist/deploy/node-runtime/download.js +2 -2
  20. package/dist/deploy/node-runtime/download.js.map +1 -1
  21. package/dist/deploy/node-runtime/elf.d.ts +3 -1
  22. package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
  23. package/dist/deploy/node-runtime/elf.js +3 -1
  24. package/dist/deploy/node-runtime/elf.js.map +1 -1
  25. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  26. package/dist/deploy/node-runtime/index.js +14 -2
  27. package/dist/deploy/node-runtime/index.js.map +1 -1
  28. package/dist/deploy/payload/stage.d.ts +2 -1
  29. package/dist/deploy/payload/stage.d.ts.map +1 -1
  30. package/dist/deploy/payload/stage.js +22 -2
  31. package/dist/deploy/payload/stage.js.map +1 -1
  32. package/dist/deploy/run-deploy.d.ts +1 -0
  33. package/dist/deploy/run-deploy.d.ts.map +1 -1
  34. package/dist/deploy/run-deploy.js +135 -79
  35. package/dist/deploy/run-deploy.js.map +1 -1
  36. package/dist/deploy/settings/arch.d.ts +9 -3
  37. package/dist/deploy/settings/arch.d.ts.map +1 -1
  38. package/dist/deploy/settings/arch.js +27 -6
  39. package/dist/deploy/settings/arch.js.map +1 -1
  40. package/dist/deploy/settings/index.d.ts +2 -1
  41. package/dist/deploy/settings/index.d.ts.map +1 -1
  42. package/dist/deploy/settings/index.js +2 -1
  43. package/dist/deploy/settings/index.js.map +1 -1
  44. package/dist/deploy/settings/libraries.d.ts.map +1 -1
  45. package/dist/deploy/settings/libraries.js +2 -1
  46. package/dist/deploy/settings/libraries.js.map +1 -1
  47. package/dist/deploy/settings/paths.d.ts +2 -1
  48. package/dist/deploy/settings/paths.d.ts.map +1 -1
  49. package/dist/deploy/settings/paths.js +6 -5
  50. package/dist/deploy/settings/paths.js.map +1 -1
  51. package/dist/deploy/targets/appimage.d.ts.map +1 -1
  52. package/dist/deploy/targets/appimage.js +1 -0
  53. package/dist/deploy/targets/appimage.js.map +1 -1
  54. package/dist/deploy/targets/flatpak-pnpm.js +4 -4
  55. package/dist/deploy/targets/flatpak-pnpm.js.map +1 -1
  56. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  57. package/dist/deploy/targets/flatpak-source.js +2 -0
  58. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  59. package/dist/deploy/targets/flatpak.d.ts.map +1 -1
  60. package/dist/deploy/targets/flatpak.js +1 -0
  61. package/dist/deploy/targets/flatpak.js.map +1 -1
  62. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -1
  63. package/dist/deploy/targets/nfpm-target.js +1 -0
  64. package/dist/deploy/targets/nfpm-target.js.map +1 -1
  65. package/dist/deploy/types.d.ts +4 -2
  66. package/dist/deploy/types.d.ts.map +1 -1
  67. package/dist/deploy/types.js.map +1 -1
  68. package/dist/deploy/vendored/appimagetool.js +2 -2
  69. package/dist/deploy/vendored/appimagetool.js.map +1 -1
  70. package/dist/deploy/vendored/nfpm.js +1 -1
  71. package/dist/deploy/vendored/nfpm.js.map +1 -1
  72. package/dist/dev/font-dir.d.ts +3 -0
  73. package/dist/dev/font-dir.d.ts.map +1 -0
  74. package/dist/dev/font-dir.js +9 -0
  75. package/dist/dev/font-dir.js.map +1 -0
  76. package/dist/dev/runner-main.d.ts.map +1 -1
  77. package/dist/dev/runner-main.js +2 -0
  78. package/dist/dev/runner-main.js.map +1 -1
  79. package/dist/dev/runner.d.ts.map +1 -1
  80. package/dist/dev/runner.js +19 -6
  81. package/dist/dev/runner.js.map +1 -1
  82. package/dist/internal/agent-rules.d.ts.map +1 -1
  83. package/dist/internal/agent-rules.js +6 -2
  84. package/dist/internal/agent-rules.js.map +1 -1
  85. package/dist/internal/banner.d.ts.map +1 -1
  86. package/dist/internal/banner.js +3 -0
  87. package/dist/internal/banner.js.map +1 -1
  88. package/dist/internal/font-path.d.ts +4 -0
  89. package/dist/internal/font-path.d.ts.map +1 -0
  90. package/dist/internal/font-path.js +12 -0
  91. package/dist/internal/font-path.js.map +1 -0
  92. package/dist/internal/font-staging.d.ts +6 -0
  93. package/dist/internal/font-staging.d.ts.map +1 -0
  94. package/dist/internal/font-staging.js +92 -0
  95. package/dist/internal/font-staging.js.map +1 -0
  96. package/dist/internal/source-imports.d.ts +2 -1
  97. package/dist/internal/source-imports.d.ts.map +1 -1
  98. package/dist/internal/source-imports.js +8 -3
  99. package/dist/internal/source-imports.js.map +1 -1
  100. package/dist/internal/xdg-banner.d.ts +4 -0
  101. package/dist/internal/xdg-banner.d.ts.map +1 -0
  102. package/dist/internal/xdg-banner.js +11 -0
  103. package/dist/internal/xdg-banner.js.map +1 -0
  104. package/dist/internal/xdg-data-dirs.d.ts +2 -1
  105. package/dist/internal/xdg-data-dirs.d.ts.map +1 -1
  106. package/dist/internal/xdg-data-dirs.js +1 -1
  107. package/dist/internal/xdg-data-dirs.js.map +1 -1
  108. package/dist/settings/schema.d.ts.map +1 -1
  109. package/dist/settings/schema.js +1 -6
  110. package/dist/settings/schema.js.map +1 -1
  111. package/dist/vite-plugins/asset-extensions.d.ts.map +1 -1
  112. package/dist/vite-plugins/asset-extensions.js +2 -0
  113. package/dist/vite-plugins/asset-extensions.js.map +1 -1
  114. package/dist/vite-plugins/asset-imports.d.ts.map +1 -1
  115. package/dist/vite-plugins/asset-imports.js +7 -2
  116. package/dist/vite-plugins/asset-imports.js.map +1 -1
  117. package/dist/vite-plugins/asset-specifier.d.ts +5 -1
  118. package/dist/vite-plugins/asset-specifier.d.ts.map +1 -1
  119. package/dist/vite-plugins/asset-specifier.js +10 -1
  120. package/dist/vite-plugins/asset-specifier.js.map +1 -1
  121. package/dist/vite-plugins/css.d.ts.map +1 -1
  122. package/dist/vite-plugins/css.js +3 -2
  123. package/dist/vite-plugins/css.js.map +1 -1
  124. package/dist/vite-plugins/font-name.d.ts +3 -0
  125. package/dist/vite-plugins/font-name.d.ts.map +1 -0
  126. package/dist/vite-plugins/font-name.js +406 -0
  127. package/dist/vite-plugins/font-name.js.map +1 -0
  128. package/dist/vite-plugins/font-worker-env.d.ts +4 -0
  129. package/dist/vite-plugins/font-worker-env.d.ts.map +1 -0
  130. package/dist/vite-plugins/font-worker-env.js +19 -0
  131. package/dist/vite-plugins/font-worker-env.js.map +1 -0
  132. package/dist/vite-plugins/font.d.ts +4 -0
  133. package/dist/vite-plugins/font.d.ts.map +1 -0
  134. package/dist/vite-plugins/font.js +99 -0
  135. package/dist/vite-plugins/font.js.map +1 -0
  136. package/dist/vite-plugins/icons.d.ts.map +1 -1
  137. package/dist/vite-plugins/icons.js +5 -10
  138. package/dist/vite-plugins/icons.js.map +1 -1
  139. package/dist/vite-plugins/index.d.ts.map +1 -1
  140. package/dist/vite-plugins/index.js +2 -0
  141. package/dist/vite-plugins/index.js.map +1 -1
  142. package/dist/vite-plugins/react-compiler.js +2 -2
  143. package/dist/vite-plugins/react-compiler.js.map +1 -1
  144. package/dist/vite-plugins/resources.js +3 -3
  145. package/dist/vite-plugins/resources.js.map +1 -1
  146. package/dist/vite-plugins/settings-worker-env.js +2 -2
  147. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  148. package/dist/vite-plugins/store-links.d.ts.map +1 -1
  149. package/dist/vite-plugins/store-links.js +2 -1
  150. package/dist/vite-plugins/store-links.js.map +1 -1
  151. package/dist/vite-plugins/undeclared-library.js +5 -5
  152. package/dist/vite-plugins/undeclared-library.js.map +1 -1
  153. package/dist/vitest-plugin.d.ts.map +1 -1
  154. package/dist/vitest-plugin.js +2 -0
  155. package/dist/vitest-plugin.js.map +1 -1
  156. package/env.d.ts +9 -0
  157. package/package.json +17 -15
  158. package/src/cli.ts +1 -1
  159. package/src/codegen/freshness.ts +5 -1
  160. package/src/commands/deploy.ts +6 -0
  161. package/src/deploy/download.ts +33 -17
  162. package/src/deploy/native-addon.ts +183 -0
  163. package/src/deploy/node-runtime/download.ts +2 -2
  164. package/src/deploy/node-runtime/elf.ts +4 -1
  165. package/src/deploy/node-runtime/index.ts +24 -4
  166. package/src/deploy/payload/stage.ts +34 -2
  167. package/src/deploy/run-deploy.ts +203 -93
  168. package/src/deploy/settings/arch.ts +40 -8
  169. package/src/deploy/settings/index.ts +4 -1
  170. package/src/deploy/settings/libraries.ts +2 -1
  171. package/src/deploy/settings/paths.ts +8 -6
  172. package/src/deploy/targets/appimage.ts +1 -0
  173. package/src/deploy/targets/flatpak-pnpm.ts +4 -4
  174. package/src/deploy/targets/flatpak-source.ts +2 -0
  175. package/src/deploy/targets/flatpak.ts +1 -0
  176. package/src/deploy/targets/nfpm-target.ts +1 -0
  177. package/src/deploy/types.ts +4 -1
  178. package/src/deploy/vendored/appimagetool.ts +2 -2
  179. package/src/deploy/vendored/nfpm.ts +1 -1
  180. package/src/dev/font-dir.ts +11 -0
  181. package/src/dev/runner-main.ts +2 -0
  182. package/src/dev/runner.ts +24 -6
  183. package/src/internal/agent-rules.ts +6 -2
  184. package/src/internal/banner.ts +4 -0
  185. package/src/internal/font-path.ts +15 -0
  186. package/src/internal/font-staging.ts +129 -0
  187. package/src/internal/source-imports.ts +18 -3
  188. package/src/internal/xdg-banner.ts +13 -0
  189. package/src/internal/xdg-data-dirs.ts +1 -1
  190. package/src/settings/schema.ts +1 -8
  191. package/src/vite-plugins/asset-extensions.ts +2 -0
  192. package/src/vite-plugins/asset-imports.ts +9 -1
  193. package/src/vite-plugins/asset-specifier.ts +17 -0
  194. package/src/vite-plugins/css.ts +4 -2
  195. package/src/vite-plugins/font-name.ts +582 -0
  196. package/src/vite-plugins/font-worker-env.ts +25 -0
  197. package/src/vite-plugins/font.ts +165 -0
  198. package/src/vite-plugins/icons.ts +6 -12
  199. package/src/vite-plugins/index.ts +2 -0
  200. package/src/vite-plugins/react-compiler.ts +2 -2
  201. package/src/vite-plugins/resources.ts +3 -3
  202. package/src/vite-plugins/settings-worker-env.ts +2 -2
  203. package/src/vite-plugins/store-links.ts +2 -1
  204. package/src/vite-plugins/undeclared-library.ts +5 -5
  205. package/src/vitest-plugin.ts +2 -0
@@ -0,0 +1,134 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ import { runCliTool } from "../internal/run-cli-tool.js";
5
+ import { cacheDir, downloadFile, readCachedDigest, writeAtomically } from "./download.js";
6
+ import { isHostArch } from "./settings/arch.js";
7
+ const BINDING_FILENAME = "gtkx.node";
8
+ const DEFAULT_REGISTRY = "https://registry.npmjs.org";
9
+ const NATIVE_MANIFEST = "@gtkx/native/package.json";
10
+ const PACKAGE_ROOT = "package";
11
+ const REQUEST_TIMEOUT = 30_000;
12
+ const SRI_PREFIX = "sha512-";
13
+ const STRIP_COMPONENTS = "1";
14
+ const VERSION_PATTERN = /^[\w.+-]+$/;
15
+ const binaryFilename = (arch) => `native.linux-${arch}-gnu.node`;
16
+ const platformStem = (arch) => `native-linux-${arch}-gnu`;
17
+ const platformPackage = (arch) => `@gtkx/${platformStem(arch)}`;
18
+ const withoutTrailingSlash = (value) => {
19
+ let end = value.length;
20
+ while (end > 0 && value[end - 1] === "/") {
21
+ end -= 1;
22
+ }
23
+ return value.slice(0, end);
24
+ };
25
+ const registryUrl = () => {
26
+ const configured = process.env.npm_config_registry;
27
+ return withoutTrailingSlash(configured !== undefined && configured.length > 0 ? configured : DEFAULT_REGISTRY);
28
+ };
29
+ const projectRequireFor = (root) => createRequire(join(root, "package.json"));
30
+ const localBinary = (projectRequire, arch) => {
31
+ const nativeRoot = dirname(projectRequire.resolve(NATIVE_MANIFEST));
32
+ const candidate = join(nativeRoot, binaryFilename(arch));
33
+ return existsSync(candidate) ? candidate : null;
34
+ };
35
+ const installedBinary = (projectRequire, arch) => {
36
+ try {
37
+ return projectRequire.resolve(platformPackage(arch));
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ };
43
+ const manifestVersion = (manifest) => {
44
+ if (typeof manifest !== "object" || manifest === null || !("version" in manifest)) {
45
+ return null;
46
+ }
47
+ const version = manifest.version;
48
+ return typeof version === "string" && VERSION_PATTERN.test(version) ? version : null;
49
+ };
50
+ const nativeVersion = (projectRequire) => {
51
+ const parsed = JSON.parse(readFileSync(projectRequire.resolve(NATIVE_MANIFEST), "utf8"));
52
+ const version = manifestVersion(parsed);
53
+ if (version === null) {
54
+ throw new Error("Cannot read a usable version from @gtkx/native; is it installed?");
55
+ }
56
+ return version;
57
+ };
58
+ const hexFromIntegrity = (integrity, subject) => {
59
+ if (typeof integrity !== "string" || !integrity.startsWith(SRI_PREFIX)) {
60
+ throw new Error(`The npm registry publishes no sha512 integrity for ${subject}`);
61
+ }
62
+ return Buffer.from(integrity.slice(SRI_PREFIX.length), "base64").toString("hex");
63
+ };
64
+ const fetchVersionDocument = async (url, subject) => {
65
+ const response = await fetch(url, { signal: AbortSignal.timeout(REQUEST_TIMEOUT) });
66
+ if (!response.ok) {
67
+ throw new Error(`Cannot fetch ${subject}: HTTP ${String(response.status)} ${response.statusText}. ` +
68
+ `Install ${subject} directly, or drop that architecture from --arch.`);
69
+ }
70
+ const document = await response.json();
71
+ if (typeof document !== "object" || document === null) {
72
+ throw new Error(`The npm registry returned no metadata for ${subject}`);
73
+ }
74
+ return document;
75
+ };
76
+ const publishedTarball = async (arch, version) => {
77
+ const registry = registryUrl();
78
+ const subject = `${platformPackage(arch)}@${version}`;
79
+ const url = `${registry}/${encodeURIComponent(platformPackage(arch))}/${version}`;
80
+ const document = await fetchVersionDocument(url, subject);
81
+ const dist = document.dist;
82
+ if (typeof dist !== "object" || dist === null) {
83
+ throw new Error(`The npm registry returned no tarball for ${subject}`);
84
+ }
85
+ const entry = dist;
86
+ const tarball = entry.tarball;
87
+ if (typeof tarball !== "string" || new URL(tarball).origin !== new URL(registry).origin) {
88
+ throw new Error(`The npm registry returned an unusable tarball URL for ${subject}`);
89
+ }
90
+ return { url: tarball, digest: hexFromIntegrity(entry.integrity, subject) };
91
+ };
92
+ const extractAddon = (archive, dir, arch) => {
93
+ runCliTool({
94
+ tool: "tar",
95
+ args: ["-xzf", archive, "-C", dir, "--strip-components", STRIP_COMPONENTS,
96
+ `${PACKAGE_ROOT}/${binaryFilename(arch)}`],
97
+ target: platformPackage(arch),
98
+ });
99
+ };
100
+ const cachedTarballUrl = (arch, version) => `${registryUrl()}/${platformPackage(arch)}/-/${platformStem(arch)}-${version}.tgz`;
101
+ const tarballFor = async (arch, version, sidecar) => {
102
+ const cached = readCachedDigest(sidecar, "sha512");
103
+ if (cached !== undefined) {
104
+ return { url: cachedTarballUrl(arch, version), digest: cached };
105
+ }
106
+ const published = await publishedTarball(arch, version);
107
+ writeAtomically(sidecar, published.digest);
108
+ return published;
109
+ };
110
+ const downloadedBinary = async (arch, version) => {
111
+ const dir = cacheDir(["native", `${version}-linux-${arch}`]);
112
+ const archive = join(dir, `${platformStem(arch)}-${version}.tgz`);
113
+ const tarball = await tarballFor(arch, version, `${archive}.sha512`);
114
+ await downloadFile({
115
+ url: tarball.url,
116
+ dest: archive,
117
+ label: `${platformPackage(arch)} ${version}`,
118
+ digest: tarball.digest,
119
+ algorithm: "sha512",
120
+ });
121
+ extractAddon(archive, dir, arch);
122
+ return join(dir, binaryFilename(arch));
123
+ };
124
+ const resolveStagedAddon = async (settings) => {
125
+ const arch = settings.arch.node;
126
+ if (isHostArch(arch)) {
127
+ return null;
128
+ }
129
+ const projectRequire = projectRequireFor(settings.paths.root);
130
+ const resolved = localBinary(projectRequire, arch) ?? installedBinary(projectRequire, arch);
131
+ return resolved ?? await downloadedBinary(arch, nativeVersion(projectRequire));
132
+ };
133
+ export { BINDING_FILENAME, resolveStagedAddon };
134
+ //# sourceMappingURL=native-addon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-addon.js","sourceRoot":"","sources":["../../src/deploy/native-addon.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport type { DeployArchName, DeploySettings } from \"./types.js\";\nimport { runCliTool } from \"../internal/run-cli-tool.js\";\nimport { cacheDir, downloadFile, readCachedDigest, writeAtomically } from \"./download.js\";\nimport { isHostArch } from \"./settings/arch.js\";\n\ntype ProjectRequire = ReturnType<typeof createRequire>;\ntype Tarball = { url: string; digest: string };\n\nconst BINDING_FILENAME = \"gtkx.node\";\nconst DEFAULT_REGISTRY = \"https://registry.npmjs.org\";\nconst NATIVE_MANIFEST = \"@gtkx/native/package.json\";\nconst PACKAGE_ROOT = \"package\";\nconst REQUEST_TIMEOUT = 30_000;\nconst SRI_PREFIX = \"sha512-\";\nconst STRIP_COMPONENTS = \"1\";\nconst VERSION_PATTERN = /^[\\w.+-]+$/;\n\nconst binaryFilename = (arch: DeployArchName): string => `native.linux-${arch}-gnu.node`;\nconst platformStem = (arch: DeployArchName): string => `native-linux-${arch}-gnu`;\nconst platformPackage = (arch: DeployArchName): string => `@gtkx/${platformStem(arch)}`;\n\nconst withoutTrailingSlash = (value: string): string => {\n let end = value.length;\n\n while (end > 0 && value[end - 1] === \"/\") {\n end -= 1;\n }\n\n return value.slice(0, end);\n};\n\nconst registryUrl = (): string => {\n const configured = process.env.npm_config_registry;\n\n return withoutTrailingSlash(configured !== undefined && configured.length > 0 ? configured : DEFAULT_REGISTRY);\n};\n\nconst projectRequireFor = (root: string): ProjectRequire => createRequire(join(root, \"package.json\"));\n\nconst localBinary = (projectRequire: ProjectRequire, arch: DeployArchName): string | null => {\n const nativeRoot = dirname(projectRequire.resolve(NATIVE_MANIFEST));\n const candidate = join(nativeRoot, binaryFilename(arch));\n\n return existsSync(candidate) ? candidate : null;\n};\n\nconst installedBinary = (projectRequire: ProjectRequire, arch: DeployArchName): string | null => {\n try {\n return projectRequire.resolve(platformPackage(arch));\n } catch {\n return null;\n }\n};\n\nconst manifestVersion = (manifest: unknown): string | null => {\n if (typeof manifest !== \"object\" || manifest === null || !(\"version\" in manifest)) {\n return null;\n }\n\n const version = manifest.version;\n\n return typeof version === \"string\" && VERSION_PATTERN.test(version) ? version : null;\n};\n\nconst nativeVersion = (projectRequire: ProjectRequire): string => {\n const parsed: unknown = JSON.parse(readFileSync(projectRequire.resolve(NATIVE_MANIFEST), \"utf8\"));\n const version = manifestVersion(parsed);\n\n if (version === null) {\n throw new Error(\"Cannot read a usable version from @gtkx/native; is it installed?\");\n }\n\n return version;\n};\n\nconst hexFromIntegrity = (integrity: unknown, subject: string): string => {\n if (typeof integrity !== \"string\" || !integrity.startsWith(SRI_PREFIX)) {\n throw new Error(`The npm registry publishes no sha512 integrity for ${subject}`);\n }\n\n return Buffer.from(integrity.slice(SRI_PREFIX.length), \"base64\").toString(\"hex\");\n};\n\nconst fetchVersionDocument = async (url: string, subject: string): Promise<Record<string, unknown>> => {\n const response = await fetch(url, { signal: AbortSignal.timeout(REQUEST_TIMEOUT) });\n\n if (!response.ok) {\n throw new Error(\n `Cannot fetch ${subject}: HTTP ${String(response.status)} ${response.statusText}. ` +\n `Install ${subject} directly, or drop that architecture from --arch.`,\n );\n }\n\n const document: unknown = await response.json();\n\n if (typeof document !== \"object\" || document === null) {\n throw new Error(`The npm registry returned no metadata for ${subject}`);\n }\n\n return document as Record<string, unknown>;\n};\n\nconst publishedTarball = async (arch: DeployArchName, version: string): Promise<Tarball> => {\n const registry = registryUrl();\n const subject = `${platformPackage(arch)}@${version}`;\n const url = `${registry}/${encodeURIComponent(platformPackage(arch))}/${version}`;\n const document = await fetchVersionDocument(url, subject);\n const dist: unknown = document.dist;\n\n if (typeof dist !== \"object\" || dist === null) {\n throw new Error(`The npm registry returned no tarball for ${subject}`);\n }\n\n const entry = dist as Record<string, unknown>;\n const tarball = entry.tarball;\n\n if (typeof tarball !== \"string\" || new URL(tarball).origin !== new URL(registry).origin) {\n throw new Error(`The npm registry returned an unusable tarball URL for ${subject}`);\n }\n\n return { url: tarball, digest: hexFromIntegrity(entry.integrity, subject) };\n};\n\nconst extractAddon = (archive: string, dir: string, arch: DeployArchName): void => {\n runCliTool({\n tool: \"tar\",\n args: [\"-xzf\", archive, \"-C\", dir, \"--strip-components\", STRIP_COMPONENTS,\n `${PACKAGE_ROOT}/${binaryFilename(arch)}`],\n target: platformPackage(arch),\n });\n};\n\nconst cachedTarballUrl = (arch: DeployArchName, version: string): string =>\n `${registryUrl()}/${platformPackage(arch)}/-/${platformStem(arch)}-${version}.tgz`;\n\nconst tarballFor = async (arch: DeployArchName, version: string, sidecar: string): Promise<Tarball> => {\n const cached = readCachedDigest(sidecar, \"sha512\");\n\n if (cached !== undefined) {\n return { url: cachedTarballUrl(arch, version), digest: cached };\n }\n\n const published = await publishedTarball(arch, version);\n writeAtomically(sidecar, published.digest);\n\n return published;\n};\n\nconst downloadedBinary = async (arch: DeployArchName, version: string): Promise<string> => {\n const dir = cacheDir([\"native\", `${version}-linux-${arch}`]);\n const archive = join(dir, `${platformStem(arch)}-${version}.tgz`);\n const tarball = await tarballFor(arch, version, `${archive}.sha512`);\n\n await downloadFile({\n url: tarball.url,\n dest: archive,\n label: `${platformPackage(arch)} ${version}`,\n digest: tarball.digest,\n algorithm: \"sha512\",\n });\n\n extractAddon(archive, dir, arch);\n\n return join(dir, binaryFilename(arch));\n};\n\nconst resolveStagedAddon = async (settings: DeploySettings): Promise<string | null> => {\n const arch = settings.arch.node;\n\n if (isHostArch(arch)) {\n return null;\n }\n\n const projectRequire = projectRequireFor(settings.paths.root);\n const resolved = localBinary(projectRequire, arch) ?? installedBinary(projectRequire, arch);\n\n return resolved ?? await downloadedBinary(arch, nativeVersion(projectRequire));\n};\n\nexport { BINDING_FILENAME, resolveStagedAddon };\n"]}
@@ -31,8 +31,8 @@ const downloadNode = async (version, arch, destDir) => {
31
31
  url: `${DIST_BASE_URL}/v${version}/${assetName}`,
32
32
  dest: join(dir, assetName),
33
33
  label: `Node.js ${version} for linux-${arch}`,
34
- sha256: await cachedDigest(request),
35
- freshSha256: () => publishedDigest(request),
34
+ digest: await cachedDigest(request),
35
+ freshDigest: () => publishedDigest(request),
36
36
  });
37
37
  mkdirSync(destDir, { recursive: true });
38
38
  extractNode(archive, destDir, version, arch);
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAOhD,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE,CAAC,SAAS,OAAO,UAAU,IAAI,EAAE,CAAC;AAEhG,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,SAAiB,EAAE,GAAW,EAAiB,EAAE,CAAC,CAAC;IACvF,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,cAAc,EAAE;IACrD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,SAAS,CAAC;IACtC,SAAS;IACT,OAAO,EAAE,WAAW,OAAO,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAE,IAAY,EAAQ,EAAE;IACtF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE3C,UAAU,CAAC;QACP,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,gBAAgB;YACrE,GAAG,OAAO,IAAI,SAAS,EAAE,EAAE,GAAG,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChE,MAAM,EAAE,WAAW,OAAO,EAAE;KAC/B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,OAAe,EAA2B,EAAE;IACnG,MAAM,SAAS,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,SAAS,EAAE;QAChD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QAC1B,KAAK,EAAE,WAAW,OAAO,cAAc,IAAI,EAAE;QAC7C,MAAM,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC;QACnC,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;KAC9C,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { DigestRequest } from \"../download.js\";\nimport { runCliTool } from \"../../internal/run-cli-tool.js\";\nimport { cachedDigest, cacheDir, downloadFile, publishedDigest } from \"../download.js\";\nimport { LICENSE_FILENAME } from \"./license.js\";\n\ntype DownloadedNode = {\n path: string;\n licenseFile: string;\n};\n\nconst DIST_BASE_URL = \"https://nodejs.org/dist\";\nconst STRIP_COMPONENTS = \"1\";\nconst CHECKSUMS_FILE = \"SHASUMS256.txt\";\nconst NODE_PATH = \"bin/node\";\n\nconst releaseName = (version: string, arch: string): string => `node-v${version}-linux-${arch}`;\n\nconst digestRequest = (version: string, assetName: string, dir: string): DigestRequest => ({\n url: `${DIST_BASE_URL}/v${version}/${CHECKSUMS_FILE}`,\n dest: join(dir, `${assetName}.sha256`),\n assetName,\n subject: `Node.js ${version}`,\n});\n\nconst extractNode = (archive: string, dir: string, version: string, arch: string): void => {\n const release = releaseName(version, arch);\n\n runCliTool({\n tool: \"tar\",\n args: [\"-xJf\", archive, \"-C\", dir, \"--strip-components\", STRIP_COMPONENTS,\n `${release}/${NODE_PATH}`, `${release}/${LICENSE_FILENAME}`],\n target: `Node.js ${version}`,\n });\n};\n\nconst downloadNode = async (version: string, arch: string, destDir: string): Promise<DownloadedNode> => {\n const assetName = `${releaseName(version, arch)}.tar.xz`;\n const dir = cacheDir([\"node\", `${version}-linux-${arch}`]);\n const request = digestRequest(version, assetName, dir);\n\n const archive = await downloadFile({\n url: `${DIST_BASE_URL}/v${version}/${assetName}`,\n dest: join(dir, assetName),\n label: `Node.js ${version} for linux-${arch}`,\n sha256: await cachedDigest(request),\n freshSha256: () => publishedDigest(request),\n });\n\n mkdirSync(destDir, { recursive: true });\n extractNode(archive, destDir, version, arch);\n\n return { path: join(destDir, NODE_PATH), licenseFile: join(destDir, LICENSE_FILENAME) };\n};\n\nexport { downloadNode };\n"]}
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAOhD,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE,CAAC,SAAS,OAAO,UAAU,IAAI,EAAE,CAAC;AAEhG,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,SAAiB,EAAE,GAAW,EAAiB,EAAE,CAAC,CAAC;IACvF,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,cAAc,EAAE;IACrD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,SAAS,CAAC;IACtC,SAAS;IACT,OAAO,EAAE,WAAW,OAAO,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAE,IAAY,EAAQ,EAAE;IACtF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE3C,UAAU,CAAC;QACP,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,gBAAgB;YACrE,GAAG,OAAO,IAAI,SAAS,EAAE,EAAE,GAAG,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChE,MAAM,EAAE,WAAW,OAAO,EAAE;KAC/B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,OAAe,EAA2B,EAAE;IACnG,MAAM,SAAS,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,SAAS,EAAE;QAChD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QAC1B,KAAK,EAAE,WAAW,OAAO,cAAc,IAAI,EAAE;QAC7C,MAAM,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC;QACnC,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;KAC9C,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { DigestRequest } from \"../download.js\";\nimport { runCliTool } from \"../../internal/run-cli-tool.js\";\nimport { cachedDigest, cacheDir, downloadFile, publishedDigest } from \"../download.js\";\nimport { LICENSE_FILENAME } from \"./license.js\";\n\ntype DownloadedNode = {\n path: string;\n licenseFile: string;\n};\n\nconst DIST_BASE_URL = \"https://nodejs.org/dist\";\nconst STRIP_COMPONENTS = \"1\";\nconst CHECKSUMS_FILE = \"SHASUMS256.txt\";\nconst NODE_PATH = \"bin/node\";\n\nconst releaseName = (version: string, arch: string): string => `node-v${version}-linux-${arch}`;\n\nconst digestRequest = (version: string, assetName: string, dir: string): DigestRequest => ({\n url: `${DIST_BASE_URL}/v${version}/${CHECKSUMS_FILE}`,\n dest: join(dir, `${assetName}.sha256`),\n assetName,\n subject: `Node.js ${version}`,\n});\n\nconst extractNode = (archive: string, dir: string, version: string, arch: string): void => {\n const release = releaseName(version, arch);\n\n runCliTool({\n tool: \"tar\",\n args: [\"-xJf\", archive, \"-C\", dir, \"--strip-components\", STRIP_COMPONENTS,\n `${release}/${NODE_PATH}`, `${release}/${LICENSE_FILENAME}`],\n target: `Node.js ${version}`,\n });\n};\n\nconst downloadNode = async (version: string, arch: string, destDir: string): Promise<DownloadedNode> => {\n const assetName = `${releaseName(version, arch)}.tar.xz`;\n const dir = cacheDir([\"node\", `${version}-linux-${arch}`]);\n const request = digestRequest(version, assetName, dir);\n\n const archive = await downloadFile({\n url: `${DIST_BASE_URL}/v${version}/${assetName}`,\n dest: join(dir, assetName),\n label: `Node.js ${version} for linux-${arch}`,\n digest: await cachedDigest(request),\n freshDigest: () => publishedDigest(request),\n });\n\n mkdirSync(destDir, { recursive: true });\n extractNode(archive, destDir, version, arch);\n\n return { path: join(destDir, NODE_PATH), licenseFile: join(destDir, LICENSE_FILENAME) };\n};\n\nexport { downloadNode };\n"]}
@@ -1,8 +1,10 @@
1
1
  type ElfInfo = {
2
+ machine: number;
2
3
  needed: string[];
3
4
  glibcMinimum: string | null;
4
5
  };
5
6
  declare const readElfInfo: (path: string) => ElfInfo;
7
+ declare const readOptionalElfInfo: (path: string) => ElfInfo | null;
6
8
  declare const glibcMinimumForFiles: (paths: Iterable<string>) => string | null;
7
- export { type ElfInfo, glibcMinimumForFiles, readElfInfo };
9
+ export { type ElfInfo, glibcMinimumForFiles, readElfInfo, readOptionalElfInfo };
8
10
  //# sourceMappingURL=elf.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"elf.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/elf.ts"],"names":[],"mappings":"AAQA,KAAK,OAAO,GAAG;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAwIF,QAAA,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAAkD,CAAC;AAqBvF,QAAA,MAAM,oBAAoB,GAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAG,MAAM,GAAG,IAYhE,CAAC;AAEF,OAAO,EAAE,KAAK,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"elf.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/elf.ts"],"names":[],"mappings":"AAQA,KAAK,OAAO,GAAG;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AA0IF,QAAA,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAAkD,CAAC;AASvF,QAAA,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,OAAO,GAAG,IAUrD,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAI,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAG,MAAM,GAAG,IAYhE,CAAC;AAEF,OAAO,EAAE,KAAK,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC"}
@@ -5,6 +5,7 @@ const CLASS_64 = 2;
5
5
  const LITTLE_ENDIAN = 1;
6
6
  const OFFSET_CLASS = 4;
7
7
  const OFFSET_DATA = 5;
8
+ const OFFSET_MACHINE = 0x12;
8
9
  const OFFSET_SECTION_HEADERS = 0x28;
9
10
  const OFFSET_SECTION_ENTRY_SIZE = 0x3A;
10
11
  const OFFSET_SECTION_COUNT = 0x3C;
@@ -93,6 +94,7 @@ const readElfBuffer = (buffer, path) => {
93
94
  const sections = readSections(buffer);
94
95
  const strings = stringTable(buffer, sectionFor(sections, ".dynstr"));
95
96
  return {
97
+ machine: buffer.readUInt16LE(OFFSET_MACHINE),
96
98
  needed: readNeeded(buffer, sectionFor(sections, ".dynamic"), strings),
97
99
  glibcMinimum: readGlibcMinimum(strings),
98
100
  };
@@ -123,5 +125,5 @@ const glibcMinimumForFiles = (paths) => {
123
125
  }
124
126
  return formatVersion(highestVersion(versions));
125
127
  };
126
- export { glibcMinimumForFiles, readElfInfo };
128
+ export { glibcMinimumForFiles, readElfInfo, readOptionalElfInfo };
127
129
  //# sourceMappingURL=elf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"elf.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/elf.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, openSync, readFileSync, readSync } from \"node:fs\";\n\ntype ElfSection = {\n name: string;\n offset: number;\n size: number;\n};\n\ntype ElfInfo = {\n needed: string[];\n glibcMinimum: string | null;\n};\n\ntype DynamicEntry = {\n tag: number;\n value: number;\n};\n\nconst ELF_MAGIC = \"ELF\";\nconst ELF_MAGIC_SIZE = 4;\nconst CLASS_64 = 2;\nconst LITTLE_ENDIAN = 1;\nconst OFFSET_CLASS = 4;\nconst OFFSET_DATA = 5;\nconst OFFSET_SECTION_HEADERS = 0x28;\nconst OFFSET_SECTION_ENTRY_SIZE = 0x3A;\nconst OFFSET_SECTION_COUNT = 0x3C;\nconst OFFSET_SECTION_NAME_INDEX = 0x3E;\nconst SECTION_NAME = 0;\nconst SECTION_OFFSET = 24;\nconst SECTION_SIZE = 32;\nconst DYNAMIC_ENTRY_SIZE = 16;\nconst DT_NULL = 0;\nconst DT_NEEDED = 1;\nconst DYNAMIC_VALUE_OFFSET = 8;\nconst GLIBC_VERSION = /GLIBC_(\\d+)\\.(\\d+)/g;\nconst VERSION_RADIX = 1000;\n\nconst hasElfMagic = (buffer: Buffer): boolean =>\n buffer.length >= OFFSET_CLASS && buffer.subarray(0, 4).toString(\"latin1\") === ELF_MAGIC;\n\nconst assertElf64 = (buffer: Buffer, path: string): void => {\n if (buffer.length < OFFSET_SECTION_NAME_INDEX || !hasElfMagic(buffer)) {\n throw new Error(`Cannot read ${path}: it is not an ELF binary`);\n }\n\n if (buffer.readUInt8(OFFSET_CLASS) !== CLASS_64 || buffer.readUInt8(OFFSET_DATA) !== LITTLE_ENDIAN) {\n throw new Error(`Cannot read ${path}: only little-endian 64-bit ELF binaries are supported`);\n }\n};\n\nconst readCString = (buffer: Buffer, start: number): string => {\n const end = buffer.indexOf(0, start);\n\n return buffer.subarray(start, end === -1 ? buffer.length : end).toString(\"latin1\");\n};\n\nconst readSection = (buffer: Buffer, base: number, names: Buffer): ElfSection => ({\n name: readCString(names, buffer.readUInt32LE(base + SECTION_NAME)),\n offset: Number(buffer.readBigUInt64LE(base + SECTION_OFFSET)),\n size: Number(buffer.readBigUInt64LE(base + SECTION_SIZE)),\n});\n\nconst readSections = (buffer: Buffer): ElfSection[] => {\n const headers = Number(buffer.readBigUInt64LE(OFFSET_SECTION_HEADERS));\n const entrySize = buffer.readUInt16LE(OFFSET_SECTION_ENTRY_SIZE);\n const count = buffer.readUInt16LE(OFFSET_SECTION_COUNT);\n const nameIndex = buffer.readUInt16LE(OFFSET_SECTION_NAME_INDEX);\n const nameBase = headers + nameIndex * entrySize;\n const nameOffset = Number(buffer.readBigUInt64LE(nameBase + SECTION_OFFSET));\n const nameSize = Number(buffer.readBigUInt64LE(nameBase + SECTION_SIZE));\n const names = buffer.subarray(nameOffset, nameOffset + nameSize);\n\n return Array.from({ length: count }, (_, index) => readSection(buffer, headers + index * entrySize, names));\n};\n\nconst sectionFor = (sections: ElfSection[], name: string): ElfSection | undefined =>\n sections.find((section) => section.name === name);\n\nconst readDynamicEntries = (buffer: Buffer, dynamic: ElfSection): DynamicEntry[] => {\n const entries: DynamicEntry[] = [];\n\n for (let cursor = 0; cursor + DYNAMIC_ENTRY_SIZE <= dynamic.size; cursor += DYNAMIC_ENTRY_SIZE) {\n const base = dynamic.offset + cursor;\n const tag = Number(buffer.readBigUInt64LE(base));\n\n if (tag === DT_NULL) {\n break;\n }\n\n entries.push({ tag, value: Number(buffer.readBigUInt64LE(base + DYNAMIC_VALUE_OFFSET)) });\n }\n\n return entries;\n};\n\nconst readNeeded = (buffer: Buffer, dynamic: ElfSection | undefined, strings: Buffer): string[] => {\n if (dynamic === undefined) {\n return [];\n }\n\n return readDynamicEntries(buffer, dynamic)\n .filter((entry) => entry.tag === DT_NEEDED)\n .map((entry) => readCString(strings, entry.value));\n};\n\nconst getRank = (version: number[]): number => (version[0] ?? 0) * VERSION_RADIX + (version[1] ?? 0);\n\nconst highestVersion = (versions: number[][]): number[] | null => {\n let highest: number[] | null = null;\n\n for (const version of versions) {\n if (highest === null || getRank(version) > getRank(highest)) {\n highest = version;\n }\n }\n\n return highest;\n};\n\nconst formatVersion = (version: number[] | null): string | null =>\n version === null ? null : `${String(version[0] ?? 0)}.${String(version[1] ?? 0)}`;\n\nconst readGlibcMinimum = (strings: Buffer): string | null => {\n const found = strings\n .toString(\"latin1\")\n .matchAll(GLIBC_VERSION)\n .map((match) => [Number(match[1]), Number(match[2])])\n .toArray();\n\n return formatVersion(highestVersion(found));\n};\n\nconst stringTable = (buffer: Buffer, dynstr: ElfSection | undefined): Buffer =>\n dynstr === undefined ? Buffer.alloc(0) : buffer.subarray(dynstr.offset, dynstr.offset + dynstr.size);\n\nconst readElfBuffer = (buffer: Buffer, path: string): ElfInfo => {\n assertElf64(buffer, path);\n const sections = readSections(buffer);\n const strings = stringTable(buffer, sectionFor(sections, \".dynstr\"));\n\n return {\n needed: readNeeded(buffer, sectionFor(sections, \".dynamic\"), strings),\n glibcMinimum: readGlibcMinimum(strings),\n };\n};\n\nconst readElfInfo = (path: string): ElfInfo => readElfBuffer(readFileSync(path), path);\n\nconst readFilePrefix = (descriptor: number, size: number): Buffer => {\n const buffer = Buffer.alloc(size);\n const bytesRead = readSync(descriptor, buffer, 0, size, 0);\n\n return buffer.subarray(0, bytesRead);\n};\n\nconst readOptionalElfInfo = (path: string): ElfInfo | null => {\n const descriptor = openSync(path, \"r\");\n\n try {\n const prefix = readFilePrefix(descriptor, ELF_MAGIC_SIZE);\n\n return hasElfMagic(prefix) ? readElfBuffer(readFileSync(descriptor), path) : null;\n } finally {\n closeSync(descriptor);\n }\n};\n\nconst glibcMinimumForFiles = (paths: Iterable<string>): string | null => {\n const versions: number[][] = [];\n\n for (const path of paths) {\n const minimum = readOptionalElfInfo(path)?.glibcMinimum;\n\n if (minimum !== undefined && minimum !== null) {\n versions.push(minimum.split(\".\").map(Number));\n }\n }\n\n return formatVersion(highestVersion(versions));\n};\n\nexport { type ElfInfo, glibcMinimumForFiles, readElfInfo };\n"]}
1
+ {"version":3,"file":"elf.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/elf.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, openSync, readFileSync, readSync } from \"node:fs\";\n\ntype ElfSection = {\n name: string;\n offset: number;\n size: number;\n};\n\ntype ElfInfo = {\n machine: number;\n needed: string[];\n glibcMinimum: string | null;\n};\n\ntype DynamicEntry = {\n tag: number;\n value: number;\n};\n\nconst ELF_MAGIC = \"ELF\";\nconst ELF_MAGIC_SIZE = 4;\nconst CLASS_64 = 2;\nconst LITTLE_ENDIAN = 1;\nconst OFFSET_CLASS = 4;\nconst OFFSET_DATA = 5;\nconst OFFSET_MACHINE = 0x12;\nconst OFFSET_SECTION_HEADERS = 0x28;\nconst OFFSET_SECTION_ENTRY_SIZE = 0x3A;\nconst OFFSET_SECTION_COUNT = 0x3C;\nconst OFFSET_SECTION_NAME_INDEX = 0x3E;\nconst SECTION_NAME = 0;\nconst SECTION_OFFSET = 24;\nconst SECTION_SIZE = 32;\nconst DYNAMIC_ENTRY_SIZE = 16;\nconst DT_NULL = 0;\nconst DT_NEEDED = 1;\nconst DYNAMIC_VALUE_OFFSET = 8;\nconst GLIBC_VERSION = /GLIBC_(\\d+)\\.(\\d+)/g;\nconst VERSION_RADIX = 1000;\n\nconst hasElfMagic = (buffer: Buffer): boolean =>\n buffer.length >= OFFSET_CLASS && buffer.subarray(0, 4).toString(\"latin1\") === ELF_MAGIC;\n\nconst assertElf64 = (buffer: Buffer, path: string): void => {\n if (buffer.length < OFFSET_SECTION_NAME_INDEX || !hasElfMagic(buffer)) {\n throw new Error(`Cannot read ${path}: it is not an ELF binary`);\n }\n\n if (buffer.readUInt8(OFFSET_CLASS) !== CLASS_64 || buffer.readUInt8(OFFSET_DATA) !== LITTLE_ENDIAN) {\n throw new Error(`Cannot read ${path}: only little-endian 64-bit ELF binaries are supported`);\n }\n};\n\nconst readCString = (buffer: Buffer, start: number): string => {\n const end = buffer.indexOf(0, start);\n\n return buffer.subarray(start, end === -1 ? buffer.length : end).toString(\"latin1\");\n};\n\nconst readSection = (buffer: Buffer, base: number, names: Buffer): ElfSection => ({\n name: readCString(names, buffer.readUInt32LE(base + SECTION_NAME)),\n offset: Number(buffer.readBigUInt64LE(base + SECTION_OFFSET)),\n size: Number(buffer.readBigUInt64LE(base + SECTION_SIZE)),\n});\n\nconst readSections = (buffer: Buffer): ElfSection[] => {\n const headers = Number(buffer.readBigUInt64LE(OFFSET_SECTION_HEADERS));\n const entrySize = buffer.readUInt16LE(OFFSET_SECTION_ENTRY_SIZE);\n const count = buffer.readUInt16LE(OFFSET_SECTION_COUNT);\n const nameIndex = buffer.readUInt16LE(OFFSET_SECTION_NAME_INDEX);\n const nameBase = headers + nameIndex * entrySize;\n const nameOffset = Number(buffer.readBigUInt64LE(nameBase + SECTION_OFFSET));\n const nameSize = Number(buffer.readBigUInt64LE(nameBase + SECTION_SIZE));\n const names = buffer.subarray(nameOffset, nameOffset + nameSize);\n\n return Array.from({ length: count }, (_, index) => readSection(buffer, headers + index * entrySize, names));\n};\n\nconst sectionFor = (sections: ElfSection[], name: string): ElfSection | undefined =>\n sections.find((section) => section.name === name);\n\nconst readDynamicEntries = (buffer: Buffer, dynamic: ElfSection): DynamicEntry[] => {\n const entries: DynamicEntry[] = [];\n\n for (let cursor = 0; cursor + DYNAMIC_ENTRY_SIZE <= dynamic.size; cursor += DYNAMIC_ENTRY_SIZE) {\n const base = dynamic.offset + cursor;\n const tag = Number(buffer.readBigUInt64LE(base));\n\n if (tag === DT_NULL) {\n break;\n }\n\n entries.push({ tag, value: Number(buffer.readBigUInt64LE(base + DYNAMIC_VALUE_OFFSET)) });\n }\n\n return entries;\n};\n\nconst readNeeded = (buffer: Buffer, dynamic: ElfSection | undefined, strings: Buffer): string[] => {\n if (dynamic === undefined) {\n return [];\n }\n\n return readDynamicEntries(buffer, dynamic)\n .filter((entry) => entry.tag === DT_NEEDED)\n .map((entry) => readCString(strings, entry.value));\n};\n\nconst getRank = (version: number[]): number => (version[0] ?? 0) * VERSION_RADIX + (version[1] ?? 0);\n\nconst highestVersion = (versions: number[][]): number[] | null => {\n let highest: number[] | null = null;\n\n for (const version of versions) {\n if (highest === null || getRank(version) > getRank(highest)) {\n highest = version;\n }\n }\n\n return highest;\n};\n\nconst formatVersion = (version: number[] | null): string | null =>\n version === null ? null : `${String(version[0] ?? 0)}.${String(version[1] ?? 0)}`;\n\nconst readGlibcMinimum = (strings: Buffer): string | null => {\n const found = strings\n .toString(\"latin1\")\n .matchAll(GLIBC_VERSION)\n .map((match) => [Number(match[1]), Number(match[2])])\n .toArray();\n\n return formatVersion(highestVersion(found));\n};\n\nconst stringTable = (buffer: Buffer, dynstr: ElfSection | undefined): Buffer =>\n dynstr === undefined ? Buffer.alloc(0) : buffer.subarray(dynstr.offset, dynstr.offset + dynstr.size);\n\nconst readElfBuffer = (buffer: Buffer, path: string): ElfInfo => {\n assertElf64(buffer, path);\n const sections = readSections(buffer);\n const strings = stringTable(buffer, sectionFor(sections, \".dynstr\"));\n\n return {\n machine: buffer.readUInt16LE(OFFSET_MACHINE),\n needed: readNeeded(buffer, sectionFor(sections, \".dynamic\"), strings),\n glibcMinimum: readGlibcMinimum(strings),\n };\n};\n\nconst readElfInfo = (path: string): ElfInfo => readElfBuffer(readFileSync(path), path);\n\nconst readFilePrefix = (descriptor: number, size: number): Buffer => {\n const buffer = Buffer.alloc(size);\n const bytesRead = readSync(descriptor, buffer, 0, size, 0);\n\n return buffer.subarray(0, bytesRead);\n};\n\nconst readOptionalElfInfo = (path: string): ElfInfo | null => {\n const descriptor = openSync(path, \"r\");\n\n try {\n const prefix = readFilePrefix(descriptor, ELF_MAGIC_SIZE);\n\n return hasElfMagic(prefix) ? readElfBuffer(readFileSync(descriptor), path) : null;\n } finally {\n closeSync(descriptor);\n }\n};\n\nconst glibcMinimumForFiles = (paths: Iterable<string>): string | null => {\n const versions: number[][] = [];\n\n for (const path of paths) {\n const minimum = readOptionalElfInfo(path)?.glibcMinimum;\n\n if (minimum !== undefined && minimum !== null) {\n versions.push(minimum.split(\".\").map(Number));\n }\n }\n\n return formatVersion(highestVersion(versions));\n};\n\nexport { type ElfInfo, glibcMinimumForFiles, readElfInfo, readOptionalElfInfo };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+F/D,QAAA,MAAM,aAAa,GAAI,UAAU,cAAc,KAAG,MAajD,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,UAAU,cAAc,KAAG,MAatD,CAAC;AA6CF,QAAA,MAAM,kBAAkB,GAAU,UAAU,cAAc,KAAG,OAAO,CAAC,WAAW,CAW/E,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAgB,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgG7E,QAAA,MAAM,aAAa,GAAI,UAAU,cAAc,KAAG,MAajD,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,UAAU,cAAc,KAAG,MAatD,CAAC;AAgEF,QAAA,MAAM,kBAAkB,GAAU,UAAU,cAAc,KAAG,OAAO,CAAC,WAAW,CAW/E,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { MINIMUM_NODE_VERSION } from "@gtkx/config/internal";
2
- import { info, tryResolveExecutable } from "@gtkx/utils";
2
+ import { info, tryResolveExecutable, warn } from "@gtkx/utils";
3
3
  import { execFileSync } from "node:child_process";
4
4
  import { chmodSync, copyFileSync, mkdirSync, statSync } from "node:fs";
5
5
  import { join, resolve } from "node:path";
6
6
  import { runCliTool } from "../../internal/run-cli-tool.js";
7
+ import { elfMachineFor, hostArchName } from "../settings/arch.js";
7
8
  import { downloadNode } from "./download.js";
8
9
  import { readElfInfo } from "./elf.js";
9
10
  import { assertPortableNode } from "./guard.js";
@@ -117,13 +118,24 @@ const stageFromSource = async (settings, version, source) => {
117
118
  assertPortableNode(readElfInfo(sourcePath), source);
118
119
  return { path: stageNode(settings, sourcePath), licenseFile: licenseBesideNode(sourcePath) };
119
120
  };
121
+ const shouldStripRuntime = (settings, node, elf) => {
122
+ if (node.shouldStrip === false) {
123
+ return false;
124
+ }
125
+ if (elf.machine === elfMachineFor(hostArchName())) {
126
+ return true;
127
+ }
128
+ warn(`Skipping \`strip\` on the bundled Node.js: it was built for ${settings.arch.node} and \`strip\` reads ` +
129
+ `only ${hostArchName()}. The ${settings.arch.node} packages carry an unstripped runtime.`);
130
+ return false;
131
+ };
120
132
  const resolveNodeRuntime = async (settings) => {
121
133
  const node = settings.deploy.node ?? {};
122
134
  const source = nodeSourceFor(settings);
123
135
  const version = resolveNodeVersion(settings);
124
136
  const staged = await stageFromSource(settings, version, source);
125
- const isStripped = node.shouldStrip === false ? false : didStripBinary(staged.path);
126
137
  const elf = readElfInfo(staged.path);
138
+ const isStripped = shouldStripRuntime(settings, node, elf) && didStripBinary(staged.path);
127
139
  const glibcMinimum = elf.glibcMinimum ?? "unknown";
128
140
  info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, runtime glibc >= ${glibcMinimum})`);
129
141
  return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { MINIMUM_NODE_VERSION } from \"@gtkx/config/internal\";\nimport { info, tryResolveExecutable } from \"@gtkx/utils\";\nimport { execFileSync } from \"node:child_process\";\nimport { chmodSync, copyFileSync, mkdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { DeploySettings, NodeRuntime } from \"../types.js\";\nimport { runCliTool } from \"../../internal/run-cli-tool.js\";\nimport { downloadNode } from \"./download.js\";\nimport { readElfInfo } from \"./elf.js\";\nimport { assertPortableNode } from \"./guard.js\";\nimport { licenseBesideNode } from \"./license.js\";\n\ntype StagedRuntime = {\n path: string;\n licenseFile: string | null;\n};\n\ntype NodeSource = \"download\" | \"host\" | \"path\";\n\nconst BYTES_PER_MIB = 1024 * 1024;\nconst EXECUTABLE_MODE = 0o755;\nconst NODE_FILENAME = \"node\";\nconst NODE_VERSION_PATTERN = /^v?(\\d+)\\.(\\d+)\\.(\\d+)$/;\nconst VERSION_PROBE_TIMEOUT_MS = 10_000;\nconst VERSION_PROBE_MAX_BUFFER = 1024;\n\nconst nodeSourceFor = (settings: DeploySettings): NodeSource => settings.deploy.node?.source ?? \"download\";\n\nconst parseNodeVersion = (value: string, subject: string): { parts: number[]; version: string } => {\n const match = NODE_VERSION_PATTERN.exec(value.trim());\n\n if (match === null) {\n throw new Error(`Cannot determine the Node.js version for ${subject}: expected a version such as 26.7.0`);\n }\n\n const parts = match.slice(1).map(Number);\n\n return { parts, version: parts.map(String).join(\".\") };\n};\n\nconst compareVersions = (left: number[], right: number[]): number => {\n for (let index = 0; index < Math.max(left.length, right.length); index += 1) {\n const difference = (left[index] ?? 0) - (right[index] ?? 0);\n\n if (difference !== 0) {\n return difference;\n }\n }\n\n return 0;\n};\n\nconst supportedNodeVersion = (value: string, subject: string): string => {\n const parsed = parseNodeVersion(value, subject);\n const minimum = parseNodeVersion(MINIMUM_NODE_VERSION, \"GTKX\");\n\n if (compareVersions(parsed.parts, minimum.parts) < 0) {\n throw new Error(\n `Cannot bundle Node.js ${parsed.version} for ${subject}: GTKX requires ${MINIMUM_NODE_VERSION} or newer`,\n );\n }\n\n return parsed.version;\n};\n\nconst probeNodeVersion = (path: string): string => {\n try {\n const output = execFileSync(path, [\"--version\"], {\n encoding: \"utf8\",\n env: { ...process.env, NODE_OPTIONS: \"\" },\n maxBuffer: VERSION_PROBE_MAX_BUFFER,\n timeout: VERSION_PROBE_TIMEOUT_MS,\n });\n\n return supportedNodeVersion(output, path);\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Cannot bundle Node.js\")) {\n throw error;\n }\n\n throw new Error(`Cannot determine the Node.js version from ${path}`, { cause: error });\n }\n};\n\nconst assertExpectedVersion = (configured: string | undefined, actual: string, source: NodeSource): string => {\n if (configured === undefined) {\n return actual;\n }\n\n const expected = parseNodeVersion(configured, `deploy.node.source: \"${source}\"`).version;\n\n if (expected !== actual) {\n throw new Error(\n `The Node.js runtime from deploy.node.source \"${source}\" is ${actual}, not the configured ${expected}`,\n );\n }\n\n return actual;\n};\n\nconst sourcePathFor = (settings: DeploySettings): string => {\n const node = settings.deploy.node ?? {};\n const source = nodeSourceFor(settings);\n\n if (source === \"host\") {\n return process.execPath;\n }\n\n if (node.path === undefined) {\n throw new Error('Cannot resolve the Node.js runtime: `deploy.node.source: \"path\"` needs `deploy.node.path`');\n }\n\n return resolve(settings.paths.root, node.path);\n};\n\nconst resolveNodeVersion = (settings: DeploySettings): string => {\n const node = settings.deploy.node ?? {};\n const source = nodeSourceFor(settings);\n\n if (source === \"download\") {\n return supportedNodeVersion(node.version ?? MINIMUM_NODE_VERSION, 'deploy.node.source: \"download\"');\n }\n\n const actual = source === \"host\"\n ? supportedNodeVersion(process.versions.node, 'deploy.node.source: \"host\"')\n : probeNodeVersion(sourcePathFor(settings));\n\n return assertExpectedVersion(node.version, actual, source);\n};\n\nconst didStripBinary = (path: string): boolean => {\n if (tryResolveExecutable(\"strip\") === undefined) {\n return false;\n }\n\n runCliTool({ tool: \"strip\", args: [\"--strip-unneeded\", path], target: \"the bundled Node.js\" });\n\n return true;\n};\n\nconst megabytes = (path: string): string => (statSync(path).size / BYTES_PER_MIB).toFixed(1);\n\nconst stageNode = (settings: DeploySettings, sourcePath: string): string => {\n mkdirSync(settings.paths.runtime, { recursive: true });\n const staged = join(settings.paths.runtime, NODE_FILENAME);\n copyFileSync(sourcePath, staged);\n chmodSync(staged, EXECUTABLE_MODE);\n\n return staged;\n};\n\nconst stageDownloadedNode = async (settings: DeploySettings, version: string): Promise<StagedRuntime> => {\n const downloaded = await downloadNode(version, settings.arch.node, settings.paths.runtime);\n chmodSync(downloaded.path, EXECUTABLE_MODE);\n\n return downloaded;\n};\n\nconst stageFromSource = async (\n settings: DeploySettings,\n version: string,\n source: NodeSource,\n): Promise<StagedRuntime> => {\n if (source === \"download\") {\n return stageDownloadedNode(settings, version);\n }\n\n const sourcePath = sourcePathFor(settings);\n assertPortableNode(readElfInfo(sourcePath), source);\n\n return { path: stageNode(settings, sourcePath), licenseFile: licenseBesideNode(sourcePath) };\n};\n\nconst resolveNodeRuntime = async (settings: DeploySettings): Promise<NodeRuntime> => {\n const node = settings.deploy.node ?? {};\n const source = nodeSourceFor(settings);\n const version = resolveNodeVersion(settings);\n const staged = await stageFromSource(settings, version, source);\n const isStripped = node.shouldStrip === false ? false : didStripBinary(staged.path);\n const elf = readElfInfo(staged.path);\n const glibcMinimum = elf.glibcMinimum ?? \"unknown\";\n info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, runtime glibc >= ${glibcMinimum})`);\n\n return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };\n};\n\nexport { resolveNodeRuntime, resolveNodeVersion, sourcePathFor };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAgB,WAAW,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AASjD,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAClC,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AACvD,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAc,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,UAAU,CAAC;AAE3G,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,OAAe,EAAwC,EAAE;IAC9F,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,qCAAqC,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAc,EAAE,KAAe,EAAU,EAAE;IAChE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1E,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5D,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,UAAU,CAAC;QACtB,CAAC;IACL,CAAC;IAED,OAAO,CAAC,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,OAAe,EAAU,EAAE;IACpE,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAE/D,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACX,yBAAyB,MAAM,CAAC,OAAO,QAAQ,OAAO,mBAAmB,oBAAoB,WAAW,CAC3G,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE;IAC9C,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE;YAC7C,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;YACzC,SAAS,EAAE,wBAAwB;YACnC,OAAO,EAAE,wBAAwB;SACpC,CAAC,CAAC;QAEH,OAAO,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC9E,MAAM,KAAK,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,UAA8B,EAAE,MAAc,EAAE,MAAkB,EAAU,EAAE;IACzG,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,EAAE,wBAAwB,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;IAEzF,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACX,gDAAgD,MAAM,QAAQ,MAAM,wBAAwB,QAAQ,EAAE,CACzG,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAU,EAAE;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,QAAwB,EAAU,EAAE;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,IAAI,oBAAoB,EAAE,gCAAgC,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,MAAM;QAC5B,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;QAC3E,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEhD,OAAO,qBAAqB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAW,EAAE;IAC7C,IAAI,oBAAoB,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAE/F,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7F,MAAM,SAAS,GAAG,CAAC,QAAwB,EAAE,UAAkB,EAAU,EAAE;IACvE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3D,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,QAAwB,EAAE,OAAe,EAA0B,EAAE;IACpG,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3F,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAE5C,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EACzB,QAAwB,EACxB,OAAe,EACf,MAAkB,EACI,EAAE;IACxB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAEpD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;AACjG,CAAC,CAAC;AAIF,MAAM,kBAAkB,GAAG,CAAC,QAAwB,EAAE,IAAsB,EAAE,GAAY,EAAW,EAAE;IACnG,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,CACA,+DAA+D,QAAQ,CAAC,IAAI,CAAC,IAAI,uBAAuB;QACxG,QAAQ,YAAY,EAAE,SAAS,QAAQ,CAAC,IAAI,CAAC,IAAI,wCAAwC,CAC5F,CAAC;IAEF,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAwB,EAAwB,EAAE;IAChF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1F,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC;IACnD,IAAI,CAAC,oBAAoB,OAAO,KAAK,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,YAAY,GAAG,CAAC,CAAC;IAEtG,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;AAC9E,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC","sourcesContent":["import { MINIMUM_NODE_VERSION } from \"@gtkx/config/internal\";\nimport { info, tryResolveExecutable, warn } from \"@gtkx/utils\";\nimport { execFileSync } from \"node:child_process\";\nimport { chmodSync, copyFileSync, mkdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { DeployConfig, DeploySettings, NodeRuntime } from \"../types.js\";\nimport { runCliTool } from \"../../internal/run-cli-tool.js\";\nimport { elfMachineFor, hostArchName } from \"../settings/arch.js\";\nimport { downloadNode } from \"./download.js\";\nimport { type ElfInfo, readElfInfo } from \"./elf.js\";\nimport { assertPortableNode } from \"./guard.js\";\nimport { licenseBesideNode } from \"./license.js\";\n\ntype StagedRuntime = {\n path: string;\n licenseFile: string | null;\n};\n\ntype NodeSource = \"download\" | \"host\" | \"path\";\n\nconst BYTES_PER_MIB = 1024 * 1024;\nconst EXECUTABLE_MODE = 0o755;\nconst NODE_FILENAME = \"node\";\nconst NODE_VERSION_PATTERN = /^v?(\\d+)\\.(\\d+)\\.(\\d+)$/;\nconst VERSION_PROBE_TIMEOUT_MS = 10_000;\nconst VERSION_PROBE_MAX_BUFFER = 1024;\n\nconst nodeSourceFor = (settings: DeploySettings): NodeSource => settings.deploy.node?.source ?? \"download\";\n\nconst parseNodeVersion = (value: string, subject: string): { parts: number[]; version: string } => {\n const match = NODE_VERSION_PATTERN.exec(value.trim());\n\n if (match === null) {\n throw new Error(`Cannot determine the Node.js version for ${subject}: expected a version such as 26.7.0`);\n }\n\n const parts = match.slice(1).map(Number);\n\n return { parts, version: parts.map(String).join(\".\") };\n};\n\nconst compareVersions = (left: number[], right: number[]): number => {\n for (let index = 0; index < Math.max(left.length, right.length); index += 1) {\n const difference = (left[index] ?? 0) - (right[index] ?? 0);\n\n if (difference !== 0) {\n return difference;\n }\n }\n\n return 0;\n};\n\nconst supportedNodeVersion = (value: string, subject: string): string => {\n const parsed = parseNodeVersion(value, subject);\n const minimum = parseNodeVersion(MINIMUM_NODE_VERSION, \"GTKX\");\n\n if (compareVersions(parsed.parts, minimum.parts) < 0) {\n throw new Error(\n `Cannot bundle Node.js ${parsed.version} for ${subject}: GTKX requires ${MINIMUM_NODE_VERSION} or newer`,\n );\n }\n\n return parsed.version;\n};\n\nconst probeNodeVersion = (path: string): string => {\n try {\n const output = execFileSync(path, [\"--version\"], {\n encoding: \"utf8\",\n env: { ...process.env, NODE_OPTIONS: \"\" },\n maxBuffer: VERSION_PROBE_MAX_BUFFER,\n timeout: VERSION_PROBE_TIMEOUT_MS,\n });\n\n return supportedNodeVersion(output, path);\n } catch (error) {\n if (error instanceof Error && error.message.startsWith(\"Cannot bundle Node.js\")) {\n throw error;\n }\n\n throw new Error(`Cannot determine the Node.js version from ${path}`, { cause: error });\n }\n};\n\nconst assertExpectedVersion = (configured: string | undefined, actual: string, source: NodeSource): string => {\n if (configured === undefined) {\n return actual;\n }\n\n const expected = parseNodeVersion(configured, `deploy.node.source: \"${source}\"`).version;\n\n if (expected !== actual) {\n throw new Error(\n `The Node.js runtime from deploy.node.source \"${source}\" is ${actual}, not the configured ${expected}`,\n );\n }\n\n return actual;\n};\n\nconst sourcePathFor = (settings: DeploySettings): string => {\n const node = settings.deploy.node ?? {};\n const source = nodeSourceFor(settings);\n\n if (source === \"host\") {\n return process.execPath;\n }\n\n if (node.path === undefined) {\n throw new Error('Cannot resolve the Node.js runtime: `deploy.node.source: \"path\"` needs `deploy.node.path`');\n }\n\n return resolve(settings.paths.root, node.path);\n};\n\nconst resolveNodeVersion = (settings: DeploySettings): string => {\n const node = settings.deploy.node ?? {};\n const source = nodeSourceFor(settings);\n\n if (source === \"download\") {\n return supportedNodeVersion(node.version ?? MINIMUM_NODE_VERSION, 'deploy.node.source: \"download\"');\n }\n\n const actual = source === \"host\"\n ? supportedNodeVersion(process.versions.node, 'deploy.node.source: \"host\"')\n : probeNodeVersion(sourcePathFor(settings));\n\n return assertExpectedVersion(node.version, actual, source);\n};\n\nconst didStripBinary = (path: string): boolean => {\n if (tryResolveExecutable(\"strip\") === undefined) {\n return false;\n }\n\n runCliTool({ tool: \"strip\", args: [\"--strip-unneeded\", path], target: \"the bundled Node.js\" });\n\n return true;\n};\n\nconst megabytes = (path: string): string => (statSync(path).size / BYTES_PER_MIB).toFixed(1);\n\nconst stageNode = (settings: DeploySettings, sourcePath: string): string => {\n mkdirSync(settings.paths.runtime, { recursive: true });\n const staged = join(settings.paths.runtime, NODE_FILENAME);\n copyFileSync(sourcePath, staged);\n chmodSync(staged, EXECUTABLE_MODE);\n\n return staged;\n};\n\nconst stageDownloadedNode = async (settings: DeploySettings, version: string): Promise<StagedRuntime> => {\n const downloaded = await downloadNode(version, settings.arch.node, settings.paths.runtime);\n chmodSync(downloaded.path, EXECUTABLE_MODE);\n\n return downloaded;\n};\n\nconst stageFromSource = async (\n settings: DeploySettings,\n version: string,\n source: NodeSource,\n): Promise<StagedRuntime> => {\n if (source === \"download\") {\n return stageDownloadedNode(settings, version);\n }\n\n const sourcePath = sourcePathFor(settings);\n assertPortableNode(readElfInfo(sourcePath), source);\n\n return { path: stageNode(settings, sourcePath), licenseFile: licenseBesideNode(sourcePath) };\n};\n\ntype DeployNodeConfig = NonNullable<DeployConfig[\"node\"]>;\n\nconst shouldStripRuntime = (settings: DeploySettings, node: DeployNodeConfig, elf: ElfInfo): boolean => {\n if (node.shouldStrip === false) {\n return false;\n }\n\n if (elf.machine === elfMachineFor(hostArchName())) {\n return true;\n }\n\n warn(\n `Skipping \\`strip\\` on the bundled Node.js: it was built for ${settings.arch.node} and \\`strip\\` reads ` +\n `only ${hostArchName()}. The ${settings.arch.node} packages carry an unstripped runtime.`,\n );\n\n return false;\n};\n\nconst resolveNodeRuntime = async (settings: DeploySettings): Promise<NodeRuntime> => {\n const node = settings.deploy.node ?? {};\n const source = nodeSourceFor(settings);\n const version = resolveNodeVersion(settings);\n const staged = await stageFromSource(settings, version, source);\n const elf = readElfInfo(staged.path);\n const isStripped = shouldStripRuntime(settings, node, elf) && didStripBinary(staged.path);\n const glibcMinimum = elf.glibcMinimum ?? \"unknown\";\n info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, runtime glibc >= ${glibcMinimum})`);\n\n return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };\n};\n\nexport { resolveNodeRuntime, resolveNodeVersion, sourcePathFor };\n"]}
@@ -2,6 +2,7 @@ import type { DeploySettings, DeployTargetName, NodeRuntime, NoticeSection, Stag
2
2
  type StageRequest = {
3
3
  settings: DeploySettings;
4
4
  node: NodeRuntime | null;
5
+ addon: string | null;
5
6
  metadata: StagedMetadata;
6
7
  };
7
8
  type StagedMetadata = {
@@ -13,7 +14,7 @@ declare const NOTICES_FILENAME = "THIRD-PARTY-NOTICES";
13
14
  declare const licenseDestination: (settings: DeploySettings) => string;
14
15
  declare const noticesDestination: (settings: DeploySettings) => string;
15
16
  declare const nodeLicenseDestination: (settings: DeploySettings) => string;
16
- declare const stagePayload: ({ settings, node, metadata }: StageRequest) => StagedFile[];
17
+ declare const stagePayload: ({ settings, node, addon, metadata }: StageRequest) => StagedFile[];
17
18
  declare const stageOverlays: (settings: DeploySettings, notices: NoticeSection[], metadata: StagedMetadata) => Record<DeployTargetName, StagedFile[]>;
18
19
  export { licenseDestination, nodeLicenseDestination, NOTICES_FILENAME, noticesDestination, type StagedMetadata, stageOverlays, stagePayload, };
19
20
  //# sourceMappingURL=stage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/deploy/payload/stage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAa5G,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAGF,QAAA,MAAM,gBAAgB,wBAAwB,CAAC;AAmB/C,QAAA,MAAM,kBAAkB,GAAI,UAAU,cAAc,KAAG,MAA8C,CAAC;AACtG,QAAA,MAAM,kBAAkB,GAAI,UAAU,cAAc,KAAG,MAA0D,CAAC;AAIlH,QAAA,MAAM,sBAAsB,GAAI,UAAU,cAAc,KAAG,MACe,CAAC;AAsF3E,QAAA,MAAM,YAAY,GAAI,8BAA8B,YAAY,KAAG,UAAU,EAc5E,CAAC;AA0DF,QAAA,MAAM,aAAa,GACf,UAAU,cAAc,EACxB,SAAS,aAAa,EAAE,EACxB,UAAU,cAAc,KACzB,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,CAKtC,CAAC;AAEH,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,cAAc,EACnB,aAAa,EACb,YAAY,GACf,CAAC"}
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/deploy/payload/stage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgB5G,KAAK,YAAY,GAAG;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAGF,QAAA,MAAM,gBAAgB,wBAAwB,CAAC;AAmB/C,QAAA,MAAM,kBAAkB,GAAI,UAAU,cAAc,KAAG,MAA8C,CAAC;AACtG,QAAA,MAAM,kBAAkB,GAAI,UAAU,cAAc,KAAG,MAA0D,CAAC;AAIlH,QAAA,MAAM,sBAAsB,GAAI,UAAU,cAAc,KAAG,MACe,CAAC;AA6G3E,QAAA,MAAM,YAAY,GAAI,qCAAqC,YAAY,KAAG,UAAU,EAmBnF,CAAC;AA0DF,QAAA,MAAM,aAAa,GACf,UAAU,cAAc,EACxB,SAAS,aAAa,EAAE,EACxB,UAAU,cAAc,KACzB,MAAM,CAAC,gBAAgB,EAAE,UAAU,EAAE,CAKtC,CAAC;AAEH,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,cAAc,EACnB,aAAa,EACb,YAAY,GACf,CAAC"}
@@ -7,7 +7,10 @@ import { listFilesRecursive } from "../../internal/list-files.js";
7
7
  import { BUNDLE_FILENAME } from "../../vite-plugins/esm-extension.js";
8
8
  import { renderCopyright } from "../freedesktop/copyright.js";
9
9
  import { renderDbusService } from "../freedesktop/dbus-service.js";
10
+ import { BINDING_FILENAME } from "../native-addon.js";
11
+ import { readOptionalElfInfo } from "../node-runtime/elf.js";
10
12
  import { renderNotices } from "../notices/render.js";
13
+ import { elfMachineFor } from "../settings/arch.js";
11
14
  import { copyInto, EXECUTABLE_MODE, executableModeFor, writeInto } from "./copy-tree.js";
12
15
  import { stageIcons } from "./icons.js";
13
16
  import { NODE_FILENAME, renderLauncher } from "./launcher.js";
@@ -44,6 +47,20 @@ const stageRuntimeFiles = (settings, root) => {
44
47
  .filter((file) => !isIconAsset(file.rel) && file.rel !== BUILD_MANIFEST_FILENAME && !isLocaleAsset(file.rel))
45
48
  .map((file) => copyInto(root, join(libDirFor(settings), file.rel), file.absPath));
46
49
  };
50
+ const stageAddon = (settings, root, addon) => addon === null ? [] : [copyInto(root, join(libDirFor(settings), BINDING_FILENAME), addon)];
51
+ const architectureMismatch = (settings, file) => new Error(`Cannot deploy ${file.rel} for ${settings.arch.node}: it was built for another architecture. ` +
52
+ "Run `gtkx build` again, or drop --skip-build.");
53
+ const assertStagedArchitecture = (settings, staged) => {
54
+ const expected = elfMachineFor(settings.arch.node);
55
+ const lib = libDirFor(settings);
56
+ const checked = new Set([join(lib, BINDING_FILENAME), join(lib, NODE_FILENAME)]);
57
+ const binaries = staged.filter((entry) => checked.has(entry.rel));
58
+ for (const file of binaries) {
59
+ if (readOptionalElfInfo(file.abs)?.machine !== expected) {
60
+ throw architectureMismatch(settings, file);
61
+ }
62
+ }
63
+ };
47
64
  const stageCatalogs = (settings, root) => listFilesRecursive(join(settings.paths.dist, LOCALE_DIRNAME))
48
65
  .map((file) => copyInto(root, join(SHARE_LOCALE, file.rel), file.absPath));
49
66
  const stageNodeBinary = (settings, root, node) => node === null ? [] : [copyInto(root, join(libDirFor(settings), NODE_FILENAME), node.path, EXECUTABLE_MODE)];
@@ -86,19 +103,22 @@ const byRelativePath = (files) => {
86
103
  }
87
104
  return sortStringsBy(latest.values(), (file) => file.rel);
88
105
  };
89
- const stagePayload = ({ settings, node, metadata }) => {
106
+ const stagePayload = ({ settings, node, addon, metadata }) => {
90
107
  const root = settings.paths.stage;
91
108
  rmSync(root, { recursive: true, force: true, maxRetries: 5 });
92
- return byRelativePath([
109
+ const staged = byRelativePath([
93
110
  writeInto(root, join("bin", settings.binaryName), renderLauncher(settings), EXECUTABLE_MODE),
94
111
  ...stageNodeBinary(settings, root, node),
95
112
  ...stageRuntimeFiles(settings, root),
113
+ ...stageAddon(settings, root, addon),
96
114
  ...stageCatalogs(settings, root),
97
115
  ...stageExtraFiles(settings, root, metadata),
98
116
  ...stageMetadata(settings, root, metadata),
99
117
  ...stageIcons(settings, root),
100
118
  ...stageSchemas(settings, root),
101
119
  ]);
120
+ assertStagedArchitecture(settings, staged);
121
+ return staged;
102
122
  };
103
123
  const withoutDbusActivation = (desktopEntry) => desktopEntry
104
124
  .split("\n")
@@ -1 +1 @@
1
- {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/deploy/payload/stage.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStringsBy, warn } from \"@gtkx/utils\";\nimport { existsSync, rmSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { DeploySettings, DeployTargetName, NodeRuntime, NoticeSection, StagedFile } from \"../types.js\";\nimport { LOCALE_DIRNAME } from \"../../i18n/catalogs.js\";\nimport { BUILD_MANIFEST_FILENAME } from \"../../internal/build-manifest.js\";\nimport { listFilesRecursive } from \"../../internal/list-files.js\";\nimport { BUNDLE_FILENAME } from \"../../vite-plugins/esm-extension.js\";\nimport { renderCopyright } from \"../freedesktop/copyright.js\";\nimport { renderDbusService } from \"../freedesktop/dbus-service.js\";\nimport { renderNotices } from \"../notices/render.js\";\nimport { copyInto, EXECUTABLE_MODE, executableModeFor, writeInto } from \"./copy-tree.js\";\nimport { stageIcons } from \"./icons.js\";\nimport { NODE_FILENAME, renderLauncher } from \"./launcher.js\";\nimport { stageSchemas } from \"./schemas.js\";\n\ntype StageRequest = {\n settings: DeploySettings;\n node: NodeRuntime | null;\n metadata: StagedMetadata;\n};\n\ntype StagedMetadata = {\n desktopEntry: string;\n metainfo: string;\n mimePackage: string | null;\n};\n\nconst DIST_ICONS_DIR = \"icons\";\nconst NOTICES_FILENAME = \"THIRD-PARTY-NOTICES\";\nconst NODE_LICENSE_FILENAME = \"LICENSE\";\nconst SHARE_APPLICATIONS = \"share/applications\";\nconst SHARE_METAINFO = \"share/metainfo\";\nconst SHARE_MIME_PACKAGES = \"share/mime/packages\";\nconst SHARE_DOC = \"share/doc\";\nconst SHARE_LICENSES = \"share/licenses\";\nconst SHARE_DBUS_SERVICES = \"share/dbus-1/services\";\nconst SHARE_LOCALE = `share/${LOCALE_DIRNAME}`;\n\nconst PREFIX_FOR: Record<DeployTargetName, string> = {\n appimage: \"/usr\",\n deb: \"/usr\",\n flatpak: \"/app\",\n rpm: \"/usr\",\n};\n\nconst libDirFor = (settings: DeploySettings): string => `lib/${settings.binaryName}`;\nconst licenseDirFor = (settings: DeploySettings): string => `${SHARE_LICENSES}/${settings.binaryName}`;\nconst licenseDestination = (settings: DeploySettings): string => `${licenseDirFor(settings)}/LICENSE`;\nconst noticesDestination = (settings: DeploySettings): string => `${licenseDirFor(settings)}/${NOTICES_FILENAME}`;\nconst isIconAsset = (rel: string): boolean => rel === DIST_ICONS_DIR || rel.startsWith(`${DIST_ICONS_DIR}/`);\nconst isLocaleAsset = (rel: string): boolean => rel === LOCALE_DIRNAME || rel.startsWith(`${LOCALE_DIRNAME}/`);\n\nconst nodeLicenseDestination = (settings: DeploySettings): string =>\n `${licenseDirFor(settings)}/${NODE_FILENAME}/${NODE_LICENSE_FILENAME}`;\n\nconst stageRuntimeFiles = (settings: DeploySettings, root: string): StagedFile[] => {\n const dist = settings.paths.dist;\n\n if (!existsSync(join(dist, BUNDLE_FILENAME))) {\n throw new Error(`Cannot deploy: ${join(dist, BUNDLE_FILENAME)} is missing. Run \\`gtkx build\\` first.`);\n }\n\n return listFilesRecursive(dist)\n .filter((file) =>\n !isIconAsset(file.rel) && file.rel !== BUILD_MANIFEST_FILENAME && !isLocaleAsset(file.rel))\n .map((file) => copyInto(root, join(libDirFor(settings), file.rel), file.absPath));\n};\n\nconst stageCatalogs = (settings: DeploySettings, root: string): StagedFile[] =>\n listFilesRecursive(join(settings.paths.dist, LOCALE_DIRNAME))\n .map((file) => copyInto(root, join(SHARE_LOCALE, file.rel), file.absPath));\n\nconst stageNodeBinary = (settings: DeploySettings, root: string, node: NodeRuntime | null): StagedFile[] =>\n node === null ? [] : [copyInto(root, join(libDirFor(settings), NODE_FILENAME), node.path, EXECUTABLE_MODE)];\n\nconst stageMetadata = (settings: DeploySettings, root: string, metadata: StagedMetadata): StagedFile[] => [\n writeInto(root, join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`), metadata.desktopEntry),\n writeInto(root, join(SHARE_METAINFO, `${settings.applicationId}.metainfo.xml`), metadata.metainfo),\n ...(metadata.mimePackage === null\n ? []\n : [writeInto(root, join(SHARE_MIME_PACKAGES, `${settings.applicationId}.xml`), metadata.mimePackage)]),\n];\n\nconst generatedMetadataKind = (\n settings: DeploySettings,\n metadata: StagedMetadata,\n destination: string,\n): string | null => {\n if (destination === join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`)) {\n return \"desktop entry\";\n }\n\n if (destination === join(SHARE_METAINFO, `${settings.applicationId}.metainfo.xml`)) {\n return \"metainfo\";\n }\n\n if (\n metadata.mimePackage !== null &&\n destination === join(SHARE_MIME_PACKAGES, `${settings.applicationId}.xml`)\n ) {\n return \"MIME package\";\n }\n\n return null;\n};\n\nconst warnMetadataCollision = (\n settings: DeploySettings,\n metadata: StagedMetadata,\n file: DeploySettings[\"extraFiles\"][number],\n): void => {\n const kind = generatedMetadataKind(settings, metadata, file.destination);\n\n if (kind !== null) {\n warn(\n `extraFiles source \"${file.source}\" targeting \"${file.destination}\" is overridden by the ` +\n `GTKX-generated ${kind}`,\n );\n }\n};\n\nconst stageExtraFiles = (settings: DeploySettings, root: string, metadata: StagedMetadata): StagedFile[] =>\n settings.extraFiles.map((file) => {\n const source = resolve(settings.paths.root, file.source);\n warnMetadataCollision(settings, metadata, file);\n\n return copyInto(root, file.destination, source, file.mode ?? executableModeFor(source));\n });\n\nconst byRelativePath = (files: StagedFile[]): StagedFile[] => {\n const latest: Map<string, StagedFile> = new Map();\n\n for (const file of files) {\n latest.set(file.rel, file);\n }\n\n return sortStringsBy(latest.values(), (file) => file.rel);\n};\n\nconst stagePayload = ({ settings, node, metadata }: StageRequest): StagedFile[] => {\n const root = settings.paths.stage;\n rmSync(root, { recursive: true, force: true, maxRetries: 5 });\n\n return byRelativePath([\n writeInto(root, join(\"bin\", settings.binaryName), renderLauncher(settings), EXECUTABLE_MODE),\n ...stageNodeBinary(settings, root, node),\n ...stageRuntimeFiles(settings, root),\n ...stageCatalogs(settings, root),\n ...stageExtraFiles(settings, root, metadata),\n ...stageMetadata(settings, root, metadata),\n ...stageIcons(settings, root),\n ...stageSchemas(settings, root),\n ]);\n};\n\nconst withoutDbusActivation = (desktopEntry: string): string =>\n desktopEntry\n .split(\"\\n\")\n .filter((line) => line !== \"DBusActivatable=true\")\n .join(\"\\n\");\n\nconst stageActivation = (\n settings: DeploySettings,\n root: string,\n target: DeployTargetName,\n metadata: StagedMetadata,\n): StagedFile[] => {\n if (!settings.isDbusActivatable) {\n return [];\n }\n\n if (target === \"appimage\") {\n return [writeInto(\n root,\n join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`),\n withoutDbusActivation(metadata.desktopEntry),\n )];\n }\n\n return [writeInto(\n root,\n join(SHARE_DBUS_SERVICES, `${settings.applicationId}.service`),\n renderDbusService(settings, PREFIX_FOR[target]),\n )];\n};\n\nconst stageOverlay = (\n settings: DeploySettings,\n target: DeployTargetName,\n notices: NoticeSection[],\n metadata: StagedMetadata,\n): StagedFile[] => {\n const root = join(settings.paths.overlay, target);\n rmSync(root, { recursive: true, force: true, maxRetries: 5 });\n const licenseFile = settings.paths.licenseFile;\n const activation = stageActivation(settings, root, target, metadata);\n\n if (target === \"deb\") {\n return [\n ...activation,\n writeInto(root, join(SHARE_DOC, settings.binaryName, \"copyright\"), renderCopyright(settings, notices)),\n ];\n }\n\n return [\n ...activation,\n ...(licenseFile === null ? [] : [copyInto(root, licenseDestination(settings), licenseFile)]),\n writeInto(root, noticesDestination(settings), renderNotices(settings, notices)),\n ];\n};\n\nconst stageOverlays = (\n settings: DeploySettings,\n notices: NoticeSection[],\n metadata: StagedMetadata,\n): Record<DeployTargetName, StagedFile[]> => ({\n appimage: stageOverlay(settings, \"appimage\", notices, metadata),\n deb: stageOverlay(settings, \"deb\", notices, metadata),\n flatpak: stageOverlay(settings, \"flatpak\", notices, metadata),\n rpm: stageOverlay(settings, \"rpm\", notices, metadata),\n});\n\nexport {\n licenseDestination,\n nodeLicenseDestination,\n NOTICES_FILENAME,\n noticesDestination,\n type StagedMetadata,\n stageOverlays,\n stagePayload,\n};\n"]}
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/deploy/payload/stage.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStringsBy, warn } from \"@gtkx/utils\";\nimport { existsSync, rmSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport type { DeploySettings, DeployTargetName, NodeRuntime, NoticeSection, StagedFile } from \"../types.js\";\nimport { LOCALE_DIRNAME } from \"../../i18n/catalogs.js\";\nimport { BUILD_MANIFEST_FILENAME } from \"../../internal/build-manifest.js\";\nimport { listFilesRecursive } from \"../../internal/list-files.js\";\nimport { BUNDLE_FILENAME } from \"../../vite-plugins/esm-extension.js\";\nimport { renderCopyright } from \"../freedesktop/copyright.js\";\nimport { renderDbusService } from \"../freedesktop/dbus-service.js\";\nimport { BINDING_FILENAME } from \"../native-addon.js\";\nimport { readOptionalElfInfo } from \"../node-runtime/elf.js\";\nimport { renderNotices } from \"../notices/render.js\";\nimport { elfMachineFor } from \"../settings/arch.js\";\nimport { copyInto, EXECUTABLE_MODE, executableModeFor, writeInto } from \"./copy-tree.js\";\nimport { stageIcons } from \"./icons.js\";\nimport { NODE_FILENAME, renderLauncher } from \"./launcher.js\";\nimport { stageSchemas } from \"./schemas.js\";\n\ntype StageRequest = {\n settings: DeploySettings;\n node: NodeRuntime | null;\n addon: string | null;\n metadata: StagedMetadata;\n};\n\ntype StagedMetadata = {\n desktopEntry: string;\n metainfo: string;\n mimePackage: string | null;\n};\n\nconst DIST_ICONS_DIR = \"icons\";\nconst NOTICES_FILENAME = \"THIRD-PARTY-NOTICES\";\nconst NODE_LICENSE_FILENAME = \"LICENSE\";\nconst SHARE_APPLICATIONS = \"share/applications\";\nconst SHARE_METAINFO = \"share/metainfo\";\nconst SHARE_MIME_PACKAGES = \"share/mime/packages\";\nconst SHARE_DOC = \"share/doc\";\nconst SHARE_LICENSES = \"share/licenses\";\nconst SHARE_DBUS_SERVICES = \"share/dbus-1/services\";\nconst SHARE_LOCALE = `share/${LOCALE_DIRNAME}`;\n\nconst PREFIX_FOR: Record<DeployTargetName, string> = {\n appimage: \"/usr\",\n deb: \"/usr\",\n flatpak: \"/app\",\n rpm: \"/usr\",\n};\n\nconst libDirFor = (settings: DeploySettings): string => `lib/${settings.binaryName}`;\nconst licenseDirFor = (settings: DeploySettings): string => `${SHARE_LICENSES}/${settings.binaryName}`;\nconst licenseDestination = (settings: DeploySettings): string => `${licenseDirFor(settings)}/LICENSE`;\nconst noticesDestination = (settings: DeploySettings): string => `${licenseDirFor(settings)}/${NOTICES_FILENAME}`;\nconst isIconAsset = (rel: string): boolean => rel === DIST_ICONS_DIR || rel.startsWith(`${DIST_ICONS_DIR}/`);\nconst isLocaleAsset = (rel: string): boolean => rel === LOCALE_DIRNAME || rel.startsWith(`${LOCALE_DIRNAME}/`);\n\nconst nodeLicenseDestination = (settings: DeploySettings): string =>\n `${licenseDirFor(settings)}/${NODE_FILENAME}/${NODE_LICENSE_FILENAME}`;\n\nconst stageRuntimeFiles = (settings: DeploySettings, root: string): StagedFile[] => {\n const dist = settings.paths.dist;\n\n if (!existsSync(join(dist, BUNDLE_FILENAME))) {\n throw new Error(`Cannot deploy: ${join(dist, BUNDLE_FILENAME)} is missing. Run \\`gtkx build\\` first.`);\n }\n\n return listFilesRecursive(dist)\n .filter((file) =>\n !isIconAsset(file.rel) && file.rel !== BUILD_MANIFEST_FILENAME && !isLocaleAsset(file.rel))\n .map((file) => copyInto(root, join(libDirFor(settings), file.rel), file.absPath));\n};\n\nconst stageAddon = (settings: DeploySettings, root: string, addon: string | null): StagedFile[] =>\n addon === null ? [] : [copyInto(root, join(libDirFor(settings), BINDING_FILENAME), addon)];\n\nconst architectureMismatch = (settings: DeploySettings, file: StagedFile): Error =>\n new Error(\n `Cannot deploy ${file.rel} for ${settings.arch.node}: it was built for another architecture. ` +\n \"Run `gtkx build` again, or drop --skip-build.\",\n );\n\nconst assertStagedArchitecture = (settings: DeploySettings, staged: StagedFile[]): void => {\n const expected = elfMachineFor(settings.arch.node);\n const lib = libDirFor(settings);\n const checked = new Set([join(lib, BINDING_FILENAME), join(lib, NODE_FILENAME)]);\n\n const binaries = staged.filter((entry) => checked.has(entry.rel));\n\n for (const file of binaries) {\n if (readOptionalElfInfo(file.abs)?.machine !== expected) {\n throw architectureMismatch(settings, file);\n }\n }\n};\n\nconst stageCatalogs = (settings: DeploySettings, root: string): StagedFile[] =>\n listFilesRecursive(join(settings.paths.dist, LOCALE_DIRNAME))\n .map((file) => copyInto(root, join(SHARE_LOCALE, file.rel), file.absPath));\n\nconst stageNodeBinary = (settings: DeploySettings, root: string, node: NodeRuntime | null): StagedFile[] =>\n node === null ? [] : [copyInto(root, join(libDirFor(settings), NODE_FILENAME), node.path, EXECUTABLE_MODE)];\n\nconst stageMetadata = (settings: DeploySettings, root: string, metadata: StagedMetadata): StagedFile[] => [\n writeInto(root, join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`), metadata.desktopEntry),\n writeInto(root, join(SHARE_METAINFO, `${settings.applicationId}.metainfo.xml`), metadata.metainfo),\n ...(metadata.mimePackage === null\n ? []\n : [writeInto(root, join(SHARE_MIME_PACKAGES, `${settings.applicationId}.xml`), metadata.mimePackage)]),\n];\n\nconst generatedMetadataKind = (\n settings: DeploySettings,\n metadata: StagedMetadata,\n destination: string,\n): string | null => {\n if (destination === join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`)) {\n return \"desktop entry\";\n }\n\n if (destination === join(SHARE_METAINFO, `${settings.applicationId}.metainfo.xml`)) {\n return \"metainfo\";\n }\n\n if (\n metadata.mimePackage !== null &&\n destination === join(SHARE_MIME_PACKAGES, `${settings.applicationId}.xml`)\n ) {\n return \"MIME package\";\n }\n\n return null;\n};\n\nconst warnMetadataCollision = (\n settings: DeploySettings,\n metadata: StagedMetadata,\n file: DeploySettings[\"extraFiles\"][number],\n): void => {\n const kind = generatedMetadataKind(settings, metadata, file.destination);\n\n if (kind !== null) {\n warn(\n `extraFiles source \"${file.source}\" targeting \"${file.destination}\" is overridden by the ` +\n `GTKX-generated ${kind}`,\n );\n }\n};\n\nconst stageExtraFiles = (settings: DeploySettings, root: string, metadata: StagedMetadata): StagedFile[] =>\n settings.extraFiles.map((file) => {\n const source = resolve(settings.paths.root, file.source);\n warnMetadataCollision(settings, metadata, file);\n\n return copyInto(root, file.destination, source, file.mode ?? executableModeFor(source));\n });\n\nconst byRelativePath = (files: StagedFile[]): StagedFile[] => {\n const latest: Map<string, StagedFile> = new Map();\n\n for (const file of files) {\n latest.set(file.rel, file);\n }\n\n return sortStringsBy(latest.values(), (file) => file.rel);\n};\n\nconst stagePayload = ({ settings, node, addon, metadata }: StageRequest): StagedFile[] => {\n const root = settings.paths.stage;\n rmSync(root, { recursive: true, force: true, maxRetries: 5 });\n\n const staged = byRelativePath([\n writeInto(root, join(\"bin\", settings.binaryName), renderLauncher(settings), EXECUTABLE_MODE),\n ...stageNodeBinary(settings, root, node),\n ...stageRuntimeFiles(settings, root),\n ...stageAddon(settings, root, addon),\n ...stageCatalogs(settings, root),\n ...stageExtraFiles(settings, root, metadata),\n ...stageMetadata(settings, root, metadata),\n ...stageIcons(settings, root),\n ...stageSchemas(settings, root),\n ]);\n\n assertStagedArchitecture(settings, staged);\n\n return staged;\n};\n\nconst withoutDbusActivation = (desktopEntry: string): string =>\n desktopEntry\n .split(\"\\n\")\n .filter((line) => line !== \"DBusActivatable=true\")\n .join(\"\\n\");\n\nconst stageActivation = (\n settings: DeploySettings,\n root: string,\n target: DeployTargetName,\n metadata: StagedMetadata,\n): StagedFile[] => {\n if (!settings.isDbusActivatable) {\n return [];\n }\n\n if (target === \"appimage\") {\n return [writeInto(\n root,\n join(SHARE_APPLICATIONS, `${settings.applicationId}.desktop`),\n withoutDbusActivation(metadata.desktopEntry),\n )];\n }\n\n return [writeInto(\n root,\n join(SHARE_DBUS_SERVICES, `${settings.applicationId}.service`),\n renderDbusService(settings, PREFIX_FOR[target]),\n )];\n};\n\nconst stageOverlay = (\n settings: DeploySettings,\n target: DeployTargetName,\n notices: NoticeSection[],\n metadata: StagedMetadata,\n): StagedFile[] => {\n const root = join(settings.paths.overlay, target);\n rmSync(root, { recursive: true, force: true, maxRetries: 5 });\n const licenseFile = settings.paths.licenseFile;\n const activation = stageActivation(settings, root, target, metadata);\n\n if (target === \"deb\") {\n return [\n ...activation,\n writeInto(root, join(SHARE_DOC, settings.binaryName, \"copyright\"), renderCopyright(settings, notices)),\n ];\n }\n\n return [\n ...activation,\n ...(licenseFile === null ? [] : [copyInto(root, licenseDestination(settings), licenseFile)]),\n writeInto(root, noticesDestination(settings), renderNotices(settings, notices)),\n ];\n};\n\nconst stageOverlays = (\n settings: DeploySettings,\n notices: NoticeSection[],\n metadata: StagedMetadata,\n): Record<DeployTargetName, StagedFile[]> => ({\n appimage: stageOverlay(settings, \"appimage\", notices, metadata),\n deb: stageOverlay(settings, \"deb\", notices, metadata),\n flatpak: stageOverlay(settings, \"flatpak\", notices, metadata),\n rpm: stageOverlay(settings, \"rpm\", notices, metadata),\n});\n\nexport {\n licenseDestination,\n nodeLicenseDestination,\n NOTICES_FILENAME,\n noticesDestination,\n type StagedMetadata,\n stageOverlays,\n stagePayload,\n};\n"]}
@@ -3,6 +3,7 @@ type DeployOptions = {
3
3
  cwd: string;
4
4
  configFile?: string | undefined;
5
5
  targets?: string | undefined;
6
+ arches?: string | undefined;
6
7
  outDir?: string | undefined;
7
8
  shouldPrintManifests: boolean;
8
9
  shouldSkipBuild: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"run-deploy.d.ts","sourceRoot":"","sources":["../../src/deploy/run-deploy.ts"],"names":[],"mappings":"AA2DA,KAAK,aAAa,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC;AA2XF,QAAA,MAAM,SAAS,GAAU,SAAS,aAAa,KAAG,OAAO,CAAC,IAAI,CA4C7D,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"run-deploy.d.ts","sourceRoot":"","sources":["../../src/deploy/run-deploy.ts"],"names":[],"mappings":"AA+DA,KAAK,aAAa,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC;AAwfF,QAAA,MAAM,SAAS,GAAU,SAAS,aAAa,KAAG,OAAO,CAAC,IAAI,CAwB7D,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}