@happier-dev/stack 0.1.0-preview.17.1 → 0.1.0-preview.21.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/docs/server-flavors.md +6 -6
- package/node_modules/@happier-dev/cli-common/dist/index.d.ts +2 -0
- package/node_modules/@happier-dev/cli-common/dist/index.d.ts.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/index.js +2 -0
- package/node_modules/@happier-dev/cli-common/dist/index.js.map +1 -1
- package/node_modules/@happier-dev/cli-common/dist/providers/index.d.ts +51 -0
- package/node_modules/@happier-dev/cli-common/dist/providers/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/providers/index.js +129 -0
- package/node_modules/@happier-dev/cli-common/dist/providers/index.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/index.d.ts +5 -0
- package/node_modules/@happier-dev/cli-common/dist/service/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/index.js +5 -0
- package/node_modules/@happier-dev/cli-common/dist/service/index.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/launchd.d.ts +19 -0
- package/node_modules/@happier-dev/cli-common/dist/service/launchd.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/launchd.js +117 -0
- package/node_modules/@happier-dev/cli-common/dist/service/launchd.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/manager.d.ts +55 -0
- package/node_modules/@happier-dev/cli-common/dist/service/manager.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/manager.js +302 -0
- package/node_modules/@happier-dev/cli-common/dist/service/manager.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/systemd.d.ts +12 -0
- package/node_modules/@happier-dev/cli-common/dist/service/systemd.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/systemd.js +75 -0
- package/node_modules/@happier-dev/cli-common/dist/service/systemd.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/windows.d.ts +8 -0
- package/node_modules/@happier-dev/cli-common/dist/service/windows.d.ts.map +1 -0
- package/node_modules/@happier-dev/cli-common/dist/service/windows.js +29 -0
- package/node_modules/@happier-dev/cli-common/dist/service/windows.js.map +1 -0
- package/node_modules/@happier-dev/cli-common/package.json +11 -0
- package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts +22 -0
- package/node_modules/@happier-dev/release-runtime/dist/assets.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/assets.js +44 -0
- package/node_modules/@happier-dev/release-runtime/dist/assets.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/checksums.d.ts +5 -0
- package/node_modules/@happier-dev/release-runtime/dist/checksums.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/checksums.js +21 -0
- package/node_modules/@happier-dev/release-runtime/dist/checksums.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts +14 -0
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js +39 -0
- package/node_modules/@happier-dev/release-runtime/dist/extractPlan.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/github.d.ts +20 -0
- package/node_modules/@happier-dev/release-runtime/dist/github.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/github.js +60 -0
- package/node_modules/@happier-dev/release-runtime/dist/github.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/index.d.ts +7 -0
- package/node_modules/@happier-dev/release-runtime/dist/index.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/index.js +7 -0
- package/node_modules/@happier-dev/release-runtime/dist/index.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/minisign.d.ts +7 -0
- package/node_modules/@happier-dev/release-runtime/dist/minisign.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/minisign.js +92 -0
- package/node_modules/@happier-dev/release-runtime/dist/minisign.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.d.ts +26 -0
- package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.d.ts.map +1 -0
- package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.js +53 -0
- package/node_modules/@happier-dev/release-runtime/dist/verifiedDownload.js.map +1 -0
- package/node_modules/@happier-dev/release-runtime/package.json +38 -0
- package/package.json +4 -2
- package/scripts/auth.mjs +3 -2
- package/scripts/auth_copy_from_pglite_lock_in_use.integration.test.mjs +1 -0
- package/scripts/auth_copy_from_runCapture.integration.test.mjs +8 -1
- package/scripts/auth_login_guided_server_no_expo.test.mjs +2 -0
- package/scripts/build.mjs +3 -18
- package/scripts/bundleWorkspaceDeps.mjs +5 -1
- package/scripts/bundleWorkspaceDeps.test.mjs +42 -1
- package/scripts/mobile.mjs +30 -2
- package/scripts/mobile_dev_client.mjs +7 -32
- package/scripts/mobile_dev_client_help_smoke.test.mjs +24 -0
- package/scripts/mobile_prebuild_happyDir_defined.test.mjs +47 -0
- package/scripts/mobile_prebuild_sets_rct_metro_port.test.mjs +81 -0
- package/scripts/mobile_run_ios_passes_port.integration.test.mjs +103 -0
- package/scripts/mobile_run_ios_uses_long_port_flag.test.mjs +106 -0
- package/scripts/providers_cmd.mjs +262 -0
- package/scripts/release_binary_smoke.integration.test.mjs +45 -37
- package/scripts/remote_cmd.mjs +352 -0
- package/scripts/self_host_daemon.real.integration.test.mjs +296 -0
- package/scripts/self_host_launchd.real.integration.test.mjs +211 -0
- package/scripts/self_host_runtime.mjs +1829 -327
- package/scripts/self_host_runtime.test.mjs +523 -1
- package/scripts/self_host_schtasks.real.integration.test.mjs +217 -0
- package/scripts/self_host_service_e2e_harness.mjs +93 -0
- package/scripts/self_host_systemd.real.integration.test.mjs +8 -86
- package/scripts/service.mjs +156 -26
- package/scripts/stack/command_arguments.mjs +1 -0
- package/scripts/stack/help_text.mjs +3 -1
- package/scripts/stack.mjs +2 -1
- package/scripts/stack_daemon_cmd.integration.test.mjs +37 -0
- package/scripts/stack_happy_cmd.integration.test.mjs +36 -0
- package/scripts/stack_pr_help_cmd.test.mjs +38 -0
- package/scripts/stop.mjs +2 -3
- package/scripts/utils/auth/credentials_paths.mjs +9 -9
- package/scripts/utils/auth/credentials_paths.test.mjs +8 -0
- package/scripts/utils/auth/orchestrated_stack_auth_flow.mjs +64 -3
- package/scripts/utils/auth/stable_scope_id.mjs +1 -1
- package/scripts/utils/cli/cli_registry.mjs +21 -0
- package/scripts/utils/cli/progress.mjs +8 -1
- package/scripts/utils/cli/progress.test.mjs +43 -0
- package/scripts/utils/dev/expo_dev.buildEnv.test.mjs +17 -0
- package/scripts/utils/dev/expo_dev.mjs +35 -5
- package/scripts/utils/dev/expo_dev_restart_port_reservation.test.mjs +180 -1
- package/scripts/utils/dev/expo_dev_runtime_metadata.test.mjs +126 -0
- package/scripts/utils/dev/expo_dev_verbose_logs.test.mjs +9 -2
- package/scripts/utils/mobile/dev_client_install_invocation.mjs +68 -0
- package/scripts/utils/mobile/dev_client_install_invocation.test.mjs +27 -0
- package/scripts/utils/server/port.mjs +20 -2
- package/scripts/utils/service/service_manager.definition.test.mjs +66 -0
- package/scripts/utils/service/service_manager.mjs +96 -0
- package/scripts/utils/service/service_manager.plan.test.mjs +37 -0
- package/scripts/utils/service/service_manager.test.mjs +20 -0
- package/scripts/utils/service/systemd_service_unit.mjs +1 -0
- package/scripts/utils/service/systemd_service_unit.test.mjs +42 -0
- package/scripts/utils/service/windows_schtasks_wrapper.mjs +1 -0
- package/scripts/utils/service/windows_schtasks_wrapper.test.mjs +25 -0
- package/scripts/utils/ui/ui_export_env.mjs +29 -0
- package/scripts/utils/ui/ui_export_env.test.mjs +25 -0
- package/scripts/worktrees.mjs +3 -0
- package/scripts/worktrees_status_default_target.test.mjs +56 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { chmod, mkdir, rename, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { buildLaunchdPath, buildLaunchdPlistXml } from './launchd.js';
|
|
5
|
+
import { renderSystemdServiceUnit } from './systemd.js';
|
|
6
|
+
import { renderWindowsScheduledTaskWrapperPs1 } from './windows.js';
|
|
7
|
+
export function resolveServiceBackend(params = {}) {
|
|
8
|
+
const p = String(params.platform ?? '').trim() || process.platform;
|
|
9
|
+
const m = String(params.mode ?? '').trim().toLowerCase() === 'system' ? 'system' : 'user';
|
|
10
|
+
if (p === 'darwin')
|
|
11
|
+
return m === 'system' ? 'launchd-system' : 'launchd-user';
|
|
12
|
+
if (p === 'linux')
|
|
13
|
+
return m === 'system' ? 'systemd-system' : 'systemd-user';
|
|
14
|
+
if (p === 'win32')
|
|
15
|
+
return m === 'system' ? 'schtasks-system' : 'schtasks-user';
|
|
16
|
+
throw new Error(`Unsupported platform: ${p}`);
|
|
17
|
+
}
|
|
18
|
+
function normalizeSpec(spec) {
|
|
19
|
+
const label = String(spec?.label ?? '').trim();
|
|
20
|
+
if (!label)
|
|
21
|
+
throw new Error('Service label is required');
|
|
22
|
+
const programArgs = Array.isArray(spec?.programArgs) ? spec.programArgs.map((a) => String(a ?? '')).filter(Boolean) : [];
|
|
23
|
+
if (programArgs.length === 0)
|
|
24
|
+
throw new Error('Service programArgs are required');
|
|
25
|
+
return {
|
|
26
|
+
label,
|
|
27
|
+
description: String(spec?.description ?? '').trim() || label,
|
|
28
|
+
programArgs,
|
|
29
|
+
workingDirectory: String(spec?.workingDirectory ?? '').trim(),
|
|
30
|
+
env: spec?.env ?? {},
|
|
31
|
+
runAsUser: String(spec?.runAsUser ?? '').trim(),
|
|
32
|
+
stdoutPath: String(spec?.stdoutPath ?? '').trim(),
|
|
33
|
+
stderrPath: String(spec?.stderrPath ?? '').trim(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function systemdUnitPathForLabel(params) {
|
|
37
|
+
const unit = `${params.label}.service`;
|
|
38
|
+
if (params.mode === 'system')
|
|
39
|
+
return join('/etc/systemd/system', unit);
|
|
40
|
+
return join(String(params.homeDir ?? '').trim() || '', '.config', 'systemd', 'user', unit);
|
|
41
|
+
}
|
|
42
|
+
function launchdPlistPathForLabel(params) {
|
|
43
|
+
const dir = params.mode === 'system'
|
|
44
|
+
? '/Library/LaunchDaemons'
|
|
45
|
+
: join(String(params.homeDir ?? '').trim() || '', 'Library', 'LaunchAgents');
|
|
46
|
+
return join(dir, `${params.label}.plist`);
|
|
47
|
+
}
|
|
48
|
+
function windowsWrapperPathForLabel(params) {
|
|
49
|
+
const base = String(params.homeDir ?? '').trim() || 'C:\\Users\\Default';
|
|
50
|
+
if (params.mode === 'system') {
|
|
51
|
+
return `C:\\\\ProgramData\\\\happier\\\\services\\\\${params.label}.ps1`;
|
|
52
|
+
}
|
|
53
|
+
return `${base}\\\\.happier\\\\services\\\\${params.label}.ps1`;
|
|
54
|
+
}
|
|
55
|
+
export function buildServiceDefinition(params) {
|
|
56
|
+
const s = normalizeSpec(params.spec);
|
|
57
|
+
const backend = String(params.backend ?? '').trim();
|
|
58
|
+
if (backend === 'systemd-user' || backend === 'systemd-system') {
|
|
59
|
+
const mode = backend === 'systemd-system' ? 'system' : 'user';
|
|
60
|
+
const path = systemdUnitPathForLabel({ homeDir: params.homeDir, label: s.label, mode });
|
|
61
|
+
const contents = renderSystemdServiceUnit({
|
|
62
|
+
description: s.description,
|
|
63
|
+
execStart: s.programArgs,
|
|
64
|
+
workingDirectory: s.workingDirectory,
|
|
65
|
+
env: s.env,
|
|
66
|
+
restart: 'always',
|
|
67
|
+
runAsUser: s.runAsUser,
|
|
68
|
+
stdoutPath: s.stdoutPath,
|
|
69
|
+
stderrPath: s.stderrPath,
|
|
70
|
+
wantedBy: mode === 'system' ? 'multi-user.target' : 'default.target',
|
|
71
|
+
});
|
|
72
|
+
return { kind: 'systemd-service', path, contents, mode: 0o644 };
|
|
73
|
+
}
|
|
74
|
+
if (backend === 'launchd-user' || backend === 'launchd-system') {
|
|
75
|
+
const mode = backend === 'launchd-system' ? 'system' : 'user';
|
|
76
|
+
const path = launchdPlistPathForLabel({ homeDir: params.homeDir, label: s.label, mode });
|
|
77
|
+
const mergedEnv = {
|
|
78
|
+
...(s.env ?? {}),
|
|
79
|
+
PATH: buildLaunchdPath({ execPath: process.execPath, basePath: process.env.PATH }),
|
|
80
|
+
};
|
|
81
|
+
const contents = buildLaunchdPlistXml({
|
|
82
|
+
label: s.label,
|
|
83
|
+
programArgs: s.programArgs,
|
|
84
|
+
env: mergedEnv,
|
|
85
|
+
stdoutPath: s.stdoutPath || (mode === 'system' ? `/var/log/${s.label}.out.log` : join(String(params.homeDir ?? '').trim() || '', '.happier', 'logs', `${s.label}.out.log`)),
|
|
86
|
+
stderrPath: s.stderrPath || (mode === 'system' ? `/var/log/${s.label}.err.log` : join(String(params.homeDir ?? '').trim() || '', '.happier', 'logs', `${s.label}.err.log`)),
|
|
87
|
+
workingDirectory: s.workingDirectory,
|
|
88
|
+
keepAliveOnFailure: true,
|
|
89
|
+
});
|
|
90
|
+
return { kind: 'launchd-plist', path, contents, mode: 0o644 };
|
|
91
|
+
}
|
|
92
|
+
if (backend === 'schtasks-user' || backend === 'schtasks-system') {
|
|
93
|
+
const mode = backend === 'schtasks-system' ? 'system' : 'user';
|
|
94
|
+
const path = windowsWrapperPathForLabel({ homeDir: params.homeDir, label: s.label, mode });
|
|
95
|
+
const contents = renderWindowsScheduledTaskWrapperPs1({
|
|
96
|
+
workingDirectory: s.workingDirectory,
|
|
97
|
+
programArgs: s.programArgs,
|
|
98
|
+
env: s.env,
|
|
99
|
+
stdoutPath: s.stdoutPath,
|
|
100
|
+
stderrPath: s.stderrPath,
|
|
101
|
+
});
|
|
102
|
+
return { kind: 'windows-wrapper-ps1', path, contents, mode: 0o644 };
|
|
103
|
+
}
|
|
104
|
+
throw new Error(`Unsupported backend: ${backend}`);
|
|
105
|
+
}
|
|
106
|
+
function resolveUid(uid) {
|
|
107
|
+
if (typeof uid === 'number' && Number.isFinite(uid) && uid >= 0)
|
|
108
|
+
return Math.floor(uid);
|
|
109
|
+
if (typeof process.getuid === 'function')
|
|
110
|
+
return process.getuid();
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
export function planServiceAction(params) {
|
|
114
|
+
const backend = String(params.backend ?? '').trim();
|
|
115
|
+
const action = String(params.action ?? '').trim();
|
|
116
|
+
const label = String(params.label ?? '').trim();
|
|
117
|
+
const definitionPath = String(params.definitionPath ?? '').trim();
|
|
118
|
+
const contents = String(params.definitionContents ?? '');
|
|
119
|
+
const taskName = String(params.taskName ?? '').trim();
|
|
120
|
+
const persistent = params.persistent !== false;
|
|
121
|
+
const uid = resolveUid(params.uid);
|
|
122
|
+
if (!backend)
|
|
123
|
+
throw new Error('backend is required');
|
|
124
|
+
if (!action)
|
|
125
|
+
throw new Error('action is required');
|
|
126
|
+
if (!label)
|
|
127
|
+
throw new Error('label is required');
|
|
128
|
+
const writes = [];
|
|
129
|
+
const commands = [];
|
|
130
|
+
if (action === 'install') {
|
|
131
|
+
if (!definitionPath)
|
|
132
|
+
throw new Error('definitionPath is required for install');
|
|
133
|
+
writes.push({ path: definitionPath, contents, mode: 0o644 });
|
|
134
|
+
}
|
|
135
|
+
if (backend === 'systemd-user' || backend === 'systemd-system') {
|
|
136
|
+
const prefix = backend === 'systemd-user' ? ['--user'] : [];
|
|
137
|
+
const unitName = `${label}.service`;
|
|
138
|
+
if (action === 'install') {
|
|
139
|
+
commands.push({ cmd: 'systemctl', args: [...prefix, 'daemon-reload'] });
|
|
140
|
+
commands.push({
|
|
141
|
+
cmd: 'systemctl',
|
|
142
|
+
args: persistent ? [...prefix, 'enable', '--now', unitName] : [...prefix, 'start', unitName],
|
|
143
|
+
});
|
|
144
|
+
return { writes, commands };
|
|
145
|
+
}
|
|
146
|
+
if (action === 'uninstall') {
|
|
147
|
+
commands.push({ cmd: 'systemctl', args: [...prefix, 'disable', '--now', unitName], allowFail: true });
|
|
148
|
+
commands.push({ cmd: 'systemctl', args: [...prefix, 'daemon-reload'] });
|
|
149
|
+
return { writes, commands };
|
|
150
|
+
}
|
|
151
|
+
if (action === 'start') {
|
|
152
|
+
commands.push({ cmd: 'systemctl', args: persistent ? [...prefix, 'enable', '--now', unitName] : [...prefix, 'start', unitName] });
|
|
153
|
+
return { writes, commands };
|
|
154
|
+
}
|
|
155
|
+
if (action === 'stop') {
|
|
156
|
+
commands.push({ cmd: 'systemctl', args: persistent ? [...prefix, 'disable', '--now', unitName] : [...prefix, 'stop', unitName], allowFail: true });
|
|
157
|
+
return { writes, commands };
|
|
158
|
+
}
|
|
159
|
+
if (action === 'restart') {
|
|
160
|
+
commands.push({ cmd: 'systemctl', args: [...prefix, 'restart', unitName] });
|
|
161
|
+
return { writes, commands };
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (backend === 'launchd-user' || backend === 'launchd-system') {
|
|
165
|
+
if (!definitionPath)
|
|
166
|
+
throw new Error('definitionPath is required for launchd operations');
|
|
167
|
+
const preferBootstrap = backend === 'launchd-user' && uid != null && uid > 0;
|
|
168
|
+
if (action === 'install' || action === 'start') {
|
|
169
|
+
if (preferBootstrap) {
|
|
170
|
+
commands.push({ cmd: 'launchctl', args: ['bootout', `gui/${uid}/${label}`], allowFail: true });
|
|
171
|
+
commands.push({ cmd: 'launchctl', args: ['bootstrap', `gui/${uid}`, definitionPath] });
|
|
172
|
+
commands.push({ cmd: 'launchctl', args: ['enable', `gui/${uid}/${label}`] });
|
|
173
|
+
commands.push({ cmd: 'launchctl', args: ['kickstart', '-k', `gui/${uid}/${label}`] });
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
if (action === 'install') {
|
|
177
|
+
commands.push({ cmd: 'launchctl', args: persistent ? ['unload', '-w', definitionPath] : ['unload', definitionPath], allowFail: true });
|
|
178
|
+
}
|
|
179
|
+
commands.push({ cmd: 'launchctl', args: persistent ? ['load', '-w', definitionPath] : ['load', definitionPath] });
|
|
180
|
+
}
|
|
181
|
+
return { writes, commands };
|
|
182
|
+
}
|
|
183
|
+
if (action === 'uninstall' || action === 'stop') {
|
|
184
|
+
if (preferBootstrap) {
|
|
185
|
+
commands.push({ cmd: 'launchctl', args: ['disable', `gui/${uid}/${label}`], allowFail: true });
|
|
186
|
+
commands.push({ cmd: 'launchctl', args: ['bootout', `gui/${uid}`, definitionPath], allowFail: true });
|
|
187
|
+
commands.push({ cmd: 'launchctl', args: ['remove', label], allowFail: true });
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
commands.push({ cmd: 'launchctl', args: persistent ? ['unload', '-w', definitionPath] : ['unload', definitionPath], allowFail: true });
|
|
191
|
+
}
|
|
192
|
+
return { writes, commands };
|
|
193
|
+
}
|
|
194
|
+
if (action === 'restart') {
|
|
195
|
+
if (preferBootstrap) {
|
|
196
|
+
commands.push({ cmd: 'launchctl', args: ['kickstart', '-k', `gui/${uid}/${label}`] });
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
commands.push({ cmd: 'launchctl', args: persistent ? ['unload', '-w', definitionPath] : ['unload', definitionPath], allowFail: true });
|
|
200
|
+
commands.push({ cmd: 'launchctl', args: persistent ? ['load', '-w', definitionPath] : ['load', definitionPath] });
|
|
201
|
+
}
|
|
202
|
+
return { writes, commands };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (backend === 'schtasks-user' || backend === 'schtasks-system') {
|
|
206
|
+
const name = taskName || `Happier\\${label}`;
|
|
207
|
+
const mode = backend === 'schtasks-system' ? 'system' : 'user';
|
|
208
|
+
if (action === 'install') {
|
|
209
|
+
if (!definitionPath)
|
|
210
|
+
throw new Error('definitionPath is required for schtasks install');
|
|
211
|
+
const ps = `powershell.exe -NoProfile -ExecutionPolicy Bypass -File "${definitionPath}"`;
|
|
212
|
+
const schedule = persistent
|
|
213
|
+
? (mode === 'system' ? 'ONSTART' : 'ONLOGON')
|
|
214
|
+
: 'ONCE';
|
|
215
|
+
const args = [
|
|
216
|
+
'/Create',
|
|
217
|
+
'/F',
|
|
218
|
+
'/SC',
|
|
219
|
+
schedule,
|
|
220
|
+
...(schedule === 'ONCE' ? ['/ST', '00:00'] : []),
|
|
221
|
+
'/TN',
|
|
222
|
+
name,
|
|
223
|
+
'/TR',
|
|
224
|
+
ps,
|
|
225
|
+
...(mode === 'system' ? ['/RU', 'SYSTEM', '/RL', 'HIGHEST'] : []),
|
|
226
|
+
];
|
|
227
|
+
commands.push({ cmd: 'schtasks', args });
|
|
228
|
+
commands.push({ cmd: 'schtasks', args: ['/Run', '/TN', name] });
|
|
229
|
+
return { writes, commands };
|
|
230
|
+
}
|
|
231
|
+
if (action === 'uninstall') {
|
|
232
|
+
commands.push({ cmd: 'schtasks', args: ['/End', '/TN', name], allowFail: true });
|
|
233
|
+
commands.push({ cmd: 'schtasks', args: ['/Delete', '/F', '/TN', name], allowFail: true });
|
|
234
|
+
return { writes, commands };
|
|
235
|
+
}
|
|
236
|
+
if (action === 'start') {
|
|
237
|
+
commands.push({ cmd: 'schtasks', args: ['/Run', '/TN', name] });
|
|
238
|
+
return { writes, commands };
|
|
239
|
+
}
|
|
240
|
+
if (action === 'stop') {
|
|
241
|
+
commands.push({ cmd: 'schtasks', args: ['/End', '/TN', name], allowFail: true });
|
|
242
|
+
return { writes, commands };
|
|
243
|
+
}
|
|
244
|
+
if (action === 'restart') {
|
|
245
|
+
commands.push({ cmd: 'schtasks', args: ['/End', '/TN', name], allowFail: true });
|
|
246
|
+
commands.push({ cmd: 'schtasks', args: ['/Run', '/TN', name] });
|
|
247
|
+
return { writes, commands };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
throw new Error(`Unsupported plan: ${backend} ${action}`);
|
|
251
|
+
}
|
|
252
|
+
function commandExists(cmd, envPath) {
|
|
253
|
+
const name = String(cmd ?? '').trim();
|
|
254
|
+
if (!name)
|
|
255
|
+
return false;
|
|
256
|
+
if (process.platform === 'win32') {
|
|
257
|
+
const res = spawnSync('where', [name], { stdio: 'ignore', env: { ...process.env, PATH: envPath ?? process.env.PATH } });
|
|
258
|
+
return (res.status ?? 1) === 0;
|
|
259
|
+
}
|
|
260
|
+
const res = spawnSync('sh', ['-lc', `command -v ${name} >/dev/null 2>&1`], { stdio: 'ignore', env: { ...process.env, PATH: envPath ?? process.env.PATH } });
|
|
261
|
+
return (res.status ?? 1) === 0;
|
|
262
|
+
}
|
|
263
|
+
export async function applyServicePlan(plan, options = {}) {
|
|
264
|
+
for (const w of plan.writes) {
|
|
265
|
+
await writeAtomicTextFile(w.path, w.contents, w.mode ?? 0o644);
|
|
266
|
+
}
|
|
267
|
+
if (options.runCommands === false)
|
|
268
|
+
return;
|
|
269
|
+
for (const c of plan.commands) {
|
|
270
|
+
if (!commandExists(c.cmd, process.env.PATH)) {
|
|
271
|
+
throw new Error(`[service] command not found: ${c.cmd}`);
|
|
272
|
+
}
|
|
273
|
+
const res = spawnSync(c.cmd, [...c.args], { encoding: 'utf8', env: process.env });
|
|
274
|
+
if (res.error) {
|
|
275
|
+
if (c.allowFail)
|
|
276
|
+
continue;
|
|
277
|
+
throw new Error(`[service] failed to run ${c.cmd}: ${res.error.message}`);
|
|
278
|
+
}
|
|
279
|
+
const status = typeof res.status === 'number' ? res.status : null;
|
|
280
|
+
if (status !== 0) {
|
|
281
|
+
if (c.allowFail)
|
|
282
|
+
continue;
|
|
283
|
+
const stderr = String(res.stderr ?? '').trim();
|
|
284
|
+
const suffix = stderr ? `\n${stderr}` : '';
|
|
285
|
+
throw new Error(`[service] command failed (${status ?? 'unknown'}): ${c.cmd} ${c.args.join(' ')}${suffix}`.trim());
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async function writeAtomicTextFile(path, contents, mode) {
|
|
290
|
+
const dir = dirname(path);
|
|
291
|
+
await mkdir(dir, { recursive: true });
|
|
292
|
+
const tmp = join(dir, `.tmp.${Date.now()}.${Math.random().toString(16).slice(2)}`);
|
|
293
|
+
await writeFile(tmp, contents, 'utf-8');
|
|
294
|
+
await rename(tmp, path);
|
|
295
|
+
try {
|
|
296
|
+
await chmod(path, mode);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// ignore
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/service/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function renderSystemdServiceUnit(params: Readonly<{
|
|
2
|
+
description: string;
|
|
3
|
+
execStart: string | readonly string[];
|
|
4
|
+
workingDirectory?: string;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
restart?: string;
|
|
7
|
+
runAsUser?: string;
|
|
8
|
+
stdoutPath?: string;
|
|
9
|
+
stderrPath?: string;
|
|
10
|
+
wantedBy?: string;
|
|
11
|
+
}>): string;
|
|
12
|
+
//# sourceMappingURL=systemd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"AAwCA,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC,GAAG,MAAM,CAqCV"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
function escapeSystemdEnvValue(value) {
|
|
2
|
+
const s = String(value ?? '');
|
|
3
|
+
if (/^[A-Za-z0-9_./:@%+-]+$/.test(s))
|
|
4
|
+
return s;
|
|
5
|
+
const escaped = s
|
|
6
|
+
.replaceAll('\\', '\\\\')
|
|
7
|
+
.replaceAll('%', '%%')
|
|
8
|
+
.replaceAll('\r\n', '\n')
|
|
9
|
+
.replaceAll('\r', '\n')
|
|
10
|
+
.replaceAll('\n', '\\n')
|
|
11
|
+
.replaceAll('"', '\\"');
|
|
12
|
+
return `"${escaped}"`;
|
|
13
|
+
}
|
|
14
|
+
function escapeSystemdExecArg(value) {
|
|
15
|
+
const s = String(value ?? '');
|
|
16
|
+
if (/^[A-Za-z0-9_./:@%+=-]+$/.test(s))
|
|
17
|
+
return s;
|
|
18
|
+
const escaped = s
|
|
19
|
+
.replaceAll('\\', '\\\\')
|
|
20
|
+
.replaceAll('\r\n', '\n')
|
|
21
|
+
.replaceAll('\r', '\n')
|
|
22
|
+
.replaceAll('\n', '\\n')
|
|
23
|
+
.replaceAll('"', '\\"');
|
|
24
|
+
return `"${escaped}"`;
|
|
25
|
+
}
|
|
26
|
+
function systemdEnvLines(env) {
|
|
27
|
+
const entries = Object.entries(env ?? {}).filter(([k]) => String(k ?? '').trim());
|
|
28
|
+
const envKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
29
|
+
const lines = [];
|
|
30
|
+
for (const [kRaw, vRaw] of entries) {
|
|
31
|
+
const k = String(kRaw ?? '').trim();
|
|
32
|
+
if (!k)
|
|
33
|
+
continue;
|
|
34
|
+
if (!envKeyPattern.test(k)) {
|
|
35
|
+
throw new Error(`Invalid systemd environment variable name: ${k}`);
|
|
36
|
+
}
|
|
37
|
+
lines.push(`Environment=${k}=${escapeSystemdEnvValue(String(vRaw ?? ''))}`);
|
|
38
|
+
}
|
|
39
|
+
return lines;
|
|
40
|
+
}
|
|
41
|
+
export function renderSystemdServiceUnit(params) {
|
|
42
|
+
const desc = String(params.description ?? '').trim() || 'Happier Service';
|
|
43
|
+
const restartPolicy = String(params.restart ?? '').trim() || 'always';
|
|
44
|
+
const workDir = String(params.workingDirectory ?? '').trim();
|
|
45
|
+
const out = String(params.stdoutPath ?? '').trim();
|
|
46
|
+
const err = String(params.stderrPath ?? '').trim();
|
|
47
|
+
const runAsUser = String(params.runAsUser ?? '').trim();
|
|
48
|
+
const execStart = Array.isArray(params.execStart)
|
|
49
|
+
? params.execStart.map((a) => escapeSystemdExecArg(String(a ?? ''))).join(' ')
|
|
50
|
+
: String(params.execStart ?? '').trim();
|
|
51
|
+
if (!execStart) {
|
|
52
|
+
throw new Error('execStart is required');
|
|
53
|
+
}
|
|
54
|
+
const envLines = systemdEnvLines(params.env);
|
|
55
|
+
const workDirLine = workDir ? `WorkingDirectory=${workDir}\n` : '';
|
|
56
|
+
const userLine = runAsUser ? `User=${runAsUser}\n` : '';
|
|
57
|
+
const outLine = out ? `StandardOutput=append:${out}\n` : '';
|
|
58
|
+
const errLine = err ? `StandardError=append:${err}\n` : '';
|
|
59
|
+
const wantedBy = String(params.wantedBy ?? '').trim() || 'default.target';
|
|
60
|
+
const envBlock = envLines.length ? `\n${envLines.join('\n')}\n` : '\n';
|
|
61
|
+
return `[Unit]
|
|
62
|
+
Description=${desc}
|
|
63
|
+
After=network-online.target
|
|
64
|
+
Wants=network-online.target
|
|
65
|
+
|
|
66
|
+
[Service]
|
|
67
|
+
Type=simple
|
|
68
|
+
${workDirLine}${userLine}${envBlock}ExecStart=${execStart}
|
|
69
|
+
Restart=${restartPolicy}
|
|
70
|
+
RestartSec=2
|
|
71
|
+
${outLine}${errLine}[Install]
|
|
72
|
+
WantedBy=${wantedBy}
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=systemd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../src/service/systemd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function renderWindowsScheduledTaskWrapperPs1(params: Readonly<{
|
|
2
|
+
workingDirectory?: string;
|
|
3
|
+
programArgs?: readonly string[];
|
|
4
|
+
env?: Record<string, string>;
|
|
5
|
+
stdoutPath?: string;
|
|
6
|
+
stderrPath?: string;
|
|
7
|
+
}>): string;
|
|
8
|
+
//# sourceMappingURL=windows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../src/service/windows.ts"],"names":[],"mappings":"AASA,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,QAAQ,CAAC;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,GAAG,MAAM,CAuBV"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function psDoubleQuote(s) {
|
|
2
|
+
// PowerShell double-quoted string escape: `"
|
|
3
|
+
return String(s ?? '').replaceAll('`', '``').replaceAll('"', '`"');
|
|
4
|
+
}
|
|
5
|
+
function psQuoted(s) {
|
|
6
|
+
return `"${psDoubleQuote(s)}"`;
|
|
7
|
+
}
|
|
8
|
+
export function renderWindowsScheduledTaskWrapperPs1(params) {
|
|
9
|
+
const wd = String(params.workingDirectory ?? '').trim();
|
|
10
|
+
const args = Array.isArray(params.programArgs) ? params.programArgs.map((a) => String(a ?? '')).filter(Boolean) : [];
|
|
11
|
+
const out = String(params.stdoutPath ?? '').trim();
|
|
12
|
+
const err = String(params.stderrPath ?? '').trim();
|
|
13
|
+
const envLines = Object.entries(params.env ?? {})
|
|
14
|
+
.filter(([k]) => String(k ?? '').trim())
|
|
15
|
+
.map(([k, v]) => `$env:${String(k).trim()} = ${psQuoted(String(v ?? ''))}`)
|
|
16
|
+
.join('\n');
|
|
17
|
+
const cmd = args.length ? `& ${args.map(psQuoted).join(' ')}` : '';
|
|
18
|
+
const redirect = out || err ? ` 1>> ${psQuoted(out)} 2>> ${psQuoted(err)}` : '';
|
|
19
|
+
return [
|
|
20
|
+
'$ErrorActionPreference = "Stop"',
|
|
21
|
+
wd ? `Set-Location -LiteralPath ${psQuoted(wd)}` : '',
|
|
22
|
+
envLines,
|
|
23
|
+
cmd ? `${cmd}${redirect}` : '',
|
|
24
|
+
'',
|
|
25
|
+
]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join('\n');
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/service/windows.ts"],"names":[],"mappings":"AAAA,SAAS,aAAa,CAAC,CAAS;IAC9B,6CAA6C;IAC7C,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,MAMnD;IACA,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;SAC9C,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhF,OAAO;QACL,iCAAiC;QACjC,EAAE,CAAC,CAAC,CAAC,6BAA6B,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACrD,QAAQ;QACR,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;QAC9B,EAAE;KACH;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -21,6 +21,17 @@
|
|
|
21
21
|
"./workspaces": {
|
|
22
22
|
"types": "./dist/workspaces/index.d.ts",
|
|
23
23
|
"default": "./dist/workspaces/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./service": {
|
|
26
|
+
"types": "./dist/service/index.d.ts",
|
|
27
|
+
"default": "./dist/service/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./providers": {
|
|
30
|
+
"types": "./dist/providers/index.d.ts",
|
|
31
|
+
"default": "./dist/providers/index.js"
|
|
24
32
|
}
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@happier-dev/agents": "0.0.0"
|
|
25
36
|
}
|
|
26
37
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare function resolveReleaseAssetBundle({ assets, product, os, arch, preferZipOnWindows, }: {
|
|
2
|
+
assets: unknown;
|
|
3
|
+
product: string;
|
|
4
|
+
os: string;
|
|
5
|
+
arch: string;
|
|
6
|
+
preferZipOnWindows?: boolean;
|
|
7
|
+
}): {
|
|
8
|
+
version: string;
|
|
9
|
+
archive: {
|
|
10
|
+
name: string;
|
|
11
|
+
url: string;
|
|
12
|
+
};
|
|
13
|
+
checksums: {
|
|
14
|
+
name: string;
|
|
15
|
+
url: string;
|
|
16
|
+
};
|
|
17
|
+
checksumsSig: {
|
|
18
|
+
name: string;
|
|
19
|
+
url: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"AAcA,wBAAgB,yBAAyB,CAAC,EACxC,MAAM,EACN,OAAO,EACP,EAAE,EACF,IAAI,EACJ,kBAAyB,GAC1B,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;;;cAEwC,MAAM;aAAO,MAAM;;;cAAnB,MAAM;aAAO,MAAM;;;cAAnB,MAAM;aAAO,MAAM;;EAoC3D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function normalizeAsset(asset) {
|
|
2
|
+
const name = String(asset?.name ?? '').trim();
|
|
3
|
+
const url = String(asset?.browser_download_url ?? asset?.url ?? '').trim();
|
|
4
|
+
return name && url ? { name, url } : null;
|
|
5
|
+
}
|
|
6
|
+
const VERSION_RE = '\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?';
|
|
7
|
+
export function resolveReleaseAssetBundle({ assets, product, os, arch, preferZipOnWindows = true, }) {
|
|
8
|
+
const list = Array.isArray(assets) ? assets : [];
|
|
9
|
+
const byName = new Map();
|
|
10
|
+
for (const asset of list) {
|
|
11
|
+
const normalized = normalizeAsset(asset);
|
|
12
|
+
if (!normalized)
|
|
13
|
+
continue;
|
|
14
|
+
byName.set(normalized.name, normalized);
|
|
15
|
+
}
|
|
16
|
+
const checksumsRe = new RegExp(`^checksums-${product}-v(${VERSION_RE})\\.txt$`);
|
|
17
|
+
const checksumsName = [...byName.keys()].find((name) => checksumsRe.test(name)) ?? '';
|
|
18
|
+
if (!checksumsName) {
|
|
19
|
+
throw new Error(`[release-assets] missing checksums-${product}-v<version>.txt asset`);
|
|
20
|
+
}
|
|
21
|
+
const versionMatch = checksumsRe.exec(checksumsName);
|
|
22
|
+
const version = versionMatch?.[1] ?? '';
|
|
23
|
+
if (!version) {
|
|
24
|
+
throw new Error(`[release-assets] unable to derive version from checksums filename: ${checksumsName}`);
|
|
25
|
+
}
|
|
26
|
+
const checksumsSigName = `${checksumsName}.minisig`;
|
|
27
|
+
const base = `${product}-v${version}-${os}-${arch}`;
|
|
28
|
+
const zipName = `${base}.zip`;
|
|
29
|
+
const tgzName = `${base}.tar.gz`;
|
|
30
|
+
const archiveName = os.toLowerCase() === 'windows' && preferZipOnWindows && byName.has(zipName)
|
|
31
|
+
? zipName
|
|
32
|
+
: tgzName;
|
|
33
|
+
const checksums = byName.get(checksumsName) ?? null;
|
|
34
|
+
const checksumsSig = byName.get(checksumsSigName) ?? null;
|
|
35
|
+
const archive = byName.get(archiveName) ?? null;
|
|
36
|
+
if (!checksums)
|
|
37
|
+
throw new Error(`[release-assets] missing release asset: ${checksumsName}`);
|
|
38
|
+
if (!checksumsSig)
|
|
39
|
+
throw new Error(`[release-assets] missing release asset: ${checksumsSigName}`);
|
|
40
|
+
if (!archive)
|
|
41
|
+
throw new Error(`[release-assets] missing release asset: ${archiveName}`);
|
|
42
|
+
return { version, archive, checksums, checksumsSig };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../src/assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksums.d.ts","sourceRoot":"","sources":["../src/checksums.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAgBlG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function lookupSha256(params) {
|
|
2
|
+
const target = String(params.filename ?? '').trim();
|
|
3
|
+
if (!target)
|
|
4
|
+
throw new Error('[checksums] filename is required');
|
|
5
|
+
const text = String(params.checksumsText ?? '');
|
|
6
|
+
const lines = text.split('\n');
|
|
7
|
+
for (const line of lines) {
|
|
8
|
+
const trimmed = line.trim();
|
|
9
|
+
if (!trimmed)
|
|
10
|
+
continue;
|
|
11
|
+
const m = /^([0-9a-fA-F]{8,})\s+(.+)$/.exec(trimmed);
|
|
12
|
+
if (!m)
|
|
13
|
+
continue;
|
|
14
|
+
const hash = m[1].toLowerCase();
|
|
15
|
+
const file = m[2].trim();
|
|
16
|
+
if (file === target)
|
|
17
|
+
return hash;
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`[checksums] sha256 not found for ${target}`);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=checksums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksums.js","sourceRoot":"","sources":["../src/checksums.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,MAA6D;IACxF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,CAAC,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PlannedCommand = Readonly<{
|
|
2
|
+
cmd: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
}>;
|
|
5
|
+
export declare function planArchiveExtraction(params: Readonly<{
|
|
6
|
+
archiveName: string;
|
|
7
|
+
archivePath: string;
|
|
8
|
+
destDir: string;
|
|
9
|
+
os: 'linux' | 'darwin' | 'windows';
|
|
10
|
+
}>): Readonly<{
|
|
11
|
+
requiredCommand: 'tar' | 'powershell';
|
|
12
|
+
command: PlannedCommand;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=extractPlan.d.ts.map
|