@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,164 @@
1
+ /**
2
+ * `vantail doctor`
3
+ *
4
+ * Answers the only question that matters when something will not start:
5
+ * which of the four moving parts is missing.
6
+ */
7
+ import { spawn } from "node:child_process";
8
+ import { resolveRuntimeBinary, RuntimeNotFoundError } from "@vantail/runtime";
9
+ import { findConfigFile, loadConfig } from "@vantail/shared/load";
10
+ import { log, style } from "../log.js";
11
+ export async function doctor(options) {
12
+ const checks = [];
13
+ checks.push(nodeCheck());
14
+ const project = await configCheck(options, checks);
15
+ await viteCheck(project?.root ?? options.cwd, checks);
16
+ await runtimeCheck(project?.root ?? options.cwd, checks);
17
+ checks.push(platformCheck());
18
+ log.blank();
19
+ for (const check of checks) {
20
+ const mark = check.ok ? style.green("ok ") : style.red("fail");
21
+ console.log(` ${mark} ${check.name.padEnd(10)} ${check.detail}`);
22
+ if (check.hint)
23
+ console.log(` ${style.dim(check.hint)}`);
24
+ }
25
+ log.blank();
26
+ const failures = checks.filter((check) => !check.ok).length;
27
+ if (failures === 0) {
28
+ log.ok("everything is in place");
29
+ return 0;
30
+ }
31
+ log.error(`${failures} ${failures === 1 ? "problem" : "problems"} found`);
32
+ return 1;
33
+ }
34
+ function nodeCheck() {
35
+ const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
36
+ const ok = major > 20 || (major === 20 && minor >= 19);
37
+ return {
38
+ name: "node",
39
+ ok,
40
+ detail: process.versions.node,
41
+ ...(ok ? {} : { hint: "Vantail needs Node 20.19 or newer" }),
42
+ };
43
+ }
44
+ async function configCheck(options, checks) {
45
+ const found = options.config ?? findConfigFile(options.cwd);
46
+ if (!found) {
47
+ checks.push({
48
+ name: "config",
49
+ ok: false,
50
+ detail: "no vantail.config.ts found",
51
+ hint: `looked in ${options.cwd} and its parents`,
52
+ });
53
+ return undefined;
54
+ }
55
+ try {
56
+ const loaded = await loadConfig({
57
+ cwd: options.cwd,
58
+ ...(options.config ? { path: options.config } : {}),
59
+ });
60
+ checks.push({
61
+ name: "config",
62
+ ok: true,
63
+ detail: `${loaded.path} ${style.dim(`(${loaded.config.app.identifier})`)}`,
64
+ });
65
+ return { root: loaded.root };
66
+ }
67
+ catch (error) {
68
+ checks.push({
69
+ name: "config",
70
+ ok: false,
71
+ detail: found,
72
+ hint: error instanceof Error ? error.message.split("\n")[0] : String(error),
73
+ });
74
+ return undefined;
75
+ }
76
+ }
77
+ async function viteCheck(root, checks) {
78
+ try {
79
+ const { createRequire } = await import("node:module");
80
+ const require = createRequire(`${root}/package.json`);
81
+ const manifest = require("vite/package.json");
82
+ checks.push({ name: "vite", ok: true, detail: manifest.version });
83
+ }
84
+ catch {
85
+ checks.push({
86
+ name: "vite",
87
+ ok: false,
88
+ detail: "not installed",
89
+ hint: "npm install --save-dev vite",
90
+ });
91
+ }
92
+ }
93
+ async function runtimeCheck(root, checks) {
94
+ try {
95
+ const runtime = resolveRuntimeBinary({ cwd: root });
96
+ const version = await runtimeVersion(runtime.path);
97
+ checks.push({
98
+ name: "runtime",
99
+ ok: version !== undefined,
100
+ detail: `${version ?? "did not respond"} ${style.dim(`(${runtime.source}${runtime.profile ? `, ${runtime.profile}` : ""})`)}`,
101
+ ...(version === undefined ? { hint: runtime.path } : {}),
102
+ });
103
+ if (version === undefined)
104
+ return;
105
+ const features = await runtimeFeatures(runtime.path);
106
+ if (features === undefined)
107
+ return;
108
+ checks.push({
109
+ name: "features",
110
+ ok: true,
111
+ detail: features === "" ? style.dim("none - a minimal build") : features,
112
+ });
113
+ }
114
+ catch (error) {
115
+ checks.push({
116
+ name: "runtime",
117
+ ok: false,
118
+ detail: "not found",
119
+ hint: error instanceof RuntimeNotFoundError
120
+ ? `npm install --save-optional ${error.packageName}`
121
+ : String(error),
122
+ });
123
+ }
124
+ }
125
+ function platformCheck() {
126
+ // Linux is exercised now - the suite runs there in a container, on X11.
127
+ // Wayland runs but has a known protocol error under load; see the README.
128
+ const hint = process.platform === "linux"
129
+ ? "Linux runs on X11; Wayland has a known issue under load"
130
+ : undefined;
131
+ return {
132
+ name: "platform",
133
+ ok: true,
134
+ detail: `${process.platform}-${process.arch}`,
135
+ ...(hint ? { hint } : {}),
136
+ };
137
+ }
138
+ function runtimeVersion(path) {
139
+ return ask(path, "--version");
140
+ }
141
+ /**
142
+ * Which capabilities this runtime was compiled with.
143
+ *
144
+ * They are compile-time features, so two runtimes reporting the same version
145
+ * can behave differently: one built without `secrets` answers `UNSUPPORTED`
146
+ * to every call, which reads like a bug until you know. `--features` is newer
147
+ * than the flag itself, so an older runtime answers nothing and this stays
148
+ * quiet rather than claiming the list is empty.
149
+ */
150
+ function runtimeFeatures(path) {
151
+ return ask(path, "--features");
152
+ }
153
+ function ask(path, flag) {
154
+ return new Promise((resolve) => {
155
+ const child = spawn(path, [flag], { stdio: ["ignore", "pipe", "ignore"] });
156
+ let output = "";
157
+ child.stdout?.on("data", (chunk) => {
158
+ output += chunk.toString();
159
+ });
160
+ child.once("error", () => resolve(undefined));
161
+ child.once("exit", (code) => resolve(code === 0 ? output.trim() : undefined));
162
+ });
163
+ }
164
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAcvC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAE7B,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IAC5D,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,GAAG,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;IACvD,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,EAAE;QACF,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;QAC7B,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAsB,EACtB,MAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,4BAA4B;YACpC,IAAI,EAAE,aAAa,OAAO,CAAC,GAAG,kBAAkB;SACjD,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;YAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;SAC3E,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK;YACb,IAAI,EACF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACxE,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,MAAe;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAwB,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,6BAA6B;SACpC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,MAAe;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,OAAO,KAAK,SAAS;YACzB,MAAM,EAAE,GAAG,OAAO,IAAI,iBAAiB,IAAI,KAAK,CAAC,GAAG,CAClD,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CACtE,EAAE;YACH,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC;QAEH,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAElC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QAEnC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,QAAQ;SACzE,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,WAAW;YACnB,IAAI,EACF,KAAK,YAAY,oBAAoB;gBACnC,CAAC,CAAC,+BAA+B,KAAK,CAAC,WAAW,EAAE;gBACpD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,yDAAyD;QAC3D,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE;QAC7C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAC1B,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `vantail package`
3
+ *
4
+ * Build, then lay the three pieces out in the shape the platform expects.
5
+ * No Rust toolchain is involved: the runtime is a precompiled binary that
6
+ * gets copied in.
7
+ */
8
+ export interface PackageOptions {
9
+ cwd: string;
10
+ config?: string;
11
+ /** Skip the Vite build and package whatever is already in `distDir`. */
12
+ skipBuild?: boolean;
13
+ /** Overrides `outDir` from the config. */
14
+ outDir?: string;
15
+ /** macOS codesign identity. Defaults to an ad-hoc signature. */
16
+ sign?: string;
17
+ /** Also produce the `.tar.gz` the self-updater downloads. */
18
+ update?: boolean;
19
+ /** Also produce the platform's installer: .dmg, .msi or .deb. */
20
+ installer?: boolean;
21
+ /** Package with a debug runtime anyway. Ten times the size; rarely wanted. */
22
+ allowDebugRuntime?: boolean;
23
+ }
24
+ export declare function packageApp(options: PackageOptions): Promise<number>;
25
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFzE"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `vantail package`
3
+ *
4
+ * Build, then lay the three pieces out in the shape the platform expects.
5
+ * No Rust toolchain is involved: the runtime is a precompiled binary that
6
+ * gets copied in.
7
+ */
8
+ import { stat, writeFile } from "node:fs/promises";
9
+ import { resolve } from "node:path";
10
+ import { resolveRuntimeBinary } from "@vantail/runtime";
11
+ import { DEFAULT_OUT_DIR } from "@vantail/shared";
12
+ import { loadConfig } from "@vantail/shared/load";
13
+ import { tarGzip } from "../bundle/archive.js";
14
+ import { buildIcons, loadIcon } from "../icons/index.js";
15
+ import { buildInstaller } from "../installers/index.js";
16
+ import { bundle, safeName, updateTarget } from "../bundle/index.js";
17
+ import { formatBytes, log, style } from "../log.js";
18
+ import { build, resolveDist } from "./build.js";
19
+ export async function packageApp(options) {
20
+ let project;
21
+ let distDir;
22
+ if (options.skipBuild) {
23
+ const loaded = await loadConfig({
24
+ cwd: options.cwd,
25
+ ...(options.config ? { path: options.config } : {}),
26
+ });
27
+ project = {
28
+ config: loaded.config,
29
+ root: loaded.root,
30
+ configPath: loaded.path,
31
+ };
32
+ distDir = resolveDist(project);
33
+ }
34
+ else {
35
+ const result = await build({
36
+ cwd: options.cwd,
37
+ ...(options.config ? { config: options.config } : {}),
38
+ });
39
+ project = result.project;
40
+ distDir = result.distDir;
41
+ }
42
+ // `release`, not whatever was built most recently: a debug runtime is
43
+ // roughly ten times the size, and shipping one by accident is far easier
44
+ // than noticing afterwards that the bundle is 28 MB instead of 3.
45
+ const runtime = resolveRuntimeBinary({
46
+ cwd: project.root,
47
+ prefer: "release",
48
+ });
49
+ if (runtime.source === "workspace") {
50
+ log.warn(`packaging a locally built runtime (${runtime.profile ?? "unknown"}) - ` +
51
+ `fine for testing, not for release`);
52
+ if (runtime.profile === "debug" && !options.allowDebugRuntime) {
53
+ // A warning is not enough for a tenfold size difference that nobody
54
+ // sees until they look at the finished bundle.
55
+ throw new Error("There is no release build of the runtime, only a debug one.\n" +
56
+ "A debug binary is about ten times the size and slower, so packaging stops here.\n\n" +
57
+ " cargo build --release\n\n" +
58
+ "Or pass --allow-debug-runtime if that really is what you want.");
59
+ }
60
+ }
61
+ const outDir = resolve(project.root, options.outDir ?? project.config.outDir ?? DEFAULT_OUT_DIR, process.platform);
62
+ const icons = await prepareIcons(project);
63
+ const result = await bundle({
64
+ config: project.config,
65
+ root: project.root,
66
+ distDir,
67
+ runtimePath: runtime.path,
68
+ outDir,
69
+ platform: process.platform,
70
+ sign: options.sign,
71
+ icons,
72
+ });
73
+ log.ok(`${result.kind === "app" ? "bundle" : "folder"} ${style.bold(result.path)}`);
74
+ if (options.update) {
75
+ await writeUpdateArchive(project, outDir, result.path);
76
+ }
77
+ if (options.installer) {
78
+ await writeInstaller(project, outDir, result.path, icons);
79
+ }
80
+ if (process.platform === "darwin" && !options.sign) {
81
+ log.step("signed ad-hoc: it runs here, but needs a Developer ID to run elsewhere");
82
+ }
83
+ return 0;
84
+ }
85
+ /**
86
+ * Wrap the bundle in whatever this platform hands to a user.
87
+ */
88
+ async function writeInstaller(project, outDir, bundlePath, icons) {
89
+ const version = project.config.app.version ?? "0.0.0";
90
+ const fileStem = `${safeName(project.config.app.name)}-${version}-${updateTarget()}`;
91
+ // WiX references the icon as a file on disk, so it has to exist first.
92
+ if (process.platform === "win32" && icons) {
93
+ await writeFile(resolve(outDir, `${fileStem}.ico`), icons.ico);
94
+ }
95
+ const result = await buildInstaller({
96
+ config: project.config,
97
+ root: project.root,
98
+ bundlePath,
99
+ outDir,
100
+ fileStem,
101
+ icons,
102
+ });
103
+ const size = await stat(result.path).then((info) => ` ${style.dim(formatBytes(info.size))}`, () => "");
104
+ log.ok(`${result.kind.padEnd(9)} ${style.bold(result.path)}${size}`);
105
+ if (result.note) {
106
+ for (const line of result.note.split("\n"))
107
+ log.step(line);
108
+ }
109
+ }
110
+ /**
111
+ * Generate every icon size from the one source image.
112
+ *
113
+ * A missing `app.icon` is not an error - an application without an icon gets
114
+ * the platform's placeholder, which is exactly what it got before. A *broken*
115
+ * one is an error, because silently shipping the placeholder is worse.
116
+ */
117
+ async function prepareIcons(project) {
118
+ const path = project.config.app.icon;
119
+ if (!path) {
120
+ log.step("no app.icon - the platform placeholder will be used");
121
+ return undefined;
122
+ }
123
+ const source = await loadIcon(resolve(project.root, path));
124
+ const icons = buildIcons(source);
125
+ log.step(`icons ${source.width}x${source.width} -> ${icons.png.size} sizes`);
126
+ return icons;
127
+ }
128
+ /**
129
+ * Pack the bundle for the self-updater.
130
+ *
131
+ * Signing happens in `vantail updater manifest` rather than here, because a
132
+ * release covers several platforms and only one machine builds each of them.
133
+ */
134
+ async function writeUpdateArchive(project, outDir, bundlePath) {
135
+ const target = updateTarget();
136
+ const version = project.config.app.version ?? "0.0.0";
137
+ const name = `${safeName(project.config.app.name)}-${version}-${target}.tar.gz`;
138
+ const path = resolve(outDir, name);
139
+ const archive = await tarGzip(bundlePath);
140
+ await writeFile(path, archive);
141
+ log.ok(`update ${style.bold(path)} ${style.dim(formatBytes(archive.length))}`);
142
+ log.step(`sign it with: vantail updater manifest ${target}=${name}`);
143
+ }
144
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/commands/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `vantail updater ...`
3
+ *
4
+ * The publishing half of the self-updater: make a key, sign an archive, and
5
+ * write the manifest an application checks against.
6
+ */
7
+ export interface KeygenOptions {
8
+ cwd: string;
9
+ /** Where to write the private key. */
10
+ out?: string;
11
+ force?: boolean;
12
+ }
13
+ export declare function keygen(options: KeygenOptions): Promise<number>;
14
+ export interface SignOptions {
15
+ cwd: string;
16
+ file: string;
17
+ key?: string;
18
+ }
19
+ export declare function sign(options: SignOptions): Promise<number>;
20
+ export interface ManifestOptions {
21
+ cwd: string;
22
+ config?: string;
23
+ /** Archives to include, as `<target>=<path>` or just `<path>`. */
24
+ artifacts: string[];
25
+ /** Base URL the archives will be served from. */
26
+ baseUrl?: string;
27
+ key?: string;
28
+ out?: string;
29
+ notes?: string;
30
+ /** ISO timestamp. The caller supplies it so the output is reproducible. */
31
+ date?: string;
32
+ }
33
+ /**
34
+ * Write the JSON an application's `updater.endpoint` should serve.
35
+ *
36
+ * ```json
37
+ * {
38
+ * "version": "1.2.0",
39
+ * "platforms": {
40
+ * "darwin-aarch64": { "url": "...", "signature": "..." }
41
+ * }
42
+ * }
43
+ * ```
44
+ */
45
+ export declare function manifest(options: ManifestOptions): Promise<number>;
46
+ //# sourceMappingURL=updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/commands/updater.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BpE;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhE;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CxE"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * `vantail updater ...`
3
+ *
4
+ * The publishing half of the self-updater: make a key, sign an archive, and
5
+ * write the manifest an application checks against.
6
+ */
7
+ import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
8
+ import { existsSync } from "node:fs";
9
+ import { basename, dirname, join, resolve } from "node:path";
10
+ import { loadConfig } from "@vantail/shared/load";
11
+ import { log, style } from "../log.js";
12
+ import { generateKeys, loadPrivateKey, publicKeyOf, signPayload } from "../updater-keys.js";
13
+ export async function keygen(options) {
14
+ const path = resolve(options.cwd, options.out ?? ".vantail/updater.key");
15
+ if (existsSync(path) && !options.force) {
16
+ log.error(`${path} already exists.\n` +
17
+ `Overwriting it would make every installed copy of your app unable to update. ` +
18
+ `Pass --force if you are certain.`);
19
+ return 1;
20
+ }
21
+ const keys = generateKeys();
22
+ await mkdir(dirname(path), { recursive: true });
23
+ await writeFile(path, keys.privateKeyPem, "utf8");
24
+ // The whole security of the update channel is this file staying secret.
25
+ await chmod(path, 0o600);
26
+ log.ok(`private key ${path}`);
27
+ log.blank();
28
+ console.log("Add this to vantail.config.ts:");
29
+ console.log(style.dim(`
30
+ updater: {
31
+ endpoint: "https://example.com/updates/latest.json",
32
+ publicKey: ${JSON.stringify(keys.publicKey)},
33
+ },
34
+ `));
35
+ log.warn("keep the private key out of version control - it is the only thing that stops someone else shipping an update to your users");
36
+ return 0;
37
+ }
38
+ export async function sign(options) {
39
+ const key = await loadPrivateKey(resolveKeyPath(options.cwd, options.key));
40
+ const payload = await readFile(resolve(options.cwd, options.file));
41
+ const signature = signPayload(key, payload);
42
+ console.log(signature);
43
+ return 0;
44
+ }
45
+ /**
46
+ * Write the JSON an application's `updater.endpoint` should serve.
47
+ *
48
+ * ```json
49
+ * {
50
+ * "version": "1.2.0",
51
+ * "platforms": {
52
+ * "darwin-aarch64": { "url": "...", "signature": "..." }
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ export async function manifest(options) {
58
+ const loaded = await loadConfig({
59
+ cwd: options.cwd,
60
+ ...(options.config ? { path: options.config } : {}),
61
+ });
62
+ const key = await loadPrivateKey(resolveKeyPath(options.cwd, options.key));
63
+ const configured = loaded.config.updater?.publicKey;
64
+ if (configured && configured !== publicKeyOf(key)) {
65
+ log.error("This key does not match `updater.publicKey` in your config.\n" +
66
+ "Signing with it would produce an update your users' apps refuse to install.");
67
+ return 1;
68
+ }
69
+ const platforms = {};
70
+ for (const artifact of options.artifacts) {
71
+ const [target, path] = splitArtifact(artifact);
72
+ const file = resolve(options.cwd, path);
73
+ const signature = signPayload(key, await readFile(file));
74
+ const name = basename(file);
75
+ platforms[target] = {
76
+ url: options.baseUrl ? `${trimSlash(options.baseUrl)}/${encodeURIComponent(name)}` : name,
77
+ signature,
78
+ };
79
+ log.step(`${target.padEnd(16)} ${name}`);
80
+ }
81
+ const document = {
82
+ version: loaded.config.app.version ?? "0.0.0",
83
+ ...(options.notes ? { notes: options.notes } : {}),
84
+ ...(options.date ? { pubDate: options.date } : {}),
85
+ platforms,
86
+ };
87
+ const out = resolve(options.cwd, options.out ?? join("build", "latest.json"));
88
+ await mkdir(dirname(out), { recursive: true });
89
+ await writeFile(out, `${JSON.stringify(document, null, 2)}\n`, "utf8");
90
+ log.ok(`manifest ${out}`);
91
+ return 0;
92
+ }
93
+ /** `darwin-aarch64=path/to.tar.gz`, or a path whose name carries the target. */
94
+ function splitArtifact(artifact) {
95
+ const equals = artifact.indexOf("=");
96
+ if (equals !== -1) {
97
+ return [artifact.slice(0, equals), artifact.slice(equals + 1)];
98
+ }
99
+ const name = basename(artifact);
100
+ const match = /-(darwin|windows|linux)-([A-Za-z0-9_]+)\.tar\.gz$/.exec(name);
101
+ if (!match) {
102
+ throw new Error(`Cannot tell which platform ${name} is for. ` +
103
+ `Name it <app>-<version>-<platform>-<arch>.tar.gz, or pass it as <target>=<path>.`);
104
+ }
105
+ return [`${match[1]}-${match[2]}`, artifact];
106
+ }
107
+ function resolveKeyPath(cwd, key) {
108
+ if (key)
109
+ return resolve(cwd, key);
110
+ const fallback = resolve(cwd, ".vantail/updater.key");
111
+ return existsSync(fallback) ? fallback : undefined;
112
+ }
113
+ function trimSlash(url) {
114
+ return url.endsWith("/") ? url.slice(0, -1) : url;
115
+ }
116
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/commands/updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Turning one source PNG into the icon formats each platform insists on.
3
+ *
4
+ * macOS wants an `.icns`, Windows wants an `.ico`, Linux wants loose PNGs at
5
+ * theme sizes. All three are containers of PNGs, which is why one source image
6
+ * is enough.
7
+ */
8
+ import { decode, encode, type Bitmap } from "./png.js";
9
+ import { resize } from "./resize.js";
10
+ export { decode, encode, resize };
11
+ export type { Bitmap };
12
+ /** The hicolor theme sizes a `.desktop` entry is looked up in. */
13
+ export declare const LINUX_SIZES: number[];
14
+ export interface IconSet {
15
+ source: Bitmap;
16
+ icns: Buffer;
17
+ ico: Buffer;
18
+ /** Keyed by pixel size. */
19
+ png: Map<number, Buffer>;
20
+ }
21
+ export declare function loadIcon(path: string): Promise<Bitmap>;
22
+ export declare function buildIcons(source: Bitmap): IconSet;
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClC,YAAY,EAAE,MAAM,EAAE,CAAC;AA8BvB,kEAAkE;AAClE,eAAO,MAAM,WAAW,UAAkC,CAAC;AAE3D,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5D;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAuBlD"}