@happier-dev/stack 0.1.0-preview.10.1 → 0.1.0-preview.134.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 +15 -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 +97 -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/build.mjs +3 -18
- package/scripts/bundleWorkspaceDeps.mjs +5 -1
- package/scripts/bundleWorkspaceDeps.test.mjs +16 -0
- package/scripts/mobile.mjs +32 -1
- 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 +101 -0
- package/scripts/providers_cmd.mjs +262 -0
- package/scripts/release_binary_smoke.integration.test.mjs +25 -6
- package/scripts/remote_cmd.mjs +240 -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 +1403 -312
- package/scripts/self_host_runtime.test.mjs +361 -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 +2 -0
- package/scripts/stack_daemon_cmd.integration.test.mjs +37 -0
- package/scripts/stack_happy_cmd.integration.test.mjs +36 -0
- package/scripts/utils/auth/credentials_paths.mjs +9 -9
- package/scripts/utils/auth/credentials_paths.test.mjs +8 -0
- package/scripts/utils/auth/stable_scope_id.mjs +1 -1
- package/scripts/utils/cli/cli_registry.mjs +18 -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/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 @@
|
|
|
1
|
+
{"version":3,"file":"extractPlan.d.ts","sourceRoot":"","sources":["../src/extractPlan.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAEvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;CACpC,CAAC,GAAG,QAAQ,CAAC;IAAE,eAAe,EAAE,KAAK,GAAG,YAAY,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC,CAsChF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function planArchiveExtraction(params) {
|
|
2
|
+
const name = String(params.archiveName ?? '').trim();
|
|
3
|
+
const archivePath = String(params.archivePath ?? '').trim();
|
|
4
|
+
const destDir = String(params.destDir ?? '').trim();
|
|
5
|
+
const os = String(params.os ?? '').trim().toLowerCase();
|
|
6
|
+
if (!name)
|
|
7
|
+
throw new Error('[extract] archiveName is required');
|
|
8
|
+
if (!archivePath)
|
|
9
|
+
throw new Error('[extract] archivePath is required');
|
|
10
|
+
if (!destDir)
|
|
11
|
+
throw new Error('[extract] destDir is required');
|
|
12
|
+
if (os !== 'linux' && os !== 'darwin' && os !== 'windows') {
|
|
13
|
+
throw new Error(`[extract] unsupported os: ${os}`);
|
|
14
|
+
}
|
|
15
|
+
if (name.toLowerCase().endsWith('.zip')) {
|
|
16
|
+
if (os !== 'windows') {
|
|
17
|
+
throw new Error(`[extract] .zip archives are supported only on windows (got ${os})`);
|
|
18
|
+
}
|
|
19
|
+
const command = `Expand-Archive -LiteralPath "${archivePath}" -DestinationPath "${destDir}" -Force`;
|
|
20
|
+
return {
|
|
21
|
+
requiredCommand: 'powershell',
|
|
22
|
+
command: {
|
|
23
|
+
cmd: 'powershell',
|
|
24
|
+
args: ['-NoProfile', '-Command', command],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (name.toLowerCase().endsWith('.tar.gz')) {
|
|
29
|
+
return {
|
|
30
|
+
requiredCommand: 'tar',
|
|
31
|
+
command: {
|
|
32
|
+
cmd: 'tar',
|
|
33
|
+
args: ['-xzf', archivePath, '-C', destDir],
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`[extract] unsupported archive extension: ${name}`);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=extractPlan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractPlan.js","sourceRoot":"","sources":["../src/extractPlan.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,MAKpC;IACA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAExD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAChE,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvE,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/D,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8DAA8D,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,OAAO,GAAG,gCAAgC,WAAW,uBAAuB,OAAO,UAAU,CAAC;QACpG,OAAO;YACL,eAAe,EAAE,YAAY;YAC7B,OAAO,EAAE;gBACP,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC;aAC1C;SACF,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE;gBACP,GAAG,EAAE,KAAK;gBACV,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;aAC3C;SACF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type FetchImpl = typeof fetch;
|
|
2
|
+
export declare function fetchGitHubReleaseByTag(params: Readonly<{
|
|
3
|
+
githubRepo: string;
|
|
4
|
+
tag: string;
|
|
5
|
+
userAgent?: string;
|
|
6
|
+
githubToken?: string;
|
|
7
|
+
fetchImpl?: FetchImpl;
|
|
8
|
+
}>): Promise<unknown>;
|
|
9
|
+
export declare function fetchFirstGitHubReleaseByTags(params: Readonly<{
|
|
10
|
+
githubRepo: string;
|
|
11
|
+
tags: string[];
|
|
12
|
+
userAgent?: string;
|
|
13
|
+
githubToken?: string;
|
|
14
|
+
fetchImpl?: FetchImpl;
|
|
15
|
+
}>): Promise<Readonly<{
|
|
16
|
+
tag: string;
|
|
17
|
+
release: unknown;
|
|
18
|
+
}>>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAiB9B,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBpB;AAED,wBAAsB,6BAA6B,CAAC,MAAM,EAAE,QAAQ,CAAC;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CA0BxD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
function buildGitHubReleaseTagUrl(githubRepo, tag) {
|
|
2
|
+
const repo = String(githubRepo ?? '').trim();
|
|
3
|
+
const t = String(tag ?? '').trim();
|
|
4
|
+
if (!repo)
|
|
5
|
+
throw new Error('[github] githubRepo is required');
|
|
6
|
+
if (!t)
|
|
7
|
+
throw new Error('[github] tag is required');
|
|
8
|
+
return `https://api.github.com/repos/${repo}/releases/tags/${encodeURIComponent(t)}`;
|
|
9
|
+
}
|
|
10
|
+
function createHttpError(message, status) {
|
|
11
|
+
const err = new Error(message);
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
err.status = status;
|
|
14
|
+
return err;
|
|
15
|
+
}
|
|
16
|
+
export async function fetchGitHubReleaseByTag(params) {
|
|
17
|
+
const userAgent = String(params.userAgent ?? '').trim() || 'happier-release-runtime';
|
|
18
|
+
const token = String(params.githubToken ?? '').trim();
|
|
19
|
+
const fetchImpl = params.fetchImpl ?? fetch;
|
|
20
|
+
const url = buildGitHubReleaseTagUrl(params.githubRepo, params.tag);
|
|
21
|
+
const headers = {
|
|
22
|
+
'user-agent': userAgent,
|
|
23
|
+
accept: 'application/vnd.github+json',
|
|
24
|
+
};
|
|
25
|
+
if (token)
|
|
26
|
+
headers.authorization = `Bearer ${token}`;
|
|
27
|
+
const response = await fetchImpl(url, { headers });
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw createHttpError(`[github] failed to resolve release tag ${params.tag} (${response.status})`, response.status);
|
|
30
|
+
}
|
|
31
|
+
return response.json();
|
|
32
|
+
}
|
|
33
|
+
export async function fetchFirstGitHubReleaseByTags(params) {
|
|
34
|
+
const tags = Array.isArray(params.tags) ? params.tags : [];
|
|
35
|
+
for (const tag of tags) {
|
|
36
|
+
try {
|
|
37
|
+
// eslint-disable-next-line no-await-in-loop
|
|
38
|
+
const release = await fetchGitHubReleaseByTag({
|
|
39
|
+
githubRepo: params.githubRepo,
|
|
40
|
+
tag,
|
|
41
|
+
userAgent: params.userAgent,
|
|
42
|
+
githubToken: params.githubToken,
|
|
43
|
+
fetchImpl: params.fetchImpl,
|
|
44
|
+
});
|
|
45
|
+
return { tag, release };
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
const status = typeof e === 'object' && e != null && 'status' in e
|
|
49
|
+
? Number(
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
e.status)
|
|
52
|
+
: NaN;
|
|
53
|
+
if (status === 404)
|
|
54
|
+
continue;
|
|
55
|
+
throw e;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
throw createHttpError('[github] no matching release tags found', 404);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAEA,SAAS,wBAAwB,CAAC,UAAkB,EAAE,GAAW;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC9D,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,OAAO,gCAAgC,IAAI,kBAAkB,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,MAAc;IACtD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,8DAA8D;IAC7D,GAAW,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAM5C;IACA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,yBAAyB,CAAC;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,SAAS,GAAc,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;IAEvD,MAAM,GAAG,GAAG,wBAAwB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,OAAO,GAA2B;QACtC,YAAY,EAAE,SAAS;QACvB,MAAM,EAAE,6BAA6B;KACtC,CAAC;IACF,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,eAAe,CAAC,0CAA0C,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtH,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,MAMlD;IACA,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC;gBAC5C,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,GAAG;gBACH,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC,CAAC;YACH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,MAAM,GACV,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,QAAQ,IAAI,CAAC;gBACjD,CAAC,CAAC,MAAM;gBACJ,8DAA8D;gBAC7D,CAAS,CAAC,MAAM,CAClB;gBACH,CAAC,CAAC,GAAG,CAAC;YACV,IAAI,MAAM,KAAK,GAAG;gBAAE,SAAS;YAC7B,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IACD,MAAM,eAAe,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DEFAULT_MINISIGN_PUBLIC_KEY, verifyMinisign } from './minisign.js';
|
|
2
|
+
export { lookupSha256 } from './checksums.js';
|
|
3
|
+
export { resolveReleaseAssetBundle } from './assets.js';
|
|
4
|
+
export { planArchiveExtraction } from './extractPlan.js';
|
|
5
|
+
export { downloadVerifiedReleaseAssetBundle } from './verifiedDownload.js';
|
|
6
|
+
export { fetchGitHubReleaseByTag, fetchFirstGitHubReleaseByTags } from './github.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { DEFAULT_MINISIGN_PUBLIC_KEY, verifyMinisign } from './minisign.js';
|
|
2
|
+
export { lookupSha256 } from './checksums.js';
|
|
3
|
+
export { resolveReleaseAssetBundle } from './assets.js';
|
|
4
|
+
export { planArchiveExtraction } from './extractPlan.js';
|
|
5
|
+
export { downloadVerifiedReleaseAssetBundle } from './verifiedDownload.js';
|
|
6
|
+
export { fetchGitHubReleaseByTag, fetchFirstGitHubReleaseByTags } from './github.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const DEFAULT_MINISIGN_PUBLIC_KEY = "untrusted comment: minisign public key 91AE28177BF6E43C\nRWQ85PZ7FyiukYbL3qv/bKnwgbT68wLVzotapeMFIb8n+c7pBQ7U8W2t\n";
|
|
2
|
+
export declare function verifyMinisign(params: Readonly<{
|
|
3
|
+
message: Buffer;
|
|
4
|
+
pubkeyFile: string;
|
|
5
|
+
sigFile: string;
|
|
6
|
+
}>): boolean;
|
|
7
|
+
//# sourceMappingURL=minisign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minisign.d.ts","sourceRoot":"","sources":["../src/minisign.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,2BAA2B,wHAEvC,CAAC;AAmEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAiClH"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createHash, createPublicKey, verify } from 'node:crypto';
|
|
2
|
+
const ED25519_SPKI_PREFIX = Buffer.from('302a300506032b6570032100', 'hex');
|
|
3
|
+
export const DEFAULT_MINISIGN_PUBLIC_KEY = `untrusted comment: minisign public key 91AE28177BF6E43C
|
|
4
|
+
RWQ85PZ7FyiukYbL3qv/bKnwgbT68wLVzotapeMFIb8n+c7pBQ7U8W2t
|
|
5
|
+
`;
|
|
6
|
+
function decodeBase64Line(line, expectedBytes) {
|
|
7
|
+
const bytes = Buffer.from(String(line ?? '').trim(), 'base64');
|
|
8
|
+
if (expectedBytes != null && bytes.length !== expectedBytes) {
|
|
9
|
+
throw new Error(`[minisign] expected ${expectedBytes} bytes, got ${bytes.length}`);
|
|
10
|
+
}
|
|
11
|
+
return bytes;
|
|
12
|
+
}
|
|
13
|
+
function parseMinisignPublicKeyFile(pubkeyFile) {
|
|
14
|
+
const lines = String(pubkeyFile ?? '')
|
|
15
|
+
.split('\n')
|
|
16
|
+
.map((l) => l.trim())
|
|
17
|
+
.filter(Boolean);
|
|
18
|
+
if (lines.length < 2)
|
|
19
|
+
throw new Error('[minisign] invalid public key file');
|
|
20
|
+
const payload = lines[lines.length - 1] ?? '';
|
|
21
|
+
const bytes = decodeBase64Line(payload, 42);
|
|
22
|
+
const signatureAlgorithm = bytes.subarray(0, 2);
|
|
23
|
+
const keyId = bytes.subarray(2, 10);
|
|
24
|
+
const rawPublicKey = bytes.subarray(10, 42);
|
|
25
|
+
return { signatureAlgorithm, keyId, rawPublicKey };
|
|
26
|
+
}
|
|
27
|
+
function parseMinisignSignatureFile(sigFile) {
|
|
28
|
+
const lines = String(sigFile ?? '').split('\n');
|
|
29
|
+
if (lines.length < 4)
|
|
30
|
+
throw new Error('[minisign] invalid signature file');
|
|
31
|
+
const untrustedPayload = String(lines[1] ?? '').trim();
|
|
32
|
+
const trustedComment = String(lines[2] ?? '');
|
|
33
|
+
const globalPayload = String(lines[3] ?? '').trim();
|
|
34
|
+
const untrustedBytes = decodeBase64Line(untrustedPayload, 74);
|
|
35
|
+
const signatureAlgorithm = untrustedBytes.subarray(0, 2);
|
|
36
|
+
const keyId = untrustedBytes.subarray(2, 10);
|
|
37
|
+
const signature = untrustedBytes.subarray(10, 74);
|
|
38
|
+
const globalSignature = decodeBase64Line(globalPayload, 64);
|
|
39
|
+
if (!trustedComment.startsWith('trusted comment: ')) {
|
|
40
|
+
throw new Error('[minisign] unexpected trusted comment format');
|
|
41
|
+
}
|
|
42
|
+
const trustedSuffix = Buffer.from(trustedComment.slice('trusted comment: '.length), 'utf-8');
|
|
43
|
+
return { signatureAlgorithm, keyId, signature, trustedSuffix, globalSignature };
|
|
44
|
+
}
|
|
45
|
+
function createEd25519PublicKey(rawPublicKey) {
|
|
46
|
+
if (!Buffer.isBuffer(rawPublicKey) || rawPublicKey.length !== 32) {
|
|
47
|
+
throw new Error('[minisign] invalid Ed25519 public key length');
|
|
48
|
+
}
|
|
49
|
+
const spki = Buffer.concat([ED25519_SPKI_PREFIX, rawPublicKey]);
|
|
50
|
+
return createPublicKey({ key: spki, format: 'der', type: 'spki' });
|
|
51
|
+
}
|
|
52
|
+
function bytesEqual(a, b) {
|
|
53
|
+
if (!a || !b)
|
|
54
|
+
return false;
|
|
55
|
+
if (a.length !== b.length)
|
|
56
|
+
return false;
|
|
57
|
+
return Buffer.compare(a, b) === 0;
|
|
58
|
+
}
|
|
59
|
+
export function verifyMinisign(params) {
|
|
60
|
+
try {
|
|
61
|
+
const bin = Buffer.isBuffer(params.message) ? params.message : Buffer.from(params.message ?? '');
|
|
62
|
+
const pubkey = parseMinisignPublicKeyFile(params.pubkeyFile);
|
|
63
|
+
const sig = parseMinisignSignatureFile(params.sigFile);
|
|
64
|
+
if (!bytesEqual(pubkey.signatureAlgorithm, Buffer.from('Ed'))) {
|
|
65
|
+
throw new Error('[minisign] incompatible public key signature algorithm');
|
|
66
|
+
}
|
|
67
|
+
if (!bytesEqual(pubkey.keyId, sig.keyId)) {
|
|
68
|
+
throw new Error('[minisign] incompatible key identifiers');
|
|
69
|
+
}
|
|
70
|
+
let prehashed = false;
|
|
71
|
+
if (bytesEqual(sig.signatureAlgorithm, Buffer.from('Ed'))) {
|
|
72
|
+
prehashed = false;
|
|
73
|
+
}
|
|
74
|
+
else if (bytesEqual(sig.signatureAlgorithm, Buffer.from('ED'))) {
|
|
75
|
+
prehashed = true;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error('[minisign] unsupported signature algorithm');
|
|
79
|
+
}
|
|
80
|
+
const publicKey = createEd25519PublicKey(pubkey.rawPublicKey);
|
|
81
|
+
const payload = prehashed ? createHash('blake2b512').update(bin).digest() : bin;
|
|
82
|
+
const okSig = verify(null, payload, publicKey, sig.signature);
|
|
83
|
+
if (!okSig)
|
|
84
|
+
return false;
|
|
85
|
+
const okGlobal = verify(null, Buffer.concat([sig.signature, sig.trustedSuffix]), publicKey, sig.globalSignature);
|
|
86
|
+
return okGlobal;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=minisign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minisign.js","sourceRoot":"","sources":["../src/minisign.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type ReleaseAsset = Readonly<{
|
|
2
|
+
name: string;
|
|
3
|
+
url: string;
|
|
4
|
+
}>;
|
|
5
|
+
export type ReleaseAssetBundle = Readonly<{
|
|
6
|
+
version: string;
|
|
7
|
+
archive: ReleaseAsset;
|
|
8
|
+
checksums: ReleaseAsset;
|
|
9
|
+
checksumsSig: ReleaseAsset;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function downloadVerifiedReleaseAssetBundle(params: Readonly<{
|
|
12
|
+
bundle: ReleaseAssetBundle;
|
|
13
|
+
destDir: string;
|
|
14
|
+
pubkeyFile: string;
|
|
15
|
+
userAgent?: string;
|
|
16
|
+
}>): Promise<Readonly<{
|
|
17
|
+
version: string;
|
|
18
|
+
archiveName: string;
|
|
19
|
+
archivePath: string;
|
|
20
|
+
source: {
|
|
21
|
+
archiveUrl: string;
|
|
22
|
+
checksumsUrl: string;
|
|
23
|
+
};
|
|
24
|
+
}>>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=verifiedDownload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifiedDownload.d.ts","sourceRoot":"","sources":["../src/verifiedDownload.ts"],"names":[],"mappings":"AAOA,KAAK,YAAY,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC,CAAC;AAmBH,wBAAsB,kCAAkC,CAAC,MAAM,EAAE,QAAQ,CAAC;IACxE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD,CAAC,CAAC,CAgCF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { lookupSha256 } from './checksums.js';
|
|
5
|
+
import { verifyMinisign } from './minisign.js';
|
|
6
|
+
async function fetchText(url, { userAgent = 'happier-release-runtime' } = {}) {
|
|
7
|
+
const res = await fetch(url, { headers: { 'user-agent': userAgent } });
|
|
8
|
+
if (!res.ok)
|
|
9
|
+
throw new Error(`[download] failed: ${url} (${res.status})`);
|
|
10
|
+
return res.text();
|
|
11
|
+
}
|
|
12
|
+
async function fetchBytes(url, { userAgent = 'happier-release-runtime' } = {}) {
|
|
13
|
+
const res = await fetch(url, { headers: { 'user-agent': userAgent } });
|
|
14
|
+
if (!res.ok)
|
|
15
|
+
throw new Error(`[download] failed: ${url} (${res.status})`);
|
|
16
|
+
const ab = await res.arrayBuffer();
|
|
17
|
+
return Buffer.from(ab);
|
|
18
|
+
}
|
|
19
|
+
function sha256Hex(bytes) {
|
|
20
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
21
|
+
}
|
|
22
|
+
export async function downloadVerifiedReleaseAssetBundle(params) {
|
|
23
|
+
const bundle = params.bundle;
|
|
24
|
+
const destDir = String(params.destDir ?? '').trim();
|
|
25
|
+
const pubkeyFile = String(params.pubkeyFile ?? '');
|
|
26
|
+
const userAgent = String(params.userAgent ?? '').trim() || 'happier-release-runtime';
|
|
27
|
+
if (!destDir)
|
|
28
|
+
throw new Error('[download] destDir is required');
|
|
29
|
+
if (!pubkeyFile.trim())
|
|
30
|
+
throw new Error('[download] pubkeyFile is required');
|
|
31
|
+
await mkdir(destDir, { recursive: true });
|
|
32
|
+
const checksumsText = await fetchText(bundle.checksums.url, { userAgent });
|
|
33
|
+
const sigFile = await fetchText(bundle.checksumsSig.url, { userAgent });
|
|
34
|
+
const ok = verifyMinisign({ message: Buffer.from(checksumsText, 'utf-8'), pubkeyFile, sigFile });
|
|
35
|
+
if (!ok) {
|
|
36
|
+
throw new Error('[download] signature verification failed for checksums file');
|
|
37
|
+
}
|
|
38
|
+
const expected = lookupSha256({ checksumsText, filename: bundle.archive.name });
|
|
39
|
+
const bytes = await fetchBytes(bundle.archive.url, { userAgent });
|
|
40
|
+
const actual = sha256Hex(bytes);
|
|
41
|
+
if (actual !== expected) {
|
|
42
|
+
throw new Error(`[download] checksum verification failed for ${bundle.archive.name}`);
|
|
43
|
+
}
|
|
44
|
+
const archivePath = join(destDir, bundle.archive.name);
|
|
45
|
+
await writeFile(archivePath, bytes);
|
|
46
|
+
return {
|
|
47
|
+
version: String(bundle.version ?? ''),
|
|
48
|
+
archiveName: bundle.archive.name,
|
|
49
|
+
archivePath,
|
|
50
|
+
source: { archiveUrl: bundle.archive.url, checksumsUrl: bundle.checksums.url },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=verifiedDownload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifiedDownload.js","sourceRoot":"","sources":["../src/verifiedDownload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@happier-dev/release-runtime",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./minisign": {
|
|
14
|
+
"types": "./dist/minisign.d.ts",
|
|
15
|
+
"default": "./dist/minisign.js"
|
|
16
|
+
},
|
|
17
|
+
"./checksums": {
|
|
18
|
+
"types": "./dist/checksums.d.ts",
|
|
19
|
+
"default": "./dist/checksums.js"
|
|
20
|
+
},
|
|
21
|
+
"./assets": {
|
|
22
|
+
"types": "./dist/assets.d.ts",
|
|
23
|
+
"default": "./dist/assets.js"
|
|
24
|
+
},
|
|
25
|
+
"./extractPlan": {
|
|
26
|
+
"types": "./dist/extractPlan.d.ts",
|
|
27
|
+
"default": "./dist/extractPlan.js"
|
|
28
|
+
},
|
|
29
|
+
"./verifiedDownload": {
|
|
30
|
+
"types": "./dist/verifiedDownload.d.ts",
|
|
31
|
+
"default": "./dist/verifiedDownload.js"
|
|
32
|
+
},
|
|
33
|
+
"./github": {
|
|
34
|
+
"types": "./dist/github.d.ts",
|
|
35
|
+
"default": "./dist/github.js"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happier-dev/stack",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-preview.
|
|
4
|
+
"version": "0.1.0-preview.134.1",
|
|
5
5
|
"repository": "happier-dev/happier",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"registry": "https://registry.npmjs.org",
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"scripts/"
|
|
19
19
|
],
|
|
20
20
|
"bundledDependencies": [
|
|
21
|
-
"@happier-dev/cli-common"
|
|
21
|
+
"@happier-dev/cli-common",
|
|
22
|
+
"@happier-dev/release-runtime"
|
|
22
23
|
],
|
|
23
24
|
"scripts": {
|
|
24
25
|
"setup": "node ./scripts/setup.mjs",
|
|
@@ -71,6 +72,7 @@
|
|
|
71
72
|
},
|
|
72
73
|
"dependencies": {
|
|
73
74
|
"@happier-dev/cli-common": "0.0.0",
|
|
75
|
+
"@happier-dev/release-runtime": "0.0.0",
|
|
74
76
|
"qrcode": "^1.5.4",
|
|
75
77
|
"qrcode-terminal": "^0.12.0"
|
|
76
78
|
}
|
package/scripts/auth.mjs
CHANGED
|
@@ -451,8 +451,9 @@ function resolveLightDirsForStack({ env, baseDir }) {
|
|
|
451
451
|
function resolveDbProviderForLightFromEnv(env) {
|
|
452
452
|
const raw = (env.HAPPIER_DB_PROVIDER ?? env.HAPPY_DB_PROVIDER ?? '').toString().trim().toLowerCase();
|
|
453
453
|
if (raw === 'sqlite') return 'sqlite';
|
|
454
|
-
|
|
455
|
-
|
|
454
|
+
if (raw === 'pglite') return 'pglite';
|
|
455
|
+
// Default for light flavor.
|
|
456
|
+
return 'sqlite';
|
|
456
457
|
}
|
|
457
458
|
|
|
458
459
|
function resolveDbProviderForFullFromEnv(env) {
|
|
@@ -37,6 +37,7 @@ test('hstack stack auth copy-from skips pglite DB seed when lock is held by a li
|
|
|
37
37
|
[
|
|
38
38
|
`HAPPIER_STACK_STACK=${name}`,
|
|
39
39
|
`HAPPIER_STACK_SERVER_COMPONENT=happier-server-light`,
|
|
40
|
+
`HAPPIER_DB_PROVIDER=pglite`,
|
|
40
41
|
`HAPPIER_STACK_REPO_DIR=${repoRoot}`,
|
|
41
42
|
`HAPPIER_SERVER_LIGHT_DATA_DIR=${dataDir}`,
|
|
42
43
|
`HAPPIER_SERVER_LIGHT_FILES_DIR=${join(dataDir, 'files')}`,
|
|
@@ -28,7 +28,8 @@ test('hstack stack auth copy-from does not hit ReferenceError: runCapture is not
|
|
|
28
28
|
const binDir = join(tmp, 'bin');
|
|
29
29
|
await mkdir(binDir, { recursive: true });
|
|
30
30
|
const yarnPath = join(binDir, 'yarn');
|
|
31
|
-
|
|
31
|
+
const yarnLogPath = join(tmp, 'yarn.calls.log');
|
|
32
|
+
await writeFile(yarnPath, `#!/bin/bash\necho \"$*\" >> ${JSON.stringify(yarnLogPath)}\nexit 0\n`, 'utf-8');
|
|
32
33
|
await chmod(yarnPath, 0o755);
|
|
33
34
|
|
|
34
35
|
const repoRoot = dirname(rootDir); // .../apps/stack -> .../ (monorepo root)
|
|
@@ -75,6 +76,12 @@ test('hstack stack auth copy-from does not hit ReferenceError: runCapture is not
|
|
|
75
76
|
!res.stdout.includes('spawn yarn ENOENT') && !res.stderr.includes('spawn yarn ENOENT'),
|
|
76
77
|
`expected yarn to be resolvable in light migrations step\nstdout:\n${res.stdout}\nstderr:\n${res.stderr}`
|
|
77
78
|
);
|
|
79
|
+
const yarnCalls = await readFile(yarnLogPath, 'utf-8');
|
|
80
|
+
assert.match(
|
|
81
|
+
yarnCalls,
|
|
82
|
+
/\bmigrate:sqlite:deploy\b/,
|
|
83
|
+
`expected light auth flow without explicit DB provider to use sqlite migrations\ncalls:\n${yarnCalls}`
|
|
84
|
+
);
|
|
78
85
|
});
|
|
79
86
|
|
|
80
87
|
test('hstack stack auth copy-from prefers source server-scoped credential over unrelated legacy key', async (t) => {
|
package/scripts/build.mjs
CHANGED
|
@@ -13,6 +13,7 @@ import { getInvokedCwd, inferComponentFromCwd } from './utils/cli/cwd_scope.mjs'
|
|
|
13
13
|
import { applyStackTauriOverrides } from './utils/tauri/stack_overrides.mjs';
|
|
14
14
|
import { buildIntoTempThenReplace } from './utils/fs/atomic_dir_swap.mjs';
|
|
15
15
|
import { pathExists } from './utils/fs/fs.mjs';
|
|
16
|
+
import { buildStackTauriExportEnv, buildStackWebExportEnv } from './utils/ui/ui_export_env.mjs';
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* Build a lightweight static web UI bundle (no Expo dev server).
|
|
@@ -93,14 +94,7 @@ async function main() {
|
|
|
93
94
|
console.log(`[local] exporting web UI to ${outDir}...`);
|
|
94
95
|
|
|
95
96
|
// Build for root hosting (the server redirects /ui -> /).
|
|
96
|
-
const env = {
|
|
97
|
-
...process.env,
|
|
98
|
-
NODE_ENV: 'production',
|
|
99
|
-
EXPO_PUBLIC_DEBUG: '0',
|
|
100
|
-
// Leave empty for web export so the app uses window.location.origin at runtime.
|
|
101
|
-
// (Important for Tailscale: a phone loading `http://100.x.y.z:3005` must not call `http://localhost:3005`.)
|
|
102
|
-
EXPO_PUBLIC_HAPPY_SERVER_URL: '',
|
|
103
|
-
};
|
|
97
|
+
const env = buildStackWebExportEnv({ baseEnv: process.env });
|
|
104
98
|
|
|
105
99
|
// Expo CLI is available via node_modules/.bin once dependencies are installed.
|
|
106
100
|
await buildIntoTempThenReplace(outDir, async (tmpOutDir) => {
|
|
@@ -171,16 +165,7 @@ async function main() {
|
|
|
171
165
|
|
|
172
166
|
console.log(`[local] exporting web UI for Tauri to ${tauriDistDir}...`);
|
|
173
167
|
|
|
174
|
-
const tauriEnv = {
|
|
175
|
-
...process.env,
|
|
176
|
-
NODE_ENV: 'production',
|
|
177
|
-
EXPO_PUBLIC_DEBUG: '0',
|
|
178
|
-
// In Tauri, window.location.origin is a tauri:// origin, so we must hardcode the API base.
|
|
179
|
-
EXPO_PUBLIC_HAPPY_SERVER_URL: tauriServerUrl,
|
|
180
|
-
// Some parts of the app use EXPO_PUBLIC_SERVER_URL; keep them aligned.
|
|
181
|
-
EXPO_PUBLIC_SERVER_URL: tauriServerUrl,
|
|
182
|
-
// For the Tauri bundle we want root-relative assets (no /ui baseUrl), so do not set EXPO_PUBLIC_WEB_BASE_URL
|
|
183
|
-
};
|
|
168
|
+
const tauriEnv = buildStackTauriExportEnv({ baseEnv: process.env, tauriServerUrl });
|
|
184
169
|
delete tauriEnv.EXPO_PUBLIC_WEB_BASE_URL;
|
|
185
170
|
|
|
186
171
|
{
|
|
@@ -15,6 +15,11 @@ export function bundleWorkspaceDeps(opts = {}) {
|
|
|
15
15
|
srcDir: resolve(repoRoot, 'packages', 'cli-common'),
|
|
16
16
|
destDir: resolve(stackDir, 'node_modules', '@happier-dev', 'cli-common'),
|
|
17
17
|
},
|
|
18
|
+
{
|
|
19
|
+
packageName: '@happier-dev/release-runtime',
|
|
20
|
+
srcDir: resolve(repoRoot, 'packages', 'release-runtime'),
|
|
21
|
+
destDir: resolve(stackDir, 'node_modules', '@happier-dev', 'release-runtime'),
|
|
22
|
+
},
|
|
18
23
|
];
|
|
19
24
|
|
|
20
25
|
bundleWorkspacePackages({ bundles });
|
|
@@ -35,4 +40,3 @@ if (invokedAsMain) {
|
|
|
35
40
|
process.exit(1);
|
|
36
41
|
}
|
|
37
42
|
}
|
|
38
|
-
|
|
@@ -14,10 +14,26 @@ function createBundleFixture(prefix = 'happy-stack-bundle-workspace-deps-') {
|
|
|
14
14
|
const repoRoot = mkdtempSync(join(tmpdir(), prefix));
|
|
15
15
|
const stackDir = resolve(repoRoot, 'apps', 'stack');
|
|
16
16
|
const cliCommonDir = resolve(repoRoot, 'packages', 'cli-common');
|
|
17
|
+
const releaseRuntimeDir = resolve(repoRoot, 'packages', 'release-runtime');
|
|
17
18
|
writeJson(resolve(repoRoot, 'package.json'), { name: 'repo', private: true });
|
|
18
19
|
writeFileSync(resolve(repoRoot, 'yarn.lock'), '# lock\n', 'utf8');
|
|
19
20
|
mkdirSync(resolve(cliCommonDir, 'dist'), { recursive: true });
|
|
21
|
+
mkdirSync(resolve(releaseRuntimeDir, 'dist'), { recursive: true });
|
|
20
22
|
mkdirSync(stackDir, { recursive: true });
|
|
23
|
+
|
|
24
|
+
// bundleWorkspaceDeps also bundles @happier-dev/release-runtime. Keep a minimal, build-like
|
|
25
|
+
// workspace package present so these tests focus on bundling behavior instead of fixture setup.
|
|
26
|
+
writeJson(resolve(releaseRuntimeDir, 'package.json'), {
|
|
27
|
+
name: '@happier-dev/release-runtime',
|
|
28
|
+
version: '0.0.0',
|
|
29
|
+
type: 'module',
|
|
30
|
+
main: './dist/index.js',
|
|
31
|
+
types: './dist/index.d.ts',
|
|
32
|
+
exports: { '.': { default: './dist/index.js', types: './dist/index.d.ts' } },
|
|
33
|
+
scripts: { postinstall: 'echo should-not-run' },
|
|
34
|
+
});
|
|
35
|
+
writeFileSync(resolve(releaseRuntimeDir, 'dist', 'index.js'), 'export const release = 1;\n', 'utf8');
|
|
36
|
+
|
|
21
37
|
return { repoRoot, stackDir, cliCommonDir };
|
|
22
38
|
}
|
|
23
39
|
|