@vantail/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/args.d.ts +16 -0
  2. package/dist/args.d.ts.map +1 -0
  3. package/dist/args.js +86 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/bin.d.ts +9 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +170 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/bundle/archive.d.ts +25 -0
  10. package/dist/bundle/archive.d.ts.map +1 -0
  11. package/dist/bundle/archive.js +187 -0
  12. package/dist/bundle/archive.js.map +1 -0
  13. package/dist/bundle/common.d.ts +33 -0
  14. package/dist/bundle/common.d.ts.map +1 -0
  15. package/dist/bundle/common.js +22 -0
  16. package/dist/bundle/common.js.map +1 -0
  17. package/dist/bundle/index.d.ts +12 -0
  18. package/dist/bundle/index.d.ts.map +1 -0
  19. package/dist/bundle/index.js +47 -0
  20. package/dist/bundle/index.js.map +1 -0
  21. package/dist/bundle/macos.d.ts +19 -0
  22. package/dist/bundle/macos.d.ts.map +1 -0
  23. package/dist/bundle/macos.js +138 -0
  24. package/dist/bundle/macos.js.map +1 -0
  25. package/dist/commands/build.d.ts +21 -0
  26. package/dist/commands/build.d.ts.map +1 -0
  27. package/dist/commands/build.js +57 -0
  28. package/dist/commands/build.js.map +1 -0
  29. package/dist/commands/dev.d.ts +17 -0
  30. package/dist/commands/dev.d.ts.map +1 -0
  31. package/dist/commands/dev.js +170 -0
  32. package/dist/commands/dev.js.map +1 -0
  33. package/dist/commands/doctor.d.ts +12 -0
  34. package/dist/commands/doctor.d.ts.map +1 -0
  35. package/dist/commands/doctor.js +164 -0
  36. package/dist/commands/doctor.js.map +1 -0
  37. package/dist/commands/package.d.ts +25 -0
  38. package/dist/commands/package.d.ts.map +1 -0
  39. package/dist/commands/package.js +144 -0
  40. package/dist/commands/package.js.map +1 -0
  41. package/dist/commands/updater.d.ts +46 -0
  42. package/dist/commands/updater.d.ts.map +1 -0
  43. package/dist/commands/updater.js +116 -0
  44. package/dist/commands/updater.js.map +1 -0
  45. package/dist/icons/index.d.ts +23 -0
  46. package/dist/icons/index.d.ts.map +1 -0
  47. package/dist/icons/index.js +124 -0
  48. package/dist/icons/index.js.map +1 -0
  49. package/dist/icons/png.d.ts +18 -0
  50. package/dist/icons/png.d.ts.map +1 -0
  51. package/dist/icons/png.js +220 -0
  52. package/dist/icons/png.js.map +1 -0
  53. package/dist/icons/resize.d.ts +14 -0
  54. package/dist/icons/resize.d.ts.map +1 -0
  55. package/dist/icons/resize.js +58 -0
  56. package/dist/icons/resize.js.map +1 -0
  57. package/dist/index.d.ts +19 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +18 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/installers/common.d.ts +20 -0
  62. package/dist/installers/common.d.ts.map +1 -0
  63. package/dist/installers/common.js +2 -0
  64. package/dist/installers/common.js.map +1 -0
  65. package/dist/installers/deb.d.ts +15 -0
  66. package/dist/installers/deb.d.ts.map +1 -0
  67. package/dist/installers/deb.js +146 -0
  68. package/dist/installers/deb.js.map +1 -0
  69. package/dist/installers/dmg.d.ts +11 -0
  70. package/dist/installers/dmg.d.ts.map +1 -0
  71. package/dist/installers/dmg.js +51 -0
  72. package/dist/installers/dmg.js.map +1 -0
  73. package/dist/installers/index.d.ts +14 -0
  74. package/dist/installers/index.d.ts.map +1 -0
  75. package/dist/installers/index.js +26 -0
  76. package/dist/installers/index.js.map +1 -0
  77. package/dist/installers/msi.d.ts +23 -0
  78. package/dist/installers/msi.d.ts.map +1 -0
  79. package/dist/installers/msi.js +199 -0
  80. package/dist/installers/msi.js.map +1 -0
  81. package/dist/log.d.ts +22 -0
  82. package/dist/log.d.ts.map +1 -0
  83. package/dist/log.js +44 -0
  84. package/dist/log.js.map +1 -0
  85. package/dist/runtime-config.d.ts +27 -0
  86. package/dist/runtime-config.d.ts.map +1 -0
  87. package/dist/runtime-config.js +79 -0
  88. package/dist/runtime-config.js.map +1 -0
  89. package/dist/updater-keys.d.ts +31 -0
  90. package/dist/updater-keys.d.ts.map +1 -0
  91. package/dist/updater-keys.js +56 -0
  92. package/dist/updater-keys.js.map +1 -0
  93. package/dist/vite.d.ts +24 -0
  94. package/dist/vite.d.ts.map +1 -0
  95. package/dist/vite.js +31 -0
  96. package/dist/vite.js.map +1 -0
  97. package/package.json +40 -0
@@ -0,0 +1,146 @@
1
+ /**
2
+ * The Debian package.
3
+ *
4
+ * A `.deb` is an `ar` archive holding exactly three members in exactly this
5
+ * order: a version marker, the metadata tarball, and the payload tarball.
6
+ * All three are built here rather than shelled out to `dpkg-deb`, so a Linux
7
+ * package can be produced from any machine - which matters, because the
8
+ * alternative is that only a Debian box can cut a Linux release.
9
+ */
10
+ import { chmod, cp, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
11
+ import { join, resolve } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+ import { tarGzipContents } from "../bundle/archive.js";
14
+ import { LINUX_SIZES } from "../icons/index.js";
15
+ /** What a Vantail application needs present to start on Debian or Ubuntu. */
16
+ const DEPENDS = [
17
+ "libwebkit2gtk-4.1-0",
18
+ "libgtk-3-0",
19
+ "libayatana-appindicator3-1 | libappindicator3-1",
20
+ ];
21
+ export async function buildDeb(input) {
22
+ const name = debianName(input.config.app.name);
23
+ const version = input.config.app.version ?? "0.0.0";
24
+ const architecture = debianArchitecture(process.arch);
25
+ const output = resolve(input.outDir, `${name}_${version}_${architecture}.deb`);
26
+ const staging = await mkdtemp(join(tmpdir(), "vantail-deb-"));
27
+ try {
28
+ // /usr/lib/<name> holds the application; /usr/bin gets a launcher so it is
29
+ // on PATH; the desktop entry and icons make it appear in the menu.
30
+ const libDir = join(staging, "data/usr/lib", name);
31
+ await mkdir(libDir, { recursive: true });
32
+ await cp(input.bundlePath, libDir, { recursive: true });
33
+ const binDir = join(staging, "data/usr/bin");
34
+ await mkdir(binDir, { recursive: true });
35
+ // A script rather than a symlink, so the archive needs no symlink support
36
+ // and the launcher can be read by anyone wondering what it does.
37
+ await writeFile(join(binDir, name), `#!/bin/sh\nexec /usr/lib/${name}/${name} "$@"\n`, "utf8");
38
+ await chmod(join(binDir, name), 0o755);
39
+ const applications = join(staging, "data/usr/share/applications");
40
+ await mkdir(applications, { recursive: true });
41
+ await writeFile(join(applications, `${name}.desktop`), desktopEntry(input, name), "utf8");
42
+ if (input.icons) {
43
+ for (const size of LINUX_SIZES) {
44
+ const image = input.icons.png.get(size);
45
+ if (!image)
46
+ continue;
47
+ const directory = join(staging, "data/usr/share/icons/hicolor", `${size}x${size}`, "apps");
48
+ await mkdir(directory, { recursive: true });
49
+ await writeFile(join(directory, `${name}.png`), image);
50
+ }
51
+ }
52
+ const data = await tarGzipContents(join(staging, "data"));
53
+ const controlDir = join(staging, "control");
54
+ await mkdir(controlDir, { recursive: true });
55
+ await writeFile(join(controlDir, "control"), controlFile({ name, version, architecture, input, installedSize: data.length }), "utf8");
56
+ const control = await tarGzipContents(controlDir);
57
+ await writeFile(output, ar([
58
+ // The order is part of the format, not a convention.
59
+ { name: "debian-binary", data: Buffer.from("2.0\n", "ascii") },
60
+ { name: "control.tar.gz", data: control },
61
+ { name: "data.tar.gz", data },
62
+ ]));
63
+ return { path: output, kind: "deb" };
64
+ }
65
+ finally {
66
+ await rm(staging, { recursive: true, force: true });
67
+ }
68
+ }
69
+ function controlFile(options) {
70
+ const { name, version, architecture, input } = options;
71
+ const description = `${input.config.app.name}\n A desktop application built with Vantail.`;
72
+ return ([
73
+ `Package: ${name}`,
74
+ `Version: ${version}`,
75
+ `Architecture: ${architecture}`,
76
+ // Required by the format. There is nowhere better to get one from, and
77
+ // an obviously-placeholder value beats a wrong one.
78
+ `Maintainer: ${input.config.app.identifier}`,
79
+ `Installed-Size: ${Math.max(1, Math.round(options.installedSize / 1024))}`,
80
+ `Depends: ${DEPENDS.join(", ")}`,
81
+ "Section: utils",
82
+ "Priority: optional",
83
+ `Description: ${description}`,
84
+ ].join("\n") + "\n");
85
+ }
86
+ function desktopEntry(input, name) {
87
+ const protocols = input.config.protocols ?? [];
88
+ return ([
89
+ "[Desktop Entry]",
90
+ "Type=Application",
91
+ `Name=${input.config.app.name}`,
92
+ // %U passes the URL along, which is how a deep link arrives here.
93
+ `Exec=${name} %U`,
94
+ `Icon=${name}`,
95
+ "Terminal=false",
96
+ "Categories=Utility;",
97
+ // This is what makes the desktop hand `myapp://` links to us.
98
+ ...(protocols.length > 0
99
+ ? [`MimeType=${protocols.map((p) => `x-scheme-handler/${p}`).join(";")};`]
100
+ : []),
101
+ ].join("\n") + "\n");
102
+ }
103
+ /**
104
+ * The `ar` archive format: a magic line, then a 60-byte header before each
105
+ * member, padded to an even length.
106
+ */
107
+ function ar(members) {
108
+ const parts = [Buffer.from("!<arch>\n", "ascii")];
109
+ for (const member of members) {
110
+ const header = Buffer.alloc(60, 0x20); // space-padded, per the format
111
+ // No trailing slash. GNU ar terminates names with one and dpkg tolerates
112
+ // it, but dpkg writes them without - and BSD ar, which is what macOS has,
113
+ // will list a slash-terminated member and then fail to extract it.
114
+ header.write(member.name.padEnd(16), 0, 16, "ascii");
115
+ header.write("0".padEnd(12), 16, 12, "ascii"); // mtime, fixed for reproducibility
116
+ header.write("0".padEnd(6), 28, 6, "ascii"); // owner
117
+ header.write("0".padEnd(6), 34, 6, "ascii"); // group
118
+ header.write("100644".padEnd(8), 40, 8, "ascii"); // mode
119
+ header.write(String(member.data.length).padEnd(10), 48, 10, "ascii");
120
+ header.write("`\n", 58, 2, "ascii"); // the end-of-header marker
121
+ parts.push(header, member.data);
122
+ if (member.data.length % 2 === 1)
123
+ parts.push(Buffer.from([0x0a]));
124
+ }
125
+ return Buffer.concat(parts);
126
+ }
127
+ /** Debian package names are lowercase, and punctuation is a hyphen. */
128
+ export function debianName(name) {
129
+ const cleaned = name
130
+ .toLowerCase()
131
+ .replace(/[^a-z0-9+.-]+/g, "-")
132
+ .replace(/^[^a-z0-9]+/, "")
133
+ .replace(/-+$/, "");
134
+ return cleaned.length > 1 ? cleaned : "vantail-app";
135
+ }
136
+ export function debianArchitecture(arch) {
137
+ // Debian's names, not Node's.
138
+ if (arch === "x64")
139
+ return "amd64";
140
+ if (arch === "arm64")
141
+ return "arm64";
142
+ if (arch === "ia32")
143
+ return "i386";
144
+ return arch;
145
+ }
146
+ //# sourceMappingURL=deb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deb.js","sourceRoot":"","sources":["../../src/installers/deb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The macOS disk image.
3
+ *
4
+ * A `.dmg` is what a Mac user expects to download: mount it, drag the app to
5
+ * the Applications alias sitting next to it, done. `hdiutil` does the actual
6
+ * work, which is fine - it ships with every Mac and this only ever runs on
7
+ * one, since the bundle it packages can only be built there anyway.
8
+ */
9
+ import type { InstallerInput, InstallerResult } from "./common.js";
10
+ export declare function buildDmg(input: InstallerInput): Promise<InstallerResult>;
11
+ //# sourceMappingURL=dmg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dmg.d.ts","sourceRoot":"","sources":["../../src/installers/dmg.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInE,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC9E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The macOS disk image.
3
+ *
4
+ * A `.dmg` is what a Mac user expects to download: mount it, drag the app to
5
+ * the Applications alias sitting next to it, done. `hdiutil` does the actual
6
+ * work, which is fine - it ships with every Mac and this only ever runs on
7
+ * one, since the bundle it packages can only be built there anyway.
8
+ */
9
+ import { execFile } from "node:child_process";
10
+ import { mkdtemp, rm, symlink } from "node:fs/promises";
11
+ import { cp } from "node:fs/promises";
12
+ import { basename, join, resolve } from "node:path";
13
+ import { tmpdir } from "node:os";
14
+ import { promisify } from "node:util";
15
+ const run = promisify(execFile);
16
+ export async function buildDmg(input) {
17
+ const volume = input.config.app.name;
18
+ const output = resolve(input.outDir, `${input.fileStem}.dmg`);
19
+ // hdiutil images the directory it is given, so the layout the user sees when
20
+ // they mount it is built first.
21
+ const staging = await mkdtemp(join(tmpdir(), "vantail-dmg-"));
22
+ try {
23
+ await cp(input.bundlePath, join(staging, basename(input.bundlePath)), {
24
+ recursive: true,
25
+ verbatimSymlinks: true,
26
+ });
27
+ // The drag target. A symlink rather than a copy, or the image would carry
28
+ // a second copy of every application on the machine.
29
+ await symlink("/Applications", join(staging, "Applications"));
30
+ await rm(output, { force: true });
31
+ await run("hdiutil", [
32
+ "create",
33
+ "-volname",
34
+ volume,
35
+ "-srcfolder",
36
+ staging,
37
+ "-ov",
38
+ // UDZO is compressed and read-only, which is what a download should be.
39
+ "-format",
40
+ "UDZO",
41
+ "-fs",
42
+ "HFS+",
43
+ output,
44
+ ]);
45
+ return { path: output, kind: "dmg" };
46
+ }
47
+ finally {
48
+ await rm(staging, { recursive: true, force: true });
49
+ }
50
+ }
51
+ //# sourceMappingURL=dmg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dmg.js","sourceRoot":"","sources":["../../src/installers/dmg.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAqB;IAClD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,MAAM,CAAC,CAAC;IAE9D,6EAA6E;IAC7E,gCAAgC;IAChC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE;YACpE,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QACH,0EAA0E;QAC1E,qDAAqD;QACrD,MAAM,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAE9D,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM,GAAG,CAAC,SAAS,EAAE;YACnB,QAAQ;YACR,UAAU;YACV,MAAM;YACN,YAAY;YACZ,OAAO;YACP,KAAK;YACL,wEAAwE;YACxE,SAAS;YACT,MAAM;YACN,KAAK;YACL,MAAM;YACN,MAAM;SACP,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Turning a bundle into the thing a user downloads.
3
+ *
4
+ * One installer per platform, chosen by where the build is running: a `.dmg`
5
+ * on macOS, an `.msi` on Windows, a `.deb` on Linux. Cross-building is not
6
+ * offered because the bundle being wrapped can only be produced on its own
7
+ * platform anyway.
8
+ */
9
+ import type { InstallerInput, InstallerResult } from "./common.js";
10
+ export type { InstallerInput, InstallerResult };
11
+ export { debianName, debianArchitecture } from "./deb.js";
12
+ export { guidFrom, msiVersion } from "./msi.js";
13
+ export declare function buildInstaller(input: InstallerInput, platform?: NodeJS.Platform): Promise<InstallerResult>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,wBAAsB,cAAc,CAClC,KAAK,EAAE,cAAc,EACrB,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAAC,eAAe,CAAC,CAW1B"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Turning a bundle into the thing a user downloads.
3
+ *
4
+ * One installer per platform, chosen by where the build is running: a `.dmg`
5
+ * on macOS, an `.msi` on Windows, a `.deb` on Linux. Cross-building is not
6
+ * offered because the bundle being wrapped can only be produced on its own
7
+ * platform anyway.
8
+ */
9
+ import { buildDeb } from "./deb.js";
10
+ import { buildDmg } from "./dmg.js";
11
+ import { buildMsi } from "./msi.js";
12
+ export { debianName, debianArchitecture } from "./deb.js";
13
+ export { guidFrom, msiVersion } from "./msi.js";
14
+ export async function buildInstaller(input, platform = process.platform) {
15
+ switch (platform) {
16
+ case "darwin":
17
+ return buildDmg(input);
18
+ case "win32":
19
+ return buildMsi(input);
20
+ case "linux":
21
+ return buildDeb(input);
22
+ default:
23
+ throw new Error(`There is no installer format for ${platform}`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIpC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAqB,EACrB,QAAQ,GAAoB,OAAO,CAAC,QAAQ;IAE5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzB;YACE,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The Windows installer.
3
+ *
4
+ * WiX turns a `.wxs` description into an `.msi`. The description is generated
5
+ * here; building it needs the WiX toolset, which is a dotnet tool and only
6
+ * runs on Windows - so on any other machine this writes the `.wxs` and says
7
+ * what to run, rather than pretending it failed.
8
+ */
9
+ import type { InstallerInput, InstallerResult } from "./common.js";
10
+ export declare function buildMsi(input: InstallerInput): Promise<InstallerResult>;
11
+ /**
12
+ * Windows Installer versions are three numbers, and the third is capped at
13
+ * 65535. A pre-release suffix has nowhere to go, so it is dropped - an `.msi`
14
+ * of `1.2.0-beta.1` installs as `1.2.0`.
15
+ */
16
+ export declare function msiVersion(version: string): string;
17
+ /**
18
+ * A GUID derived from a string, so the same application always produces the
19
+ * same one and upgrades line up. Not a real UUIDv5 - it does not need to be
20
+ * anything but stable and well-formed.
21
+ */
22
+ export declare function guidFrom(seed: string): string;
23
+ //# sourceMappingURL=msi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msi.d.ts","sourceRoot":"","sources":["../../src/installers/msi.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInE,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAoB9E;AA6FD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B7C"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * The Windows installer.
3
+ *
4
+ * WiX turns a `.wxs` description into an `.msi`. The description is generated
5
+ * here; building it needs the WiX toolset, which is a dotnet tool and only
6
+ * runs on Windows - so on any other machine this writes the `.wxs` and says
7
+ * what to run, rather than pretending it failed.
8
+ */
9
+ import { execFile } from "node:child_process";
10
+ import { mkdir, readdir, writeFile } from "node:fs/promises";
11
+ import { join, relative, resolve, sep } from "node:path";
12
+ import { promisify } from "node:util";
13
+ import { safeName } from "../bundle/common.js";
14
+ const run = promisify(execFile);
15
+ export async function buildMsi(input) {
16
+ const output = resolve(input.outDir, `${input.fileStem}.msi`);
17
+ const source = resolve(input.outDir, `${input.fileStem}.wxs`);
18
+ await mkdir(input.outDir, { recursive: true });
19
+ await writeFile(source, await wxs(input), "utf8");
20
+ if (!(await hasWix())) {
21
+ return {
22
+ path: source,
23
+ kind: "msi",
24
+ note: "WiX is not installed, so only the .wxs was written. On Windows:\n" +
25
+ " dotnet tool install --global wix\n" +
26
+ ` wix build "${source}" -o "${output}"`,
27
+ };
28
+ }
29
+ await run("wix", ["build", source, "-o", output]);
30
+ return { path: output, kind: "msi" };
31
+ }
32
+ async function hasWix() {
33
+ try {
34
+ await run("wix", ["--version"]);
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Build the installer description.
43
+ *
44
+ * Every file in the bundle is listed explicitly. WiX can harvest a directory
45
+ * instead, but that means shipping a second tool and a build step that reads
46
+ * the disk twice; the bundle is small enough to enumerate.
47
+ */
48
+ async function wxs(input) {
49
+ const { app } = input.config;
50
+ const name = safeName(app.name);
51
+ const version = msiVersion(app.version ?? "0.0.0");
52
+ const files = await walk(input.bundlePath);
53
+ const components = files
54
+ .map((file, index) => {
55
+ const target = relative(input.bundlePath, file).split(sep);
56
+ const id = `file${index}`;
57
+ return ` <File Id="${id}" Source="${escapeXml(file)}" Name="${escapeXml(target[target.length - 1])}"${target.length > 1 ? ` Subdirectory="${escapeXml(target.slice(0, -1).join("\\"))}"` : ""} />`;
58
+ })
59
+ .join("\n");
60
+ // A stable GUID per application, so an upgrade replaces rather than
61
+ // installs alongside. Derived from the identifier for exactly that reason.
62
+ const upgradeCode = guidFrom(app.identifier);
63
+ return `<?xml version="1.0" encoding="utf-8"?>
64
+ <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
65
+ <Package
66
+ Name="${escapeXml(app.name)}"
67
+ Manufacturer="${escapeXml(app.identifier)}"
68
+ Version="${version}"
69
+ UpgradeCode="${upgradeCode}"
70
+ Scope="perUser"
71
+ Compressed="yes">
72
+
73
+ <MajorUpgrade DowngradeErrorMessage="A newer version of ${escapeXml(app.name)} is already installed." />
74
+ <MediaTemplate EmbedCab="yes" />
75
+ ${input.icons ? ` <Icon Id="AppIcon" SourceFile="${escapeXml(join(input.outDir, `${input.fileStem}.ico`))}" />\n <Property Id="ARPPRODUCTICON" Value="AppIcon" />\n` : ""}
76
+ <StandardDirectory Id="LocalAppDataFolder">
77
+ <Directory Id="INSTALLFOLDER" Name="${escapeXml(name)}" />
78
+ </StandardDirectory>
79
+
80
+ <StandardDirectory Id="ProgramMenuFolder">
81
+ <Directory Id="ShortcutFolder" Name="${escapeXml(app.name)}" />
82
+ </StandardDirectory>
83
+
84
+ <ComponentGroup Id="ApplicationFiles" Directory="INSTALLFOLDER">
85
+ ${components}
86
+ </ComponentGroup>
87
+
88
+ <Component Id="StartMenuShortcut" Directory="ShortcutFolder" Guid="${guidFrom(`${app.identifier}.shortcut`)}">
89
+ <Shortcut Id="AppShortcut"
90
+ Name="${escapeXml(app.name)}"
91
+ Target="[INSTALLFOLDER]${escapeXml(name)}.exe"
92
+ WorkingDirectory="INSTALLFOLDER"${input.icons ? '\n Icon="AppIcon"' : ""} />
93
+ <RemoveFolder Id="RemoveShortcutFolder" Directory="ShortcutFolder" On="uninstall" />
94
+ <RegistryValue Root="HKCU"
95
+ Key="Software\\${escapeXml(app.identifier)}"
96
+ Name="installed"
97
+ Type="integer"
98
+ Value="1"
99
+ KeyPath="yes" />
100
+ </Component>
101
+
102
+ ${protocolComponents(input, name)}
103
+ <Feature Id="Main">
104
+ <ComponentGroupRef Id="ApplicationFiles" />
105
+ <ComponentRef Id="StartMenuShortcut" />${(input.config.protocols ?? [])
106
+ .map((protocol) => `\n <ComponentRef Id="Protocol${escapeXml(componentId(protocol))}" />`)
107
+ .join("")}
108
+ </Feature>
109
+ </Package>
110
+ </Wix>
111
+ `;
112
+ }
113
+ /**
114
+ * Windows Installer versions are three numbers, and the third is capped at
115
+ * 65535. A pre-release suffix has nowhere to go, so it is dropped - an `.msi`
116
+ * of `1.2.0-beta.1` installs as `1.2.0`.
117
+ */
118
+ export function msiVersion(version) {
119
+ const [major = "0", minor = "0", patch = "0"] = version.split("-")[0].split(".");
120
+ const clamp = (value, limit) => Math.min(Math.max(0, Number.parseInt(value, 10) || 0), limit);
121
+ return `${clamp(major, 255)}.${clamp(minor, 255)}.${clamp(patch, 65535)}`;
122
+ }
123
+ /**
124
+ * A GUID derived from a string, so the same application always produces the
125
+ * same one and upgrades line up. Not a real UUIDv5 - it does not need to be
126
+ * anything but stable and well-formed.
127
+ */
128
+ export function guidFrom(seed) {
129
+ let hash = 0x811c9dc5;
130
+ const bytes = [];
131
+ for (let round = 0; round < 16; round += 1) {
132
+ for (const character of `${seed}:${round}`) {
133
+ hash ^= character.codePointAt(0);
134
+ hash = Math.imul(hash, 0x01000193) >>> 0;
135
+ }
136
+ bytes.push(hash & 0xff);
137
+ }
138
+ const hex = bytes.map((byte) => byte.toString(16).padStart(2, "0"));
139
+ // Stamped as version 4, variant 1, which is what tools expect to see.
140
+ hex[6] = `4${hex[6].slice(1)}`;
141
+ hex[8] = `${((Number.parseInt(hex[8], 16) & 0x3f) | 0x80).toString(16).padStart(2, "0")}`;
142
+ const joined = hex.join("");
143
+ return [
144
+ joined.slice(0, 8),
145
+ joined.slice(8, 12),
146
+ joined.slice(12, 16),
147
+ joined.slice(16, 20),
148
+ joined.slice(20, 32),
149
+ ]
150
+ .join("-")
151
+ .toUpperCase();
152
+ }
153
+ /**
154
+ * Register the application's URL schemes with Windows.
155
+ *
156
+ * Per user rather than per machine, matching the per-user install scope, so
157
+ * the installer needs no elevation.
158
+ */
159
+ function protocolComponents(input, name) {
160
+ const protocols = input.config.protocols ?? [];
161
+ if (protocols.length === 0)
162
+ return "";
163
+ return protocols
164
+ .map((protocol) => `
165
+ <Component Id="Protocol${escapeXml(componentId(protocol))}" Directory="INSTALLFOLDER" Guid="${guidFrom(`${input.config.app.identifier}.protocol.${protocol}`)}">
166
+ <RegistryKey Root="HKCU" Key="Software\\Classes\\${escapeXml(protocol)}">
167
+ <RegistryValue Type="string" Value="URL:${escapeXml(input.config.app.name)}" KeyPath="yes" />
168
+ <RegistryValue Name="URL Protocol" Type="string" Value="" />
169
+ </RegistryKey>
170
+ <RegistryValue Root="HKCU"
171
+ Key="Software\\Classes\\${escapeXml(protocol)}\\shell\\open\\command"
172
+ Type="string"
173
+ Value="&quot;[INSTALLFOLDER]${escapeXml(name)}.exe&quot; &quot;%1&quot;" />
174
+ </Component>`)
175
+ .join("");
176
+ }
177
+ /** WiX identifiers are letters, digits and underscores. */
178
+ function componentId(value) {
179
+ return value.replace(/[^A-Za-z0-9_]/g, "_");
180
+ }
181
+ async function walk(directory) {
182
+ const out = [];
183
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
184
+ const path = join(directory, entry.name);
185
+ if (entry.isDirectory())
186
+ out.push(...(await walk(path)));
187
+ else if (entry.isFile())
188
+ out.push(path);
189
+ }
190
+ return out.sort();
191
+ }
192
+ function escapeXml(value) {
193
+ return value
194
+ .replace(/&/g, "&amp;")
195
+ .replace(/</g, "&lt;")
196
+ .replace(/>/g, "&gt;")
197
+ .replace(/"/g, "&quot;");
198
+ }
199
+ //# sourceMappingURL=msi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msi.js","sourceRoot":"","sources":["../../src/installers/msi.ts"],"names":[],"mappings":"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"}
package/dist/log.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ /** Terminal output. Small on purpose - the CLI should be quiet. */
2
+ export declare const style: {
3
+ bold: (text: string) => string;
4
+ dim: (text: string) => string;
5
+ red: (text: string) => string;
6
+ green: (text: string) => string;
7
+ yellow: (text: string) => string;
8
+ blue: (text: string) => string;
9
+ magenta: (text: string) => string;
10
+ cyan: (text: string) => string;
11
+ };
12
+ export declare const log: {
13
+ info(message: string): void;
14
+ step(message: string): void;
15
+ warn(message: string): void;
16
+ error(message: string): void;
17
+ ok(message: string): void;
18
+ blank(): void;
19
+ };
20
+ /** Format a byte count the way a build tool should. */
21
+ export declare function formatBytes(bytes: number): string;
22
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAQnE,eAAO,MAAM,KAAK;IAChB,IAAI,SAJgC,MAAM;IAK1C,GAAG;IACH,GAAG;IACH,KAAK;IACL,MAAM;IACN,IAAI;IACJ,OAAO;IACP,IAAI;CACL,CAAC;AAIF,eAAO,MAAM,GAAG;IACd,IAAI,UAAU,MAAM,GAAG,IAAI;IAG3B,IAAI,UAAU,MAAM,GAAG,IAAI;IAG3B,IAAI,UAAU,MAAM,GAAG,IAAI;IAG3B,KAAK,UAAU,MAAM,GAAG,IAAI;IAG5B,EAAE,UAAU,MAAM,GAAG,IAAI;IAGzB,KAAK,IAAI,IAAI;CAGd,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
package/dist/log.js ADDED
@@ -0,0 +1,44 @@
1
+ /** Terminal output. Small on purpose - the CLI should be quiet. */
2
+ const ESC = String.fromCharCode(27);
3
+ const enabled = process.stdout.isTTY === true && process.env["NO_COLOR"] === undefined;
4
+ const wrap = (code) => (text) => enabled ? `${ESC}[${code}m${text}${ESC}[0m` : text;
5
+ export const style = {
6
+ bold: wrap("1"),
7
+ dim: wrap("2"),
8
+ red: wrap("31"),
9
+ green: wrap("32"),
10
+ yellow: wrap("33"),
11
+ blue: wrap("34"),
12
+ magenta: wrap("35"),
13
+ cyan: wrap("36"),
14
+ };
15
+ const tag = style.magenta("vantail");
16
+ export const log = {
17
+ info(message) {
18
+ console.log(`${tag} ${message}`);
19
+ },
20
+ step(message) {
21
+ console.log(`${tag} ${style.dim(message)}`);
22
+ },
23
+ warn(message) {
24
+ console.warn(`${tag} ${style.yellow("warning")} ${message}`);
25
+ },
26
+ error(message) {
27
+ console.error(`${tag} ${style.red("error")} ${message}`);
28
+ },
29
+ ok(message) {
30
+ console.log(`${tag} ${style.green("ok")} ${message}`);
31
+ },
32
+ blank() {
33
+ console.log("");
34
+ },
35
+ };
36
+ /** Format a byte count the way a build tool should. */
37
+ export function formatBytes(bytes) {
38
+ if (bytes < 1024)
39
+ return `${bytes} B`;
40
+ if (bytes < 1024 * 1024)
41
+ return `${(bytes / 1024).toFixed(1)} kB`;
42
+ return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
43
+ }
44
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;AACpC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;AAEvF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAC9C,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAErD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IACf,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IACd,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC;IACf,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAErC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,EAAE,CAAC,OAAe;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,KAAK;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Turning `vantail.config.ts` into the `vantail.json` the runtime reads.
3
+ *
4
+ * The runtime deliberately knows nothing about projects, dev servers or
5
+ * bundlers - it reads one flat file. This is where that file is produced.
6
+ */
7
+ import type { ParsedConfig } from "@vantail/shared/load";
8
+ export interface RuntimeConfigInput {
9
+ config: ParsedConfig;
10
+ /** Project root - the directory holding `vantail.config.ts`. */
11
+ root: string;
12
+ /** Set for `vantail dev`: the URL the webview should load. */
13
+ devUrl?: string;
14
+ /**
15
+ * Overrides `distDir`. Written verbatim, so an absolute path works and a
16
+ * relative one is resolved against the generated file's own directory.
17
+ */
18
+ distDir?: string;
19
+ /** Overrides `app.icon`, for a bundle where it has been copied elsewhere. */
20
+ icon?: string;
21
+ }
22
+ export declare function buildRuntimeConfig(input: RuntimeConfigInput): Record<string, unknown>;
23
+ /** Write a runtime config and return its path. */
24
+ export declare function writeRuntimeConfig(path: string, input: RuntimeConfigInput): Promise<string>;
25
+ /** Where `vantail dev` keeps its generated config. */
26
+ export declare function devConfigPath(root: string): string;
27
+ //# sourceMappingURL=runtime-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../src/runtime-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkCrF;AAED,kDAAkD;AAClD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAIjG;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}