@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,124 @@
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 { readFile } from "node:fs/promises";
9
+ import { decode, encode } from "./png.js";
10
+ import { resize } from "./resize.js";
11
+ export { decode, encode, resize };
12
+ /**
13
+ * Sizes macOS asks for, and the four-character type that carries each.
14
+ *
15
+ * Every size a Retina display asks for needs its own entry. Without one,
16
+ * macOS scales the next thing it can find: leave out `ic11` and a 16pt icon
17
+ * on a Retina screen is the 16px bitmap doubled, which is what a broken
18
+ * small icon in Finder actually is.
19
+ *
20
+ * The list mirrors what `iconutil` produces. `icp6` is deliberately absent -
21
+ * macOS reads it as 48x48 regardless of what is inside, so writing a 64px
22
+ * image there produces an entry nothing wants.
23
+ */
24
+ const ICNS_TYPES = [
25
+ ["icp4", 16], // 16pt
26
+ ["ic11", 32], // 16pt @2x
27
+ ["icp5", 32], // 32pt
28
+ ["ic12", 64], // 32pt @2x
29
+ ["ic07", 128], // 128pt
30
+ ["ic13", 256], // 128pt @2x
31
+ ["ic08", 256], // 256pt
32
+ ["ic14", 512], // 256pt @2x
33
+ ["ic09", 512], // 512pt
34
+ ["ic10", 1024], // 512pt @2x
35
+ ];
36
+ /** What Windows shows at each place it shows an icon. */
37
+ const ICO_SIZES = [16, 24, 32, 48, 64, 128, 256];
38
+ /** The hicolor theme sizes a `.desktop` entry is looked up in. */
39
+ export const LINUX_SIZES = [16, 32, 48, 64, 128, 256, 512];
40
+ export async function loadIcon(path) {
41
+ const bitmap = decode(await readFile(path));
42
+ if (bitmap.width !== bitmap.height) {
43
+ throw new Error(`An icon has to be square; ${path} is ${bitmap.width}x${bitmap.height}.`);
44
+ }
45
+ if (bitmap.width < 256) {
46
+ throw new Error(`${path} is ${bitmap.width}x${bitmap.width}. Icons are scaled down, never up - ` +
47
+ `use at least 256x256, and 1024x1024 if you can.`);
48
+ }
49
+ return bitmap;
50
+ }
51
+ export function buildIcons(source) {
52
+ // Every size is derived from the source rather than from the size above it,
53
+ // so errors do not compound down the chain.
54
+ const at = new Map();
55
+ const scaled = (size) => {
56
+ let bitmap = at.get(size);
57
+ if (!bitmap) {
58
+ bitmap = resize(source, Math.min(size, source.width));
59
+ at.set(size, bitmap);
60
+ }
61
+ return bitmap;
62
+ };
63
+ const png = new Map();
64
+ for (const size of new Set([
65
+ ...ICNS_TYPES.map(([, s]) => s),
66
+ ...ICO_SIZES,
67
+ ...LINUX_SIZES,
68
+ ])) {
69
+ png.set(size, encode(scaled(size)));
70
+ }
71
+ return { source, icns: buildIcns(png), ico: buildIco(png), png };
72
+ }
73
+ /**
74
+ * `.icns` is a magic word, a total length, and a run of typed chunks. Since
75
+ * OS X 10.7 those chunks may hold PNG data directly, which is what makes this
76
+ * a repackaging job rather than an encoding one.
77
+ */
78
+ function buildIcns(png) {
79
+ const chunks = [];
80
+ for (const [type, size] of ICNS_TYPES) {
81
+ const image = png.get(size);
82
+ if (!image)
83
+ continue;
84
+ const header = Buffer.alloc(8);
85
+ header.write(type, 0, 4, "ascii");
86
+ header.writeUInt32BE(image.length + 8, 4);
87
+ chunks.push(header, image);
88
+ }
89
+ const body = Buffer.concat(chunks);
90
+ const header = Buffer.alloc(8);
91
+ header.write("icns", 0, 4, "ascii");
92
+ header.writeUInt32BE(body.length + 8, 4);
93
+ return Buffer.concat([header, body]);
94
+ }
95
+ /**
96
+ * `.ico` is a directory of entries followed by their images. PNG payloads have
97
+ * been accepted since Vista and are what everything writes now.
98
+ */
99
+ function buildIco(png) {
100
+ const images = ICO_SIZES.map((size) => ({
101
+ size,
102
+ data: png.get(size),
103
+ })).filter((entry) => entry.data);
104
+ const directory = Buffer.alloc(6 + images.length * 16);
105
+ directory.writeUInt16LE(0, 0); // reserved
106
+ directory.writeUInt16LE(1, 2); // 1 = icon
107
+ directory.writeUInt16LE(images.length, 4);
108
+ let offset = directory.length;
109
+ images.forEach((image, index) => {
110
+ const at = 6 + index * 16;
111
+ // 256 is written as 0: the field is one byte and 256 does not fit.
112
+ directory.writeUInt8(image.size >= 256 ? 0 : image.size, at);
113
+ directory.writeUInt8(image.size >= 256 ? 0 : image.size, at + 1);
114
+ directory.writeUInt8(0, at + 2); // palette size, 0 for truecolour
115
+ directory.writeUInt8(0, at + 3); // reserved
116
+ directory.writeUInt16LE(1, at + 4); // colour planes
117
+ directory.writeUInt16LE(32, at + 6); // bits per pixel
118
+ directory.writeUInt32LE(image.data.length, at + 8);
119
+ directory.writeUInt32LE(offset, at + 12);
120
+ offset += image.data.length;
121
+ });
122
+ return Buffer.concat([directory, ...images.map((image) => image.data)]);
123
+ }
124
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Just enough PNG to turn one source image into every size an icon needs.
3
+ *
4
+ * A dependency would do more, but the job here is narrow - decode what a
5
+ * designer exports, scale it down, write it back out - and a native image
6
+ * library is an odd thing for a tool whose whole pitch is that you do not need
7
+ * a compiler. What is *not* supported fails loudly rather than quietly
8
+ * producing a wrong icon.
9
+ */
10
+ export interface Bitmap {
11
+ width: number;
12
+ height: number;
13
+ /** Straight (not premultiplied) RGBA, 8 bits per channel. */
14
+ pixels: Uint8Array;
15
+ }
16
+ export declare function decode(source: Buffer): Bitmap;
17
+ export declare function encode(bitmap: Bitmap): Buffer;
18
+ //# sourceMappingURL=png.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.d.ts","sourceRoot":"","sources":["../../src/icons/png.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqD7C;AAgID,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0B7C"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Just enough PNG to turn one source image into every size an icon needs.
3
+ *
4
+ * A dependency would do more, but the job here is narrow - decode what a
5
+ * designer exports, scale it down, write it back out - and a native image
6
+ * library is an odd thing for a tool whose whole pitch is that you do not need
7
+ * a compiler. What is *not* supported fails loudly rather than quietly
8
+ * producing a wrong icon.
9
+ */
10
+ import { deflateSync, inflateSync } from "node:zlib";
11
+ const SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
12
+ export function decode(source) {
13
+ if (!source.subarray(0, 8).equals(SIGNATURE)) {
14
+ throw new Error("That is not a PNG file");
15
+ }
16
+ let header;
17
+ let palette;
18
+ let transparency;
19
+ const data = [];
20
+ for (let at = 8; at + 8 <= source.length;) {
21
+ const length = source.readUInt32BE(at);
22
+ const type = source.toString("ascii", at + 4, at + 8);
23
+ const body = source.subarray(at + 8, at + 8 + length);
24
+ at += 12 + length; // length + type + data + crc
25
+ if (type === "IHDR") {
26
+ const interlace = body.readUInt8(12);
27
+ if (interlace !== 0) {
28
+ throw new Error("Interlaced PNGs are not supported - save it without interlacing");
29
+ }
30
+ header = {
31
+ width: body.readUInt32BE(0),
32
+ height: body.readUInt32BE(4),
33
+ depth: body.readUInt8(8),
34
+ color: body.readUInt8(9),
35
+ };
36
+ }
37
+ else if (type === "PLTE")
38
+ palette = Buffer.from(body);
39
+ else if (type === "tRNS")
40
+ transparency = Buffer.from(body);
41
+ else if (type === "IDAT")
42
+ data.push(Buffer.from(body));
43
+ else if (type === "IEND")
44
+ break;
45
+ }
46
+ if (!header)
47
+ throw new Error("That PNG has no header chunk");
48
+ if (header.depth !== 8) {
49
+ throw new Error(`Only 8-bit PNGs are supported; this one is ${header.depth}-bit. Re-export it as 8-bit.`);
50
+ }
51
+ const channels = CHANNELS[header.color];
52
+ if (channels === undefined) {
53
+ throw new Error(`Unsupported PNG colour type ${header.color}`);
54
+ }
55
+ const raw = inflateSync(Buffer.concat(data));
56
+ const scanlines = unfilter(raw, header.width, header.height, channels);
57
+ return {
58
+ width: header.width,
59
+ height: header.height,
60
+ pixels: toRgba(scanlines, header, channels, palette, transparency),
61
+ };
62
+ }
63
+ /** Bytes per pixel in the raw scanline data, by PNG colour type. */
64
+ const CHANNELS = {
65
+ 0: 1, // greyscale
66
+ 2: 3, // truecolour
67
+ 3: 1, // palette index
68
+ 4: 2, // greyscale + alpha
69
+ 6: 4, // truecolour + alpha
70
+ };
71
+ /**
72
+ * Reverse the per-scanline filters.
73
+ *
74
+ * Every row is prefixed with a filter byte and encoded relative to its left
75
+ * neighbour, the row above, or both. This is where a PNG decoder is usually
76
+ * wrong, so it follows the spec's names exactly.
77
+ */
78
+ function unfilter(raw, width, height, channels) {
79
+ const stride = width * channels;
80
+ const out = Buffer.alloc(stride * height);
81
+ for (let row = 0; row < height; row += 1) {
82
+ const filter = raw.readUInt8(row * (stride + 1));
83
+ const from = row * (stride + 1) + 1;
84
+ const to = row * stride;
85
+ const above = to - stride;
86
+ for (let index = 0; index < stride; index += 1) {
87
+ const value = raw[from + index];
88
+ const left = index >= channels ? out[to + index - channels] : 0;
89
+ const up = row > 0 ? out[above + index] : 0;
90
+ const upLeft = row > 0 && index >= channels ? out[above + index - channels] : 0;
91
+ let restored;
92
+ switch (filter) {
93
+ case 0:
94
+ restored = value;
95
+ break;
96
+ case 1:
97
+ restored = value + left;
98
+ break;
99
+ case 2:
100
+ restored = value + up;
101
+ break;
102
+ case 3:
103
+ restored = value + ((left + up) >> 1);
104
+ break;
105
+ case 4:
106
+ restored = value + paeth(left, up, upLeft);
107
+ break;
108
+ default:
109
+ throw new Error(`Unknown PNG filter type ${filter} on row ${row}`);
110
+ }
111
+ out[to + index] = restored & 0xff;
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+ function paeth(left, up, upLeft) {
117
+ const estimate = left + up - upLeft;
118
+ const dLeft = Math.abs(estimate - left);
119
+ const dUp = Math.abs(estimate - up);
120
+ const dUpLeft = Math.abs(estimate - upLeft);
121
+ if (dLeft <= dUp && dLeft <= dUpLeft)
122
+ return left;
123
+ return dUp <= dUpLeft ? up : upLeft;
124
+ }
125
+ function toRgba(scanlines, header, channels, palette, transparency) {
126
+ const count = header.width * header.height;
127
+ const pixels = new Uint8Array(count * 4);
128
+ for (let index = 0; index < count; index += 1) {
129
+ const from = index * channels;
130
+ const to = index * 4;
131
+ switch (header.color) {
132
+ case 0: {
133
+ const grey = scanlines[from];
134
+ pixels[to] = grey;
135
+ pixels[to + 1] = grey;
136
+ pixels[to + 2] = grey;
137
+ pixels[to + 3] = 255;
138
+ break;
139
+ }
140
+ case 2:
141
+ pixels[to] = scanlines[from];
142
+ pixels[to + 1] = scanlines[from + 1];
143
+ pixels[to + 2] = scanlines[from + 2];
144
+ pixels[to + 3] = 255;
145
+ break;
146
+ case 3: {
147
+ if (!palette)
148
+ throw new Error("That PNG uses a palette but has no palette chunk");
149
+ const entry = scanlines[from] * 3;
150
+ pixels[to] = palette[entry];
151
+ pixels[to + 1] = palette[entry + 1];
152
+ pixels[to + 2] = palette[entry + 2];
153
+ // tRNS gives palette entries an alpha; entries past its end are opaque.
154
+ pixels[to + 3] = transparency?.[scanlines[from]] ?? 255;
155
+ break;
156
+ }
157
+ case 4: {
158
+ const grey = scanlines[from];
159
+ pixels[to] = grey;
160
+ pixels[to + 1] = grey;
161
+ pixels[to + 2] = grey;
162
+ pixels[to + 3] = scanlines[from + 1];
163
+ break;
164
+ }
165
+ default:
166
+ pixels[to] = scanlines[from];
167
+ pixels[to + 1] = scanlines[from + 1];
168
+ pixels[to + 2] = scanlines[from + 2];
169
+ pixels[to + 3] = scanlines[from + 3];
170
+ }
171
+ }
172
+ return pixels;
173
+ }
174
+ export function encode(bitmap) {
175
+ const stride = bitmap.width * 4;
176
+ const raw = Buffer.alloc((stride + 1) * bitmap.height);
177
+ for (let row = 0; row < bitmap.height; row += 1) {
178
+ // Filter 0 (None). Icons are small; the extra bytes are not worth the
179
+ // complexity of choosing a filter per row.
180
+ raw[row * (stride + 1)] = 0;
181
+ Buffer.from(bitmap.pixels.buffer, bitmap.pixels.byteOffset + row * stride, stride).copy(raw, row * (stride + 1) + 1);
182
+ }
183
+ const header = Buffer.alloc(13);
184
+ header.writeUInt32BE(bitmap.width, 0);
185
+ header.writeUInt32BE(bitmap.height, 4);
186
+ header.writeUInt8(8, 8); // bit depth
187
+ header.writeUInt8(6, 9); // RGBA
188
+ return Buffer.concat([
189
+ SIGNATURE,
190
+ chunk("IHDR", header),
191
+ chunk("IDAT", deflateSync(raw, { level: 9 })),
192
+ chunk("IEND", Buffer.alloc(0)),
193
+ ]);
194
+ }
195
+ function chunk(type, body) {
196
+ const length = Buffer.alloc(4);
197
+ length.writeUInt32BE(body.length);
198
+ const payload = Buffer.concat([Buffer.from(type, "ascii"), body]);
199
+ const crc = Buffer.alloc(4);
200
+ crc.writeUInt32BE(crc32(payload) >>> 0);
201
+ return Buffer.concat([length, payload, crc]);
202
+ }
203
+ const CRC_TABLE = (() => {
204
+ const table = new Uint32Array(256);
205
+ for (let index = 0; index < 256; index += 1) {
206
+ let value = index;
207
+ for (let bit = 0; bit < 8; bit += 1) {
208
+ value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
209
+ }
210
+ table[index] = value >>> 0;
211
+ }
212
+ return table;
213
+ })();
214
+ function crc32(buffer) {
215
+ let crc = 0xffffffff;
216
+ for (const byte of buffer)
217
+ crc = CRC_TABLE[(crc ^ byte) & 0xff] ^ (crc >>> 8);
218
+ return (crc ^ 0xffffffff) >>> 0;
219
+ }
220
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../src/icons/png.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Bitmap } from "./png.js";
2
+ /**
3
+ * Scale an image down by averaging the source pixels each target pixel covers.
4
+ *
5
+ * Box filtering rather than nearest-neighbour, because an icon downscaled by
6
+ * picking one pixel in sixteen looks like a mistake at 32x32 - which is the
7
+ * size people actually see.
8
+ *
9
+ * Alpha is premultiplied before averaging and divided back out afterwards.
10
+ * Averaging straight RGBA mixes the colour of fully transparent pixels into
11
+ * the visible ones, which puts a dark halo around anything with a soft edge.
12
+ */
13
+ export declare function resize(source: Bitmap, size: number): Bitmap;
14
+ //# sourceMappingURL=resize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.d.ts","sourceRoot":"","sources":["../../src/icons/resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoD3D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Scale an image down by averaging the source pixels each target pixel covers.
3
+ *
4
+ * Box filtering rather than nearest-neighbour, because an icon downscaled by
5
+ * picking one pixel in sixteen looks like a mistake at 32x32 - which is the
6
+ * size people actually see.
7
+ *
8
+ * Alpha is premultiplied before averaging and divided back out afterwards.
9
+ * Averaging straight RGBA mixes the colour of fully transparent pixels into
10
+ * the visible ones, which puts a dark halo around anything with a soft edge.
11
+ */
12
+ export function resize(source, size) {
13
+ if (source.width === size && source.height === size)
14
+ return source;
15
+ const pixels = new Uint8Array(size * size * 4);
16
+ const scaleX = source.width / size;
17
+ const scaleY = source.height / size;
18
+ for (let y = 0; y < size; y += 1) {
19
+ const top = Math.floor(y * scaleY);
20
+ const bottom = Math.max(top + 1, Math.min(source.height, Math.ceil((y + 1) * scaleY)));
21
+ for (let x = 0; x < size; x += 1) {
22
+ const left = Math.floor(x * scaleX);
23
+ const right = Math.max(left + 1, Math.min(source.width, Math.ceil((x + 1) * scaleX)));
24
+ let red = 0;
25
+ let green = 0;
26
+ let blue = 0;
27
+ let alpha = 0;
28
+ let count = 0;
29
+ for (let sy = top; sy < bottom; sy += 1) {
30
+ for (let sx = left; sx < right; sx += 1) {
31
+ const at = (sy * source.width + sx) * 4;
32
+ const a = source.pixels[at + 3];
33
+ red += source.pixels[at] * a;
34
+ green += source.pixels[at + 1] * a;
35
+ blue += source.pixels[at + 2] * a;
36
+ alpha += a;
37
+ count += 1;
38
+ }
39
+ }
40
+ const to = (y * size + x) * 4;
41
+ if (alpha === 0) {
42
+ // Fully transparent: there is no colour to recover, and dividing by
43
+ // zero would invent one.
44
+ pixels[to] = 0;
45
+ pixels[to + 1] = 0;
46
+ pixels[to + 2] = 0;
47
+ pixels[to + 3] = 0;
48
+ continue;
49
+ }
50
+ pixels[to] = Math.round(red / alpha);
51
+ pixels[to + 1] = Math.round(green / alpha);
52
+ pixels[to + 2] = Math.round(blue / alpha);
53
+ pixels[to + 3] = Math.round(alpha / count);
54
+ }
55
+ }
56
+ return { width: size, height: size, pixels };
57
+ }
58
+ //# sourceMappingURL=resize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.js","sourceRoot":"","sources":["../../src/icons/resize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `@vantail/cli` - the programmatic side of the command line.
3
+ *
4
+ * `defineConfig` lives here so that `vantail.config.ts` has exactly one import,
5
+ * from the package the project already depends on to build itself.
6
+ */
7
+ export { defineConfig } from "@vantail/shared";
8
+ export type { AppConfig, ClipboardPermissions, FilesystemPermissions, PathScope, PermissionsConfig, VantailConfig, WindowConfig, } from "@vantail/shared";
9
+ export { build, type BuildOptions, type BuildResult } from "./commands/build.js";
10
+ export { dev, type DevOptions } from "./commands/dev.js";
11
+ export { doctor, type DoctorOptions } from "./commands/doctor.js";
12
+ export { packageApp, type PackageOptions } from "./commands/package.js";
13
+ export { bundle, type BundleInput, type BundleResult } from "./bundle/index.js";
14
+ export { buildRuntimeConfig, type RuntimeConfigInput } from "./runtime-config.js";
15
+ /** Kept in step with package.json by the release script. */
16
+ export declare const VERSION = "0.1.0";
17
+ /** `ConfigError` is thrown from a package the CLI does not re-export. */
18
+ export declare const ConfigErrorName = "ConfigError";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EACV,SAAS,EACT,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAElF,4DAA4D;AAC5D,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,yEAAyE;AACzE,eAAO,MAAM,eAAe,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `@vantail/cli` - the programmatic side of the command line.
3
+ *
4
+ * `defineConfig` lives here so that `vantail.config.ts` has exactly one import,
5
+ * from the package the project already depends on to build itself.
6
+ */
7
+ export { defineConfig } from "@vantail/shared";
8
+ export { build } from "./commands/build.js";
9
+ export { dev } from "./commands/dev.js";
10
+ export { doctor } from "./commands/doctor.js";
11
+ export { packageApp } from "./commands/package.js";
12
+ export { bundle } from "./bundle/index.js";
13
+ export { buildRuntimeConfig } from "./runtime-config.js";
14
+ /** Kept in step with package.json by the release script. */
15
+ export const VERSION = "0.1.0";
16
+ /** `ConfigError` is thrown from a package the CLI does not re-export. */
17
+ export const ConfigErrorName = "ConfigError";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAW/C,OAAO,EAAE,KAAK,EAAuC,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,GAAG,EAAmB,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAsB,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAuB,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAuC,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAA2B,MAAM,qBAAqB,CAAC;AAElF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,yEAAyE;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ParsedConfig } from "@vantail/shared/load";
2
+ import type { IconSet } from "../icons/index.js";
3
+ export interface InstallerInput {
4
+ config: ParsedConfig;
5
+ /** Project root, for resolving anything the config names. */
6
+ root: string;
7
+ /** The `.app` or portable folder to wrap. */
8
+ bundlePath: string;
9
+ outDir: string;
10
+ /** `My-App-1.2.0-darwin-aarch64`, without an extension. */
11
+ fileStem: string;
12
+ icons?: IconSet | undefined;
13
+ }
14
+ export interface InstallerResult {
15
+ path: string;
16
+ kind: "dmg" | "msi" | "deb";
17
+ /** Set when the file was produced but a required tool was missing. */
18
+ note?: string;
19
+ }
20
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/installers/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/installers/common.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
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 type { InstallerInput, InstallerResult } from "./common.js";
11
+ export declare function buildDeb(input: InstallerInput): Promise<InstallerResult>;
12
+ /** Debian package names are lowercase, and punctuation is a hyphen. */
13
+ export declare function debianName(name: string): string;
14
+ export declare function debianArchitecture(arch: string): string;
15
+ //# sourceMappingURL=deb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deb.d.ts","sourceRoot":"","sources":["../../src/installers/deb.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAUnE,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAqE9E;AA6ED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMvD"}