@gtkx/cli 1.2.0 → 1.2.1

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 (117) hide show
  1. package/dist/builder.d.ts.map +1 -1
  2. package/dist/builder.js +2 -0
  3. package/dist/builder.js.map +1 -1
  4. package/dist/deploy/freedesktop/copyright.d.ts +2 -2
  5. package/dist/deploy/freedesktop/copyright.d.ts.map +1 -1
  6. package/dist/deploy/freedesktop/copyright.js +105 -14
  7. package/dist/deploy/freedesktop/copyright.js.map +1 -1
  8. package/dist/deploy/node-runtime/download.d.ts +5 -1
  9. package/dist/deploy/node-runtime/download.d.ts.map +1 -1
  10. package/dist/deploy/node-runtime/download.js +6 -3
  11. package/dist/deploy/node-runtime/download.js.map +1 -1
  12. package/dist/deploy/node-runtime/index.d.ts +2 -1
  13. package/dist/deploy/node-runtime/index.d.ts.map +1 -1
  14. package/dist/deploy/node-runtime/index.js +10 -9
  15. package/dist/deploy/node-runtime/index.js.map +1 -1
  16. package/dist/deploy/node-runtime/license.d.ts +4 -0
  17. package/dist/deploy/node-runtime/license.d.ts.map +1 -0
  18. package/dist/deploy/node-runtime/license.js +19 -0
  19. package/dist/deploy/node-runtime/license.js.map +1 -0
  20. package/dist/deploy/notices/collect.d.ts +8 -0
  21. package/dist/deploy/notices/collect.d.ts.map +1 -0
  22. package/dist/deploy/notices/collect.js +17 -0
  23. package/dist/deploy/notices/collect.js.map +1 -0
  24. package/dist/deploy/notices/dependencies.d.ts +5 -0
  25. package/dist/deploy/notices/dependencies.d.ts.map +1 -0
  26. package/dist/deploy/notices/dependencies.js +39 -0
  27. package/dist/deploy/notices/dependencies.js.map +1 -0
  28. package/dist/deploy/notices/gtkx.d.ts +6 -0
  29. package/dist/deploy/notices/gtkx.d.ts.map +1 -0
  30. package/dist/deploy/notices/gtkx.js +68 -0
  31. package/dist/deploy/notices/gtkx.js.map +1 -0
  32. package/dist/deploy/notices/libraries.d.ts +4 -0
  33. package/dist/deploy/notices/libraries.d.ts.map +1 -0
  34. package/dist/deploy/notices/libraries.js +60 -0
  35. package/dist/deploy/notices/libraries.js.map +1 -0
  36. package/dist/deploy/notices/node-runtime.d.ts +4 -0
  37. package/dist/deploy/notices/node-runtime.d.ts.map +1 -0
  38. package/dist/deploy/notices/node-runtime.js +78 -0
  39. package/dist/deploy/notices/node-runtime.js.map +1 -0
  40. package/dist/deploy/notices/packages.d.ts +13 -0
  41. package/dist/deploy/notices/packages.d.ts.map +1 -0
  42. package/dist/deploy/notices/packages.js +115 -0
  43. package/dist/deploy/notices/packages.js.map +1 -0
  44. package/dist/deploy/notices/render.d.ts +4 -0
  45. package/dist/deploy/notices/render.d.ts.map +1 -0
  46. package/dist/deploy/notices/render.js +41 -0
  47. package/dist/deploy/notices/render.js.map +1 -0
  48. package/dist/deploy/notices/text.d.ts +5 -0
  49. package/dist/deploy/notices/text.d.ts.map +1 -0
  50. package/dist/deploy/notices/text.js +34 -0
  51. package/dist/deploy/notices/text.js.map +1 -0
  52. package/dist/deploy/payload/copy-tree.d.ts +2 -1
  53. package/dist/deploy/payload/copy-tree.d.ts.map +1 -1
  54. package/dist/deploy/payload/copy-tree.js +3 -1
  55. package/dist/deploy/payload/copy-tree.js.map +1 -1
  56. package/dist/deploy/payload/stage.d.ts +7 -3
  57. package/dist/deploy/payload/stage.d.ts.map +1 -1
  58. package/dist/deploy/payload/stage.js +25 -14
  59. package/dist/deploy/payload/stage.js.map +1 -1
  60. package/dist/deploy/run-deploy.d.ts.map +1 -1
  61. package/dist/deploy/run-deploy.js +22 -5
  62. package/dist/deploy/run-deploy.js.map +1 -1
  63. package/dist/deploy/settings/extra-files.d.ts +4 -0
  64. package/dist/deploy/settings/extra-files.d.ts.map +1 -0
  65. package/dist/deploy/settings/extra-files.js +11 -0
  66. package/dist/deploy/settings/extra-files.js.map +1 -0
  67. package/dist/deploy/settings/index.d.ts.map +1 -1
  68. package/dist/deploy/settings/index.js +2 -1
  69. package/dist/deploy/settings/index.js.map +1 -1
  70. package/dist/deploy/settings/package-manifest.d.ts +1 -0
  71. package/dist/deploy/settings/package-manifest.d.ts.map +1 -1
  72. package/dist/deploy/settings/package-manifest.js +7 -0
  73. package/dist/deploy/settings/package-manifest.js.map +1 -1
  74. package/dist/deploy/settings/paths.d.ts +2 -1
  75. package/dist/deploy/settings/paths.d.ts.map +1 -1
  76. package/dist/deploy/settings/paths.js +1 -1
  77. package/dist/deploy/settings/paths.js.map +1 -1
  78. package/dist/deploy/targets/flatpak-manifest.d.ts +3 -1
  79. package/dist/deploy/targets/flatpak-manifest.d.ts.map +1 -1
  80. package/dist/deploy/targets/flatpak-manifest.js +50 -4
  81. package/dist/deploy/targets/flatpak-manifest.js.map +1 -1
  82. package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
  83. package/dist/deploy/targets/flatpak-source.js +55 -1
  84. package/dist/deploy/targets/flatpak-source.js.map +1 -1
  85. package/dist/deploy/types.d.ts +22 -2
  86. package/dist/deploy/types.d.ts.map +1 -1
  87. package/dist/deploy/types.js.map +1 -1
  88. package/dist/vite-plugins/bundled-packages.d.ts +5 -0
  89. package/dist/vite-plugins/bundled-packages.d.ts.map +1 -0
  90. package/dist/vite-plugins/bundled-packages.js +63 -0
  91. package/dist/vite-plugins/bundled-packages.js.map +1 -0
  92. package/package.json +9 -9
  93. package/src/builder.ts +2 -0
  94. package/src/deploy/freedesktop/copyright.ts +153 -18
  95. package/src/deploy/node-runtime/download.ts +13 -4
  96. package/src/deploy/node-runtime/index.ts +17 -11
  97. package/src/deploy/node-runtime/license.ts +24 -0
  98. package/src/deploy/notices/collect.ts +26 -0
  99. package/src/deploy/notices/dependencies.ts +53 -0
  100. package/src/deploy/notices/gtkx.ts +92 -0
  101. package/src/deploy/notices/libraries.ts +81 -0
  102. package/src/deploy/notices/node-runtime.ts +101 -0
  103. package/src/deploy/notices/packages.ts +168 -0
  104. package/src/deploy/notices/render.ts +52 -0
  105. package/src/deploy/notices/text.ts +42 -0
  106. package/src/deploy/payload/copy-tree.ts +5 -1
  107. package/src/deploy/payload/stage.ts +40 -16
  108. package/src/deploy/run-deploy.ts +27 -5
  109. package/src/deploy/settings/extra-files.ts +21 -0
  110. package/src/deploy/settings/index.ts +2 -1
  111. package/src/deploy/settings/package-manifest.ts +10 -0
  112. package/src/deploy/settings/paths.ts +1 -1
  113. package/src/deploy/targets/flatpak-manifest.ts +69 -4
  114. package/src/deploy/targets/flatpak-source.ts +87 -1
  115. package/src/deploy/types.ts +27 -1
  116. package/src/vite-plugins/bundled-packages.ts +95 -0
  117. package/LICENSE +0 -373
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAmC,MAAM,MAAM,CAAC;AAQ1E,KAAK,YAAY,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC,CAAC;AAoBF,QAAA,MAAM,KAAK,GAAU,SAAS,YAAY,KAAG,OAAO,CAAC,MAAM,CA8B1D,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAmC,MAAM,MAAM,CAAC;AAS1E,KAAK,YAAY,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC,CAAC;AAoBF,QAAA,MAAM,KAAK,GAAU,SAAS,YAAY,KAAG,OAAO,CAAC,MAAM,CA+B1D,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
package/dist/builder.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { join, posix } from "node:path";
2
2
  import { mergeConfig, build as viteBuild } from "vite";
3
3
  import { gtkxBuiltUrl } from "./vite-plugins/built-url.js";
4
+ import { gtkxBundledPackages } from "./vite-plugins/bundled-packages.js";
4
5
  import { BUNDLE_FILENAME, ESM_EXTENSION } from "./vite-plugins/esm-extension.js";
5
6
  import { gtkxVitePlugins } from "./vite-plugins/index.js";
6
7
  import { gtkxNative } from "./vite-plugins/native.js";
@@ -32,6 +33,7 @@ const build = async (options) => {
32
33
  gtkxWorker(),
33
34
  gtkxBuiltUrl(assetBase),
34
35
  gtkxNative(root),
36
+ gtkxBundledPackages(root),
35
37
  gtkxSelfContained(),
36
38
  ],
37
39
  build: {
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAqB,WAAW,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQtD,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AACpC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,aAAa,GAAiB;IAChC,KAAK,EAAE;QACH,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,KAAK;KACnB;IACD,MAAM,EAAE;QACJ,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;KACrD;CACJ,CAAC;AAEF,MAAM,KAAK,GAAG,KAAK,EAAE,OAAqB,EAAmB,EAAE;IAC3D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACvD,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,EAAE,KAAK,EAAE,SAAS,IAAI,kBAAkB,CAAC;IAErE,MAAM,MAAM,GAAiB;QACzB,OAAO,EAAE;YACL,GAAG,eAAe,CAAC,UAAU,CAAC;YAC9B,UAAU,EAAE;YACZ,YAAY,CAAC,SAAS,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC;YAChB,iBAAiB,EAAE;SACtB;QACD,KAAK,EAAE;YACH,GAAG,EAAE,KAAK;YACV,iBAAiB,EAAE,CAAC;YACpB,eAAe,EAAE;gBACb,MAAM,EAAE;oBACJ,cAAc,EAAE,gBAAgB;oBAChC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,aAAa,CAAC;oBACjE,SAAS,EAAE,IAAI;iBAClB;aACJ;SACJ;KACJ,CAAC;IAEF,MAAM,MAAM,GAAiB,WAAW,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/F,MAAM,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAEzE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC","sourcesContent":["import { join, posix } from \"node:path\";\nimport { type InlineConfig, mergeConfig, build as viteBuild } from \"vite\";\nimport { gtkxBuiltUrl } from \"./vite-plugins/built-url.js\";\nimport { BUNDLE_FILENAME, ESM_EXTENSION } from \"./vite-plugins/esm-extension.js\";\nimport { gtkxVitePlugins } from \"./vite-plugins/index.js\";\nimport { gtkxNative } from \"./vite-plugins/native.js\";\nimport { gtkxSelfContained } from \"./vite-plugins/self-contained.js\";\nimport { gtkxWorker } from \"./vite-plugins/worker.js\";\n\ntype BuildOptions = {\n entry: string;\n assetBase?: string | undefined;\n vite?: InlineConfig | undefined;\n};\n\nconst BUILD_MODE = \"production\";\nconst CHUNK_STEM = \"[name]-[hash]\";\nconst DEFAULT_OUT_DIR = \"dist\";\nconst DEFAULT_ASSETS_DIR = \"assets\";\nconst ENTRY_FILE_NAMES = BUNDLE_FILENAME;\n\nconst buildDefaults: InlineConfig = {\n build: {\n ssrEmitAssets: true,\n outDir: DEFAULT_OUT_DIR,\n minify: true,\n cssMinify: false,\n },\n define: {\n \"process.env.NODE_ENV\": JSON.stringify(BUILD_MODE),\n },\n};\n\nconst build = async (options: BuildOptions): Promise<string> => {\n const { entry, assetBase, vite: viteConfig } = options;\n const root = viteConfig?.root ?? process.cwd();\n const assetsDir = viteConfig?.build?.assetsDir ?? DEFAULT_ASSETS_DIR;\n\n const forced: InlineConfig = {\n plugins: [\n ...gtkxVitePlugins(BUILD_MODE),\n gtkxWorker(),\n gtkxBuiltUrl(assetBase),\n gtkxNative(root),\n gtkxSelfContained(),\n ],\n build: {\n ssr: entry,\n assetsInlineLimit: 0,\n rolldownOptions: {\n output: {\n entryFileNames: ENTRY_FILE_NAMES,\n chunkFileNames: posix.join(assetsDir, CHUNK_STEM + ESM_EXTENSION),\n keepNames: true,\n },\n },\n },\n };\n\n const merged: InlineConfig = mergeConfig(mergeConfig(buildDefaults, viteConfig ?? {}), forced);\n await viteBuild({ ...merged, ssr: { ...merged.ssr, noExternal: true } });\n\n return join(merged.build?.outDir ?? DEFAULT_OUT_DIR, ENTRY_FILE_NAMES);\n};\n\nexport { build };\n"]}
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAqB,WAAW,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQtD,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AACpC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,aAAa,GAAiB;IAChC,KAAK,EAAE;QACH,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,KAAK;KACnB;IACD,MAAM,EAAE;QACJ,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;KACrD;CACJ,CAAC;AAEF,MAAM,KAAK,GAAG,KAAK,EAAE,OAAqB,EAAmB,EAAE;IAC3D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACvD,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,UAAU,EAAE,KAAK,EAAE,SAAS,IAAI,kBAAkB,CAAC;IAErE,MAAM,MAAM,GAAiB;QACzB,OAAO,EAAE;YACL,GAAG,eAAe,CAAC,UAAU,CAAC;YAC9B,UAAU,EAAE;YACZ,YAAY,CAAC,SAAS,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC;YAChB,mBAAmB,CAAC,IAAI,CAAC;YACzB,iBAAiB,EAAE;SACtB;QACD,KAAK,EAAE;YACH,GAAG,EAAE,KAAK;YACV,iBAAiB,EAAE,CAAC;YACpB,eAAe,EAAE;gBACb,MAAM,EAAE;oBACJ,cAAc,EAAE,gBAAgB;oBAChC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,aAAa,CAAC;oBACjE,SAAS,EAAE,IAAI;iBAClB;aACJ;SACJ;KACJ,CAAC;IAEF,MAAM,MAAM,GAAiB,WAAW,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/F,MAAM,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAEzE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC","sourcesContent":["import { join, posix } from \"node:path\";\nimport { type InlineConfig, mergeConfig, build as viteBuild } from \"vite\";\nimport { gtkxBuiltUrl } from \"./vite-plugins/built-url.js\";\nimport { gtkxBundledPackages } from \"./vite-plugins/bundled-packages.js\";\nimport { BUNDLE_FILENAME, ESM_EXTENSION } from \"./vite-plugins/esm-extension.js\";\nimport { gtkxVitePlugins } from \"./vite-plugins/index.js\";\nimport { gtkxNative } from \"./vite-plugins/native.js\";\nimport { gtkxSelfContained } from \"./vite-plugins/self-contained.js\";\nimport { gtkxWorker } from \"./vite-plugins/worker.js\";\n\ntype BuildOptions = {\n entry: string;\n assetBase?: string | undefined;\n vite?: InlineConfig | undefined;\n};\n\nconst BUILD_MODE = \"production\";\nconst CHUNK_STEM = \"[name]-[hash]\";\nconst DEFAULT_OUT_DIR = \"dist\";\nconst DEFAULT_ASSETS_DIR = \"assets\";\nconst ENTRY_FILE_NAMES = BUNDLE_FILENAME;\n\nconst buildDefaults: InlineConfig = {\n build: {\n ssrEmitAssets: true,\n outDir: DEFAULT_OUT_DIR,\n minify: true,\n cssMinify: false,\n },\n define: {\n \"process.env.NODE_ENV\": JSON.stringify(BUILD_MODE),\n },\n};\n\nconst build = async (options: BuildOptions): Promise<string> => {\n const { entry, assetBase, vite: viteConfig } = options;\n const root = viteConfig?.root ?? process.cwd();\n const assetsDir = viteConfig?.build?.assetsDir ?? DEFAULT_ASSETS_DIR;\n\n const forced: InlineConfig = {\n plugins: [\n ...gtkxVitePlugins(BUILD_MODE),\n gtkxWorker(),\n gtkxBuiltUrl(assetBase),\n gtkxNative(root),\n gtkxBundledPackages(root),\n gtkxSelfContained(),\n ],\n build: {\n ssr: entry,\n assetsInlineLimit: 0,\n rolldownOptions: {\n output: {\n entryFileNames: ENTRY_FILE_NAMES,\n chunkFileNames: posix.join(assetsDir, CHUNK_STEM + ESM_EXTENSION),\n keepNames: true,\n },\n },\n },\n };\n\n const merged: InlineConfig = mergeConfig(mergeConfig(buildDefaults, viteConfig ?? {}), forced);\n await viteBuild({ ...merged, ssr: { ...merged.ssr, noExternal: true } });\n\n return join(merged.build?.outDir ?? DEFAULT_OUT_DIR, ENTRY_FILE_NAMES);\n};\n\nexport { build };\n"]}
@@ -1,4 +1,4 @@
1
- import type { DeploySettings } from "../types.js";
2
- declare const renderCopyright: (settings: DeploySettings) => string;
1
+ import type { DeploySettings, NoticeSection } from "../types.js";
2
+ declare const renderCopyright: (settings: DeploySettings, sections: NoticeSection[]) => string;
3
3
  export { renderCopyright };
4
4
  //# sourceMappingURL=copyright.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"copyright.d.ts","sourceRoot":"","sources":["../../../src/deploy/freedesktop/copyright.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA4BlD,QAAA,MAAM,eAAe,GAAI,UAAU,cAAc,KAAG,MASpC,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"copyright.d.ts","sourceRoot":"","sources":["../../../src/deploy/freedesktop/copyright.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAU,aAAa,EAAE,MAAM,aAAa,CAAC;AA+JzE,QAAA,MAAM,eAAe,GAAI,UAAU,cAAc,EAAE,UAAU,aAAa,EAAE,KAAG,MAa9E,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,33 +1,124 @@
1
1
  import { readFileSync } from "node:fs";
2
+ import { BUNDLE_FILENAME } from "../../vite-plugins/esm-extension.js";
2
3
  const FORMAT_URL = "https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/";
3
4
  const CONTINUATION_BLANK = " .";
4
- const indentLicenseBody = (body) => body
5
- .split("\n")
6
- .map((line) => (line.trim().length === 0 ? CONTINUATION_BLANK : ` ${line}`));
7
- const licenseBody = (licenseFile) => {
5
+ const UNKNOWN_COPYRIGHT = "unknown";
6
+ const UNKNOWN_LICENSE = "unknown";
7
+ const LICENSE_SEPARATOR = " and ";
8
+ const SPDX_GROUPING = /[()]/g;
9
+ const SPDX_OPERATOR = /\b(?:AND|OR|WITH)\b/g;
10
+ const REPEATED_SPACE = / {2,}/g;
11
+ const OUTSIDE_NAME = /[^\w.+-]+/g;
12
+ const NAME_JOINER = "-";
13
+ const NAME_TOKEN = /^[\w.+-]+$/;
14
+ const NAME_CONNECTIVE = / (?:or|with) /;
15
+ const indentLine = (line) => (line.trim().length === 0 ? CONTINUATION_BLANK : ` ${line}`);
16
+ const foldedField = (name, lines) => {
17
+ const [first, ...rest] = lines;
18
+ return first === undefined ? [] : [`${name}: ${first}`, ...rest.map((line) => indentLine(line))];
19
+ };
20
+ const licenseText = (licenseFile) => {
8
21
  if (licenseFile === null) {
9
- return [];
22
+ return null;
10
23
  }
11
24
  try {
12
- return indentLicenseBody(readFileSync(licenseFile, "utf8").trimEnd());
25
+ return readFileSync(licenseFile, "utf8").trimEnd();
13
26
  }
14
27
  catch {
15
- return [];
28
+ return null;
16
29
  }
17
30
  };
18
- const headerLines = (settings) => [
31
+ const shortName = (license) => license
32
+ .replaceAll(SPDX_GROUPING, " ")
33
+ .replaceAll(SPDX_OPERATOR, (operator) => operator.toLowerCase())
34
+ .replaceAll(REPEATED_SPACE, " ")
35
+ .trim();
36
+ const isShortName = (part) => part.split(NAME_CONNECTIVE).every((token) => NAME_TOKEN.test(token));
37
+ const namePart = (part) => isShortName(part) ? part : part.split(OUTSIDE_NAME).filter((token) => token.length > 0).join(NAME_JOINER);
38
+ const shortNames = (license) => shortName(license).split(LICENSE_SEPARATOR).map((part) => namePart(part)).filter((part) => part.length > 0);
39
+ const licenseNames = (notices) => {
40
+ const names = [...new Set(notices.flatMap((notice) => shortNames(notice.license)))];
41
+ return names.length === 0 ? UNKNOWN_LICENSE : names.join(LICENSE_SEPARATOR);
42
+ };
43
+ const compactNotice = (notice) => {
44
+ const label = `${notice.subject} (${licenseNames([notice])})`;
45
+ return notice.source === null ? label : `${label}: ${notice.source}`;
46
+ };
47
+ const noticeBody = (notice, reproduced) => {
48
+ const head = [
49
+ "",
50
+ `${notice.subject} (${licenseNames([notice])})`,
51
+ ...(notice.source === null ? [] : [`Source: ${notice.source}`]),
52
+ ];
53
+ if (notice.text === null || reproduced.has(notice.text)) {
54
+ return head;
55
+ }
56
+ reproduced.add(notice.text);
57
+ return [...head, "", ...notice.text.split("\n")];
58
+ };
59
+ const copyrightNames = (notices) => {
60
+ const lines = [...new Set(notices.flatMap((notice) => notice.copyright))];
61
+ return lines.length === 0 ? [UNKNOWN_COPYRIGHT] : lines;
62
+ };
63
+ const stanzaComment = (sections) => sections.flatMap((section, index) => [...(index === 0 ? [] : [""]), section.title, ...section.summary]);
64
+ const sectionComment = (section) => [
65
+ section.title,
66
+ "",
67
+ ...section.summary,
68
+ "",
69
+ ...section.notices.map((notice) => compactNotice(notice)),
70
+ ];
71
+ const bundlePath = (settings) => `lib/${settings.binaryName}/${BUNDLE_FILENAME}`;
72
+ const applicationNotice = (settings) => ({
73
+ subject: settings.name,
74
+ license: settings.license,
75
+ source: settings.homepage,
76
+ copyright: [settings.copyright],
77
+ text: null,
78
+ });
79
+ const stanzaNotices = (settings, files, sections) => {
80
+ const own = files === bundlePath(settings) ? [applicationNotice(settings)] : [];
81
+ return [...own, ...sections.flatMap((section) => section.notices)];
82
+ };
83
+ const fileStanza = ({ settings, files, sections, reproduced }) => {
84
+ const notices = stanzaNotices(settings, files, sections);
85
+ const texts = notices.flatMap((notice) => noticeBody(notice, reproduced));
86
+ return [
87
+ `Files: ${files}`,
88
+ ...foldedField("Comment", stanzaComment(sections)),
89
+ ...foldedField("Copyright", copyrightNames(notices)),
90
+ ...foldedField("License", [licenseNames(notices), ...texts]),
91
+ "",
92
+ ];
93
+ };
94
+ const filePatterns = (sections) => [...new Set(sections.flatMap((section) => section.files))];
95
+ const sectionsFor = (sections, files) => sections.filter((section) => section.files.includes(files));
96
+ const headerComment = (sections) => sections.filter((section) => section.files.length === 0).flatMap((section) => sectionComment(section));
97
+ const headerLines = (settings, sections) => [
19
98
  `Format: ${FORMAT_URL}`,
20
99
  `Upstream-Name: ${settings.name}`,
21
100
  ...(settings.homepage === null ? [] : [`Source: ${settings.homepage}`]),
101
+ ...foldedField("Comment", headerComment(sections)),
22
102
  ];
23
- const renderCopyright = (settings) => [
24
- ...headerLines(settings),
25
- "",
103
+ const applicationStanza = (settings, text) => [
26
104
  "Files: *",
27
105
  `Copyright: ${settings.copyright}`,
28
- `License: ${settings.license}`,
29
- ...licenseBody(settings.paths.licenseFile),
106
+ ...foldedField("License", [
107
+ licenseNames([applicationNotice(settings)]),
108
+ ...(text === null ? [] : text.split("\n")),
109
+ ]),
30
110
  "",
31
- ].join("\n");
111
+ ];
112
+ const renderCopyright = (settings, sections) => {
113
+ const own = licenseText(settings.paths.licenseFile);
114
+ const reproduced = new Set(own === null ? [] : [own]);
115
+ const stanzas = filePatterns(sections).flatMap((files) => fileStanza({ settings, files, sections: sectionsFor(sections, files), reproduced }));
116
+ return [
117
+ ...headerLines(settings, sections),
118
+ "",
119
+ ...applicationStanza(settings, own),
120
+ ...stanzas,
121
+ ].join("\n");
122
+ };
32
123
  export { renderCopyright };
33
124
  //# sourceMappingURL=copyright.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copyright.js","sourceRoot":"","sources":["../../../src/deploy/freedesktop/copyright.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,UAAU,GAAG,oEAAoE,CAAC;AACxF,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAY,EAAE,CACjD,IAAI;KACC,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;AAErF,MAAM,WAAW,GAAG,CAAC,WAA0B,EAAY,EAAE;IACzD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,OAAO,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAAwB,EAAY,EAAE,CAAC;IACxD,WAAW,UAAU,EAAE;IACvB,kBAAkB,QAAQ,CAAC,IAAI,EAAE;IACjC,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;CAC1E,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAAwB,EAAU,EAAE,CACzD;IACI,GAAG,WAAW,CAAC,QAAQ,CAAC;IACxB,EAAE;IACF,UAAU;IACV,cAAc,QAAQ,CAAC,SAAS,EAAE;IAClC,YAAY,QAAQ,CAAC,OAAO,EAAE;IAC9B,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;IAC1C,EAAE;CACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { DeploySettings } from \"../types.js\";\n\nconst FORMAT_URL = \"https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\";\nconst CONTINUATION_BLANK = \" .\";\n\nconst indentLicenseBody = (body: string): string[] =>\n body\n .split(\"\\n\")\n .map((line) => (line.trim().length === 0 ? CONTINUATION_BLANK : ` ${line}`));\n\nconst licenseBody = (licenseFile: string | null): string[] => {\n if (licenseFile === null) {\n return [];\n }\n\n try {\n return indentLicenseBody(readFileSync(licenseFile, \"utf8\").trimEnd());\n } catch {\n return [];\n }\n};\n\nconst headerLines = (settings: DeploySettings): string[] => [\n `Format: ${FORMAT_URL}`,\n `Upstream-Name: ${settings.name}`,\n ...(settings.homepage === null ? [] : [`Source: ${settings.homepage}`]),\n];\n\nconst renderCopyright = (settings: DeploySettings): string =>\n [\n ...headerLines(settings),\n \"\",\n \"Files: *\",\n `Copyright: ${settings.copyright}`,\n `License: ${settings.license}`,\n ...licenseBody(settings.paths.licenseFile),\n \"\",\n ].join(\"\\n\");\n\nexport { renderCopyright };\n"]}
1
+ {"version":3,"file":"copyright.js","sourceRoot":"","sources":["../../../src/deploy/freedesktop/copyright.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { DeploySettings, Notice, NoticeSection } from \"../types.js\";\nimport { BUNDLE_FILENAME } from \"../../vite-plugins/esm-extension.js\";\n\ntype FileStanza = {\n settings: DeploySettings;\n files: string;\n sections: NoticeSection[];\n reproduced: Set<string>;\n};\n\nconst FORMAT_URL = \"https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\";\nconst CONTINUATION_BLANK = \" .\";\nconst UNKNOWN_COPYRIGHT = \"unknown\";\nconst UNKNOWN_LICENSE = \"unknown\";\nconst LICENSE_SEPARATOR = \" and \";\nconst SPDX_GROUPING = /[()]/g;\nconst SPDX_OPERATOR = /\\b(?:AND|OR|WITH)\\b/g;\nconst REPEATED_SPACE = / {2,}/g;\nconst OUTSIDE_NAME = /[^\\w.+-]+/g;\nconst NAME_JOINER = \"-\";\nconst NAME_TOKEN = /^[\\w.+-]+$/;\nconst NAME_CONNECTIVE = / (?:or|with) /;\n\nconst indentLine = (line: string): string => (line.trim().length === 0 ? CONTINUATION_BLANK : ` ${line}`);\n\nconst foldedField = (name: string, lines: string[]): string[] => {\n const [first, ...rest] = lines;\n\n return first === undefined ? [] : [`${name}: ${first}`, ...rest.map((line) => indentLine(line))];\n};\n\nconst licenseText = (licenseFile: string | null): string | null => {\n if (licenseFile === null) {\n return null;\n }\n\n try {\n return readFileSync(licenseFile, \"utf8\").trimEnd();\n } catch {\n return null;\n }\n};\n\nconst shortName = (license: string): string =>\n license\n .replaceAll(SPDX_GROUPING, \" \")\n .replaceAll(SPDX_OPERATOR, (operator) => operator.toLowerCase())\n .replaceAll(REPEATED_SPACE, \" \")\n .trim();\n\nconst isShortName = (part: string): boolean =>\n part.split(NAME_CONNECTIVE).every((token) => NAME_TOKEN.test(token));\n\nconst namePart = (part: string): string =>\n isShortName(part) ? part : part.split(OUTSIDE_NAME).filter((token) => token.length > 0).join(NAME_JOINER);\n\nconst shortNames = (license: string): string[] =>\n shortName(license).split(LICENSE_SEPARATOR).map((part) => namePart(part)).filter((part) => part.length > 0);\n\nconst licenseNames = (notices: Notice[]): string => {\n const names = [...new Set(notices.flatMap((notice) => shortNames(notice.license)))];\n\n return names.length === 0 ? UNKNOWN_LICENSE : names.join(LICENSE_SEPARATOR);\n};\n\nconst compactNotice = (notice: Notice): string => {\n const label = `${notice.subject} (${licenseNames([notice])})`;\n\n return notice.source === null ? label : `${label}: ${notice.source}`;\n};\n\nconst noticeBody = (notice: Notice, reproduced: Set<string>): string[] => {\n const head = [\n \"\",\n `${notice.subject} (${licenseNames([notice])})`,\n ...(notice.source === null ? [] : [`Source: ${notice.source}`]),\n ];\n\n if (notice.text === null || reproduced.has(notice.text)) {\n return head;\n }\n\n reproduced.add(notice.text);\n\n return [...head, \"\", ...notice.text.split(\"\\n\")];\n};\n\nconst copyrightNames = (notices: Notice[]): string[] => {\n const lines = [...new Set(notices.flatMap((notice) => notice.copyright))];\n\n return lines.length === 0 ? [UNKNOWN_COPYRIGHT] : lines;\n};\n\nconst stanzaComment = (sections: NoticeSection[]): string[] =>\n sections.flatMap((section, index) => [...(index === 0 ? [] : [\"\"]), section.title, ...section.summary]);\n\nconst sectionComment = (section: NoticeSection): string[] => [\n section.title,\n \"\",\n ...section.summary,\n \"\",\n ...section.notices.map((notice) => compactNotice(notice)),\n];\n\nconst bundlePath = (settings: DeploySettings): string => `lib/${settings.binaryName}/${BUNDLE_FILENAME}`;\n\nconst applicationNotice = (settings: DeploySettings): Notice => ({\n subject: settings.name,\n license: settings.license,\n source: settings.homepage,\n copyright: [settings.copyright],\n text: null,\n});\n\nconst stanzaNotices = (settings: DeploySettings, files: string, sections: NoticeSection[]): Notice[] => {\n const own = files === bundlePath(settings) ? [applicationNotice(settings)] : [];\n\n return [...own, ...sections.flatMap((section) => section.notices)];\n};\n\nconst fileStanza = ({ settings, files, sections, reproduced }: FileStanza): string[] => {\n const notices = stanzaNotices(settings, files, sections);\n const texts = notices.flatMap((notice) => noticeBody(notice, reproduced));\n\n return [\n `Files: ${files}`,\n ...foldedField(\"Comment\", stanzaComment(sections)),\n ...foldedField(\"Copyright\", copyrightNames(notices)),\n ...foldedField(\"License\", [licenseNames(notices), ...texts]),\n \"\",\n ];\n};\n\nconst filePatterns = (sections: NoticeSection[]): string[] =>\n [...new Set(sections.flatMap((section) => section.files))];\n\nconst sectionsFor = (sections: NoticeSection[], files: string): NoticeSection[] =>\n sections.filter((section) => section.files.includes(files));\n\nconst headerComment = (sections: NoticeSection[]): string[] =>\n sections.filter((section) => section.files.length === 0).flatMap((section) => sectionComment(section));\n\nconst headerLines = (settings: DeploySettings, sections: NoticeSection[]): string[] => [\n `Format: ${FORMAT_URL}`,\n `Upstream-Name: ${settings.name}`,\n ...(settings.homepage === null ? [] : [`Source: ${settings.homepage}`]),\n ...foldedField(\"Comment\", headerComment(sections)),\n];\n\nconst applicationStanza = (settings: DeploySettings, text: string | null): string[] => [\n \"Files: *\",\n `Copyright: ${settings.copyright}`,\n ...foldedField(\"License\", [\n licenseNames([applicationNotice(settings)]),\n ...(text === null ? [] : text.split(\"\\n\")),\n ]),\n \"\",\n];\n\nconst renderCopyright = (settings: DeploySettings, sections: NoticeSection[]): string => {\n const own = licenseText(settings.paths.licenseFile);\n const reproduced: Set<string> = new Set(own === null ? [] : [own]);\n\n const stanzas = filePatterns(sections).flatMap((files) =>\n fileStanza({ settings, files, sections: sectionsFor(sections, files), reproduced }));\n\n return [\n ...headerLines(settings, sections),\n \"\",\n ...applicationStanza(settings, own),\n ...stanzas,\n ].join(\"\\n\");\n};\n\nexport { renderCopyright };\n"]}
@@ -1,3 +1,7 @@
1
- declare const downloadNode: (version: string, arch: string, destDir: string) => Promise<string>;
1
+ type DownloadedNode = {
2
+ path: string;
3
+ licenseFile: string;
4
+ };
5
+ declare const downloadNode: (version: string, arch: string, destDir: string) => Promise<DownloadedNode>;
2
6
  export { downloadNode };
3
7
  //# sourceMappingURL=download.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/download.ts"],"names":[],"mappings":"AA4BA,QAAA,MAAM,YAAY,GAAU,SAAS,MAAM,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,MAAM,CAiB1F,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/download.ts"],"names":[],"mappings":"AAOA,KAAK,cAAc,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AA2BF,QAAA,MAAM,YAAY,GAAU,SAAS,MAAM,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,cAAc,CAiBlG,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -2,9 +2,11 @@ import { mkdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { runCliTool } from "../../internal/run-cli-tool.js";
4
4
  import { cachedDigest, cacheDir, downloadFile, publishedDigest } from "../download.js";
5
+ import { LICENSE_FILENAME } from "./license.js";
5
6
  const DIST_BASE_URL = "https://nodejs.org/dist";
6
- const STRIP_COMPONENTS = "2";
7
+ const STRIP_COMPONENTS = "1";
7
8
  const CHECKSUMS_FILE = "SHASUMS256.txt";
9
+ const NODE_PATH = "bin/node";
8
10
  const releaseName = (version, arch) => `node-v${version}-linux-${arch}`;
9
11
  const digestRequest = (version, assetName, dir) => ({
10
12
  url: `${DIST_BASE_URL}/v${version}/${CHECKSUMS_FILE}`,
@@ -13,10 +15,11 @@ const digestRequest = (version, assetName, dir) => ({
13
15
  subject: `Node.js ${version}`,
14
16
  });
15
17
  const extractNode = (archive, dir, version, arch) => {
18
+ const release = releaseName(version, arch);
16
19
  runCliTool({
17
20
  tool: "tar",
18
21
  args: ["-xJf", archive, "-C", dir, "--strip-components", STRIP_COMPONENTS,
19
- `${releaseName(version, arch)}/bin/node`],
22
+ `${release}/${NODE_PATH}`, `${release}/${LICENSE_FILENAME}`],
20
23
  target: `Node.js ${version}`,
21
24
  });
22
25
  };
@@ -33,7 +36,7 @@ const downloadNode = async (version, arch, destDir) => {
33
36
  });
34
37
  mkdirSync(destDir, { recursive: true });
35
38
  extractNode(archive, destDir, version, arch);
36
- return join(destDir, "node");
39
+ return { path: join(destDir, NODE_PATH), licenseFile: join(destDir, LICENSE_FILENAME) };
37
40
  };
38
41
  export { downloadNode };
39
42
  //# sourceMappingURL=download.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvF,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAExC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE,CAAC,SAAS,OAAO,UAAU,IAAI,EAAE,CAAC;AAEhG,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,SAAiB,EAAE,GAAW,EAAiB,EAAE,CAAC,CAAC;IACvF,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,cAAc,EAAE;IACrD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,SAAS,CAAC;IACtC,SAAS;IACT,OAAO,EAAE,WAAW,OAAO,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAE,IAAY,EAAQ,EAAE;IACtF,UAAU,CAAC;QACP,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,gBAAgB;YACrE,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC;QAC7C,MAAM,EAAE,WAAW,OAAO,EAAE;KAC/B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,OAAe,EAAmB,EAAE;IAC3F,MAAM,SAAS,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,SAAS,EAAE;QAChD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QAC1B,KAAK,EAAE,WAAW,OAAO,cAAc,IAAI,EAAE;QAC7C,MAAM,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC;QACnC,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;KAC9C,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7C,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { DigestRequest } from \"../download.js\";\nimport { runCliTool } from \"../../internal/run-cli-tool.js\";\nimport { cachedDigest, cacheDir, downloadFile, publishedDigest } from \"../download.js\";\n\nconst DIST_BASE_URL = \"https://nodejs.org/dist\";\nconst STRIP_COMPONENTS = \"2\";\nconst CHECKSUMS_FILE = \"SHASUMS256.txt\";\n\nconst releaseName = (version: string, arch: string): string => `node-v${version}-linux-${arch}`;\n\nconst digestRequest = (version: string, assetName: string, dir: string): DigestRequest => ({\n url: `${DIST_BASE_URL}/v${version}/${CHECKSUMS_FILE}`,\n dest: join(dir, `${assetName}.sha256`),\n assetName,\n subject: `Node.js ${version}`,\n});\n\nconst extractNode = (archive: string, dir: string, version: string, arch: string): void => {\n runCliTool({\n tool: \"tar\",\n args: [\"-xJf\", archive, \"-C\", dir, \"--strip-components\", STRIP_COMPONENTS,\n `${releaseName(version, arch)}/bin/node`],\n target: `Node.js ${version}`,\n });\n};\n\nconst downloadNode = async (version: string, arch: string, destDir: string): Promise<string> => {\n const assetName = `${releaseName(version, arch)}.tar.xz`;\n const dir = cacheDir([\"node\", `${version}-linux-${arch}`]);\n const request = digestRequest(version, assetName, dir);\n\n const archive = await downloadFile({\n url: `${DIST_BASE_URL}/v${version}/${assetName}`,\n dest: join(dir, assetName),\n label: `Node.js ${version} for linux-${arch}`,\n sha256: await cachedDigest(request),\n freshSha256: () => publishedDigest(request),\n });\n\n mkdirSync(destDir, { recursive: true });\n extractNode(archive, destDir, version, arch);\n\n return join(destDir, \"node\");\n};\n\nexport { downloadNode };\n"]}
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAOhD,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAChD,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,IAAY,EAAU,EAAE,CAAC,SAAS,OAAO,UAAU,IAAI,EAAE,CAAC;AAEhG,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,SAAiB,EAAE,GAAW,EAAiB,EAAE,CAAC,CAAC;IACvF,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,cAAc,EAAE;IACrD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,SAAS,CAAC;IACtC,SAAS;IACT,OAAO,EAAE,WAAW,OAAO,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAE,IAAY,EAAQ,EAAE;IACtF,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE3C,UAAU,CAAC;QACP,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,gBAAgB;YACrE,GAAG,OAAO,IAAI,SAAS,EAAE,EAAE,GAAG,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChE,MAAM,EAAE,WAAW,OAAO,EAAE;KAC/B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,OAAe,EAA2B,EAAE;IACnG,MAAM,SAAS,GAAG,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,OAAO,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QAC/B,GAAG,EAAE,GAAG,aAAa,KAAK,OAAO,IAAI,SAAS,EAAE;QAChD,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QAC1B,KAAK,EAAE,WAAW,OAAO,cAAc,IAAI,EAAE;QAC7C,MAAM,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC;QACnC,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;KAC9C,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { DigestRequest } from \"../download.js\";\nimport { runCliTool } from \"../../internal/run-cli-tool.js\";\nimport { cachedDigest, cacheDir, downloadFile, publishedDigest } from \"../download.js\";\nimport { LICENSE_FILENAME } from \"./license.js\";\n\ntype DownloadedNode = {\n path: string;\n licenseFile: string;\n};\n\nconst DIST_BASE_URL = \"https://nodejs.org/dist\";\nconst STRIP_COMPONENTS = \"1\";\nconst CHECKSUMS_FILE = \"SHASUMS256.txt\";\nconst NODE_PATH = \"bin/node\";\n\nconst releaseName = (version: string, arch: string): string => `node-v${version}-linux-${arch}`;\n\nconst digestRequest = (version: string, assetName: string, dir: string): DigestRequest => ({\n url: `${DIST_BASE_URL}/v${version}/${CHECKSUMS_FILE}`,\n dest: join(dir, `${assetName}.sha256`),\n assetName,\n subject: `Node.js ${version}`,\n});\n\nconst extractNode = (archive: string, dir: string, version: string, arch: string): void => {\n const release = releaseName(version, arch);\n\n runCliTool({\n tool: \"tar\",\n args: [\"-xJf\", archive, \"-C\", dir, \"--strip-components\", STRIP_COMPONENTS,\n `${release}/${NODE_PATH}`, `${release}/${LICENSE_FILENAME}`],\n target: `Node.js ${version}`,\n });\n};\n\nconst downloadNode = async (version: string, arch: string, destDir: string): Promise<DownloadedNode> => {\n const assetName = `${releaseName(version, arch)}.tar.xz`;\n const dir = cacheDir([\"node\", `${version}-linux-${arch}`]);\n const request = digestRequest(version, assetName, dir);\n\n const archive = await downloadFile({\n url: `${DIST_BASE_URL}/v${version}/${assetName}`,\n dest: join(dir, assetName),\n label: `Node.js ${version} for linux-${arch}`,\n sha256: await cachedDigest(request),\n freshSha256: () => publishedDigest(request),\n });\n\n mkdirSync(destDir, { recursive: true });\n extractNode(archive, destDir, version, arch);\n\n return { path: join(destDir, NODE_PATH), licenseFile: join(destDir, LICENSE_FILENAME) };\n};\n\nexport { downloadNode };\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { DeploySettings, NodeRuntime } from "../types.js";
2
+ declare const sourcePathFor: (settings: DeploySettings) => string;
2
3
  declare const resolveNodeRuntime: (settings: DeploySettings) => Promise<NodeRuntime>;
3
- export { resolveNodeRuntime };
4
+ export { resolveNodeRuntime, sourcePathFor };
4
5
  //# 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;AAgE/D,QAAA,MAAM,kBAAkB,GAAU,UAAU,cAAc,KAAG,OAAO,CAAC,WAAW,CAU/E,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
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"}
@@ -5,6 +5,7 @@ import { runCliTool } from "../../internal/run-cli-tool.js";
5
5
  import { downloadNode } from "./download.js";
6
6
  import { readElfInfo } from "./elf.js";
7
7
  import { assertPortableNode } from "./guard.js";
8
+ import { licenseBesideNode } from "./license.js";
8
9
  const BYTES_PER_MIB = 1024 * 1024;
9
10
  const EXECUTABLE_MODE = 0o755;
10
11
  const NODE_FILENAME = "node";
@@ -35,9 +36,9 @@ const stageNode = (settings, sourcePath) => {
35
36
  return staged;
36
37
  };
37
38
  const stageDownloadedNode = async (settings, version) => {
38
- const staged = await downloadNode(version, settings.arch.node, settings.paths.runtime);
39
- chmodSync(staged, EXECUTABLE_MODE);
40
- return staged;
39
+ const downloaded = await downloadNode(version, settings.arch.node, settings.paths.runtime);
40
+ chmodSync(downloaded.path, EXECUTABLE_MODE);
41
+ return downloaded;
41
42
  };
42
43
  const stageFromSource = async (settings, version, source) => {
43
44
  if (source === "download") {
@@ -45,17 +46,17 @@ const stageFromSource = async (settings, version, source) => {
45
46
  }
46
47
  const sourcePath = sourcePathFor(settings);
47
48
  assertPortableNode(readElfInfo(sourcePath), source);
48
- return stageNode(settings, sourcePath);
49
+ return { path: stageNode(settings, sourcePath), licenseFile: licenseBesideNode(sourcePath) };
49
50
  };
50
51
  const resolveNodeRuntime = async (settings) => {
51
52
  const node = settings.deploy.node ?? {};
52
53
  const source = node.source ?? "download";
53
54
  const version = node.version ?? process.versions.node;
54
55
  const staged = await stageFromSource(settings, version, source);
55
- const isStripped = node.shouldStrip === false ? false : didStripBinary(staged);
56
- const elf = readElfInfo(staged);
57
- info(`Bundled Node.js v${version} (${megabytes(staged)} MiB, glibc >= ${elf.glibcFloor ?? "unknown"})`);
58
- return { path: staged, version, glibcFloor: elf.glibcFloor, isStripped };
56
+ const isStripped = node.shouldStrip === false ? false : didStripBinary(staged.path);
57
+ const elf = readElfInfo(staged.path);
58
+ info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, glibc >= ${elf.glibcFloor ?? "unknown"})`);
59
+ return { ...staged, version, glibcFloor: elf.glibcFloor, isStripped };
59
60
  };
60
- export { resolveNodeRuntime };
61
+ export { resolveNodeRuntime, sourcePathFor };
61
62
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAClC,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAU,EAAE;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IAEzC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAW,EAAE;IAC7C,IAAI,oBAAoB,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAE/F,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7F,MAAM,SAAS,GAAG,CAAC,QAAwB,EAAE,UAAkB,EAAU,EAAE;IACvE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3D,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,QAAwB,EAAE,OAAe,EAAmB,EAAE;IAC7F,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvF,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,QAAwB,EAAE,OAAe,EAAE,MAAc,EAAmB,EAAE;IACzG,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAEpD,OAAO,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAwB,EAAwB,EAAE;IAChF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,oBAAoB,OAAO,KAAK,SAAS,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,UAAU,IAAI,SAAS,GAAG,CAAC,CAAC;IAExG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC","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\";\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<string> => {\n const staged = await downloadNode(version, settings.arch.node, settings.paths.runtime);\n chmodSync(staged, EXECUTABLE_MODE);\n\n return staged;\n};\n\nconst stageFromSource = async (settings: DeploySettings, version: string, source: string): Promise<string> => {\n if (source === \"download\") {\n return stageDownloadedNode(settings, version);\n }\n\n const sourcePath = sourcePathFor(settings);\n assertPortableNode(readElfInfo(sourcePath), source);\n\n return stageNode(settings, 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);\n const elf = readElfInfo(staged);\n info(`Bundled Node.js v${version} (${megabytes(staged)} MiB, glibc >= ${elf.glibcFloor ?? \"unknown\"})`);\n\n return { path: staged, version, glibcFloor: elf.glibcFloor, isStripped };\n};\n\nexport { resolveNodeRuntime };\n"]}
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.glibcFloor ?? \"unknown\"})`);\n\n return { ...staged, version, glibcFloor: elf.glibcFloor, isStripped };\n};\n\nexport { resolveNodeRuntime, sourcePathFor };\n"]}
@@ -0,0 +1,4 @@
1
+ declare const LICENSE_FILENAME = "LICENSE";
2
+ declare const licenseBesideNode: (binary: string) => string | null;
3
+ export { LICENSE_FILENAME, licenseBesideNode };
4
+ //# sourceMappingURL=license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../../src/deploy/node-runtime/license.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,gBAAgB,YAAY,CAAC;AAiBnC,QAAA,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAC8B,CAAC;AAEpF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ const LICENSE_FILENAME = "LICENSE";
4
+ const NODE_MARKER = "Node.js";
5
+ const licenseCandidates = (binary) => {
6
+ const dir = dirname(binary);
7
+ return [join(dir, LICENSE_FILENAME), join(dir, "..", LICENSE_FILENAME)];
8
+ };
9
+ const isNodeLicense = (path) => {
10
+ try {
11
+ return readFileSync(path, "utf8").includes(NODE_MARKER);
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ };
17
+ const licenseBesideNode = (binary) => licenseCandidates(binary).find((candidate) => isNodeLicense(candidate)) ?? null;
18
+ export { LICENSE_FILENAME, licenseBesideNode };
19
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../../src/deploy/node-runtime/license.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,gBAAgB,GAAG,SAAS,CAAC;AACnC,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAY,EAAE;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE;IAC5C,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAiB,EAAE,CACxD,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC;AAEpF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nconst LICENSE_FILENAME = \"LICENSE\";\nconst NODE_MARKER = \"Node.js\";\n\nconst licenseCandidates = (binary: string): string[] => {\n const dir = dirname(binary);\n\n return [join(dir, LICENSE_FILENAME), join(dir, \"..\", LICENSE_FILENAME)];\n};\n\nconst isNodeLicense = (path: string): boolean => {\n try {\n return readFileSync(path, \"utf8\").includes(NODE_MARKER);\n } catch {\n return false;\n }\n};\n\nconst licenseBesideNode = (binary: string): string | null =>\n licenseCandidates(binary).find((candidate) => isNodeLicense(candidate)) ?? null;\n\nexport { LICENSE_FILENAME, licenseBesideNode };\n"]}
@@ -0,0 +1,8 @@
1
+ import type { DeploySettings, NodeRuntime, NoticeSection } from "../types.js";
2
+ type NoticeRequest = {
3
+ settings: DeploySettings;
4
+ node: NodeRuntime | null;
5
+ };
6
+ declare const collectNotices: ({ settings, node }: NoticeRequest) => NoticeSection[];
7
+ export { collectNotices };
8
+ //# sourceMappingURL=collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../../src/deploy/notices/collect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO9E,KAAK,aAAa,GAAG;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,oBAAoB,aAAa,KAAG,aAAa,EAWxE,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { dependencyNotices } from "./dependencies.js";
2
+ import { gtkxNotices } from "./gtkx.js";
3
+ import { libraryNotices } from "./libraries.js";
4
+ import { nodeNotices } from "./node-runtime.js";
5
+ import { bundledPackages } from "./packages.js";
6
+ const collectNotices = ({ settings, node }) => {
7
+ const packages = bundledPackages(settings);
8
+ const sections = [
9
+ nodeNotices(settings, node),
10
+ gtkxNotices(settings, packages),
11
+ dependencyNotices(settings, packages),
12
+ libraryNotices(settings),
13
+ ];
14
+ return sections.filter((section) => section.notices.length > 0);
15
+ };
16
+ export { collectNotices };
17
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../../src/deploy/notices/collect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,cAAc,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAiB,EAAmB,EAAE;IAC1E,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG;QACb,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC;QAC3B,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC/B,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACrC,cAAc,CAAC,QAAQ,CAAC;KAC3B,CAAC;IAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import type { DeploySettings, NodeRuntime, NoticeSection } from \"../types.js\";\nimport { dependencyNotices } from \"./dependencies.js\";\nimport { gtkxNotices } from \"./gtkx.js\";\nimport { libraryNotices } from \"./libraries.js\";\nimport { nodeNotices } from \"./node-runtime.js\";\nimport { bundledPackages } from \"./packages.js\";\n\ntype NoticeRequest = {\n settings: DeploySettings;\n node: NodeRuntime | null;\n};\n\nconst collectNotices = ({ settings, node }: NoticeRequest): NoticeSection[] => {\n const packages = bundledPackages(settings);\n\n const sections = [\n nodeNotices(settings, node),\n gtkxNotices(settings, packages),\n dependencyNotices(settings, packages),\n libraryNotices(settings),\n ];\n\n return sections.filter((section) => section.notices.length > 0);\n};\n\nexport { collectNotices };\n"]}
@@ -0,0 +1,5 @@
1
+ import type { DeploySettings, NoticeSection } from "../types.js";
2
+ import type { BundledPackage } from "./packages.js";
3
+ declare const dependencyNotices: (settings: DeploySettings, packages: BundledPackage[]) => NoticeSection;
4
+ export { dependencyNotices };
5
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/deploy/notices/dependencies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAU,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAsCpD,QAAA,MAAM,iBAAiB,GAAI,UAAU,cAAc,EAAE,UAAU,cAAc,EAAE,KAAG,aAUjF,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { warn } from "@gtkx/utils";
2
+ import { BUNDLE_FILENAME } from "../../vite-plugins/esm-extension.js";
3
+ import { isGtkxPackage } from "./gtkx.js";
4
+ const TITLE = "Bundled JavaScript dependencies";
5
+ const UNKNOWN_LICENSE = "unknown";
6
+ const SUMMARY = [
7
+ "Every package listed here is compiled into the application bundle, so its own terms travel with this",
8
+ "package. A dependency that ships a license file has it reproduced in full below; one that only declares",
9
+ "an SPDX identifier is listed with that identifier and with where its source can be obtained.",
10
+ ];
11
+ const subjectFor = (entry) => entry.version === null ? entry.name : `${entry.name} ${entry.version}`;
12
+ const noticeFor = (entry) => ({
13
+ subject: subjectFor(entry),
14
+ license: entry.license ?? UNKNOWN_LICENSE,
15
+ source: entry.source,
16
+ copyright: entry.copyright,
17
+ text: entry.text,
18
+ });
19
+ const warnUndeclared = (entries) => {
20
+ const undeclared = entries.filter((entry) => entry.isPresent && entry.license === null && entry.text === null);
21
+ if (undeclared.length === 0) {
22
+ return;
23
+ }
24
+ warn(`The third-party notices list ${undeclared.map((entry) => subjectFor(entry)).join(", ")} without any ` +
25
+ "license: the package declares no SPDX identifier and ships no license file. Check what the terms are " +
26
+ "before you publish this build, and ask upstream to record them.");
27
+ };
28
+ const dependencyNotices = (settings, packages) => {
29
+ const bundled = packages.filter((entry) => !isGtkxPackage(entry));
30
+ warnUndeclared(bundled);
31
+ return {
32
+ title: TITLE,
33
+ files: [`lib/${settings.binaryName}/${BUNDLE_FILENAME}`],
34
+ summary: SUMMARY,
35
+ notices: bundled.map((entry) => noticeFor(entry)),
36
+ };
37
+ };
38
+ export { dependencyNotices };
39
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/deploy/notices/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,KAAK,GAAG,iCAAiC,CAAC;AAChD,MAAM,eAAe,GAAG,SAAS,CAAC;AAElC,MAAM,OAAO,GAAG;IACZ,sGAAsG;IACtG,yGAAyG;IACzG,8FAA8F;CACjG,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAqB,EAAU,EAAE,CACjD,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAE3E,MAAM,SAAS,GAAG,CAAC,KAAqB,EAAU,EAAE,CAAC,CAAC;IAClD,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;IACzC,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,SAAS,EAAE,KAAK,CAAC,SAAS;IAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;CACnB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,OAAyB,EAAQ,EAAE;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAE/G,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACX,CAAC;IAED,IAAI,CACA,gCAAgC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe;QACtG,uGAAuG;QACvG,iEAAiE,CACpE,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAwB,EAAE,QAA0B,EAAiB,EAAE;IAC9F,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,cAAc,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,OAAO,QAAQ,CAAC,UAAU,IAAI,eAAe,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;KACpD,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import { warn } from \"@gtkx/utils\";\nimport type { DeploySettings, Notice, NoticeSection } from \"../types.js\";\nimport type { BundledPackage } from \"./packages.js\";\nimport { BUNDLE_FILENAME } from \"../../vite-plugins/esm-extension.js\";\nimport { isGtkxPackage } from \"./gtkx.js\";\n\nconst TITLE = \"Bundled JavaScript dependencies\";\nconst UNKNOWN_LICENSE = \"unknown\";\n\nconst SUMMARY = [\n \"Every package listed here is compiled into the application bundle, so its own terms travel with this\",\n \"package. A dependency that ships a license file has it reproduced in full below; one that only declares\",\n \"an SPDX identifier is listed with that identifier and with where its source can be obtained.\",\n];\n\nconst subjectFor = (entry: BundledPackage): string =>\n entry.version === null ? entry.name : `${entry.name} ${entry.version}`;\n\nconst noticeFor = (entry: BundledPackage): Notice => ({\n subject: subjectFor(entry),\n license: entry.license ?? UNKNOWN_LICENSE,\n source: entry.source,\n copyright: entry.copyright,\n text: entry.text,\n});\n\nconst warnUndeclared = (entries: BundledPackage[]): void => {\n const undeclared = entries.filter((entry) => entry.isPresent && entry.license === null && entry.text === null);\n\n if (undeclared.length === 0) {\n return;\n }\n\n warn(\n `The third-party notices list ${undeclared.map((entry) => subjectFor(entry)).join(\", \")} without any ` +\n \"license: the package declares no SPDX identifier and ships no license file. Check what the terms are \" +\n \"before you publish this build, and ask upstream to record them.\",\n );\n};\n\nconst dependencyNotices = (settings: DeploySettings, packages: BundledPackage[]): NoticeSection => {\n const bundled = packages.filter((entry) => !isGtkxPackage(entry));\n warnUndeclared(bundled);\n\n return {\n title: TITLE,\n files: [`lib/${settings.binaryName}/${BUNDLE_FILENAME}`],\n summary: SUMMARY,\n notices: bundled.map((entry) => noticeFor(entry)),\n };\n};\n\nexport { dependencyNotices };\n"]}
@@ -0,0 +1,6 @@
1
+ import type { DeploySettings, NoticeSection } from "../types.js";
2
+ import type { BundledPackage } from "./packages.js";
3
+ declare const isGtkxPackage: (entry: BundledPackage) => boolean;
4
+ declare const gtkxNotices: (settings: DeploySettings, packages: BundledPackage[]) => NoticeSection;
5
+ export { gtkxNotices, isGtkxPackage };
6
+ //# sourceMappingURL=gtkx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gtkx.d.ts","sourceRoot":"","sources":["../../../src/deploy/notices/gtkx.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAU,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAapD,QAAA,MAAM,aAAa,GAAI,OAAO,cAAc,KAAG,OAAuC,CAAC;AA0DvF,QAAA,MAAM,WAAW,GAAI,UAAU,cAAc,EAAE,UAAU,cAAc,EAAE,KAAG,aAgB3E,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC"}