@gjsify/cli 0.64.1-next.249 → 0.64.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.gjs.mjs +79 -79
- package/lib/commands/ship.js +15 -7
- package/lib/utils/ship/flatpak-config.d.ts +33 -0
- package/lib/utils/ship/flatpak-config.js +40 -1
- package/lib/utils/ship/layout.d.ts +40 -2
- package/lib/utils/ship/layout.js +93 -4
- package/lib/utils/ship/settings.js +4 -3
- package/package.json +21 -22
package/lib/commands/ship.js
CHANGED
|
@@ -454,13 +454,21 @@ async function assemble(args) {
|
|
|
454
454
|
})),
|
|
455
455
|
];
|
|
456
456
|
// THE APPLICATION ICON, rendered once for the sizes this layout's writers
|
|
457
|
-
// embed — six for the `.exe`'s resource directory, seven for the `.icns
|
|
458
|
-
//
|
|
459
|
-
//
|
|
460
|
-
//
|
|
461
|
-
//
|
|
462
|
-
//
|
|
463
|
-
|
|
457
|
+
// embed — six for the `.exe`'s resource directory, seven for the `.icns`,
|
|
458
|
+
// three for the hicolor theme — and nothing for a CLI. `resolveAppIcon`
|
|
459
|
+
// REFUSES an app that has no source for a size rather than staging without
|
|
460
|
+
// it: the released artifacts this closes shipped for a year with the generic
|
|
461
|
+
// icon on two platforms, and the only reason was that nothing said so
|
|
462
|
+
// (`utils/ship/icons.ts`).
|
|
463
|
+
//
|
|
464
|
+
// …EXCEPT WHERE THE ROW SAYS THE ICON IS NOT REQUIRED, which is Linux and is
|
|
465
|
+
// not a softening of that rule. An icon-less app there is reported by
|
|
466
|
+
// `resolveShipSettings`'s warning and then by its own menu entry, so refusing
|
|
467
|
+
// would stop a project that has not drawn its icon yet from building a `.deb`
|
|
468
|
+
// over a defect it can already see (`LayoutIcon.required`). The guard belongs
|
|
469
|
+
// HERE as well as in `iconFor`, because `resolveAppIcon` is the half that
|
|
470
|
+
// refuses an empty `iconFiles` — reaching it at all is what has to not happen.
|
|
471
|
+
const icon = settings.kind === 'app' && layout.icon !== undefined && (layout.icon.required || settings.iconFiles.length > 0)
|
|
464
472
|
? await resolveAppIcon({
|
|
465
473
|
iconFiles: settings.iconFiles,
|
|
466
474
|
appId: settings.appId,
|
|
@@ -43,6 +43,39 @@ export interface PickedFlatpakBuildKeys {
|
|
|
43
43
|
export declare function pickFlatpakBuildKeys(preferred: ShipFlatpakOptions | undefined, legacy: ConfigDataFlatpak): PickedFlatpakBuildKeys;
|
|
44
44
|
/** The branch a `ship` Flatpak is exported under when the project names none. */
|
|
45
45
|
export declare const DEFAULT_SHIP_FLATPAK_BRANCH = "stable";
|
|
46
|
+
/**
|
|
47
|
+
* The scalable icon directory a `kind: 'app'` Flatpak drops before
|
|
48
|
+
* `appstreamcli compose` reads the tree.
|
|
49
|
+
*
|
|
50
|
+
* THE OTHER HALF OF `LAYOUTS.linux.icon`, and the half that cannot live in the
|
|
51
|
+
* layout: the stage is one payload for four Linux formats (ADR 0024 § 2) and the
|
|
52
|
+
* `.deb`, the `.rpm` and the AppImage all WANT the SVG — it is the icon GTK
|
|
53
|
+
* prefers, and `selectAppDirIcon` ranks it above every raster. Only the Flatpak
|
|
54
|
+
* has a build step that reads the theme, so only the Flatpak removes it, and it
|
|
55
|
+
* does so inside the sandbox rather than in the tree `ship` staged.
|
|
56
|
+
*
|
|
57
|
+
* WHY IT IS REMOVED AT ALL. `flatpak-builder` runs `appstreamcli compose` on the
|
|
58
|
+
* HOST to produce `/app/share/app-info`; AppStream 1.1.3 decodes icons through
|
|
59
|
+
* gdk-pixbuf, which reads SVG only through a loader module Fedora 44 no longer
|
|
60
|
+
* ships (`LAYOUTS.linux.icon` carries the measurement). Three probes: with the
|
|
61
|
+
* SVG present compose fails whether or not rasters are there, because it PREFERS
|
|
62
|
+
* the scalable icon and does not fall back; with the SVG gone and the rasters
|
|
63
|
+
* present it succeeds and emits 64×64 and 128×128 into the catalogue. So the
|
|
64
|
+
* rasters are necessary and this is what makes them sufficient.
|
|
65
|
+
*
|
|
66
|
+
* UNCONDITIONAL, not host-detected, and that is the point. `org.flatpak.Builder`
|
|
67
|
+
* on Flathub bundles a gdk-pixbuf that CAN read SVG, so probing the host would
|
|
68
|
+
* make the same source produce a different `.flatpak` depending on where it was
|
|
69
|
+
* built — the one property ADR 0024 § A2 asks a pack to keep. One tree, every
|
|
70
|
+
* host, at the cost of a scalable icon inside a sandbox whose only reader
|
|
71
|
+
* (`Icon=<appId>` in the exported desktop entry) resolves the 256 px raster.
|
|
72
|
+
*
|
|
73
|
+
* THE UPSTREAM FIX IS NOT OURS: `libappstream-compose.so.0` already links
|
|
74
|
+
* `librsvg-2.so.2` and uses it for fonts alone, so AppStream could render the
|
|
75
|
+
* icon without gdk-pixbuf at all. Reported as an `Upstream (AppStream, file by
|
|
76
|
+
* hand)` issue rather than filed there (root AGENTS.md).
|
|
77
|
+
*/
|
|
78
|
+
export declare const SCALABLE_ICONS_CLEANUP = "/share/icons/hicolor/scalable";
|
|
46
79
|
export interface ShipFlatpakInput {
|
|
47
80
|
ship: ConfigDataShip;
|
|
48
81
|
flatpak: ConfigDataFlatpak;
|
|
@@ -88,6 +88,39 @@ export function pickFlatpakBuildKeys(preferred, legacy) {
|
|
|
88
88
|
}
|
|
89
89
|
/** The branch a `ship` Flatpak is exported under when the project names none. */
|
|
90
90
|
export const DEFAULT_SHIP_FLATPAK_BRANCH = 'stable';
|
|
91
|
+
/**
|
|
92
|
+
* The scalable icon directory a `kind: 'app'` Flatpak drops before
|
|
93
|
+
* `appstreamcli compose` reads the tree.
|
|
94
|
+
*
|
|
95
|
+
* THE OTHER HALF OF `LAYOUTS.linux.icon`, and the half that cannot live in the
|
|
96
|
+
* layout: the stage is one payload for four Linux formats (ADR 0024 § 2) and the
|
|
97
|
+
* `.deb`, the `.rpm` and the AppImage all WANT the SVG — it is the icon GTK
|
|
98
|
+
* prefers, and `selectAppDirIcon` ranks it above every raster. Only the Flatpak
|
|
99
|
+
* has a build step that reads the theme, so only the Flatpak removes it, and it
|
|
100
|
+
* does so inside the sandbox rather than in the tree `ship` staged.
|
|
101
|
+
*
|
|
102
|
+
* WHY IT IS REMOVED AT ALL. `flatpak-builder` runs `appstreamcli compose` on the
|
|
103
|
+
* HOST to produce `/app/share/app-info`; AppStream 1.1.3 decodes icons through
|
|
104
|
+
* gdk-pixbuf, which reads SVG only through a loader module Fedora 44 no longer
|
|
105
|
+
* ships (`LAYOUTS.linux.icon` carries the measurement). Three probes: with the
|
|
106
|
+
* SVG present compose fails whether or not rasters are there, because it PREFERS
|
|
107
|
+
* the scalable icon and does not fall back; with the SVG gone and the rasters
|
|
108
|
+
* present it succeeds and emits 64×64 and 128×128 into the catalogue. So the
|
|
109
|
+
* rasters are necessary and this is what makes them sufficient.
|
|
110
|
+
*
|
|
111
|
+
* UNCONDITIONAL, not host-detected, and that is the point. `org.flatpak.Builder`
|
|
112
|
+
* on Flathub bundles a gdk-pixbuf that CAN read SVG, so probing the host would
|
|
113
|
+
* make the same source produce a different `.flatpak` depending on where it was
|
|
114
|
+
* built — the one property ADR 0024 § A2 asks a pack to keep. One tree, every
|
|
115
|
+
* host, at the cost of a scalable icon inside a sandbox whose only reader
|
|
116
|
+
* (`Icon=<appId>` in the exported desktop entry) resolves the 256 px raster.
|
|
117
|
+
*
|
|
118
|
+
* THE UPSTREAM FIX IS NOT OURS: `libappstream-compose.so.0` already links
|
|
119
|
+
* `librsvg-2.so.2` and uses it for fonts alone, so AppStream could render the
|
|
120
|
+
* icon without gdk-pixbuf at all. Reported as an `Upstream (AppStream, file by
|
|
121
|
+
* hand)` issue rather than filed there (root AGENTS.md).
|
|
122
|
+
*/
|
|
123
|
+
export const SCALABLE_ICONS_CLEANUP = '/share/icons/hicolor/scalable';
|
|
91
124
|
/**
|
|
92
125
|
* Resolve the Flatpak half of `gjsify.ship`, reading the legacy block where the
|
|
93
126
|
* new one is silent, and applying `ship`'s own defaults.
|
|
@@ -116,7 +149,13 @@ export function resolveShipFlatpakSettings(input) {
|
|
|
116
149
|
// extension not being installed.
|
|
117
150
|
appendPath: appendPath ?? (extensions.length > 0 ? deriveAppendPath(extensions) : []),
|
|
118
151
|
finishArgs: finishArgs ?? (input.kind === 'cli' ? DEFAULT_CLI_FINISH_ARGS : DEFAULT_GUI_FINISH_ARGS),
|
|
119
|
-
|
|
152
|
+
// APPENDED to what the project declared, not defaulted to — the one entry
|
|
153
|
+
// here that is not the author's choice. A project with its own `cleanup`
|
|
154
|
+
// list would otherwise lose the entry that keeps its own Flatpak buildable
|
|
155
|
+
// (see {@link SCALABLE_ICONS_CLEANUP}), and `??` cannot express "ours as
|
|
156
|
+
// well as theirs". Deduplicated so a project that already wrote the glob —
|
|
157
|
+
// the workaround this replaces — gets one, and in ITS position.
|
|
158
|
+
cleanup: [...new Set([...(cleanup ?? []), ...(input.kind === 'app' ? [SCALABLE_ICONS_CLEANUP] : [])])],
|
|
120
159
|
};
|
|
121
160
|
return { settings, warnings: fromLegacy.length === 0 ? [] : [deprecationWarning(fromLegacy)] };
|
|
122
161
|
}
|
|
@@ -70,15 +70,44 @@ export interface LayoutMetadataInput extends LayoutIdentity {
|
|
|
70
70
|
* Declared on the row rather than computed from it because the orchestrator
|
|
71
71
|
* renders the rasters BEFORE the row runs — `resolveAppIcon` is asynchronous (a
|
|
72
72
|
* child GJS) and `Layout.metadata` is not — so the row states its needs up front
|
|
73
|
-
* and receives exactly those sizes.
|
|
73
|
+
* and receives exactly those sizes.
|
|
74
|
+
*
|
|
75
|
+
* ON ALL THREE ROWS, and it was absent from the Linux one until a Flatpak build
|
|
76
|
+
* measured why that was wrong. The reasoning it was absent for — "the hicolor
|
|
74
77
|
* theme carries the SVG the project declared and GTK renders it itself, so there
|
|
75
|
-
* is nothing to convert and
|
|
78
|
+
* is nothing to convert" — is true of GTK and NOT of the tooling that reads the
|
|
79
|
+
* same theme at BUILD time: `appstreamcli compose` resolves an SVG through
|
|
80
|
+
* gdk-pixbuf, which needs an SVG LOADER MODULE, and a host without one fails the
|
|
81
|
+
* whole compose run rather than falling back to a raster. The same host-packaging
|
|
82
|
+
* fact `icons.ts` records for the rasterizer, one phase to the right — see
|
|
83
|
+
* {@link LAYOUTS.linux.icon}.
|
|
76
84
|
*/
|
|
77
85
|
export interface LayoutIcon {
|
|
78
86
|
/** Square edge lengths the writer embeds. */
|
|
79
87
|
sizes: readonly number[];
|
|
80
88
|
/** What is written, for the refusal: "the Windows launcher's icon". */
|
|
81
89
|
writes: string;
|
|
90
|
+
/**
|
|
91
|
+
* Whether a `kind: 'app'` stage is REFUSED when the project declares no icon
|
|
92
|
+
* source, or assembled without one.
|
|
93
|
+
*
|
|
94
|
+
* REQUIRED on every row, like {@link Layout.metadata} and
|
|
95
|
+
* {@link Layout.arches}: `false` is an answer, and an optional field is one a
|
|
96
|
+
* fourth OS forgets and then silently inherits whichever default was typed
|
|
97
|
+
* first.
|
|
98
|
+
*
|
|
99
|
+
* The two answers are different FAILURE MODES, not different strictnesses.
|
|
100
|
+
* On macOS and Windows the icon lives inside a container — an `.icns` named by
|
|
101
|
+
* `CFBundleIconFile`, a `.rsrc` in the launcher — and an application that
|
|
102
|
+
* ships without it shows the generic icon with nothing anywhere saying so:
|
|
103
|
+
* measured on released artifacts, for a year (`icons.ts`). On Linux the icon
|
|
104
|
+
* is a FILE in a theme, the desktop entry's `Icon=` names it, and an
|
|
105
|
+
* icon-less app is visibly icon-less in the menu the first time it is
|
|
106
|
+
* installed — which `resolveShipSettings` already warns about. Turning that
|
|
107
|
+
* warning into a refusal would stop a project that has not drawn its icon yet
|
|
108
|
+
* from building a `.deb` at all, for a defect its own menu entry reports.
|
|
109
|
+
*/
|
|
110
|
+
required: boolean;
|
|
82
111
|
}
|
|
83
112
|
/** The four places a payload file can belong, as stage-relative directories. */
|
|
84
113
|
export interface LayoutDirs {
|
|
@@ -252,6 +281,15 @@ export interface LayoutArches {
|
|
|
252
281
|
/** What a reader must know to act on the refusal: who blocks it, and where it is tracked. */
|
|
253
282
|
why: string;
|
|
254
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* The square sizes the Linux row writes into the hicolor theme.
|
|
286
|
+
*
|
|
287
|
+
* Here and not in a writer module like {@link ICO_SIZES} and {@link ICNS_SIZES},
|
|
288
|
+
* because there is no writer: the rasters ARE the artifact, one file per size,
|
|
289
|
+
* and the row below is the only thing that names them. See
|
|
290
|
+
* {@link LAYOUTS.linux.icon} for what asked for each of the three.
|
|
291
|
+
*/
|
|
292
|
+
export declare const HICOLOR_RASTER_SIZES: readonly [64, 128, 256];
|
|
255
293
|
export declare const LAYOUTS: Record<LayoutName, Layout>;
|
|
256
294
|
/** Every layout name, derived from the table so a new row cannot be missed. */
|
|
257
295
|
export declare const LAYOUT_NAMES: LayoutName[];
|
package/lib/utils/ship/layout.js
CHANGED
|
@@ -36,6 +36,15 @@ import { SHARE } from './share-dirs.js';
|
|
|
36
36
|
* `hdiutil` time, which is three milestones away and on another host.
|
|
37
37
|
*/
|
|
38
38
|
const BUNDLE_NAME_FORBIDDEN = /[/:\\]/;
|
|
39
|
+
/**
|
|
40
|
+
* The square sizes the Linux row writes into the hicolor theme.
|
|
41
|
+
*
|
|
42
|
+
* Here and not in a writer module like {@link ICO_SIZES} and {@link ICNS_SIZES},
|
|
43
|
+
* because there is no writer: the rasters ARE the artifact, one file per size,
|
|
44
|
+
* and the row below is the only thing that names them. See
|
|
45
|
+
* {@link LAYOUTS.linux.icon} for what asked for each of the three.
|
|
46
|
+
*/
|
|
47
|
+
export const HICOLOR_RASTER_SIZES = [64, 128, 256];
|
|
39
48
|
/**
|
|
40
49
|
* The value `ATSApplicationFontsPath` takes for this bundle, or nothing when the
|
|
41
50
|
* payload carries no face (ADR 0038).
|
|
@@ -81,6 +90,10 @@ function iconFor(input, layout) {
|
|
|
81
90
|
if (input.kind !== 'app')
|
|
82
91
|
return undefined;
|
|
83
92
|
if (input.icon === undefined) {
|
|
93
|
+
// The row's own answer, not a uniform one — {@link LayoutIcon.required}
|
|
94
|
+
// carries which failure mode this layout has.
|
|
95
|
+
if (LAYOUTS[layout].icon?.required !== true)
|
|
96
|
+
return undefined;
|
|
84
97
|
throw new Error(`gjsify ship: the ${layout} layout writes the application's icon and was given none. ` +
|
|
85
98
|
'A `kind: "app"` stage is rendered its icon by `resolveAppIcon` before the layout runs; ' +
|
|
86
99
|
'reaching this row without one is a caller that skipped that step.');
|
|
@@ -105,10 +118,78 @@ export const LAYOUTS = {
|
|
|
105
118
|
data: 'share',
|
|
106
119
|
other: '',
|
|
107
120
|
}),
|
|
121
|
+
// THE RASTERS THE BUILD-TIME READERS OF THE THEME NEED, and the one row
|
|
122
|
+
// whose icon is written as ordinary payload files rather than into a
|
|
123
|
+
// container. A GNOME app declares one scalable SVG, `planIcons` stages it
|
|
124
|
+
// at `share/icons/hicolor/scalable/apps/<appId>.svg`, and GTK renders it —
|
|
125
|
+
// so for three milestones this row wrote nothing.
|
|
126
|
+
//
|
|
127
|
+
// WHAT READS THE THEME BEFORE GTK DOES is `appstreamcli compose`, which
|
|
128
|
+
// `flatpak-builder` runs to produce `/app/share/app-info` — the catalogue
|
|
129
|
+
// every app store shows the app out of. AppStream 1.1.3 loads an icon
|
|
130
|
+
// through gdk-pixbuf, gdk-pixbuf reads SVG only through a LOADER MODULE,
|
|
131
|
+
// and that module is a property of the host's packaging rather than of
|
|
132
|
+
// this payload: on Fedora 44, workstation and `ghcr.io/gjsify/ci-fedora:44`
|
|
133
|
+
// alike, `/usr/lib64/gdk-pixbuf-2.0/2.10.0/loaders/` holds the xpm loader
|
|
134
|
+
// and nothing else, and `dnf provides '*/libpixbufloader-svg.so'` answers
|
|
135
|
+
// with no package at all — librsvg dropped it. So the compose run dies
|
|
136
|
+
// `file-read-error` ("image file format unknown") on the SVG and takes the
|
|
137
|
+
// whole `gjsify ship linux --target flatpak` with it. Exactly the fact
|
|
138
|
+
// `icons.ts` records for the rasterizer, one phase to the right, and the
|
|
139
|
+
// reason this is the SAME list of sizes rather than a flatpak-only patch:
|
|
140
|
+
// a `.deb` installing rasters beside its SVG is what every other GNOME app
|
|
141
|
+
// does, and the artifact stays one payload.
|
|
142
|
+
//
|
|
143
|
+
// IT IS NOT ENOUGH TO ADD THEM, measured in three probes: with the SVG
|
|
144
|
+
// present appstreamcli PREFERS it and does not fall back, so SVG + 128 and
|
|
145
|
+
// SVG + 64/128/256 both still fail and PNG-only succeeds. The SVG has to
|
|
146
|
+
// leave the tree the compose run sees — which is a Flatpak-only move,
|
|
147
|
+
// because only there is the tree built, and it is the generated manifest's
|
|
148
|
+
// `cleanup` that makes it (`flatpak-config.ts`).
|
|
149
|
+
//
|
|
150
|
+
// 64/128/256 is what a store needs and what the theme spec's own
|
|
151
|
+
// `index.theme` sizes cover: AppStream asks for 64 and 128 (it emitted
|
|
152
|
+
// exactly those two from the PNG-only probe), and 256 is the HiDPI entry
|
|
153
|
+
// Flathub's quality guidelines expect.
|
|
154
|
+
icon: {
|
|
155
|
+
sizes: HICOLOR_RASTER_SIZES,
|
|
156
|
+
writes: "the hicolor theme's raster icons (`share/icons/hicolor/<n>x<n>/apps/<appId>.png`)",
|
|
157
|
+
// The ONE row that assembles without an icon rather than refusing —
|
|
158
|
+
// `LayoutIcon.required` carries why.
|
|
159
|
+
required: false,
|
|
160
|
+
},
|
|
108
161
|
// A `/usr` prefix has no manifest of its own — everything a Linux package
|
|
109
162
|
// says about itself is in the `.deb`/`.rpm` header or in the freedesktop
|
|
110
|
-
// files the payload already carries.
|
|
111
|
-
|
|
163
|
+
// files the payload already carries. What it owns is the rasters above.
|
|
164
|
+
//
|
|
165
|
+
// SKIPPING A SIZE THE PAYLOAD ALREADY STAGES is not an optimisation: a
|
|
166
|
+
// project shipping its own hand-tuned `data/icons/hicolor/128x128/apps/…`
|
|
167
|
+
// has it planned by `planIcons` at the identical path, and `placeStage`
|
|
168
|
+
// REFUSES two sources for one destination (`claim`). The project's file is
|
|
169
|
+
// the one to keep — it is drawn for that size, which is the whole point of
|
|
170
|
+
// the hicolor convention (`icons.ts`) — so the row yields rather than
|
|
171
|
+
// colliding. `resolveAppIcon` has already read that same PNG into the
|
|
172
|
+
// raster map, so the bytes agree either way; what differs is only which
|
|
173
|
+
// file the stage records as the source.
|
|
174
|
+
metadata: (input, payload) => {
|
|
175
|
+
const icon = iconFor(input, 'linux');
|
|
176
|
+
if (icon === undefined)
|
|
177
|
+
return [];
|
|
178
|
+
const planned = new Set(payload.map((file) => file.path));
|
|
179
|
+
const out = [];
|
|
180
|
+
for (const size of [...icon.png.keys()].sort((a, b) => a - b)) {
|
|
181
|
+
const rel = `${SHARE.icons}/${size}x${size}/apps/${input.appId}.png`;
|
|
182
|
+
const data = icon.png.get(size);
|
|
183
|
+
if (data === undefined || planned.has(rel))
|
|
184
|
+
continue;
|
|
185
|
+
out.push({
|
|
186
|
+
path: place(LAYOUTS.linux, input, rel),
|
|
187
|
+
mode: 0o644,
|
|
188
|
+
source: { kind: 'bytes', data },
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return out;
|
|
192
|
+
},
|
|
112
193
|
// Every architecture Debian and rpm have a name for, which is what
|
|
113
194
|
// `DEBIAN_ARCH`/`RPM_ARCH` already enumerate — the layout adds nothing.
|
|
114
195
|
arches: null,
|
|
@@ -213,7 +294,11 @@ export const LAYOUTS = {
|
|
|
213
294
|
// released 0.8.0 bundle of one app (macOS 15.7, 2026-09-13): no key, no
|
|
214
295
|
// `.icns`, generic icon — the twin of the Windows defect `pe-launcher.ts`
|
|
215
296
|
// records.
|
|
216
|
-
icon: {
|
|
297
|
+
icon: {
|
|
298
|
+
sizes: ICNS_SIZES,
|
|
299
|
+
writes: 'the macOS bundle icon (`Contents/Resources/<binaryName>.icns`)',
|
|
300
|
+
required: true,
|
|
301
|
+
},
|
|
217
302
|
metadata: (input, payload) => {
|
|
218
303
|
const icon = iconFor(input, 'darwin');
|
|
219
304
|
const iconFile = icon === undefined ? undefined : `${input.binaryName}.icns`;
|
|
@@ -359,7 +444,11 @@ export const LAYOUTS = {
|
|
|
359
444
|
// the target's out of its resource directory — so the `.exe` carries the
|
|
360
445
|
// six sizes as `RT_ICON`/`RT_GROUP_ICON` (`ico.ts`, `pe-launcher.ts`) and
|
|
361
446
|
// there is no `.ico` file in the program directory to fall out of sync.
|
|
362
|
-
icon: {
|
|
447
|
+
icon: {
|
|
448
|
+
sizes: ICO_SIZES,
|
|
449
|
+
writes: 'the Windows launcher icon (`.rsrc` of `<binaryName>.exe`)',
|
|
450
|
+
required: true,
|
|
451
|
+
},
|
|
363
452
|
metadata: (input) => {
|
|
364
453
|
const icon = iconFor(input, 'windows');
|
|
365
454
|
return input.arch === 'x64'
|
|
@@ -181,9 +181,10 @@ export function resolveShipSettings(input) {
|
|
|
181
181
|
const description = descriptionParagraphs(metadata.description) ?? [summary];
|
|
182
182
|
const sections = sectionsFor(metadata.categories);
|
|
183
183
|
if (kind === 'app' && discovered.iconFiles.length === 0) {
|
|
184
|
-
warnings.push(`gjsify ship: no icon found — the installed app will show a placeholder in menus
|
|
185
|
-
'
|
|
186
|
-
'`gjsify.ship.icon` at an SVG (or a directory of
|
|
184
|
+
warnings.push(`gjsify ship: no icon found — the installed app will show a placeholder in menus on Linux, the ` +
|
|
185
|
+
'Flatpak will carry no catalogue icon for an app store to show, and the darwin and windows ' +
|
|
186
|
+
'layouts refuse to stage without one. Point `gjsify.ship.icon` at an SVG (or a directory of ' +
|
|
187
|
+
'sized PNGs).');
|
|
187
188
|
}
|
|
188
189
|
// Resolved here rather than in the packer, because the packer may run on a
|
|
189
190
|
// host with no `package.json` at all (ADR 0024 § A2) — and because the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/cli",
|
|
3
|
-
"version": "0.64.1
|
|
3
|
+
"version": "0.64.1",
|
|
4
4
|
"description": "CLI for Gjsify",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -142,22 +142,22 @@
|
|
|
142
142
|
"cli"
|
|
143
143
|
],
|
|
144
144
|
"dependencies": {
|
|
145
|
-
"@gjsify/blueprint": "0.64.1
|
|
146
|
-
"@gjsify/buffer": "0.64.1
|
|
147
|
-
"@gjsify/create-app": "0.64.1
|
|
148
|
-
"@gjsify/node-globals": "0.64.1
|
|
149
|
-
"@gjsify/node-polyfills": "0.64.1
|
|
150
|
-
"@gjsify/npm-registry": "0.64.1
|
|
151
|
-
"@gjsify/resolve-npm": "0.64.1
|
|
152
|
-
"@gjsify/rolldown-plugin-gjsify": "0.64.1
|
|
153
|
-
"@gjsify/vite-plugin-blueprint": "0.64.1
|
|
154
|
-
"@gjsify/rolldown-plugin-pnp": "0.64.1
|
|
155
|
-
"@gjsify/semver": "0.64.1
|
|
156
|
-
"@gjsify/tar": "0.64.1
|
|
157
|
-
"@gjsify/tsc": "0.64.1
|
|
158
|
-
"@gjsify/utils": "0.64.1
|
|
159
|
-
"@gjsify/web-polyfills": "0.64.1
|
|
160
|
-
"@gjsify/workspace": "0.64.1
|
|
145
|
+
"@gjsify/blueprint": "^0.64.1",
|
|
146
|
+
"@gjsify/buffer": "^0.64.1",
|
|
147
|
+
"@gjsify/create-app": "^0.64.1",
|
|
148
|
+
"@gjsify/node-globals": "^0.64.1",
|
|
149
|
+
"@gjsify/node-polyfills": "^0.64.1",
|
|
150
|
+
"@gjsify/npm-registry": "^0.64.1",
|
|
151
|
+
"@gjsify/resolve-npm": "^0.64.1",
|
|
152
|
+
"@gjsify/rolldown-plugin-gjsify": "^0.64.1",
|
|
153
|
+
"@gjsify/vite-plugin-blueprint": "^0.64.1",
|
|
154
|
+
"@gjsify/rolldown-plugin-pnp": "^0.64.1",
|
|
155
|
+
"@gjsify/semver": "^0.64.1",
|
|
156
|
+
"@gjsify/tar": "^0.64.1",
|
|
157
|
+
"@gjsify/tsc": "^0.64.1",
|
|
158
|
+
"@gjsify/utils": "^0.64.1",
|
|
159
|
+
"@gjsify/web-polyfills": "^0.64.1",
|
|
160
|
+
"@gjsify/workspace": "^0.64.1",
|
|
161
161
|
"acorn": "^8.17.0",
|
|
162
162
|
"cosmiconfig": "^9.0.2",
|
|
163
163
|
"get-tsconfig": "^4.14.0",
|
|
@@ -166,13 +166,13 @@
|
|
|
166
166
|
"yargs": "^18.0.0"
|
|
167
167
|
},
|
|
168
168
|
"devDependencies": {
|
|
169
|
-
"@gjsify/unit": "0.64.1
|
|
169
|
+
"@gjsify/unit": "^0.64.1",
|
|
170
170
|
"@types/yargs": "^17.0.35",
|
|
171
171
|
"typescript": "^6.0.3"
|
|
172
172
|
},
|
|
173
173
|
"peerDependencies": {
|
|
174
|
-
"@gjsify/oxfmt-native": "0.64.1
|
|
175
|
-
"@gjsify/rolldown-native": "0.64.1
|
|
174
|
+
"@gjsify/oxfmt-native": "^0.64.1",
|
|
175
|
+
"@gjsify/rolldown-native": "^0.64.1"
|
|
176
176
|
},
|
|
177
177
|
"peerDependenciesMeta": {
|
|
178
178
|
"@gjsify/oxfmt-native": {
|
|
@@ -191,6 +191,5 @@
|
|
|
191
191
|
"bugs": {
|
|
192
192
|
"url": "https://github.com/gjsify/gjsify/issues"
|
|
193
193
|
},
|
|
194
|
-
"homepage": "https://github.com/gjsify/gjsify/tree/main/packages/infra/cli#readme"
|
|
195
|
-
"gitHead": "2e501133bfbe80e44506deef30e911e0c551502f"
|
|
194
|
+
"homepage": "https://github.com/gjsify/gjsify/tree/main/packages/infra/cli#readme"
|
|
196
195
|
}
|