@gtkx/cli 2.0.0-beta.1 → 2.0.0-beta.3

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 (238) hide show
  1. package/dist/builder.d.ts +1 -0
  2. package/dist/builder.d.ts.map +1 -1
  3. package/dist/builder.js +17 -5
  4. package/dist/builder.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +9 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/codegen/reference.d.ts.map +1 -1
  10. package/dist/codegen/reference.js +1 -0
  11. package/dist/codegen/reference.js.map +1 -1
  12. package/dist/codegen/run-codegen.d.ts +4 -2
  13. package/dist/codegen/run-codegen.d.ts.map +1 -1
  14. package/dist/codegen/run-codegen.js +15 -16
  15. package/dist/codegen/run-codegen.js.map +1 -1
  16. package/dist/codegen/store-resolver.d.ts +2 -1
  17. package/dist/codegen/store-resolver.d.ts.map +1 -1
  18. package/dist/codegen/store-resolver.js +4 -3
  19. package/dist/codegen/store-resolver.js.map +1 -1
  20. package/dist/commands/build.d.ts +5 -0
  21. package/dist/commands/build.d.ts.map +1 -1
  22. package/dist/commands/build.js +83 -10
  23. package/dist/commands/build.js.map +1 -1
  24. package/dist/commands/codegen.d.ts +1 -0
  25. package/dist/commands/codegen.d.ts.map +1 -1
  26. package/dist/commands/codegen.js +6 -5
  27. package/dist/commands/codegen.js.map +1 -1
  28. package/dist/commands/deploy.d.ts +1 -0
  29. package/dist/commands/deploy.d.ts.map +1 -1
  30. package/dist/commands/deploy.js +4 -2
  31. package/dist/commands/deploy.js.map +1 -1
  32. package/dist/commands/dev.d.ts +9 -0
  33. package/dist/commands/dev.d.ts.map +1 -1
  34. package/dist/commands/dev.js +29 -4
  35. package/dist/commands/dev.js.map +1 -1
  36. package/dist/commands/docs.d.ts.map +1 -1
  37. package/dist/commands/docs.js +1 -0
  38. package/dist/commands/docs.js.map +1 -1
  39. package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
  40. package/dist/deploy/freedesktop/metainfo.js +41 -2
  41. package/dist/deploy/freedesktop/metainfo.js.map +1 -1
  42. package/dist/deploy/freedesktop/validate.d.ts.map +1 -1
  43. package/dist/deploy/freedesktop/validate.js +10 -4
  44. package/dist/deploy/freedesktop/validate.js.map +1 -1
  45. package/dist/deploy/nfpm/config.d.ts +3 -2
  46. package/dist/deploy/nfpm/config.d.ts.map +1 -1
  47. package/dist/deploy/nfpm/config.js +7 -4
  48. package/dist/deploy/nfpm/config.js.map +1 -1
  49. package/dist/deploy/nfpm/contents.d.ts.map +1 -1
  50. package/dist/deploy/nfpm/contents.js +8 -0
  51. package/dist/deploy/nfpm/contents.js.map +1 -1
  52. package/dist/deploy/node-runtime/elf.d.ts +2 -1
  53. package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
  54. package/dist/deploy/node-runtime/elf.js +32 -5
  55. package/dist/deploy/node-runtime/elf.js.map +1 -1
  56. package/dist/deploy/node-runtime/index.d.ts +2 -1
  57. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  58. package/dist/deploy/node-runtime/index.js +75 -5
  59. package/dist/deploy/node-runtime/index.js.map +1 -1
  60. package/dist/deploy/notices/node-runtime.js +2 -2
  61. package/dist/deploy/notices/node-runtime.js.map +1 -1
  62. package/dist/deploy/payload/launcher.d.ts.map +1 -1
  63. package/dist/deploy/payload/launcher.js +14 -1
  64. package/dist/deploy/payload/launcher.js.map +1 -1
  65. package/dist/deploy/payload/stage.js +1 -1
  66. package/dist/deploy/payload/stage.js.map +1 -1
  67. package/dist/deploy/run-deploy.d.ts +1 -0
  68. package/dist/deploy/run-deploy.d.ts.map +1 -1
  69. package/dist/deploy/run-deploy.js +100 -14
  70. package/dist/deploy/run-deploy.js.map +1 -1
  71. package/dist/deploy/settings/build-manifest.d.ts +6 -1
  72. package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
  73. package/dist/deploy/settings/build-manifest.js +15 -4
  74. package/dist/deploy/settings/build-manifest.js.map +1 -1
  75. package/dist/deploy/settings/extra-files.d.ts +1 -1
  76. package/dist/deploy/settings/extra-files.d.ts.map +1 -1
  77. package/dist/deploy/settings/extra-files.js +22 -1
  78. package/dist/deploy/settings/extra-files.js.map +1 -1
  79. package/dist/deploy/settings/index.d.ts +1 -0
  80. package/dist/deploy/settings/index.d.ts.map +1 -1
  81. package/dist/deploy/settings/index.js +2 -1
  82. package/dist/deploy/settings/index.js.map +1 -1
  83. package/dist/deploy/settings/paths.d.ts +2 -1
  84. package/dist/deploy/settings/paths.d.ts.map +1 -1
  85. package/dist/deploy/settings/paths.js +113 -5
  86. package/dist/deploy/settings/paths.js.map +1 -1
  87. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  88. package/dist/deploy/targets/flatpak-source.js +11 -2
  89. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  90. package/dist/deploy/targets/nfpm-target.d.ts.map +1 -1
  91. package/dist/deploy/targets/nfpm-target.js +12 -7
  92. package/dist/deploy/targets/nfpm-target.js.map +1 -1
  93. package/dist/deploy/types.d.ts +1 -0
  94. package/dist/deploy/types.d.ts.map +1 -1
  95. package/dist/deploy/types.js.map +1 -1
  96. package/dist/dev/entry-env.d.ts +2 -1
  97. package/dist/dev/entry-env.d.ts.map +1 -1
  98. package/dist/dev/entry-env.js +2 -1
  99. package/dist/dev/entry-env.js.map +1 -1
  100. package/dist/dev/headless.d.ts +3 -0
  101. package/dist/dev/headless.d.ts.map +1 -0
  102. package/dist/dev/headless.js +35 -0
  103. package/dist/dev/headless.js.map +1 -0
  104. package/dist/dev/runner-deps.d.ts +1 -1
  105. package/dist/dev/runner-deps.d.ts.map +1 -1
  106. package/dist/dev/runner-deps.js +3 -3
  107. package/dist/dev/runner-deps.js.map +1 -1
  108. package/dist/dev/runner-main.d.ts.map +1 -1
  109. package/dist/dev/runner-main.js +8 -3
  110. package/dist/dev/runner-main.js.map +1 -1
  111. package/dist/dev/supervisor.d.ts +1 -0
  112. package/dist/dev/supervisor.d.ts.map +1 -1
  113. package/dist/dev/supervisor.js +4 -3
  114. package/dist/dev/supervisor.js.map +1 -1
  115. package/dist/i18n/catalogs.d.ts.map +1 -1
  116. package/dist/i18n/catalogs.js +1 -0
  117. package/dist/i18n/catalogs.js.map +1 -1
  118. package/dist/i18n/source-messages.d.ts.map +1 -1
  119. package/dist/i18n/source-messages.js +960 -8
  120. package/dist/i18n/source-messages.js.map +1 -1
  121. package/dist/internal/build-manifest.d.ts +5 -2
  122. package/dist/internal/build-manifest.d.ts.map +1 -1
  123. package/dist/internal/build-manifest.js +15 -2
  124. package/dist/internal/build-manifest.js.map +1 -1
  125. package/dist/internal/build-output.d.ts +8 -0
  126. package/dist/internal/build-output.d.ts.map +1 -0
  127. package/dist/internal/build-output.js +79 -0
  128. package/dist/internal/build-output.js.map +1 -0
  129. package/dist/internal/docs-elements.d.ts +1 -0
  130. package/dist/internal/docs-elements.d.ts.map +1 -1
  131. package/dist/internal/docs-elements.js +5 -4
  132. package/dist/internal/docs-elements.js.map +1 -1
  133. package/dist/internal/entry-arg.d.ts +4 -1
  134. package/dist/internal/entry-arg.d.ts.map +1 -1
  135. package/dist/internal/entry-arg.js +7 -1
  136. package/dist/internal/entry-arg.js.map +1 -1
  137. package/dist/internal/errors.d.ts +2 -1
  138. package/dist/internal/errors.d.ts.map +1 -1
  139. package/dist/internal/errors.js +1 -1
  140. package/dist/internal/errors.js.map +1 -1
  141. package/dist/internal/output-directory.d.ts +15 -0
  142. package/dist/internal/output-directory.d.ts.map +1 -0
  143. package/dist/internal/output-directory.js +490 -0
  144. package/dist/internal/output-directory.js.map +1 -0
  145. package/dist/internal/parent-process.d.ts +12 -0
  146. package/dist/internal/parent-process.d.ts.map +1 -0
  147. package/dist/internal/parent-process.js +74 -0
  148. package/dist/internal/parent-process.js.map +1 -0
  149. package/dist/internal/prepare-project.d.ts +2 -0
  150. package/dist/internal/prepare-project.d.ts.map +1 -1
  151. package/dist/internal/prepare-project.js +3 -3
  152. package/dist/internal/prepare-project.js.map +1 -1
  153. package/dist/internal/source-imports.js +1 -1
  154. package/dist/internal/source-imports.js.map +1 -1
  155. package/dist/mcp/client.js +2 -2
  156. package/dist/mcp/client.js.map +1 -1
  157. package/dist/vite-plugins/build-manifest.d.ts +5 -1
  158. package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
  159. package/dist/vite-plugins/build-manifest.js +2 -1
  160. package/dist/vite-plugins/build-manifest.js.map +1 -1
  161. package/dist/vite-plugins/ensure-store.d.ts +1 -1
  162. package/dist/vite-plugins/ensure-store.d.ts.map +1 -1
  163. package/dist/vite-plugins/ensure-store.js +2 -2
  164. package/dist/vite-plugins/ensure-store.js.map +1 -1
  165. package/dist/vite-plugins/i18n.d.ts.map +1 -1
  166. package/dist/vite-plugins/i18n.js +58 -6
  167. package/dist/vite-plugins/i18n.js.map +1 -1
  168. package/dist/vite-plugins/index.d.ts +8 -1
  169. package/dist/vite-plugins/index.d.ts.map +1 -1
  170. package/dist/vite-plugins/index.js +6 -2
  171. package/dist/vite-plugins/index.js.map +1 -1
  172. package/dist/vite-plugins/native.d.ts.map +1 -1
  173. package/dist/vite-plugins/native.js +0 -4
  174. package/dist/vite-plugins/native.js.map +1 -1
  175. package/dist/vite-plugins/self-contained.d.ts.map +1 -1
  176. package/dist/vite-plugins/self-contained.js +159 -158
  177. package/dist/vite-plugins/self-contained.js.map +1 -1
  178. package/dist/vite-plugins/settings-worker-env.d.ts +1 -1
  179. package/dist/vite-plugins/settings-worker-env.d.ts.map +1 -1
  180. package/dist/vite-plugins/settings-worker-env.js +2 -2
  181. package/dist/vite-plugins/settings-worker-env.js.map +1 -1
  182. package/dist/vitest-plugin.d.ts +2 -1
  183. package/dist/vitest-plugin.d.ts.map +1 -1
  184. package/dist/vitest-plugin.js +6 -6
  185. package/dist/vitest-plugin.js.map +1 -1
  186. package/package.json +10 -9
  187. package/src/builder.ts +18 -5
  188. package/src/cli.ts +9 -1
  189. package/src/codegen/reference.ts +1 -0
  190. package/src/codegen/run-codegen.ts +17 -19
  191. package/src/codegen/store-resolver.ts +5 -3
  192. package/src/commands/build.ts +13 -2
  193. package/src/commands/codegen.ts +6 -5
  194. package/src/commands/deploy.ts +4 -2
  195. package/src/commands/dev.ts +38 -4
  196. package/src/commands/docs.ts +1 -0
  197. package/src/deploy/freedesktop/metainfo.ts +73 -21
  198. package/src/deploy/freedesktop/validate.ts +12 -4
  199. package/src/deploy/nfpm/config.ts +13 -4
  200. package/src/deploy/nfpm/contents.ts +8 -0
  201. package/src/deploy/node-runtime/elf.ts +43 -5
  202. package/src/deploy/node-runtime/index.ts +107 -6
  203. package/src/deploy/notices/node-runtime.ts +2 -2
  204. package/src/deploy/payload/launcher.ts +20 -1
  205. package/src/deploy/payload/stage.ts +1 -1
  206. package/src/deploy/run-deploy.ts +56 -16
  207. package/src/deploy/settings/build-manifest.ts +28 -3
  208. package/src/deploy/settings/extra-files.ts +26 -2
  209. package/src/deploy/settings/index.ts +3 -1
  210. package/src/deploy/settings/paths.ts +70 -5
  211. package/src/deploy/targets/flatpak-source.ts +13 -2
  212. package/src/deploy/targets/nfpm-target.ts +13 -6
  213. package/src/deploy/types.ts +1 -0
  214. package/src/dev/entry-env.ts +2 -1
  215. package/src/dev/headless.ts +40 -0
  216. package/src/dev/runner-deps.ts +3 -3
  217. package/src/dev/runner-main.ts +10 -3
  218. package/src/dev/supervisor.ts +6 -3
  219. package/src/i18n/catalogs.ts +1 -0
  220. package/src/i18n/source-messages.ts +1429 -28
  221. package/src/internal/build-manifest.ts +25 -1
  222. package/src/internal/build-output.ts +113 -0
  223. package/src/internal/docs-elements.ts +10 -4
  224. package/src/internal/entry-arg.ts +8 -1
  225. package/src/internal/errors.ts +1 -1
  226. package/src/internal/output-directory.ts +699 -0
  227. package/src/internal/parent-process.ts +110 -0
  228. package/src/internal/prepare-project.ts +5 -5
  229. package/src/internal/source-imports.ts +1 -1
  230. package/src/mcp/client.ts +2 -2
  231. package/src/vite-plugins/build-manifest.ts +7 -1
  232. package/src/vite-plugins/ensure-store.ts +2 -2
  233. package/src/vite-plugins/i18n.ts +83 -5
  234. package/src/vite-plugins/index.ts +14 -7
  235. package/src/vite-plugins/native.ts +0 -5
  236. package/src/vite-plugins/self-contained.ts +184 -185
  237. package/src/vite-plugins/settings-worker-env.ts +2 -2
  238. package/src/vitest-plugin.ts +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"contents.js","sourceRoot":"","sources":["../../../src/deploy/nfpm/contents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAUlC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,UAAU;IACV,UAAU;IACV,YAAY;IACZ,yBAAyB;IACzB,mBAAmB;IACnB,4BAA4B;IAC5B,gBAAgB;IAChB,qBAAqB;IACrB,6BAA6B;IAC7B,kBAAkB;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,iBAAiB;IACjB,0BAA0B;CAC7B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,IAAgB,EAAe,EAAE,CAAC,CAAC;IACnE,GAAG,EAAE,IAAI,CAAC,GAAG;IACb,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;IACjC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAW,EAAE,CACrD,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAExF,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAY,EAAE;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAuB,EAAY,EAAE;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEvF,OAAO,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAe,EAAE,CAAC,CAAC;IAC5D,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,KAAmB,EAAE,oBAA6B,EAAiB,EAAE;IACvG,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import { sortStrings } from \"@gtkx/utils\";\nimport { posix } from \"node:path\";\nimport type { StagedFile } from \"../types.js\";\n\ntype NfpmContent = {\n src?: string;\n dst: string;\n type?: string;\n file_info?: { mode: number };\n};\n\nconst FILESYSTEM_OWNED_PREFIXES = new Set([\n \"/usr\",\n \"/usr/bin\",\n \"/usr/lib\",\n \"/usr/share\",\n \"/usr/share/applications\",\n \"/usr/share/dbus-1\",\n \"/usr/share/dbus-1/services\",\n \"/usr/share/doc\",\n \"/usr/share/glib-2.0\",\n \"/usr/share/glib-2.0/schemas\",\n \"/usr/share/icons\",\n \"/usr/share/licenses\",\n \"/usr/share/metainfo\",\n \"/usr/share/mime\",\n \"/usr/share/mime/packages\",\n]);\n\nconst ICON_THEME_PREFIX = \"/usr/share/icons/\";\n\nconst contentFor = (prefix: string, file: StagedFile): NfpmContent => ({\n src: file.abs,\n dst: posix.join(prefix, file.rel),\n file_info: { mode: file.mode },\n});\n\nconst isFilesystemOwned = (directory: string): boolean =>\n FILESYSTEM_OWNED_PREFIXES.has(directory) || directory.startsWith(ICON_THEME_PREFIX);\n\nconst parentDirectories = (destination: string): string[] => {\n const parts = destination.split(\"/\").slice(1, -1);\n\n return parts.map((_, index) => `/${parts.slice(0, index + 1).join(\"/\")}`);\n};\n\nconst ownedDirectories = (contents: NfpmContent[]): string[] => {\n const directories = new Set(contents.flatMap((entry) => parentDirectories(entry.dst)));\n\n return sortStrings([...directories].filter((directory) => !isFilesystemOwned(directory)));\n};\n\nconst directoryContent = (destination: string): NfpmContent => ({\n dst: destination,\n type: \"dir\",\n file_info: { mode: 0o755 },\n});\n\nconst nfpmContents = (prefix: string, files: StagedFile[], shouldOwnDirectories: boolean): NfpmContent[] => {\n const contents = files.map((file) => contentFor(prefix, file));\n\n if (!shouldOwnDirectories) {\n return contents;\n }\n\n return [...ownedDirectories(contents).map((directory) => directoryContent(directory)), ...contents];\n};\n\nexport { nfpmContents };\n"]}
1
+ {"version":3,"file":"contents.js","sourceRoot":"","sources":["../../../src/deploy/nfpm/contents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAUlC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,UAAU;IACV,UAAU;IACV,kBAAkB;IAClB,yBAAyB;IACzB,uBAAuB;IACvB,cAAc;IACd,YAAY;IACZ,yBAAyB;IACzB,mBAAmB;IACnB,4BAA4B;IAC5B,mCAAmC;IACnC,4BAA4B;IAC5B,gBAAgB;IAChB,qBAAqB;IACrB,6BAA6B;IAC7B,kBAAkB;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,iBAAiB;IACjB,0BAA0B;IAC1B,qBAAqB;IACrB,6BAA6B;CAChC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,IAAgB,EAAe,EAAE,CAAC,CAAC;IACnE,GAAG,EAAE,IAAI,CAAC,GAAG;IACb,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;IACjC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAW,EAAE,CACrD,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAExF,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAY,EAAE;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAuB,EAAY,EAAE;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAEvF,OAAO,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAe,EAAE,CAAC,CAAC;IAC5D,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,KAAmB,EAAE,oBAA6B,EAAiB,EAAE;IACvG,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import { sortStrings } from \"@gtkx/utils\";\nimport { posix } from \"node:path\";\nimport type { StagedFile } from \"../types.js\";\n\ntype NfpmContent = {\n src?: string;\n dst: string;\n type?: string;\n file_info?: { mode: number };\n};\n\nconst FILESYSTEM_OWNED_PREFIXES = new Set([\n \"/usr\",\n \"/usr/bin\",\n \"/usr/lib\",\n \"/usr/lib/systemd\",\n \"/usr/lib/systemd/system\",\n \"/usr/lib/systemd/user\",\n \"/usr/libexec\",\n \"/usr/share\",\n \"/usr/share/applications\",\n \"/usr/share/dbus-1\",\n \"/usr/share/dbus-1/services\",\n \"/usr/share/dbus-1/system-services\",\n \"/usr/share/dbus-1/system.d\",\n \"/usr/share/doc\",\n \"/usr/share/glib-2.0\",\n \"/usr/share/glib-2.0/schemas\",\n \"/usr/share/icons\",\n \"/usr/share/licenses\",\n \"/usr/share/metainfo\",\n \"/usr/share/mime\",\n \"/usr/share/mime/packages\",\n \"/usr/share/polkit-1\",\n \"/usr/share/polkit-1/actions\",\n]);\n\nconst ICON_THEME_PREFIX = \"/usr/share/icons/\";\n\nconst contentFor = (prefix: string, file: StagedFile): NfpmContent => ({\n src: file.abs,\n dst: posix.join(prefix, file.rel),\n file_info: { mode: file.mode },\n});\n\nconst isFilesystemOwned = (directory: string): boolean =>\n FILESYSTEM_OWNED_PREFIXES.has(directory) || directory.startsWith(ICON_THEME_PREFIX);\n\nconst parentDirectories = (destination: string): string[] => {\n const parts = destination.split(\"/\").slice(1, -1);\n\n return parts.map((_, index) => `/${parts.slice(0, index + 1).join(\"/\")}`);\n};\n\nconst ownedDirectories = (contents: NfpmContent[]): string[] => {\n const directories = new Set(contents.flatMap((entry) => parentDirectories(entry.dst)));\n\n return sortStrings([...directories].filter((directory) => !isFilesystemOwned(directory)));\n};\n\nconst directoryContent = (destination: string): NfpmContent => ({\n dst: destination,\n type: \"dir\",\n file_info: { mode: 0o755 },\n});\n\nconst nfpmContents = (prefix: string, files: StagedFile[], shouldOwnDirectories: boolean): NfpmContent[] => {\n const contents = files.map((file) => contentFor(prefix, file));\n\n if (!shouldOwnDirectories) {\n return contents;\n }\n\n return [...ownedDirectories(contents).map((directory) => directoryContent(directory)), ...contents];\n};\n\nexport { nfpmContents };\n"]}
@@ -3,5 +3,6 @@ type ElfInfo = {
3
3
  glibcMinimum: string | null;
4
4
  };
5
5
  declare const readElfInfo: (path: string) => ElfInfo;
6
- export { type ElfInfo, readElfInfo };
6
+ declare const glibcMinimumForFiles: (paths: Iterable<string>) => string | null;
7
+ export { type ElfInfo, glibcMinimumForFiles, readElfInfo };
7
8
  //# 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;AAyHF,QAAA,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAUnC,CAAC;AAEF,OAAO,EAAE,KAAK,OAAO,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,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,5 +1,6 @@
1
- import { readFileSync } from "node:fs";
1
+ import { closeSync, openSync, readFileSync, readSync } from "node:fs";
2
2
  const ELF_MAGIC = "ELF";
3
+ const ELF_MAGIC_SIZE = 4;
3
4
  const CLASS_64 = 2;
4
5
  const LITTLE_ENDIAN = 1;
5
6
  const OFFSET_CLASS = 4;
@@ -17,8 +18,9 @@ const DT_NEEDED = 1;
17
18
  const DYNAMIC_VALUE_OFFSET = 8;
18
19
  const GLIBC_VERSION = /GLIBC_(\d+)\.(\d+)/g;
19
20
  const VERSION_RADIX = 1000;
21
+ const hasElfMagic = (buffer) => buffer.length >= OFFSET_CLASS && buffer.subarray(0, 4).toString("latin1") === ELF_MAGIC;
20
22
  const assertElf64 = (buffer, path) => {
21
- if (buffer.length < OFFSET_SECTION_NAME_INDEX || buffer.subarray(0, 4).toString("latin1") !== ELF_MAGIC) {
23
+ if (buffer.length < OFFSET_SECTION_NAME_INDEX || !hasElfMagic(buffer)) {
22
24
  throw new Error(`Cannot read ${path}: it is not an ELF binary`);
23
25
  }
24
26
  if (buffer.readUInt8(OFFSET_CLASS) !== CLASS_64 || buffer.readUInt8(OFFSET_DATA) !== LITTLE_ENDIAN) {
@@ -86,8 +88,7 @@ const readGlibcMinimum = (strings) => {
86
88
  return formatVersion(highestVersion(found));
87
89
  };
88
90
  const stringTable = (buffer, dynstr) => dynstr === undefined ? Buffer.alloc(0) : buffer.subarray(dynstr.offset, dynstr.offset + dynstr.size);
89
- const readElfInfo = (path) => {
90
- const buffer = readFileSync(path);
91
+ const readElfBuffer = (buffer, path) => {
91
92
  assertElf64(buffer, path);
92
93
  const sections = readSections(buffer);
93
94
  const strings = stringTable(buffer, sectionFor(sections, ".dynstr"));
@@ -96,5 +97,31 @@ const readElfInfo = (path) => {
96
97
  glibcMinimum: readGlibcMinimum(strings),
97
98
  };
98
99
  };
99
- export { readElfInfo };
100
+ const readElfInfo = (path) => readElfBuffer(readFileSync(path), path);
101
+ const readFilePrefix = (descriptor, size) => {
102
+ const buffer = Buffer.alloc(size);
103
+ const bytesRead = readSync(descriptor, buffer, 0, size, 0);
104
+ return buffer.subarray(0, bytesRead);
105
+ };
106
+ const readOptionalElfInfo = (path) => {
107
+ const descriptor = openSync(path, "r");
108
+ try {
109
+ const prefix = readFilePrefix(descriptor, ELF_MAGIC_SIZE);
110
+ return hasElfMagic(prefix) ? readElfBuffer(readFileSync(descriptor), path) : null;
111
+ }
112
+ finally {
113
+ closeSync(descriptor);
114
+ }
115
+ };
116
+ const glibcMinimumForFiles = (paths) => {
117
+ const versions = [];
118
+ for (const path of paths) {
119
+ const minimum = readOptionalElfInfo(path)?.glibcMinimum;
120
+ if (minimum !== undefined && minimum !== null) {
121
+ versions.push(minimum.split(".").map(Number));
122
+ }
123
+ }
124
+ return formatVersion(highestVersion(versions));
125
+ };
126
+ export { glibcMinimumForFiles, readElfInfo };
100
127
  //# sourceMappingURL=elf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"elf.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/elf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAkBvC,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAQ,EAAE;IACvD,IAAI,MAAM,CAAC,MAAM,GAAG,yBAAyB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,aAAa,EAAE,CAAC;QACjG,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,wDAAwD,CAAC,CAAC;IACjG,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,KAAa,EAAU,EAAE;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,KAAa,EAAc,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,MAAc,EAAgB,EAAE;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IAEjE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAChH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,QAAsB,EAAE,IAAY,EAA0B,EAAE,CAChF,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAEtD,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,OAAmB,EAAkB,EAAE;IAC/E,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,kBAAkB,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;QAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAClB,MAAM;QACV,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,OAA+B,EAAE,OAAe,EAAY,EAAE;IAC9F,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC;SACrC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC;SAC1C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,OAAiB,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAErG,MAAM,cAAc,GAAG,CAAC,QAAoB,EAAmB,EAAE;IAC7D,IAAI,OAAO,GAAoB,IAAI,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,OAAO,CAAC;QACtB,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAwB,EAAiB,EAAE,CAC9D,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAEtF,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAiB,EAAE;IACxD,MAAM,KAAK,GAAG,OAAO;SAChB,QAAQ,CAAC,QAAQ,CAAC;SAClB,QAAQ,CAAC,aAAa,CAAC;SACvB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,OAAO,EAAE,CAAC;IAEf,OAAO,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,MAA8B,EAAU,EAAE,CAC3E,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAEzG,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAErE,OAAO;QACH,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QACrE,YAAY,EAAE,gBAAgB,CAAC,OAAO,CAAC;KAC1C,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAgB,WAAW,EAAE,CAAC","sourcesContent":["import { readFileSync } 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 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 assertElf64 = (buffer: Buffer, path: string): void => {\n if (buffer.length < OFFSET_SECTION_NAME_INDEX || buffer.subarray(0, 4).toString(\"latin1\") !== ELF_MAGIC) {\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 readElfInfo = (path: string): ElfInfo => {\n const buffer = readFileSync(path);\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\nexport { type ElfInfo, readElfInfo };\n"]}
1
+ {"version":3,"file":"elf.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/elf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAkBtE,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,WAAW,GAAG,CAAC,MAAc,EAAW,EAAE,CAC5C,MAAM,CAAC,MAAM,IAAI,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;AAE5F,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAQ,EAAE;IACvD,IAAI,MAAM,CAAC,MAAM,GAAG,yBAAyB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,2BAA2B,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,aAAa,EAAE,CAAC;QACjG,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,wDAAwD,CAAC,CAAC;IACjG,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,KAAa,EAAU,EAAE;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,KAAa,EAAc,EAAE,CAAC,CAAC;IAC9E,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,cAAc,CAAC,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,MAAc,EAAgB,EAAE;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IAEjE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAChH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,QAAsB,EAAE,IAAY,EAA0B,EAAE,CAChF,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAEtD,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,OAAmB,EAAkB,EAAE;IAC/E,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,kBAAkB,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;QAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAClB,MAAM;QACV,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,OAA+B,EAAE,OAAe,EAAY,EAAE;IAC9F,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC;SACrC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC;SAC1C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,OAAiB,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAErG,MAAM,cAAc,GAAG,CAAC,QAAoB,EAAmB,EAAE;IAC7D,IAAI,OAAO,GAAoB,IAAI,CAAC;IAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,OAAO,GAAG,OAAO,CAAC;QACtB,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAwB,EAAiB,EAAE,CAC9D,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAEtF,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAiB,EAAE;IACxD,MAAM,KAAK,GAAG,OAAO;SAChB,QAAQ,CAAC,QAAQ,CAAC;SAClB,QAAQ,CAAC,aAAa,CAAC;SACvB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,OAAO,EAAE,CAAC;IAEf,OAAO,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,MAA8B,EAAU,EAAE,CAC3E,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAEzG,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,IAAY,EAAW,EAAE;IAC5D,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAErE,OAAO;QACH,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QACrE,YAAY,EAAE,gBAAgB,CAAC,OAAO,CAAC;KAC1C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAEvF,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAE,IAAY,EAAU,EAAE;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE3D,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAkB,EAAE;IACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEvC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAE1D,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,CAAC;YAAS,CAAC;QACP,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAuB,EAAiB,EAAE;IACpE,MAAM,QAAQ,GAAe,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;QAExD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED,OAAO,aAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,OAAO,EAAgB,oBAAoB,EAAE,WAAW,EAAE,CAAC","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,5 +1,6 @@
1
1
  import type { DeploySettings, NodeRuntime } from "../types.js";
2
2
  declare const sourcePathFor: (settings: DeploySettings) => string;
3
+ declare const resolveNodeVersion: (settings: DeploySettings) => string;
3
4
  declare const resolveNodeRuntime: (settings: DeploySettings) => Promise<NodeRuntime>;
4
- export { resolveNodeRuntime, sourcePathFor };
5
+ export { resolveNodeRuntime, resolveNodeVersion, sourcePathFor };
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/D,QAAA,MAAM,aAAa,GAAI,UAAU,cAAc,KAAG,MAajD,CAAC;AAyCF,QAAA,MAAM,kBAAkB,GAAU,UAAU,cAAc,KAAG,OAAO,CAAC,WAAW,CAU/E,CAAC;AAEF,OAAO,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,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,4 +1,6 @@
1
+ import { MINIMUM_NODE_VERSION } from "@gtkx/config/internal";
1
2
  import { info, tryResolveExecutable } from "@gtkx/utils";
3
+ import { execFileSync } from "node:child_process";
2
4
  import { chmodSync, copyFileSync, mkdirSync, statSync } from "node:fs";
3
5
  import { join, resolve } from "node:path";
4
6
  import { runCliTool } from "../../internal/run-cli-tool.js";
@@ -9,9 +11,65 @@ import { licenseBesideNode } from "./license.js";
9
11
  const BYTES_PER_MIB = 1024 * 1024;
10
12
  const EXECUTABLE_MODE = 0o755;
11
13
  const NODE_FILENAME = "node";
14
+ const NODE_VERSION_PATTERN = /^v?(\d+)\.(\d+)\.(\d+)$/;
15
+ const VERSION_PROBE_TIMEOUT_MS = 10_000;
16
+ const VERSION_PROBE_MAX_BUFFER = 1024;
17
+ const nodeSourceFor = (settings) => settings.deploy.node?.source ?? "download";
18
+ const parseNodeVersion = (value, subject) => {
19
+ const match = NODE_VERSION_PATTERN.exec(value.trim());
20
+ if (match === null) {
21
+ throw new Error(`Cannot determine the Node.js version for ${subject}: expected a version such as 26.7.0`);
22
+ }
23
+ const parts = match.slice(1).map(Number);
24
+ return { parts, version: parts.map(String).join(".") };
25
+ };
26
+ const compareVersions = (left, right) => {
27
+ for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
28
+ const difference = (left[index] ?? 0) - (right[index] ?? 0);
29
+ if (difference !== 0) {
30
+ return difference;
31
+ }
32
+ }
33
+ return 0;
34
+ };
35
+ const supportedNodeVersion = (value, subject) => {
36
+ const parsed = parseNodeVersion(value, subject);
37
+ const minimum = parseNodeVersion(MINIMUM_NODE_VERSION, "GTKX");
38
+ if (compareVersions(parsed.parts, minimum.parts) < 0) {
39
+ throw new Error(`Cannot bundle Node.js ${parsed.version} for ${subject}: GTKX requires ${MINIMUM_NODE_VERSION} or newer`);
40
+ }
41
+ return parsed.version;
42
+ };
43
+ const probeNodeVersion = (path) => {
44
+ try {
45
+ const output = execFileSync(path, ["--version"], {
46
+ encoding: "utf8",
47
+ env: { ...process.env, NODE_OPTIONS: "" },
48
+ maxBuffer: VERSION_PROBE_MAX_BUFFER,
49
+ timeout: VERSION_PROBE_TIMEOUT_MS,
50
+ });
51
+ return supportedNodeVersion(output, path);
52
+ }
53
+ catch (error) {
54
+ if (error instanceof Error && error.message.startsWith("Cannot bundle Node.js")) {
55
+ throw error;
56
+ }
57
+ throw new Error(`Cannot determine the Node.js version from ${path}`, { cause: error });
58
+ }
59
+ };
60
+ const assertExpectedVersion = (configured, actual, source) => {
61
+ if (configured === undefined) {
62
+ return actual;
63
+ }
64
+ const expected = parseNodeVersion(configured, `deploy.node.source: "${source}"`).version;
65
+ if (expected !== actual) {
66
+ throw new Error(`The Node.js runtime from deploy.node.source "${source}" is ${actual}, not the configured ${expected}`);
67
+ }
68
+ return actual;
69
+ };
12
70
  const sourcePathFor = (settings) => {
13
71
  const node = settings.deploy.node ?? {};
14
- const source = node.source ?? "download";
72
+ const source = nodeSourceFor(settings);
15
73
  if (source === "host") {
16
74
  return process.execPath;
17
75
  }
@@ -20,6 +78,17 @@ const sourcePathFor = (settings) => {
20
78
  }
21
79
  return resolve(settings.paths.root, node.path);
22
80
  };
81
+ const resolveNodeVersion = (settings) => {
82
+ const node = settings.deploy.node ?? {};
83
+ const source = nodeSourceFor(settings);
84
+ if (source === "download") {
85
+ return supportedNodeVersion(node.version ?? MINIMUM_NODE_VERSION, 'deploy.node.source: "download"');
86
+ }
87
+ const actual = source === "host"
88
+ ? supportedNodeVersion(process.versions.node, 'deploy.node.source: "host"')
89
+ : probeNodeVersion(sourcePathFor(settings));
90
+ return assertExpectedVersion(node.version, actual, source);
91
+ };
23
92
  const didStripBinary = (path) => {
24
93
  if (tryResolveExecutable("strip") === undefined) {
25
94
  return false;
@@ -50,13 +119,14 @@ const stageFromSource = async (settings, version, source) => {
50
119
  };
51
120
  const resolveNodeRuntime = async (settings) => {
52
121
  const node = settings.deploy.node ?? {};
53
- const source = node.source ?? "download";
54
- const version = node.version ?? process.versions.node;
122
+ const source = nodeSourceFor(settings);
123
+ const version = resolveNodeVersion(settings);
55
124
  const staged = await stageFromSource(settings, version, source);
56
125
  const isStripped = node.shouldStrip === false ? false : didStripBinary(staged.path);
57
126
  const elf = readElfInfo(staged.path);
58
- info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, glibc >= ${elf.glibcMinimum ?? "unknown"})`);
127
+ const glibcMinimum = elf.glibcMinimum ?? "unknown";
128
+ info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, runtime glibc >= ${glibcMinimum})`);
59
129
  return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };
60
130
  };
61
- export { resolveNodeRuntime, sourcePathFor };
131
+ export { resolveNodeRuntime, resolveNodeVersion, sourcePathFor };
62
132
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { info, tryResolveExecutable } from \"@gtkx/utils\";\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\nconst BYTES_PER_MIB = 1024 * 1024;\nconst EXECUTABLE_MODE = 0o755;\nconst NODE_FILENAME = \"node\";\n\nconst sourcePathFor = (settings: DeploySettings): string => {\n const node = settings.deploy.node ?? {};\n const source = node.source ?? \"download\";\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 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 (settings: DeploySettings, version: string, source: string): 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 = node.source ?? \"download\";\n const version = node.version ?? process.versions.node;\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 info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, glibc >= ${elf.glibcMinimum ?? \"unknown\"})`);\n\n return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };\n};\n\nexport { resolveNodeRuntime, sourcePathFor };\n"]}
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,5 +1,5 @@
1
1
  import { warn } from "@gtkx/utils";
2
- import { sourcePathFor } from "../node-runtime/index.js";
2
+ import { resolveNodeVersion, sourcePathFor } from "../node-runtime/index.js";
3
3
  import { licenseBesideNode } from "../node-runtime/license.js";
4
4
  import { NODE_FILENAME } from "../payload/launcher.js";
5
5
  import { nodeLicenseDestination } from "../payload/stage.js";
@@ -22,7 +22,7 @@ const MISSING_LICENSE = "Cannot read a license file for the Node.js runtime this
22
22
  'next to the binary, so point `deploy.node.path` at one, or use `deploy.node.source: "download"`, and ' +
23
23
  "the notices carry it.";
24
24
  const isSourceMode = (settings) => settings.deploy.flatpak?.mode === "source";
25
- const versionFor = (settings, node) => node?.version ?? settings.deploy.node?.version ?? process.versions.node;
25
+ const versionFor = (settings, node) => node?.version ?? resolveNodeVersion(settings);
26
26
  const licenseFileFor = (settings, node) => {
27
27
  if (node !== null) {
28
28
  return node.licenseFile;
@@ -1 +1 @@
1
- {"version":3,"file":"node-runtime.js","sourceRoot":"","sources":["../../../src/deploy/notices/node-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { warn } from \"@gtkx/utils\";\nimport type { DeploySettings, NodeRuntime, NoticeSection } from \"../types.js\";\nimport { sourcePathFor } from \"../node-runtime/index.js\";\nimport { licenseBesideNode } from \"../node-runtime/license.js\";\nimport { NODE_FILENAME } from \"../payload/launcher.js\";\nimport { nodeLicenseDestination } from \"../payload/stage.js\";\nimport { copyrightLines, readLicenseText } from \"./text.js\";\n\nconst TITLE = \"Node.js runtime\";\nconst LICENSE_NAME = \"Node.js\";\nconst SOURCE_URL = \"https://github.com/nodejs/node\";\nconst LICENSE_URL = \"https://github.com/nodejs/node/blob/main/LICENSE\";\n\nconst SUMMARY = [\n \"This package carries the Node.js runtime that runs the application. Its license is the one Node.js\",\n \"publishes as a single document, covering Node.js itself under the MIT terms together with the\",\n \"components it embeds under theirs, among them V8, OpenSSL, ICU, libuv, zlib, brotli and llhttp.\",\n];\n\nconst CARRIED_SUMMARY = [\"The notice below is that document, reproduced from the release this package bundles.\"];\n\nconst MISSING_SUMMARY = [\n \"This run had no copy of that document at hand, so the notice below names it and it is published at\",\n `${LICENSE_URL}.`,\n];\n\nconst MISSING_LICENSE =\n \"Cannot read a license file for the Node.js runtime this deploy bundles. An official release unpacks it \" +\n 'next to the binary, so point `deploy.node.path` at one, or use `deploy.node.source: \"download\"`, and ' +\n \"the notices carry it.\";\n\nconst isSourceMode = (settings: DeploySettings): boolean => settings.deploy.flatpak?.mode === \"source\";\n\nconst versionFor = (settings: DeploySettings, node: NodeRuntime | null): string =>\n node?.version ?? settings.deploy.node?.version ?? process.versions.node;\n\nconst licenseFileFor = (settings: DeploySettings, node: NodeRuntime | null): string | null => {\n if (node !== null) {\n return node.licenseFile;\n }\n\n if ((settings.deploy.node?.source ?? \"download\") === \"download\") {\n return null;\n }\n\n return licenseBesideNode(sourcePathFor(settings));\n};\n\nconst textFor = (settings: DeploySettings, node: NodeRuntime | null): string | null => {\n const licenseFile = licenseFileFor(settings, node);\n\n return licenseFile === null ? null : readLicenseText(licenseFile);\n};\n\nconst extensionSummary = (settings: DeploySettings): string[] => [\n \"The flatpak built from source copies its runtime out of the Node SDK extension in the build sandbox.\",\n `That build installs the license file the extension ships as ${nodeLicenseDestination(settings)}, and`,\n \"installs nothing when the extension ships none, so read the text at the address above if that file is\",\n \"not in the package you received.\",\n];\n\nconst carriedSummary = (settings: DeploySettings, text: string | null): string[] => {\n if (isSourceMode(settings)) {\n return [...MISSING_SUMMARY, ...extensionSummary(settings)];\n }\n\n return text === null ? MISSING_SUMMARY : CARRIED_SUMMARY;\n};\n\nconst summaryFor = (settings: DeploySettings, text: string | null): string[] => [\n ...SUMMARY,\n ...carriedSummary(settings, text),\n];\n\nconst warnMissingLicense = (node: NodeRuntime | null, text: string | null): void => {\n if (node === null || text !== null) {\n return;\n }\n\n warn(MISSING_LICENSE);\n};\n\nconst nodeNotices = (settings: DeploySettings, node: NodeRuntime | null): NoticeSection => {\n const text = textFor(settings, node);\n warnMissingLicense(node, text);\n\n return {\n title: TITLE,\n files: [`lib/${settings.binaryName}/${NODE_FILENAME}`],\n summary: summaryFor(settings, text),\n notices: [{\n subject: `Node.js ${versionFor(settings, node)}`,\n license: LICENSE_NAME,\n source: SOURCE_URL,\n copyright: copyrightLines(text),\n text,\n }],\n };\n};\n\nexport { nodeNotices };\n"]}
1
+ {"version":3,"file":"node-runtime.js","sourceRoot":"","sources":["../../../src/deploy/notices/node-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { warn } from \"@gtkx/utils\";\nimport type { DeploySettings, NodeRuntime, NoticeSection } from \"../types.js\";\nimport { resolveNodeVersion, sourcePathFor } from \"../node-runtime/index.js\";\nimport { licenseBesideNode } from \"../node-runtime/license.js\";\nimport { NODE_FILENAME } from \"../payload/launcher.js\";\nimport { nodeLicenseDestination } from \"../payload/stage.js\";\nimport { copyrightLines, readLicenseText } from \"./text.js\";\n\nconst TITLE = \"Node.js runtime\";\nconst LICENSE_NAME = \"Node.js\";\nconst SOURCE_URL = \"https://github.com/nodejs/node\";\nconst LICENSE_URL = \"https://github.com/nodejs/node/blob/main/LICENSE\";\n\nconst SUMMARY = [\n \"This package carries the Node.js runtime that runs the application. Its license is the one Node.js\",\n \"publishes as a single document, covering Node.js itself under the MIT terms together with the\",\n \"components it embeds under theirs, among them V8, OpenSSL, ICU, libuv, zlib, brotli and llhttp.\",\n];\n\nconst CARRIED_SUMMARY = [\"The notice below is that document, reproduced from the release this package bundles.\"];\n\nconst MISSING_SUMMARY = [\n \"This run had no copy of that document at hand, so the notice below names it and it is published at\",\n `${LICENSE_URL}.`,\n];\n\nconst MISSING_LICENSE =\n \"Cannot read a license file for the Node.js runtime this deploy bundles. An official release unpacks it \" +\n 'next to the binary, so point `deploy.node.path` at one, or use `deploy.node.source: \"download\"`, and ' +\n \"the notices carry it.\";\n\nconst isSourceMode = (settings: DeploySettings): boolean => settings.deploy.flatpak?.mode === \"source\";\n\nconst versionFor = (settings: DeploySettings, node: NodeRuntime | null): string =>\n node?.version ?? resolveNodeVersion(settings);\n\nconst licenseFileFor = (settings: DeploySettings, node: NodeRuntime | null): string | null => {\n if (node !== null) {\n return node.licenseFile;\n }\n\n if ((settings.deploy.node?.source ?? \"download\") === \"download\") {\n return null;\n }\n\n return licenseBesideNode(sourcePathFor(settings));\n};\n\nconst textFor = (settings: DeploySettings, node: NodeRuntime | null): string | null => {\n const licenseFile = licenseFileFor(settings, node);\n\n return licenseFile === null ? null : readLicenseText(licenseFile);\n};\n\nconst extensionSummary = (settings: DeploySettings): string[] => [\n \"The flatpak built from source copies its runtime out of the Node SDK extension in the build sandbox.\",\n `That build installs the license file the extension ships as ${nodeLicenseDestination(settings)}, and`,\n \"installs nothing when the extension ships none, so read the text at the address above if that file is\",\n \"not in the package you received.\",\n];\n\nconst carriedSummary = (settings: DeploySettings, text: string | null): string[] => {\n if (isSourceMode(settings)) {\n return [...MISSING_SUMMARY, ...extensionSummary(settings)];\n }\n\n return text === null ? MISSING_SUMMARY : CARRIED_SUMMARY;\n};\n\nconst summaryFor = (settings: DeploySettings, text: string | null): string[] => [\n ...SUMMARY,\n ...carriedSummary(settings, text),\n];\n\nconst warnMissingLicense = (node: NodeRuntime | null, text: string | null): void => {\n if (node === null || text !== null) {\n return;\n }\n\n warn(MISSING_LICENSE);\n};\n\nconst nodeNotices = (settings: DeploySettings, node: NodeRuntime | null): NoticeSection => {\n const text = textFor(settings, node);\n warnMissingLicense(node, text);\n\n return {\n title: TITLE,\n files: [`lib/${settings.binaryName}/${NODE_FILENAME}`],\n summary: summaryFor(settings, text),\n notices: [{\n subject: `Node.js ${versionFor(settings, node)}`,\n license: LICENSE_NAME,\n source: SOURCE_URL,\n copyright: copyrightLines(text),\n text,\n }],\n };\n};\n\nexport { nodeNotices };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../../src/deploy/payload/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,QAAA,MAAM,aAAa,SAAS,CAAC;AAQ7B,QAAA,MAAM,cAAc,GAAI,UAAU,cAAc,KAAG,MAelD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../../src/deploy/payload/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,QAAA,MAAM,aAAa,SAAS,CAAC;AA0B7B,QAAA,MAAM,cAAc,GAAI,UAAU,cAAc,KAAG,MAgBlD,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC"}
@@ -1,10 +1,22 @@
1
1
  import { BUNDLE_FILENAME } from "../../vite-plugins/esm-extension.js";
2
2
  const NODE_FILENAME = "node";
3
+ const SHELL_SINGLE_QUOTE = "'";
4
+ const SHELL_SINGLE_QUOTE_ESCAPE = "'\"'\"'";
3
5
  const compileCacheLines = (binaryName) => [
4
6
  "cache_home=${XDG_CACHE_HOME:-${HOME:-/tmp}/.cache}",
5
7
  `NODE_COMPILE_CACHE="$cache_home/${binaryName}/node"`,
6
8
  "export NODE_COMPILE_CACHE",
7
9
  ];
10
+ const shellQuote = (value) => SHELL_SINGLE_QUOTE + value.split(SHELL_SINGLE_QUOTE).join(SHELL_SINGLE_QUOTE_ESCAPE) + SHELL_SINGLE_QUOTE;
11
+ const launcherEnvLines = (settings) => Object.entries(settings.deploy.launcherEnv ?? {})
12
+ .toSorted(([left], [right]) => left.localeCompare(right))
13
+ .map(([name, value]) => `export ${name}=${shellQuote(value)}`);
14
+ const launcherCommand = (settings, libDir) => [
15
+ `"${libDir}/${NODE_FILENAME}"`,
16
+ ...(settings.deploy.nodeFlags ?? []).map((flag) => shellQuote(flag)),
17
+ `"${libDir}/${BUNDLE_FILENAME}"`,
18
+ '"$@"',
19
+ ].join(" ");
8
20
  const renderLauncher = (settings) => {
9
21
  const libDir = `$prefix/lib/${settings.binaryName}`;
10
22
  const shouldUseCompileCache = settings.deploy.node?.shouldUseCompileCache !== false;
@@ -16,7 +28,8 @@ const renderLauncher = (settings) => {
16
28
  'GTKX_LOCALE_DIR="$prefix/share/locale"',
17
29
  "export GTKX_LOCALE_DIR",
18
30
  ...(shouldUseCompileCache ? compileCacheLines(settings.binaryName) : []),
19
- `exec "${libDir}/${NODE_FILENAME}" "${libDir}/${BUNDLE_FILENAME}" "$@"`,
31
+ ...launcherEnvLines(settings),
32
+ `exec ${launcherCommand(settings, libDir)}`,
20
33
  "",
21
34
  ].join("\n");
22
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/deploy/payload/launcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAEtE,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAY,EAAE,CAAC;IACxD,oDAAoD;IACpD,mCAAmC,UAAU,QAAQ;IACrD,2BAA2B;CAC9B,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,QAAwB,EAAU,EAAE;IACxD,MAAM,MAAM,GAAG,eAAe,QAAQ,CAAC,UAAU,EAAE,CAAC;IACpD,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,KAAK,KAAK,CAAC;IAEpF,OAAO;QACH,WAAW;QACX,QAAQ;QACR,0BAA0B;QAC1B,wCAAwC;QACxC,wCAAwC;QACxC,wBAAwB;QACxB,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,SAAS,MAAM,IAAI,aAAa,MAAM,MAAM,IAAI,eAAe,QAAQ;QACvE,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import type { DeploySettings } from \"../types.js\";\nimport { BUNDLE_FILENAME } from \"../../vite-plugins/esm-extension.js\";\n\nconst NODE_FILENAME = \"node\";\n\nconst compileCacheLines = (binaryName: string): string[] => [\n \"cache_home=${XDG_CACHE_HOME:-${HOME:-/tmp}/.cache}\",\n `NODE_COMPILE_CACHE=\"$cache_home/${binaryName}/node\"`,\n \"export NODE_COMPILE_CACHE\",\n];\n\nconst renderLauncher = (settings: DeploySettings): string => {\n const libDir = `$prefix/lib/${settings.binaryName}`;\n const shouldUseCompileCache = settings.deploy.node?.shouldUseCompileCache !== false;\n\n return [\n \"#!/bin/sh\",\n \"set -e\",\n 'self=$(readlink -f \"$0\")',\n 'prefix=$(dirname \"$(dirname \"$self\")\")',\n 'GTKX_LOCALE_DIR=\"$prefix/share/locale\"',\n \"export GTKX_LOCALE_DIR\",\n ...(shouldUseCompileCache ? compileCacheLines(settings.binaryName) : []),\n `exec \"${libDir}/${NODE_FILENAME}\" \"${libDir}/${BUNDLE_FILENAME}\" \"$@\"`,\n \"\",\n ].join(\"\\n\");\n};\n\nexport { NODE_FILENAME, renderLauncher };\n"]}
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../../src/deploy/payload/launcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAEtE,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAE5C,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAY,EAAE,CAAC;IACxD,oDAAoD;IACpD,mCAAmC,UAAU,QAAQ;IACrD,2BAA2B;CAC9B,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CACzC,kBAAkB,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,CAAC;AAE9G,MAAM,gBAAgB,GAAG,CAAC,QAAwB,EAAY,EAAE,CAC5D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;KAC5C,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KACxD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEvE,MAAM,eAAe,GAAG,CAAC,QAAwB,EAAE,MAAc,EAAU,EAAE,CACzE;IACI,IAAI,MAAM,IAAI,aAAa,GAAG;IAC9B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpE,IAAI,MAAM,IAAI,eAAe,GAAG;IAChC,MAAM;CACT,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhB,MAAM,cAAc,GAAG,CAAC,QAAwB,EAAU,EAAE;IACxD,MAAM,MAAM,GAAG,eAAe,QAAQ,CAAC,UAAU,EAAE,CAAC;IACpD,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,KAAK,KAAK,CAAC;IAEpF,OAAO;QACH,WAAW;QACX,QAAQ;QACR,0BAA0B;QAC1B,wCAAwC;QACxC,wCAAwC;QACxC,wBAAwB;QACxB,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QAC7B,QAAQ,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;QAC3C,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import type { DeploySettings } from \"../types.js\";\nimport { BUNDLE_FILENAME } from \"../../vite-plugins/esm-extension.js\";\n\nconst NODE_FILENAME = \"node\";\nconst SHELL_SINGLE_QUOTE = \"'\";\nconst SHELL_SINGLE_QUOTE_ESCAPE = \"'\\\"'\\\"'\";\n\nconst compileCacheLines = (binaryName: string): string[] => [\n \"cache_home=${XDG_CACHE_HOME:-${HOME:-/tmp}/.cache}\",\n `NODE_COMPILE_CACHE=\"$cache_home/${binaryName}/node\"`,\n \"export NODE_COMPILE_CACHE\",\n];\n\nconst shellQuote = (value: string): string =>\n SHELL_SINGLE_QUOTE + value.split(SHELL_SINGLE_QUOTE).join(SHELL_SINGLE_QUOTE_ESCAPE) + SHELL_SINGLE_QUOTE;\n\nconst launcherEnvLines = (settings: DeploySettings): string[] =>\n Object.entries(settings.deploy.launcherEnv ?? {})\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([name, value]) => `export ${name}=${shellQuote(value)}`);\n\nconst launcherCommand = (settings: DeploySettings, libDir: string): string =>\n [\n `\"${libDir}/${NODE_FILENAME}\"`,\n ...(settings.deploy.nodeFlags ?? []).map((flag) => shellQuote(flag)),\n `\"${libDir}/${BUNDLE_FILENAME}\"`,\n '\"$@\"',\n ].join(\" \");\n\nconst renderLauncher = (settings: DeploySettings): string => {\n const libDir = `$prefix/lib/${settings.binaryName}`;\n const shouldUseCompileCache = settings.deploy.node?.shouldUseCompileCache !== false;\n\n return [\n \"#!/bin/sh\",\n \"set -e\",\n 'self=$(readlink -f \"$0\")',\n 'prefix=$(dirname \"$(dirname \"$self\")\")',\n 'GTKX_LOCALE_DIR=\"$prefix/share/locale\"',\n \"export GTKX_LOCALE_DIR\",\n ...(shouldUseCompileCache ? compileCacheLines(settings.binaryName) : []),\n ...launcherEnvLines(settings),\n `exec ${launcherCommand(settings, libDir)}`,\n \"\",\n ].join(\"\\n\");\n};\n\nexport { NODE_FILENAME, renderLauncher };\n"]}
@@ -73,10 +73,10 @@ const stagePayload = ({ settings, node, metadata }) => {
73
73
  ...stageNodeBinary(settings, root, node),
74
74
  ...stageRuntimeFiles(settings, root),
75
75
  ...stageCatalogs(settings, root),
76
+ ...stageExtraFiles(settings, root),
76
77
  ...stageMetadata(settings, root, metadata),
77
78
  ...stageIcons(settings, root),
78
79
  ...stageSchemas(settings, root),
79
- ...stageExtraFiles(settings, root),
80
80
  ]);
81
81
  };
82
82
  const withoutDbusActivation = (desktopEntry) => desktopEntry
@@ -1 +1 @@
1
- {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/deploy/payload/stage.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStringsBy } 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 stageExtraFiles = (settings: DeploySettings, root: string): StagedFile[] =>\n settings.extraFiles.map((file) => {\n const source = resolve(settings.paths.root, file.source);\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 ...stageMetadata(settings, root, metadata),\n ...stageIcons(settings, root),\n ...stageSchemas(settings, root),\n ...stageExtraFiles(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 } 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 stageExtraFiles = (settings: DeploySettings, root: string): StagedFile[] =>\n settings.extraFiles.map((file) => {\n const source = resolve(settings.paths.root, file.source);\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),\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,6 +1,7 @@
1
1
  type DeployOptions = {
2
2
  entry: string;
3
3
  cwd: string;
4
+ configFile?: string | undefined;
4
5
  targets?: string | undefined;
5
6
  outDir?: string | undefined;
6
7
  shouldPrintManifests: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"run-deploy.d.ts","sourceRoot":"","sources":["../../src/deploy/run-deploy.ts"],"names":[],"mappings":"AAyDA,KAAK,aAAa,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,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;AA4VF,QAAA,MAAM,SAAS,GAAU,SAAS,aAAa,KAAG,OAAO,CAAC,IAAI,CAsC7D,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
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"}