@gtkx/cli 2.0.0-beta.1 → 2.0.0-beta.2
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.
- package/dist/builder.d.ts +1 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +17 -5
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +4 -2
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +13 -8
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/codegen/store-resolver.d.ts +1 -1
- package/dist/codegen/store-resolver.d.ts.map +1 -1
- package/dist/codegen/store-resolver.js +2 -2
- package/dist/codegen/store-resolver.js.map +1 -1
- package/dist/commands/build.d.ts +5 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +83 -10
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/codegen.d.ts +1 -0
- package/dist/commands/codegen.d.ts.map +1 -1
- package/dist/commands/codegen.js +6 -5
- package/dist/commands/codegen.js.map +1 -1
- package/dist/commands/deploy.d.ts +1 -0
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +4 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -0
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +19 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/deploy/freedesktop/metainfo.d.ts.map +1 -1
- package/dist/deploy/freedesktop/metainfo.js +41 -2
- package/dist/deploy/freedesktop/metainfo.js.map +1 -1
- package/dist/deploy/nfpm/config.d.ts.map +1 -1
- package/dist/deploy/nfpm/config.js +5 -2
- package/dist/deploy/nfpm/config.js.map +1 -1
- package/dist/deploy/nfpm/contents.d.ts.map +1 -1
- package/dist/deploy/nfpm/contents.js +8 -0
- package/dist/deploy/nfpm/contents.js.map +1 -1
- package/dist/deploy/node-runtime/elf.d.ts +2 -1
- package/dist/deploy/node-runtime/elf.d.ts.map +1 -1
- package/dist/deploy/node-runtime/elf.js +32 -5
- package/dist/deploy/node-runtime/elf.js.map +1 -1
- package/dist/deploy/node-runtime/index.d.ts +2 -1
- package/dist/deploy/node-runtime/index.d.ts.map +1 -1
- package/dist/deploy/node-runtime/index.js +73 -4
- package/dist/deploy/node-runtime/index.js.map +1 -1
- package/dist/deploy/notices/node-runtime.js +2 -2
- package/dist/deploy/notices/node-runtime.js.map +1 -1
- package/dist/deploy/payload/launcher.d.ts.map +1 -1
- package/dist/deploy/payload/launcher.js +14 -1
- package/dist/deploy/payload/launcher.js.map +1 -1
- package/dist/deploy/payload/stage.js +1 -1
- package/dist/deploy/payload/stage.js.map +1 -1
- package/dist/deploy/run-deploy.d.ts +1 -0
- package/dist/deploy/run-deploy.d.ts.map +1 -1
- package/dist/deploy/run-deploy.js +100 -14
- package/dist/deploy/run-deploy.js.map +1 -1
- package/dist/deploy/settings/build-manifest.d.ts +6 -1
- package/dist/deploy/settings/build-manifest.d.ts.map +1 -1
- package/dist/deploy/settings/build-manifest.js +15 -4
- package/dist/deploy/settings/build-manifest.js.map +1 -1
- package/dist/deploy/settings/extra-files.d.ts +1 -1
- package/dist/deploy/settings/extra-files.d.ts.map +1 -1
- package/dist/deploy/settings/extra-files.js +22 -1
- package/dist/deploy/settings/extra-files.js.map +1 -1
- package/dist/deploy/settings/index.d.ts +1 -0
- package/dist/deploy/settings/index.d.ts.map +1 -1
- package/dist/deploy/settings/index.js +2 -1
- package/dist/deploy/settings/index.js.map +1 -1
- package/dist/deploy/settings/paths.d.ts +2 -1
- package/dist/deploy/settings/paths.d.ts.map +1 -1
- package/dist/deploy/settings/paths.js +113 -5
- package/dist/deploy/settings/paths.js.map +1 -1
- package/dist/deploy/targets/flatpak-source.d.ts.map +1 -1
- package/dist/deploy/targets/flatpak-source.js +11 -2
- package/dist/deploy/targets/flatpak-source.js.map +1 -1
- package/dist/deploy/types.d.ts +1 -0
- package/dist/deploy/types.d.ts.map +1 -1
- package/dist/deploy/types.js.map +1 -1
- package/dist/dev/headless.d.ts +3 -0
- package/dist/dev/headless.d.ts.map +1 -0
- package/dist/dev/headless.js +35 -0
- package/dist/dev/headless.js.map +1 -0
- package/dist/dev/runner-deps.js +1 -1
- package/dist/dev/runner-deps.js.map +1 -1
- package/dist/i18n/source-messages.d.ts.map +1 -1
- package/dist/i18n/source-messages.js +835 -1
- package/dist/i18n/source-messages.js.map +1 -1
- package/dist/internal/build-manifest.d.ts +5 -2
- package/dist/internal/build-manifest.d.ts.map +1 -1
- package/dist/internal/build-manifest.js +15 -2
- package/dist/internal/build-manifest.js.map +1 -1
- package/dist/internal/build-output.d.ts +8 -0
- package/dist/internal/build-output.d.ts.map +1 -0
- package/dist/internal/build-output.js +69 -0
- package/dist/internal/build-output.js.map +1 -0
- package/dist/internal/entry-arg.d.ts +4 -1
- package/dist/internal/entry-arg.d.ts.map +1 -1
- package/dist/internal/entry-arg.js +7 -1
- package/dist/internal/entry-arg.js.map +1 -1
- package/dist/internal/output-directory.d.ts +15 -0
- package/dist/internal/output-directory.d.ts.map +1 -0
- package/dist/internal/output-directory.js +490 -0
- package/dist/internal/output-directory.js.map +1 -0
- package/dist/internal/prepare-project.d.ts +2 -0
- package/dist/internal/prepare-project.d.ts.map +1 -1
- package/dist/internal/prepare-project.js +3 -3
- package/dist/internal/prepare-project.js.map +1 -1
- package/dist/internal/source-imports.js +1 -1
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/mcp/client.js +2 -2
- package/dist/mcp/client.js.map +1 -1
- package/dist/vite-plugins/build-manifest.d.ts +5 -1
- package/dist/vite-plugins/build-manifest.d.ts.map +1 -1
- package/dist/vite-plugins/build-manifest.js +2 -1
- package/dist/vite-plugins/build-manifest.js.map +1 -1
- package/dist/vite-plugins/i18n.d.ts.map +1 -1
- package/dist/vite-plugins/i18n.js +58 -6
- package/dist/vite-plugins/i18n.js.map +1 -1
- package/dist/vite-plugins/index.d.ts +8 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +6 -2
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/self-contained.d.ts.map +1 -1
- package/dist/vite-plugins/self-contained.js +159 -158
- package/dist/vite-plugins/self-contained.js.map +1 -1
- package/package.json +9 -9
- package/src/builder.ts +18 -5
- package/src/cli.ts +3 -0
- package/src/codegen/run-codegen.ts +15 -7
- package/src/codegen/store-resolver.ts +2 -2
- package/src/commands/build.ts +13 -2
- package/src/commands/codegen.ts +6 -5
- package/src/commands/deploy.ts +4 -2
- package/src/commands/dev.ts +20 -1
- package/src/deploy/freedesktop/metainfo.ts +73 -21
- package/src/deploy/nfpm/config.ts +5 -2
- package/src/deploy/nfpm/contents.ts +8 -0
- package/src/deploy/node-runtime/elf.ts +43 -5
- package/src/deploy/node-runtime/index.ts +105 -5
- package/src/deploy/notices/node-runtime.ts +2 -2
- package/src/deploy/payload/launcher.ts +20 -1
- package/src/deploy/payload/stage.ts +1 -1
- package/src/deploy/run-deploy.ts +56 -16
- package/src/deploy/settings/build-manifest.ts +28 -3
- package/src/deploy/settings/extra-files.ts +26 -2
- package/src/deploy/settings/index.ts +3 -1
- package/src/deploy/settings/paths.ts +70 -5
- package/src/deploy/targets/flatpak-source.ts +13 -2
- package/src/deploy/types.ts +1 -0
- package/src/dev/headless.ts +40 -0
- package/src/dev/runner-deps.ts +1 -1
- package/src/i18n/source-messages.ts +1220 -2
- package/src/internal/build-manifest.ts +25 -1
- package/src/internal/build-output.ts +99 -0
- package/src/internal/entry-arg.ts +8 -1
- package/src/internal/output-directory.ts +699 -0
- package/src/internal/prepare-project.ts +5 -5
- package/src/internal/source-imports.ts +1 -1
- package/src/mcp/client.ts +2 -2
- package/src/vite-plugins/build-manifest.ts +7 -1
- package/src/vite-plugins/i18n.ts +86 -5
- package/src/vite-plugins/index.ts +14 -7
- package/src/vite-plugins/self-contained.ts +184 -185
package/dist/commands/dev.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
declare const dev: import("citty").CommandDef<{
|
|
2
|
+
readonly headless: {
|
|
3
|
+
readonly type: "boolean";
|
|
4
|
+
readonly description: "Run on an isolated headless Wayland display";
|
|
5
|
+
};
|
|
6
|
+
readonly size: {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Headless display size as WIDTHxHEIGHT";
|
|
9
|
+
};
|
|
2
10
|
readonly entry: import("citty").PositionalArgDef;
|
|
3
11
|
readonly cwd: import("citty").StringArgDef;
|
|
4
12
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAUA,QAAA,MAAM,GAAG;;;;;;;;;;;EAgCP,CAAC;AAEH,OAAO,EAAE,GAAG,EAAE,CAAC"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { resolveConfigWatch } from "../codegen/run-codegen.js";
|
|
3
|
+
import { startHeadlessDevDisplay } from "../dev/headless.js";
|
|
3
4
|
import { runDevSupervisor } from "../dev/supervisor.js";
|
|
4
5
|
import { splitApplicationArgs } from "../internal/application-args.js";
|
|
5
6
|
import { entryArg } from "../internal/entry-arg.js";
|
|
@@ -12,12 +13,29 @@ const dev = defineCommand({
|
|
|
12
13
|
},
|
|
13
14
|
args: {
|
|
14
15
|
...entryArg,
|
|
16
|
+
headless: {
|
|
17
|
+
type: "boolean",
|
|
18
|
+
description: "Run on an isolated headless Wayland display",
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Headless display size as WIDTHxHEIGHT",
|
|
23
|
+
},
|
|
15
24
|
},
|
|
16
25
|
async run({ args }) {
|
|
26
|
+
if (args.size !== undefined && !args.headless) {
|
|
27
|
+
throw new Error("--size requires --headless");
|
|
28
|
+
}
|
|
17
29
|
const { cwd, entry: entryPath } = await prepareProject(args, DEV_MODE);
|
|
18
30
|
const watch = await resolveConfigWatch(cwd, DEV_MODE);
|
|
19
31
|
const { applicationArgs } = splitApplicationArgs(process.argv.slice(2));
|
|
20
|
-
|
|
32
|
+
const stopHeadless = args.headless ? await startHeadlessDevDisplay(args.size) : undefined;
|
|
33
|
+
try {
|
|
34
|
+
await runDevSupervisor({ entryPath, cwd, args: applicationArgs, watch });
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
stopHeadless?.();
|
|
38
|
+
}
|
|
21
39
|
},
|
|
22
40
|
});
|
|
23
41
|
export { dev };
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAiB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B,MAAM,GAAG,GAAG,aAAa,CAAC;IACtB,IAAI,EAAE;QACF,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,mCAAmC;KACnD;IACD,IAAI,EAAE;QACF,GAAG,QAAQ;
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAiB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B,MAAM,GAAG,GAAG,aAAa,CAAC;IACtB,IAAI,EAAE;QACF,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,mCAAmC;KACnD;IACD,IAAI,EAAE;QACF,GAAG,QAAQ;QACX,QAAQ,EAAE;YACN,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,6CAA6C;SAC7D;QACD,IAAI,EAAE;YACF,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uCAAuC;SACvD;KACJ;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QACd,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvE,MAAM,KAAK,GAAyB,MAAM,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC5E,MAAM,EAAE,eAAe,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1F,IAAI,CAAC;YACD,MAAM,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACP,YAAY,EAAE,EAAE,CAAC;QACrB,CAAC;IACL,CAAC;CACJ,CAAC,CAAC;AAEH,OAAO,EAAE,GAAG,EAAE,CAAC","sourcesContent":["import { defineCommand } from \"citty\";\nimport { resolveConfigWatch } from \"../codegen/run-codegen.js\";\nimport { startHeadlessDevDisplay } from \"../dev/headless.js\";\nimport { type DevWatch, runDevSupervisor } from \"../dev/supervisor.js\";\nimport { splitApplicationArgs } from \"../internal/application-args.js\";\nimport { entryArg } from \"../internal/entry-arg.js\";\nimport { prepareProject } from \"../internal/prepare-project.js\";\n\nconst DEV_MODE = \"development\";\n\nconst dev = defineCommand({\n meta: {\n name: \"dev\",\n description: \"Start development server with HMR\",\n },\n args: {\n ...entryArg,\n headless: {\n type: \"boolean\",\n description: \"Run on an isolated headless Wayland display\",\n },\n size: {\n type: \"string\",\n description: \"Headless display size as WIDTHxHEIGHT\",\n },\n },\n async run({ args }) {\n if (args.size !== undefined && !args.headless) {\n throw new Error(\"--size requires --headless\");\n }\n\n const { cwd, entry: entryPath } = await prepareProject(args, DEV_MODE);\n const watch: DevWatch | undefined = await resolveConfigWatch(cwd, DEV_MODE);\n const { applicationArgs } = splitApplicationArgs(process.argv.slice(2));\n const stopHeadless = args.headless ? await startHeadlessDevDisplay(args.size) : undefined;\n\n try {\n await runDevSupervisor({ entryPath, cwd, args: applicationArgs, watch });\n } finally {\n stopHeadless?.();\n }\n },\n});\n\nexport { dev };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metainfo.d.ts","sourceRoot":"","sources":["../../../src/deploy/freedesktop/metainfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"metainfo.d.ts","sourceRoot":"","sources":["../../../src/deploy/freedesktop/metainfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2FlD,QAAA,MAAM,cAAc,GAAI,UAAU,cAAc,KAAG,MAIlD,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -2,12 +2,47 @@ import { brandingSection, contentRatingSection, descriptionSection, developerSec
|
|
|
2
2
|
import { element, renderDocument, text } from "./xml.js";
|
|
3
3
|
const COMPONENT_TYPE = "desktop-application";
|
|
4
4
|
const DESKTOP_SUFFIX = ".desktop";
|
|
5
|
+
const COMPONENT_CLOSE = "</component>\n";
|
|
6
|
+
const PROVIDES_CLOSE = " </provides>\n";
|
|
7
|
+
const PROVIDES_FRAGMENT = /^<provides\s*>([\s\S]*)<\/provides>$/;
|
|
8
|
+
const normalizeExtraFragment = (fragment, index) => {
|
|
9
|
+
const normalized = fragment.trim();
|
|
10
|
+
if (normalized.length === 0) {
|
|
11
|
+
throw new Error(`Cannot render deploy.metainfoExtra entry ${String(index + 1)}: it is empty`);
|
|
12
|
+
}
|
|
13
|
+
return normalized;
|
|
14
|
+
};
|
|
15
|
+
const indentFragment = (fragment, depth) => {
|
|
16
|
+
const indentation = " ".repeat(depth * 4);
|
|
17
|
+
return fragment.split(/\r?\n/).map((line) => `${indentation}${line}`).join("\n");
|
|
18
|
+
};
|
|
19
|
+
const appendExtraFragments = (document, fragments) => {
|
|
20
|
+
if (fragments.length === 0) {
|
|
21
|
+
return document;
|
|
22
|
+
}
|
|
23
|
+
let merged = document;
|
|
24
|
+
const componentFragments = [];
|
|
25
|
+
for (const [index, rawFragment] of fragments.entries()) {
|
|
26
|
+
const fragment = normalizeExtraFragment(rawFragment, index);
|
|
27
|
+
const provides = PROVIDES_FRAGMENT.exec(fragment)?.[1]?.trim();
|
|
28
|
+
if (provides === undefined) {
|
|
29
|
+
componentFragments.push(fragment);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
merged = merged.replace(PROVIDES_CLOSE, () => `${indentFragment(provides, 2)}\n${PROVIDES_CLOSE}`);
|
|
33
|
+
}
|
|
34
|
+
if (componentFragments.length === 0) {
|
|
35
|
+
return merged;
|
|
36
|
+
}
|
|
37
|
+
const extra = componentFragments.map((fragment) => indentFragment(fragment, 1)).join("\n");
|
|
38
|
+
return merged.replace(COMPONENT_CLOSE, () => `${extra}\n${COMPONENT_CLOSE}`);
|
|
39
|
+
};
|
|
5
40
|
const launchable = (applicationId) => ({
|
|
6
41
|
tag: "launchable",
|
|
7
42
|
attributes: { type: "desktop-id" },
|
|
8
43
|
text: `${applicationId}${DESKTOP_SUFFIX}`,
|
|
9
44
|
});
|
|
10
|
-
const
|
|
45
|
+
const metainfoRoot = (settings) => element("component", { type: COMPONENT_TYPE }, [
|
|
11
46
|
text("id", settings.applicationId),
|
|
12
47
|
text("name", settings.name),
|
|
13
48
|
text("summary", settings.summary),
|
|
@@ -24,6 +59,10 @@ const renderMetainfo = (settings) => renderDocument(element("component", { type:
|
|
|
24
59
|
...releasesSection(settings),
|
|
25
60
|
...contentRatingSection(settings),
|
|
26
61
|
...brandingSection(settings),
|
|
27
|
-
])
|
|
62
|
+
]);
|
|
63
|
+
const renderMetainfo = (settings) => {
|
|
64
|
+
const document = renderDocument(metainfoRoot(settings));
|
|
65
|
+
return appendExtraFragments(document, settings.deploy.metainfoExtra ?? []);
|
|
66
|
+
};
|
|
28
67
|
export { renderMetainfo };
|
|
29
68
|
//# sourceMappingURL=metainfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metainfo.js","sourceRoot":"","sources":["../../../src/deploy/freedesktop/metainfo.ts"],"names":[],"mappings":"AACA,OAAO,EACH,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,WAAW,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAgB,MAAM,UAAU,CAAC;AAEvE,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAC7C,MAAM,cAAc,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"metainfo.js","sourceRoot":"","sources":["../../../src/deploy/freedesktop/metainfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeploySettings } from \"../types.js\";\nimport {\n brandingSection,\n contentRatingSection,\n descriptionSection,\n developerSection,\n listSection,\n providesSection,\n releasesSection,\n screenshotsSection,\n urlsSection,\n} from \"./metainfo-sections.js\";\nimport { element, renderDocument, text, type XmlNode } from \"./xml.js\";\n\nconst COMPONENT_TYPE = \"desktop-application\";\nconst DESKTOP_SUFFIX = \".desktop\";\nconst COMPONENT_CLOSE = \"</component>\\n\";\nconst PROVIDES_CLOSE = \" </provides>\\n\";\nconst PROVIDES_FRAGMENT = /^<provides\\s*>([\\s\\S]*)<\\/provides>$/;\n\nconst normalizeExtraFragment = (fragment: string, index: number): string => {\n const normalized = fragment.trim();\n\n if (normalized.length === 0) {\n throw new Error(`Cannot render deploy.metainfoExtra entry ${String(index + 1)}: it is empty`);\n }\n\n return normalized;\n};\n\nconst indentFragment = (fragment: string, depth: number): string => {\n const indentation = \" \".repeat(depth * 4);\n\n return fragment.split(/\\r?\\n/).map((line) => `${indentation}${line}`).join(\"\\n\");\n};\n\nconst appendExtraFragments = (document: string, fragments: string[]): string => {\n if (fragments.length === 0) {\n return document;\n }\n\n let merged = document;\n const componentFragments: string[] = [];\n\n for (const [index, rawFragment] of fragments.entries()) {\n const fragment = normalizeExtraFragment(rawFragment, index);\n const provides = PROVIDES_FRAGMENT.exec(fragment)?.[1]?.trim();\n\n if (provides === undefined) {\n componentFragments.push(fragment);\n continue;\n }\n\n merged = merged.replace(PROVIDES_CLOSE, () => `${indentFragment(provides, 2)}\\n${PROVIDES_CLOSE}`);\n }\n\n if (componentFragments.length === 0) {\n return merged;\n }\n\n const extra = componentFragments.map((fragment) => indentFragment(fragment, 1)).join(\"\\n\");\n\n return merged.replace(COMPONENT_CLOSE, () => `${extra}\\n${COMPONENT_CLOSE}`);\n};\n\nconst launchable = (applicationId: string): XmlNode => ({\n tag: \"launchable\",\n attributes: { type: \"desktop-id\" },\n text: `${applicationId}${DESKTOP_SUFFIX}`,\n});\n\nconst metainfoRoot = (settings: DeploySettings): XmlNode =>\n element(\"component\", { type: COMPONENT_TYPE }, [\n text(\"id\", settings.applicationId),\n text(\"name\", settings.name),\n text(\"summary\", settings.summary),\n text(\"metadata_license\", settings.metadataLicense),\n text(\"project_license\", settings.license),\n ...developerSection(settings),\n ...descriptionSection(settings),\n launchable(settings.applicationId),\n ...providesSection(settings),\n ...listSection(\"categories\", \"category\", settings.categories),\n ...listSection(\"keywords\", \"keyword\", settings.keywords),\n ...urlsSection(settings),\n ...screenshotsSection(settings),\n ...releasesSection(settings),\n ...contentRatingSection(settings),\n ...brandingSection(settings),\n ]);\n\nconst renderMetainfo = (settings: DeploySettings): string => {\n const document = renderDocument(metainfoRoot(settings));\n\n return appendExtraFragments(document, settings.deploy.metainfoExtra ?? []);\n};\n\nexport { renderMetainfo };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/deploy/nfpm/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/deploy/nfpm/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAM7E,OAAO,EAAE,KAAK,OAAO,EAAkB,MAAM,eAAe,CAAC;AAE7D,KAAK,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;AAClC,KAAK,UAAU,GAAG,OAAO,CAAC;AAmG1B,QAAA,MAAM,cAAc,GAAI,UAAU,cAAc,EAAE,UAAU,YAAY,KAAG,MACV,CAAC;AAgBlE,QAAA,MAAM,gBAAgB,GAAI,SAAS,aAAa,EAAE,UAAU,YAAY,KAAG,UA4B1E,CAAC;AAEF,OAAO,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveDepends } from "../depends.js";
|
|
2
|
+
import { glibcMinimumForFiles } from "../node-runtime/elf.js";
|
|
2
3
|
import { groupForCategories, sectionForCategories } from "../settings/categories.js";
|
|
3
4
|
import { nfpmContents } from "./contents.js";
|
|
4
5
|
import { debDescription, rpmDescription } from "./description.js";
|
|
@@ -92,7 +93,9 @@ const descriptionFor = (settings, packager) => packager === "rpm" ? rpmDescripti
|
|
|
92
93
|
const renderNfpmConfig = (payload, packager) => {
|
|
93
94
|
const settings = payload.settings;
|
|
94
95
|
const isRpm = packager === "rpm";
|
|
95
|
-
const
|
|
96
|
+
const staged = stagedFilesFor(payload, packager);
|
|
97
|
+
const glibcMinimum = glibcMinimumForFiles(staged.map((file) => file.abs));
|
|
98
|
+
const depends = resolveDepends(settings, glibcMinimum);
|
|
96
99
|
return {
|
|
97
100
|
name: packageNameFor(settings, packager),
|
|
98
101
|
arch: settings.arch[packager],
|
|
@@ -112,7 +115,7 @@ const renderNfpmConfig = (payload, packager) => {
|
|
|
112
115
|
...relationsFor(settings, packager),
|
|
113
116
|
...optional("scripts", scriptsFor(settings)),
|
|
114
117
|
[packager]: packagerSettings(settings, packager),
|
|
115
|
-
contents: nfpmContents(PREFIX,
|
|
118
|
+
contents: nfpmContents(PREFIX, staged, isRpm),
|
|
116
119
|
};
|
|
117
120
|
};
|
|
118
121
|
export { packageNameFor, renderNfpmConfig };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/deploy/nfpm/config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DeployPayload, DeploySettings, StagedFile } from \"../types.js\";\nimport { resolveDepends } from \"../depends.js\";\nimport { groupForCategories, sectionForCategories } from \"../settings/categories.js\";\nimport { nfpmContents } from \"./contents.js\";\nimport { debDescription, rpmDescription } from \"./description.js\";\nimport { type Entries, optional, when } from \"./optional.js\";\n\ntype NfpmPackager = \"deb\" | \"rpm\";\ntype NfpmConfig = Entries;\n\nconst PREFIX = \"/usr\";\nconst DEFAULT_PRIORITY = \"optional\";\nconst DEFAULT_UMASK = 0o022;\nconst VERSION_SCHEMA = \"none\";\n\nconst maintainerFor = (settings: DeploySettings): string => {\n const { name, email } = settings.developer;\n\n return email === null ? name : `${name} <${email}>`;\n};\n\nconst scriptsFor = (settings: DeploySettings): NfpmConfig | undefined => {\n const scripts = settings.deploy.scripts;\n\n if (scripts === undefined) {\n return undefined;\n }\n\n return {\n ...optional(\"preinstall\", scripts.preInstall),\n ...optional(\"postinstall\", scripts.postInstall),\n ...optional(\"preremove\", scripts.preRemove),\n ...optional(\"postremove\", scripts.postRemove),\n };\n};\n\nconst relationsFor = (settings: DeploySettings, packager: NfpmPackager): NfpmConfig => {\n const relations = settings.deploy.relations ?? {};\n\n return {\n ...optional(\"recommends\", relations.recommends?.[packager]),\n ...optional(\"suggests\", relations.suggests?.[packager]),\n ...optional(\"provides\", relations.provides?.[packager]),\n ...optional(\"conflicts\", relations.conflicts?.[packager]),\n ...optional(\"replaces\", relations.replaces?.[packager]),\n };\n};\n\nconst debSection = (settings: DeploySettings): NfpmConfig => ({\n section: settings.deploy.deb?.section ?? sectionForCategories(settings.categories),\n priority: settings.deploy.deb?.priority ?? DEFAULT_PRIORITY,\n});\n\nconst debSignature = (settings: DeploySettings): NfpmConfig => {\n const signing = settings.deploy.signing?.deb;\n\n if (signing === undefined) {\n return {};\n }\n\n return {\n signature: {\n key_file: signing.keyFile,\n ...optional(\"key_id\", signing.keyId),\n ...optional(\"method\", signing.method),\n ...optional(\"type\", signing.type),\n ...optional(\"signer\", signing.signer),\n },\n };\n};\n\nconst rpmSignature = (settings: DeploySettings): NfpmConfig => {\n const signing = settings.deploy.signing?.rpm;\n\n if (signing === undefined) {\n return {};\n }\n\n return { signature: { key_file: signing.keyFile, ...optional(\"key_id\", signing.keyId) } };\n};\n\nconst debSettings = (settings: DeploySettings): NfpmConfig => {\n const deb = settings.deploy.deb ?? {};\n const relations = settings.deploy.relations ?? {};\n\n return {\n ...optional(\"compression\", deb.compression),\n ...optional(\"fields\", deb.fields),\n ...optional(\"breaks\", relations.breaks?.deb),\n ...optional(\"predepends\", relations.preDepends?.deb),\n ...debSignature(settings),\n };\n};\n\nconst rpmSettings = (settings: DeploySettings): NfpmConfig => {\n const rpm = settings.deploy.rpm ?? {};\n\n return {\n group: rpm.group ?? groupForCategories(settings.categories),\n summary: settings.summary,\n packager: maintainerFor(settings),\n ...optional(\"compression\", rpm.compression),\n ...optional(\"prefixes\", rpm.prefixes),\n ...rpmSignature(settings),\n };\n};\n\nconst packageNameFor = (settings: DeploySettings, packager: NfpmPackager): string =>\n settings.deploy[packager]?.packageName ?? settings.binaryName;\n\nconst stagedFilesFor = (payload: DeployPayload, packager: NfpmPackager): StagedFile[] => [\n ...payload.stage,\n ...payload.overlays[packager],\n];\n\nconst packagerSettings = (settings: DeploySettings, packager: NfpmPackager): NfpmConfig =>\n packager === \"rpm\" ? rpmSettings(settings) : debSettings(settings);\n\nconst releaseFor = (settings: DeploySettings, packager: NfpmPackager): string =>\n packager === \"rpm\" ? settings.versions.rpmRelease : settings.versions.debRevision;\n\nconst descriptionFor = (settings: DeploySettings, packager: NfpmPackager): string =>\n packager === \"rpm\" ? rpmDescription(settings) : debDescription(settings);\n\nconst renderNfpmConfig = (payload: DeployPayload, packager: NfpmPackager): NfpmConfig => {\n const settings = payload.settings;\n const isRpm = packager === \"rpm\";\n const depends = resolveDepends(settings, payload.node?.glibcMinimum ?? null);\n\n return {\n name: packageNameFor(settings, packager),\n arch: settings.arch[packager],\n platform: \"linux\",\n version: settings.versions.packageVersion,\n version_schema: VERSION_SCHEMA,\n release: releaseFor(settings, packager),\n ...optional(\"epoch\", settings.versions.epoch === null ? undefined : String(settings.versions.epoch)),\n ...when(!isRpm, debSection(settings)),\n maintainer: maintainerFor(settings),\n vendor: settings.developer.name,\n ...optional(\"homepage\", settings.homepage),\n license: settings.license,\n description: descriptionFor(settings, packager),\n umask: DEFAULT_UMASK,\n depends: depends[packager],\n ...relationsFor(settings, packager),\n ...optional(\"scripts\", scriptsFor(settings)),\n [packager]: packagerSettings(settings, packager),\n contents: nfpmContents(PREFIX, stagedFilesFor(payload, packager), isRpm),\n };\n};\n\nexport { type NfpmPackager, packageNameFor, renderNfpmConfig };\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/deploy/nfpm/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAgB,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAK7D,MAAM,MAAM,GAAG,MAAM,CAAC;AACtB,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAU,EAAE;IACvD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;IAE3C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,QAAwB,EAA0B,EAAE;IACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IAExC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;QAC7C,GAAG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,WAAW,CAAC;QAC/C,GAAG,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;QAC3C,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;KAChD,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAwB,EAAE,QAAsB,EAAc,EAAE;IAClF,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAElD,OAAO;QACH,GAAG,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3D,GAAG,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;QACvD,GAAG,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;QACvD,GAAG,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzD,GAAG,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;KAC1D,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,QAAwB,EAAc,EAAE,CAAC,CAAC;IAC1D,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC;IAClF,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,gBAAgB;CAC9D,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,QAAwB,EAAc,EAAE;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;IAE7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO;QACH,SAAS,EAAE;YACP,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC;YACpC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;YACrC,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC;YACjC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;SACxC;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,QAAwB,EAAc,EAAE;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;IAE7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AAC9F,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAAwB,EAAc,EAAE;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAElD,OAAO;QACH,GAAG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC;QAC3C,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC;QACjC,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;QAC5C,GAAG,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC;QACpD,GAAG,YAAY,CAAC,QAAQ,CAAC;KAC5B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAAwB,EAAc,EAAE;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAEtC,OAAO;QACH,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC3D,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;QACjC,GAAG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,WAAW,CAAC;QAC3C,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC;QACrC,GAAG,YAAY,CAAC,QAAQ,CAAC;KAC5B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,QAAwB,EAAE,QAAsB,EAAU,EAAE,CAChF,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC;AAElE,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,QAAsB,EAAgB,EAAE,CAAC;IACrF,GAAG,OAAO,CAAC,KAAK;IAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;CAChC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAwB,EAAE,QAAsB,EAAc,EAAE,CACtF,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AAEvE,MAAM,UAAU,GAAG,CAAC,QAAwB,EAAE,QAAsB,EAAU,EAAE,CAC5E,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;AAEtF,MAAM,cAAc,GAAG,CAAC,QAAwB,EAAE,QAAsB,EAAU,EAAE,CAChF,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;AAE7E,MAAM,gBAAgB,GAAG,CAAC,OAAsB,EAAE,QAAsB,EAAc,EAAE;IACpF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,KAAK,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEvD,OAAO;QACH,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACxC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7B,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,cAAc;QACzC,cAAc,EAAE,cAAc;QAC9B,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACvC,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpG,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC;QACnC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI;QAC/B,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAC1C,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC/C,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC;QAC1B,GAAG,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACnC,GAAG,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAChD,QAAQ,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;KAChD,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAqB,cAAc,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["import type { DeployPayload, DeploySettings, StagedFile } from \"../types.js\";\nimport { resolveDepends } from \"../depends.js\";\nimport { glibcMinimumForFiles } from \"../node-runtime/elf.js\";\nimport { groupForCategories, sectionForCategories } from \"../settings/categories.js\";\nimport { nfpmContents } from \"./contents.js\";\nimport { debDescription, rpmDescription } from \"./description.js\";\nimport { type Entries, optional, when } from \"./optional.js\";\n\ntype NfpmPackager = \"deb\" | \"rpm\";\ntype NfpmConfig = Entries;\n\nconst PREFIX = \"/usr\";\nconst DEFAULT_PRIORITY = \"optional\";\nconst DEFAULT_UMASK = 0o022;\nconst VERSION_SCHEMA = \"none\";\n\nconst maintainerFor = (settings: DeploySettings): string => {\n const { name, email } = settings.developer;\n\n return email === null ? name : `${name} <${email}>`;\n};\n\nconst scriptsFor = (settings: DeploySettings): NfpmConfig | undefined => {\n const scripts = settings.deploy.scripts;\n\n if (scripts === undefined) {\n return undefined;\n }\n\n return {\n ...optional(\"preinstall\", scripts.preInstall),\n ...optional(\"postinstall\", scripts.postInstall),\n ...optional(\"preremove\", scripts.preRemove),\n ...optional(\"postremove\", scripts.postRemove),\n };\n};\n\nconst relationsFor = (settings: DeploySettings, packager: NfpmPackager): NfpmConfig => {\n const relations = settings.deploy.relations ?? {};\n\n return {\n ...optional(\"recommends\", relations.recommends?.[packager]),\n ...optional(\"suggests\", relations.suggests?.[packager]),\n ...optional(\"provides\", relations.provides?.[packager]),\n ...optional(\"conflicts\", relations.conflicts?.[packager]),\n ...optional(\"replaces\", relations.replaces?.[packager]),\n };\n};\n\nconst debSection = (settings: DeploySettings): NfpmConfig => ({\n section: settings.deploy.deb?.section ?? sectionForCategories(settings.categories),\n priority: settings.deploy.deb?.priority ?? DEFAULT_PRIORITY,\n});\n\nconst debSignature = (settings: DeploySettings): NfpmConfig => {\n const signing = settings.deploy.signing?.deb;\n\n if (signing === undefined) {\n return {};\n }\n\n return {\n signature: {\n key_file: signing.keyFile,\n ...optional(\"key_id\", signing.keyId),\n ...optional(\"method\", signing.method),\n ...optional(\"type\", signing.type),\n ...optional(\"signer\", signing.signer),\n },\n };\n};\n\nconst rpmSignature = (settings: DeploySettings): NfpmConfig => {\n const signing = settings.deploy.signing?.rpm;\n\n if (signing === undefined) {\n return {};\n }\n\n return { signature: { key_file: signing.keyFile, ...optional(\"key_id\", signing.keyId) } };\n};\n\nconst debSettings = (settings: DeploySettings): NfpmConfig => {\n const deb = settings.deploy.deb ?? {};\n const relations = settings.deploy.relations ?? {};\n\n return {\n ...optional(\"compression\", deb.compression),\n ...optional(\"fields\", deb.fields),\n ...optional(\"breaks\", relations.breaks?.deb),\n ...optional(\"predepends\", relations.preDepends?.deb),\n ...debSignature(settings),\n };\n};\n\nconst rpmSettings = (settings: DeploySettings): NfpmConfig => {\n const rpm = settings.deploy.rpm ?? {};\n\n return {\n group: rpm.group ?? groupForCategories(settings.categories),\n summary: settings.summary,\n packager: maintainerFor(settings),\n ...optional(\"compression\", rpm.compression),\n ...optional(\"prefixes\", rpm.prefixes),\n ...rpmSignature(settings),\n };\n};\n\nconst packageNameFor = (settings: DeploySettings, packager: NfpmPackager): string =>\n settings.deploy[packager]?.packageName ?? settings.binaryName;\n\nconst stagedFilesFor = (payload: DeployPayload, packager: NfpmPackager): StagedFile[] => [\n ...payload.stage,\n ...payload.overlays[packager],\n];\n\nconst packagerSettings = (settings: DeploySettings, packager: NfpmPackager): NfpmConfig =>\n packager === \"rpm\" ? rpmSettings(settings) : debSettings(settings);\n\nconst releaseFor = (settings: DeploySettings, packager: NfpmPackager): string =>\n packager === \"rpm\" ? settings.versions.rpmRelease : settings.versions.debRevision;\n\nconst descriptionFor = (settings: DeploySettings, packager: NfpmPackager): string =>\n packager === \"rpm\" ? rpmDescription(settings) : debDescription(settings);\n\nconst renderNfpmConfig = (payload: DeployPayload, packager: NfpmPackager): NfpmConfig => {\n const settings = payload.settings;\n const isRpm = packager === \"rpm\";\n const staged = stagedFilesFor(payload, packager);\n const glibcMinimum = glibcMinimumForFiles(staged.map((file) => file.abs));\n const depends = resolveDepends(settings, glibcMinimum);\n\n return {\n name: packageNameFor(settings, packager),\n arch: settings.arch[packager],\n platform: \"linux\",\n version: settings.versions.packageVersion,\n version_schema: VERSION_SCHEMA,\n release: releaseFor(settings, packager),\n ...optional(\"epoch\", settings.versions.epoch === null ? undefined : String(settings.versions.epoch)),\n ...when(!isRpm, debSection(settings)),\n maintainer: maintainerFor(settings),\n vendor: settings.developer.name,\n ...optional(\"homepage\", settings.homepage),\n license: settings.license,\n description: descriptionFor(settings, packager),\n umask: DEFAULT_UMASK,\n depends: depends[packager],\n ...relationsFor(settings, packager),\n ...optional(\"scripts\", scriptsFor(settings)),\n [packager]: packagerSettings(settings, packager),\n contents: nfpmContents(PREFIX, staged, isRpm),\n };\n};\n\nexport { type NfpmPackager, packageNameFor, renderNfpmConfig };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../../../src/deploy/nfpm/contents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,WAAW,GAAG;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"contents.d.ts","sourceRoot":"","sources":["../../../src/deploy/nfpm/contents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,WAAW,GAAG;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,CAAC;AAyDF,QAAA,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,UAAU,EAAE,EAAE,sBAAsB,OAAO,KAAG,WAAW,EAQrG,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -4,10 +4,16 @@ const FILESYSTEM_OWNED_PREFIXES = new Set([
|
|
|
4
4
|
"/usr",
|
|
5
5
|
"/usr/bin",
|
|
6
6
|
"/usr/lib",
|
|
7
|
+
"/usr/lib/systemd",
|
|
8
|
+
"/usr/lib/systemd/system",
|
|
9
|
+
"/usr/lib/systemd/user",
|
|
10
|
+
"/usr/libexec",
|
|
7
11
|
"/usr/share",
|
|
8
12
|
"/usr/share/applications",
|
|
9
13
|
"/usr/share/dbus-1",
|
|
10
14
|
"/usr/share/dbus-1/services",
|
|
15
|
+
"/usr/share/dbus-1/system-services",
|
|
16
|
+
"/usr/share/dbus-1/system.d",
|
|
11
17
|
"/usr/share/doc",
|
|
12
18
|
"/usr/share/glib-2.0",
|
|
13
19
|
"/usr/share/glib-2.0/schemas",
|
|
@@ -16,6 +22,8 @@ const FILESYSTEM_OWNED_PREFIXES = new Set([
|
|
|
16
22
|
"/usr/share/metainfo",
|
|
17
23
|
"/usr/share/mime",
|
|
18
24
|
"/usr/share/mime/packages",
|
|
25
|
+
"/usr/share/polkit-1",
|
|
26
|
+
"/usr/share/polkit-1/actions",
|
|
19
27
|
]);
|
|
20
28
|
const ICON_THEME_PREFIX = "/usr/share/icons/";
|
|
21
29
|
const contentFor = (prefix, file) => ({
|
|
@@ -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;
|
|
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
|
-
|
|
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;
|
|
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
|
|
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
|
|
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
|
-
|
|
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":"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","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":"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","sourcesContent":["import { closeSync, openSync, readFileSync, readSync } from \"node:fs\";\n\ntype ElfSection = {\n name: string;\n offset: number;\n size: number;\n};\n\ntype ElfInfo = {\n needed: string[];\n glibcMinimum: string | null;\n};\n\ntype DynamicEntry = {\n tag: number;\n value: number;\n};\n\nconst ELF_MAGIC = \"ELF\";\nconst ELF_MAGIC_SIZE = 4;\nconst CLASS_64 = 2;\nconst LITTLE_ENDIAN = 1;\nconst OFFSET_CLASS = 4;\nconst OFFSET_DATA = 5;\nconst OFFSET_SECTION_HEADERS = 0x28;\nconst OFFSET_SECTION_ENTRY_SIZE = 0x3A;\nconst OFFSET_SECTION_COUNT = 0x3C;\nconst OFFSET_SECTION_NAME_INDEX = 0x3E;\nconst SECTION_NAME = 0;\nconst SECTION_OFFSET = 24;\nconst SECTION_SIZE = 32;\nconst DYNAMIC_ENTRY_SIZE = 16;\nconst DT_NULL = 0;\nconst DT_NEEDED = 1;\nconst DYNAMIC_VALUE_OFFSET = 8;\nconst GLIBC_VERSION = /GLIBC_(\\d+)\\.(\\d+)/g;\nconst VERSION_RADIX = 1000;\n\nconst hasElfMagic = (buffer: Buffer): boolean =>\n buffer.length >= OFFSET_CLASS && buffer.subarray(0, 4).toString(\"latin1\") === ELF_MAGIC;\n\nconst assertElf64 = (buffer: Buffer, path: string): void => {\n if (buffer.length < OFFSET_SECTION_NAME_INDEX || !hasElfMagic(buffer)) {\n throw new Error(`Cannot read ${path}: it is not an ELF binary`);\n }\n\n if (buffer.readUInt8(OFFSET_CLASS) !== CLASS_64 || buffer.readUInt8(OFFSET_DATA) !== LITTLE_ENDIAN) {\n throw new Error(`Cannot read ${path}: only little-endian 64-bit ELF binaries are supported`);\n }\n};\n\nconst readCString = (buffer: Buffer, start: number): string => {\n const end = buffer.indexOf(0, start);\n\n return buffer.subarray(start, end === -1 ? buffer.length : end).toString(\"latin1\");\n};\n\nconst readSection = (buffer: Buffer, base: number, names: Buffer): ElfSection => ({\n name: readCString(names, buffer.readUInt32LE(base + SECTION_NAME)),\n offset: Number(buffer.readBigUInt64LE(base + SECTION_OFFSET)),\n size: Number(buffer.readBigUInt64LE(base + SECTION_SIZE)),\n});\n\nconst readSections = (buffer: Buffer): ElfSection[] => {\n const headers = Number(buffer.readBigUInt64LE(OFFSET_SECTION_HEADERS));\n const entrySize = buffer.readUInt16LE(OFFSET_SECTION_ENTRY_SIZE);\n const count = buffer.readUInt16LE(OFFSET_SECTION_COUNT);\n const nameIndex = buffer.readUInt16LE(OFFSET_SECTION_NAME_INDEX);\n const nameBase = headers + nameIndex * entrySize;\n const nameOffset = Number(buffer.readBigUInt64LE(nameBase + SECTION_OFFSET));\n const nameSize = Number(buffer.readBigUInt64LE(nameBase + SECTION_SIZE));\n const names = buffer.subarray(nameOffset, nameOffset + nameSize);\n\n return Array.from({ length: count }, (_, index) => readSection(buffer, headers + index * entrySize, names));\n};\n\nconst sectionFor = (sections: ElfSection[], name: string): ElfSection | undefined =>\n sections.find((section) => section.name === name);\n\nconst readDynamicEntries = (buffer: Buffer, dynamic: ElfSection): DynamicEntry[] => {\n const entries: DynamicEntry[] = [];\n\n for (let cursor = 0; cursor + DYNAMIC_ENTRY_SIZE <= dynamic.size; cursor += DYNAMIC_ENTRY_SIZE) {\n const base = dynamic.offset + cursor;\n const tag = Number(buffer.readBigUInt64LE(base));\n\n if (tag === DT_NULL) {\n break;\n }\n\n entries.push({ tag, value: Number(buffer.readBigUInt64LE(base + DYNAMIC_VALUE_OFFSET)) });\n }\n\n return entries;\n};\n\nconst readNeeded = (buffer: Buffer, dynamic: ElfSection | undefined, strings: Buffer): string[] => {\n if (dynamic === undefined) {\n return [];\n }\n\n return readDynamicEntries(buffer, dynamic)\n .filter((entry) => entry.tag === DT_NEEDED)\n .map((entry) => readCString(strings, entry.value));\n};\n\nconst getRank = (version: number[]): number => (version[0] ?? 0) * VERSION_RADIX + (version[1] ?? 0);\n\nconst highestVersion = (versions: number[][]): number[] | null => {\n let highest: number[] | null = null;\n\n for (const version of versions) {\n if (highest === null || getRank(version) > getRank(highest)) {\n highest = version;\n }\n }\n\n return highest;\n};\n\nconst formatVersion = (version: number[] | null): string | null =>\n version === null ? null : `${String(version[0] ?? 0)}.${String(version[1] ?? 0)}`;\n\nconst readGlibcMinimum = (strings: Buffer): string | null => {\n const found = strings\n .toString(\"latin1\")\n .matchAll(GLIBC_VERSION)\n .map((match) => [Number(match[1]), Number(match[2])])\n .toArray();\n\n return formatVersion(highestVersion(found));\n};\n\nconst stringTable = (buffer: Buffer, dynstr: ElfSection | undefined): Buffer =>\n dynstr === undefined ? Buffer.alloc(0) : buffer.subarray(dynstr.offset, dynstr.offset + dynstr.size);\n\nconst readElfBuffer = (buffer: Buffer, path: string): ElfInfo => {\n assertElf64(buffer, path);\n const sections = readSections(buffer);\n const strings = stringTable(buffer, sectionFor(sections, \".dynstr\"));\n\n return {\n needed: readNeeded(buffer, sectionFor(sections, \".dynamic\"), strings),\n glibcMinimum: readGlibcMinimum(strings),\n };\n};\n\nconst readElfInfo = (path: string): ElfInfo => readElfBuffer(readFileSync(path), path);\n\nconst readFilePrefix = (descriptor: number, size: number): Buffer => {\n const buffer = Buffer.alloc(size);\n const bytesRead = readSync(descriptor, buffer, 0, size, 0);\n\n return buffer.subarray(0, bytesRead);\n};\n\nconst readOptionalElfInfo = (path: string): ElfInfo | null => {\n const descriptor = openSync(path, \"r\");\n\n try {\n const prefix = readFilePrefix(descriptor, ELF_MAGIC_SIZE);\n\n return hasElfMagic(prefix) ? readElfBuffer(readFileSync(descriptor), path) : null;\n } finally {\n closeSync(descriptor);\n }\n};\n\nconst glibcMinimumForFiles = (paths: Iterable<string>): string | null => {\n const versions: number[][] = [];\n\n for (const path of paths) {\n const minimum = readOptionalElfInfo(path)?.glibcMinimum;\n\n if (minimum !== undefined && minimum !== null) {\n versions.push(minimum.split(\".\").map(Number));\n }\n }\n\n return formatVersion(highestVersion(versions));\n};\n\nexport { type ElfInfo, glibcMinimumForFiles, readElfInfo };\n"]}
|
|
@@ -1,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":"
|
|
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,CAU/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 =
|
|
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,13 @@ const stageFromSource = async (settings, version, source) => {
|
|
|
50
119
|
};
|
|
51
120
|
const resolveNodeRuntime = async (settings) => {
|
|
52
121
|
const node = settings.deploy.node ?? {};
|
|
53
|
-
const source =
|
|
54
|
-
const version =
|
|
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
127
|
info(`Bundled Node.js v${version} (${megabytes(staged.path)} MiB, glibc >= ${elf.glibcMinimum ?? "unknown"})`);
|
|
59
128
|
return { ...staged, version, glibcMinimum: elf.glibcMinimum, isStripped };
|
|
60
129
|
};
|
|
61
|
-
export { resolveNodeRuntime, sourcePathFor };
|
|
130
|
+
export { resolveNodeRuntime, resolveNodeVersion, sourcePathFor };
|
|
62
131
|
//# sourceMappingURL=index.js.map
|