@hs-x/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1001 -0
- package/dist/account-store.d.ts +51 -0
- package/dist/account-store.d.ts.map +1 -0
- package/dist/account-store.js +138 -0
- package/dist/account-store.js.map +1 -0
- package/dist/bin/hs-x.d.ts +3 -0
- package/dist/bin/hs-x.d.ts.map +1 -0
- package/dist/bin/hs-x.js +47 -0
- package/dist/bin/hs-x.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +595 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli-error.d.ts +36 -0
- package/dist/cli-error.d.ts.map +1 -0
- package/dist/cli-error.js +40 -0
- package/dist/cli-error.js.map +1 -0
- package/dist/cloudflare-auth.d.ts +25 -0
- package/dist/cloudflare-auth.d.ts.map +1 -0
- package/dist/cloudflare-auth.js +251 -0
- package/dist/cloudflare-auth.js.map +1 -0
- package/dist/cloudflare-kv.d.ts +23 -0
- package/dist/cloudflare-kv.d.ts.map +1 -0
- package/dist/cloudflare-kv.js +101 -0
- package/dist/cloudflare-kv.js.map +1 -0
- package/dist/cloudflare-oauth-store.d.ts +16 -0
- package/dist/cloudflare-oauth-store.d.ts.map +1 -0
- package/dist/cloudflare-oauth-store.js +80 -0
- package/dist/cloudflare-oauth-store.js.map +1 -0
- package/dist/cloudflare-oauth.d.ts +82 -0
- package/dist/cloudflare-oauth.d.ts.map +1 -0
- package/dist/cloudflare-oauth.js +336 -0
- package/dist/cloudflare-oauth.js.map +1 -0
- package/dist/cloudflare-pointer.d.ts +13 -0
- package/dist/cloudflare-pointer.d.ts.map +1 -0
- package/dist/cloudflare-pointer.js +46 -0
- package/dist/cloudflare-pointer.js.map +1 -0
- package/dist/command-history.d.ts +7 -0
- package/dist/command-history.d.ts.map +1 -0
- package/dist/command-history.js +34 -0
- package/dist/command-history.js.map +1 -0
- package/dist/commands/account.d.ts +7 -0
- package/dist/commands/account.d.ts.map +1 -0
- package/dist/commands/account.js +315 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/api.d.ts +36 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +521 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/completion.d.ts +7 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +121 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/connect.d.ts +7 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +1123 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/control-plane-read.d.ts +22 -0
- package/dist/commands/control-plane-read.d.ts.map +1 -0
- package/dist/commands/control-plane-read.js +350 -0
- package/dist/commands/control-plane-read.js.map +1 -0
- package/dist/commands/deploy-promote.d.ts +14 -0
- package/dist/commands/deploy-promote.d.ts.map +1 -0
- package/dist/commands/deploy-promote.js +105 -0
- package/dist/commands/deploy-promote.js.map +1 -0
- package/dist/commands/deploy.d.ts +18 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +2764 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +7 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +913 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +258 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/flags.d.ts +22 -0
- package/dist/commands/flags.d.ts.map +1 -0
- package/dist/commands/flags.js +185 -0
- package/dist/commands/flags.js.map +1 -0
- package/dist/commands/help-command.d.ts +13 -0
- package/dist/commands/help-command.d.ts.map +1 -0
- package/dist/commands/help-command.js +482 -0
- package/dist/commands/help-command.js.map +1 -0
- package/dist/commands/history.d.ts +6 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +42 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +233 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +26 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +441 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +381 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/migrate.d.ts +8 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +258 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/rollback.d.ts +21 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +301 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/secrets.d.ts +7 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +230 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +241 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/unlink.d.ts +21 -0
- package/dist/commands/unlink.d.ts.map +1 -0
- package/dist/commands/unlink.js +83 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/commands/update.d.ts +11 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +154 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +9 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +39 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -0
- package/dist/control-plane-fetch.d.ts +34 -0
- package/dist/control-plane-fetch.d.ts.map +1 -0
- package/dist/control-plane-fetch.js +73 -0
- package/dist/control-plane-fetch.js.map +1 -0
- package/dist/control-plane-loader.d.ts +16 -0
- package/dist/control-plane-loader.d.ts.map +1 -0
- package/dist/control-plane-loader.js +24 -0
- package/dist/control-plane-loader.js.map +1 -0
- package/dist/dev/compat-shim.d.ts +40 -0
- package/dist/dev/compat-shim.d.ts.map +1 -0
- package/dist/dev/compat-shim.js +65 -0
- package/dist/dev/compat-shim.js.map +1 -0
- package/dist/dev/event-bus.d.ts +27 -0
- package/dist/dev/event-bus.d.ts.map +1 -0
- package/dist/dev/event-bus.js +32 -0
- package/dist/dev/event-bus.js.map +1 -0
- package/dist/dev/log-server.d.ts +52 -0
- package/dist/dev/log-server.d.ts.map +1 -0
- package/dist/dev/log-server.js +216 -0
- package/dist/dev/log-server.js.map +1 -0
- package/dist/dev/session-manager.d.ts +33 -0
- package/dist/dev/session-manager.d.ts.map +1 -0
- package/dist/dev/session-manager.js +132 -0
- package/dist/dev/session-manager.js.map +1 -0
- package/dist/dev/stream-renderer.d.ts +22 -0
- package/dist/dev/stream-renderer.d.ts.map +1 -0
- package/dist/dev/stream-renderer.js +65 -0
- package/dist/dev/stream-renderer.js.map +1 -0
- package/dist/dev/tunnel.d.ts +40 -0
- package/dist/dev/tunnel.d.ts.map +1 -0
- package/dist/dev/tunnel.js +139 -0
- package/dist/dev/tunnel.js.map +1 -0
- package/dist/effect-http.d.ts +10 -0
- package/dist/effect-http.d.ts.map +1 -0
- package/dist/effect-http.js +38 -0
- package/dist/effect-http.js.map +1 -0
- package/dist/errors-registry.d.ts +11 -0
- package/dist/errors-registry.d.ts.map +1 -0
- package/dist/errors-registry.js +554 -0
- package/dist/errors-registry.js.map +1 -0
- package/dist/errors.d.ts +58 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/help.d.ts +6 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +100 -0
- package/dist/help.js.map +1 -0
- package/dist/history.d.ts +15 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +69 -0
- package/dist/history.js.map +1 -0
- package/dist/hubspot-auth.d.ts +53 -0
- package/dist/hubspot-auth.d.ts.map +1 -0
- package/dist/hubspot-auth.js +301 -0
- package/dist/hubspot-auth.js.map +1 -0
- package/dist/hubspot-developer-client.d.ts +10 -0
- package/dist/hubspot-developer-client.d.ts.map +1 -0
- package/dist/hubspot-developer-client.js +212 -0
- package/dist/hubspot-developer-client.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/init/templates.d.ts +18 -0
- package/dist/init/templates.d.ts.map +1 -0
- package/dist/init/templates.js +239 -0
- package/dist/init/templates.js.map +1 -0
- package/dist/load-env.d.ts +16 -0
- package/dist/load-env.d.ts.map +1 -0
- package/dist/load-env.js +69 -0
- package/dist/load-env.js.map +1 -0
- package/dist/machine-id.d.ts +3 -0
- package/dist/machine-id.d.ts.map +1 -0
- package/dist/machine-id.js +41 -0
- package/dist/machine-id.js.map +1 -0
- package/dist/paths.d.ts +4 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +19 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompt.d.ts +43 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +379 -0
- package/dist/prompt.js.map +1 -0
- package/dist/reporter/human.d.ts +28 -0
- package/dist/reporter/human.d.ts.map +1 -0
- package/dist/reporter/human.js +126 -0
- package/dist/reporter/human.js.map +1 -0
- package/dist/reporter/index.d.ts +14 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +37 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/json.d.ts +43 -0
- package/dist/reporter/json.d.ts.map +1 -0
- package/dist/reporter/json.js +146 -0
- package/dist/reporter/json.js.map +1 -0
- package/dist/reporter/style.d.ts +34 -0
- package/dist/reporter/style.d.ts.map +1 -0
- package/dist/reporter/style.js +97 -0
- package/dist/reporter/style.js.map +1 -0
- package/dist/reporter/types.d.ts +41 -0
- package/dist/reporter/types.d.ts.map +1 -0
- package/dist/reporter/types.js +2 -0
- package/dist/reporter/types.js.map +1 -0
- package/dist/result.d.ts +4 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +2 -0
- package/dist/result.js.map +1 -0
- package/dist/services/account-store.d.ts +31 -0
- package/dist/services/account-store.d.ts.map +1 -0
- package/dist/services/account-store.js +135 -0
- package/dist/services/account-store.js.map +1 -0
- package/dist/services/app-paths.d.ts +25 -0
- package/dist/services/app-paths.d.ts.map +1 -0
- package/dist/services/app-paths.js +34 -0
- package/dist/services/app-paths.js.map +1 -0
- package/dist/services/cloudflare-auth.d.ts +83 -0
- package/dist/services/cloudflare-auth.d.ts.map +1 -0
- package/dist/services/cloudflare-auth.js +30 -0
- package/dist/services/cloudflare-auth.js.map +1 -0
- package/dist/services/cloudflare-kv.d.ts +45 -0
- package/dist/services/cloudflare-kv.d.ts.map +1 -0
- package/dist/services/cloudflare-kv.js +151 -0
- package/dist/services/cloudflare-kv.js.map +1 -0
- package/dist/services/command-history.d.ts +29 -0
- package/dist/services/command-history.d.ts.map +1 -0
- package/dist/services/command-history.js +62 -0
- package/dist/services/command-history.js.map +1 -0
- package/dist/services/control-plane.d.ts +32 -0
- package/dist/services/control-plane.d.ts.map +1 -0
- package/dist/services/control-plane.js +57 -0
- package/dist/services/control-plane.js.map +1 -0
- package/dist/services/env-loader.d.ts +18 -0
- package/dist/services/env-loader.d.ts.map +1 -0
- package/dist/services/env-loader.js +34 -0
- package/dist/services/env-loader.js.map +1 -0
- package/dist/services/http.d.ts +19 -0
- package/dist/services/http.d.ts.map +1 -0
- package/dist/services/http.js +9 -0
- package/dist/services/http.js.map +1 -0
- package/dist/services/live.d.ts +16 -0
- package/dist/services/live.d.ts.map +1 -0
- package/dist/services/live.js +26 -0
- package/dist/services/live.js.map +1 -0
- package/dist/services/machine-id.d.ts +18 -0
- package/dist/services/machine-id.d.ts.map +1 -0
- package/dist/services/machine-id.js +39 -0
- package/dist/services/machine-id.js.map +1 -0
- package/dist/services/reporter.d.ts +55 -0
- package/dist/services/reporter.d.ts.map +1 -0
- package/dist/services/reporter.js +49 -0
- package/dist/services/reporter.js.map +1 -0
- package/dist/state-store.d.ts +39 -0
- package/dist/state-store.d.ts.map +1 -0
- package/dist/state-store.js +89 -0
- package/dist/state-store.js.map +1 -0
- package/dist/telemetry.d.ts +13 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +129 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tenant-state.d.ts +69 -0
- package/dist/tenant-state.d.ts.map +1 -0
- package/dist/tenant-state.js +161 -0
- package/dist/tenant-state.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { HttpClientRequest } from '@hs-x/types';
|
|
4
|
+
import { CLI_VERSION } from '../constants.js';
|
|
5
|
+
import { executeCliHttp } from '../effect-http.js';
|
|
6
|
+
import { cachePath } from '../paths.js';
|
|
7
|
+
import { createReporter } from '../reporter/index.js';
|
|
8
|
+
export async function updateCommand({ argv, json, }) {
|
|
9
|
+
const latest = await fetchLatestVersion();
|
|
10
|
+
const current = CLI_VERSION;
|
|
11
|
+
const upToDate = latest === undefined || compareSemver(current, latest) >= 0;
|
|
12
|
+
const result = {
|
|
13
|
+
ok: true,
|
|
14
|
+
command: 'update',
|
|
15
|
+
current,
|
|
16
|
+
latest: latest ?? null,
|
|
17
|
+
up_to_date: upToDate,
|
|
18
|
+
install_command: 'bun add -g hs-x@latest',
|
|
19
|
+
};
|
|
20
|
+
if (json) {
|
|
21
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
22
|
+
return { exitCode: 0 };
|
|
23
|
+
}
|
|
24
|
+
const reporter = createReporter({ command: 'update', argv });
|
|
25
|
+
reporter.header(`v${current}`);
|
|
26
|
+
if (latest === undefined) {
|
|
27
|
+
reporter.warn('HSX_W_UPDATE_REGISTRY_UNREACHABLE', 'Could not reach the registry. Try again later or pin a version manually.');
|
|
28
|
+
reporter.info('Install latest: bun add -g hs-x@latest');
|
|
29
|
+
reporter.done('Offline');
|
|
30
|
+
return { exitCode: 0 };
|
|
31
|
+
}
|
|
32
|
+
if (upToDate) {
|
|
33
|
+
reporter.step(`You are on the latest version (v${current})`).ok();
|
|
34
|
+
reporter.done('Up to date');
|
|
35
|
+
return { exitCode: 0 };
|
|
36
|
+
}
|
|
37
|
+
reporter.step(`Update available: v${current} -> v${latest}`).warn();
|
|
38
|
+
reporter.info('Run: bun add -g hs-x@latest');
|
|
39
|
+
reporter.info(`Changelog: https://hs-x.dev/changelog#v${latest}`);
|
|
40
|
+
reporter.done('Update available');
|
|
41
|
+
return { exitCode: 0 };
|
|
42
|
+
}
|
|
43
|
+
export async function maybePrintUpdateHint(input) {
|
|
44
|
+
if (!shouldCheckForUpdate(input))
|
|
45
|
+
return;
|
|
46
|
+
try {
|
|
47
|
+
const cacheFile = updateCheckCachePath();
|
|
48
|
+
const cached = await readVersionCheckCache(cacheFile);
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const lastChecked = cached ? Date.parse(cached.checkedAt) : 0;
|
|
51
|
+
const latest = cached && Number.isFinite(lastChecked) && now - lastChecked < 24 * 60 * 60 * 1000
|
|
52
|
+
? cached.latest
|
|
53
|
+
: await refreshVersionCheckCache(cacheFile);
|
|
54
|
+
if (!latest || compareSemver(CLI_VERSION, latest) >= 0)
|
|
55
|
+
return;
|
|
56
|
+
process.stderr.write(`\nUpdate available: hs-x v${latest} (current v${CLI_VERSION}). Run: bun add -g hs-x@latest\n`);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// update hints are best-effort and must never affect command output/exit code
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function shouldCheckForUpdate(input) {
|
|
63
|
+
if (input.json || input.argv.includes('--json-stream') || input.argv.includes('--quiet'))
|
|
64
|
+
return false;
|
|
65
|
+
if (input.argv.includes('-q') || input.argv.includes('--no-update-check'))
|
|
66
|
+
return false;
|
|
67
|
+
if (truthyEnv(process.env.HSX_UPDATE_CHECK_DISABLED) ||
|
|
68
|
+
truthyEnv(process.env.NO_UPDATE_NOTIFIER)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
if (input.command === 'help' || input.command === '--help' || input.command === '-h')
|
|
72
|
+
return false;
|
|
73
|
+
if (input.command === 'update' || input.command === 'upgrade')
|
|
74
|
+
return false;
|
|
75
|
+
if (input.command === '--version' || input.command === '-v')
|
|
76
|
+
return false;
|
|
77
|
+
if (truthyEnv(process.env.HSX_UPDATE_CHECK_FORCE))
|
|
78
|
+
return true;
|
|
79
|
+
return !isSourceTreeCliRun();
|
|
80
|
+
}
|
|
81
|
+
function isSourceTreeCliRun() {
|
|
82
|
+
return process.argv.some((arg) => arg.includes('/packages/cli/src/bin/'));
|
|
83
|
+
}
|
|
84
|
+
function updateCheckCachePath() {
|
|
85
|
+
const override = process.env.HSX_UPDATE_CHECK_CACHE_PATH;
|
|
86
|
+
if (override && override.length > 0)
|
|
87
|
+
return override;
|
|
88
|
+
return cachePath('update-check.json');
|
|
89
|
+
}
|
|
90
|
+
async function readVersionCheckCache(path) {
|
|
91
|
+
try {
|
|
92
|
+
const parsed = JSON.parse(await readFile(path, 'utf8'));
|
|
93
|
+
if (typeof parsed.checkedAt !== 'string')
|
|
94
|
+
return undefined;
|
|
95
|
+
return {
|
|
96
|
+
checkedAt: parsed.checkedAt,
|
|
97
|
+
...(typeof parsed.latest === 'string' ? { latest: parsed.latest } : {}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function refreshVersionCheckCache(path) {
|
|
105
|
+
const latest = await fetchLatestVersion({ timeoutMs: 900 });
|
|
106
|
+
await mkdir(dirname(path), { recursive: true });
|
|
107
|
+
await writeFile(path, `${JSON.stringify({
|
|
108
|
+
checkedAt: new Date().toISOString(),
|
|
109
|
+
...(latest ? { latest } : {}),
|
|
110
|
+
}, null, 2)}\n`, 'utf8');
|
|
111
|
+
return latest;
|
|
112
|
+
}
|
|
113
|
+
async function fetchLatestVersion(options = {}) {
|
|
114
|
+
try {
|
|
115
|
+
const controller = new AbortController();
|
|
116
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 2500);
|
|
117
|
+
const url = new URL(options.url ?? process.env.HSX_UPDATE_CHECK_URL ?? 'https://registry.npmjs.org/hs-x/latest');
|
|
118
|
+
const request = HttpClientRequest.get(url).pipe(HttpClientRequest.setHeader('accept', 'application/json'));
|
|
119
|
+
try {
|
|
120
|
+
const response = await executeCliHttp(request, {
|
|
121
|
+
abortSignal: controller.signal,
|
|
122
|
+
});
|
|
123
|
+
if (!response.ok)
|
|
124
|
+
return undefined;
|
|
125
|
+
const body = (await response.json());
|
|
126
|
+
return typeof body.version === 'string' ? body.version : undefined;
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
clearTimeout(timeout);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function compareSemver(a, b) {
|
|
137
|
+
const parse = (s) => s
|
|
138
|
+
.replace(/^v/, '')
|
|
139
|
+
.split('.')
|
|
140
|
+
.map((n) => Number.parseInt(n, 10) || 0);
|
|
141
|
+
const pa = parse(a);
|
|
142
|
+
const pb = parse(b);
|
|
143
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
144
|
+
const da = pa[i] ?? 0;
|
|
145
|
+
const db = pb[i] ?? 0;
|
|
146
|
+
if (da !== db)
|
|
147
|
+
return da < db ? -1 : 1;
|
|
148
|
+
}
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
function truthyEnv(value) {
|
|
152
|
+
return value === '1' || value === 'true' || value === 'yes';
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQtD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,IAAI,EACJ,IAAI,GAIL;IACC,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,QAAQ;QACjB,OAAO;QACP,MAAM,EAAE,MAAM,IAAI,IAAI;QACtB,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,wBAAwB;KAC1C,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CACX,mCAAmC,EACnC,0EAA0E,CAC3E,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,mCAAmC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,sBAAsB,OAAO,QAAQ,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,QAAQ,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;IACnE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAI1C;IACC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAAE,OAAO;IACzC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GACV,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YAC/E,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,MAAM,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,MAAM,cAAc,WAAW,kCAAkC,CAC/F,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;IAChF,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAI7B;IACC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtF,OAAO,KAAK,CAAC;IACf,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAAE,OAAO,KAAK,CAAC;IACxF,IACE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAChD,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAClF,OAAO,KAAK,CAAC;IACf,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5E,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1E,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,CAAC,kBAAkB,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACzD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,OAAO,SAAS,CAAC,mBAAmB,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAA+B,CAAC;QACtF,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC3D,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,IAAY;IAClD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CACb,IAAI,EACJ,GAAG,IAAI,CAAC,SAAS,CACf;QACE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,EACD,IAAI,EACJ,CAAC,CACF,IAAI,EACL,MAAM,CACP,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,UAAkE,EAAE;IAEpE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,wCAAwC,CAC5F,CAAC;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAC7C,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAC1D,CAAC;QACF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE;gBAC7C,WAAW,EAAE,UAAU,CAAC,MAAM;aAC/B,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YACnC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkC,CAAC;YACtE,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC;SACE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CliResult } from '../result.js';
|
|
2
|
+
export declare function validateCommand({ command, root, json, argv, }: {
|
|
3
|
+
readonly command: 'check' | 'validate';
|
|
4
|
+
readonly root: string;
|
|
5
|
+
readonly json: boolean;
|
|
6
|
+
readonly argv?: readonly string[];
|
|
7
|
+
}): Promise<CliResult>;
|
|
8
|
+
export declare function checkHelpText(command: string): string;
|
|
9
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAS,GACV,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GAAG,OAAO,CAAC,SAAS,CAAC,CAuBrB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CASrD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { basename } from 'node:path';
|
|
2
|
+
import { validateProject } from '@hs-x/validator';
|
|
3
|
+
import { createReporter } from '../reporter/index.js';
|
|
4
|
+
export async function validateCommand({ command, root, json, argv = [], }) {
|
|
5
|
+
const result = await validateProject({ root });
|
|
6
|
+
if (json) {
|
|
7
|
+
process.stdout.write(`${JSON.stringify({ command, ...result, ok: result.ok }, null, 2)}\n`);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
const reporter = createReporter({ command, argv });
|
|
11
|
+
reporter.header(basename(root));
|
|
12
|
+
const step = reporter.step(`Checking ${result.filesChecked} files`);
|
|
13
|
+
if (result.diagnostics.length === 0) {
|
|
14
|
+
step.ok('no issues');
|
|
15
|
+
reporter.done('Validated', 0);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
step.fail(`${result.diagnostics.length} issue${result.diagnostics.length === 1 ? '' : 's'}`);
|
|
19
|
+
for (const d of result.diagnostics) {
|
|
20
|
+
const code = d.code ?? 'diagnostic';
|
|
21
|
+
const msg = d.message ?? JSON.stringify(d);
|
|
22
|
+
reporter.error(code, msg);
|
|
23
|
+
}
|
|
24
|
+
reporter.done('Failed', 20);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { exitCode: result.ok ? 0 : 1 };
|
|
28
|
+
}
|
|
29
|
+
export function checkHelpText(command) {
|
|
30
|
+
return `hs-x ${command}
|
|
31
|
+
|
|
32
|
+
Validate project source and report diagnostics.
|
|
33
|
+
|
|
34
|
+
Flags:
|
|
35
|
+
--cwd <path> Project directory (defaults to current working directory)
|
|
36
|
+
--json Emit JSON result
|
|
37
|
+
`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAI,GAAG,EAAE,GAMV;IACC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,YAAY,QAAQ,CAAC,CAAC;QACpE,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,SAAS,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7F,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAI,CAAuB,CAAC,IAAI,IAAI,YAAY,CAAC;gBAC3D,MAAM,GAAG,GAAI,CAA0B,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACrE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,QAAQ,OAAO;;;;;;;CAOvB,CAAC;AACF,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const DEFAULT_CONTROL_PLANE_URL = "https://api.hs-x.dev";
|
|
2
|
+
export interface CliConfig {
|
|
3
|
+
readonly controlPlaneUrl: URL;
|
|
4
|
+
readonly runtimeControlPlaneUrl?: URL;
|
|
5
|
+
readonly accountId?: string;
|
|
6
|
+
readonly projectId?: string;
|
|
7
|
+
readonly userId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function loadCliConfig(argv?: readonly string[], env?: NodeJS.ProcessEnv): CliConfig;
|
|
10
|
+
export declare function formatConfigUrl(url: URL): string;
|
|
11
|
+
export declare function resolveControlPlaneUrl(argv?: readonly string[]): string;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC;IAC9B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,GAAG,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAuCD,wBAAgB,aAAa,CAC3B,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,SAAS,CAEX;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAEhD;AAID,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAG3E"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Config, ConfigProvider, Effect, Option } from 'effect';
|
|
2
|
+
export const DEFAULT_CONTROL_PLANE_URL = 'https://api.hs-x.dev';
|
|
3
|
+
const cliConfig = Config.all({
|
|
4
|
+
controlPlaneUrl: Config.url('CONTROL_PLANE_URL').pipe(Config.withDefault(new URL(DEFAULT_CONTROL_PLANE_URL))),
|
|
5
|
+
runtimeControlPlaneUrl: Config.url('RUNTIME_CONTROL_PLANE_URL').pipe(Config.option),
|
|
6
|
+
accountId: Config.string('ACCOUNT_ID').pipe(Config.option),
|
|
7
|
+
projectId: Config.string('PROJECT_ID').pipe(Config.option),
|
|
8
|
+
userId: Config.string('USER_ID').pipe(Config.withDefault('local-cli-user')),
|
|
9
|
+
}).pipe(Config.nested('HSX'), Config.map((config) => ({
|
|
10
|
+
controlPlaneUrl: config.controlPlaneUrl,
|
|
11
|
+
...(Option.isSome(config.runtimeControlPlaneUrl)
|
|
12
|
+
? { runtimeControlPlaneUrl: config.runtimeControlPlaneUrl.value }
|
|
13
|
+
: {}),
|
|
14
|
+
...(Option.isSome(config.accountId) ? { accountId: config.accountId.value } : {}),
|
|
15
|
+
...(Option.isSome(config.projectId) ? { projectId: config.projectId.value } : {}),
|
|
16
|
+
userId: config.userId,
|
|
17
|
+
})));
|
|
18
|
+
function cliConfigProvider(argv = [], env = process.env) {
|
|
19
|
+
const values = new Map();
|
|
20
|
+
for (const [key, value] of Object.entries(env)) {
|
|
21
|
+
if (typeof value === 'string' && value.length > 0)
|
|
22
|
+
values.set(key, value);
|
|
23
|
+
}
|
|
24
|
+
overlayFlag(values, argv, '--control-plane-url', 'HSX_CONTROL_PLANE_URL');
|
|
25
|
+
overlayFlag(values, argv, '--runtime-control-plane-url', 'HSX_RUNTIME_CONTROL_PLANE_URL');
|
|
26
|
+
overlayFlag(values, argv, '--account-id', 'HSX_ACCOUNT_ID');
|
|
27
|
+
overlayFlag(values, argv, '--project-id', 'HSX_PROJECT_ID');
|
|
28
|
+
overlayFlag(values, argv, '--user-id', 'HSX_USER_ID');
|
|
29
|
+
return ConfigProvider.fromMap(values, { pathDelim: '_', seqDelim: ',' });
|
|
30
|
+
}
|
|
31
|
+
export function loadCliConfig(argv = [], env = process.env) {
|
|
32
|
+
return Effect.runSync(Effect.withConfigProvider(cliConfigProvider(argv, env))(cliConfig));
|
|
33
|
+
}
|
|
34
|
+
export function formatConfigUrl(url) {
|
|
35
|
+
return url.toString().replace(/\/$/, '');
|
|
36
|
+
}
|
|
37
|
+
// The HS-X control plane URL is a platform-managed constant. End users do not pick it.
|
|
38
|
+
// Override via HSX_CONTROL_PLANE_URL only for local testing.
|
|
39
|
+
export function resolveControlPlaneUrl(argv = []) {
|
|
40
|
+
// --control-plane-url is hidden / advanced and intentionally overrides env.
|
|
41
|
+
return formatConfigUrl(loadCliConfig(argv).controlPlaneUrl);
|
|
42
|
+
}
|
|
43
|
+
function overlayFlag(values, argv, flag, key) {
|
|
44
|
+
const value = resolveFlag(argv, flag);
|
|
45
|
+
if (value && value.length > 0)
|
|
46
|
+
values.set(key, value);
|
|
47
|
+
}
|
|
48
|
+
function resolveFlag(argv, flag) {
|
|
49
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
50
|
+
const arg = argv[i];
|
|
51
|
+
if (arg === undefined)
|
|
52
|
+
continue;
|
|
53
|
+
if (arg === flag) {
|
|
54
|
+
const next = argv[i + 1];
|
|
55
|
+
return next && !next.startsWith('-') ? next : undefined;
|
|
56
|
+
}
|
|
57
|
+
if (arg.startsWith(`${flag}=`)) {
|
|
58
|
+
const value = arg.slice(flag.length + 1);
|
|
59
|
+
return value.length > 0 ? value : undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,uEAAuE;AACvE,eAAO,MAAM,gBAAgB,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface ControlPlaneFetchInput {
|
|
2
|
+
readonly controlPlaneUrl: string;
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
5
|
+
readonly body?: unknown;
|
|
6
|
+
readonly headers?: Record<string, string>;
|
|
7
|
+
/** Override only for tests. */
|
|
8
|
+
readonly fetchImpl?: typeof fetch;
|
|
9
|
+
/** Override only for tests. */
|
|
10
|
+
readonly storePath?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class ControlPlaneAuthError extends Error {
|
|
13
|
+
readonly name = "ControlPlaneAuthError";
|
|
14
|
+
readonly code: 'HSX_E_NOT_LOGGED_IN' | 'HSX_E_SESSION_EXPIRED';
|
|
15
|
+
constructor(code: 'HSX_E_NOT_LOGGED_IN' | 'HSX_E_SESSION_EXPIRED', message: string);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Send a request to the control plane with the locally-stored bearer
|
|
19
|
+
* session attached as `Authorization: Bearer <sessionToken>`. Throws
|
|
20
|
+
* `ControlPlaneAuthError` when the user hasn't run `hs-x login` or the
|
|
21
|
+
* stored session has expired locally; otherwise returns the raw `Response`
|
|
22
|
+
* so the caller can branch on status.
|
|
23
|
+
*/
|
|
24
|
+
export declare function controlPlaneFetch(input: ControlPlaneFetchInput): Promise<Response>;
|
|
25
|
+
/**
|
|
26
|
+
* Build the auth headers for a control-plane request. Prefers a stored
|
|
27
|
+
* bearer session (issued by `hs-x login`); falls back to the legacy
|
|
28
|
+
* `x-hsx-user-id` header so test harnesses and in-memory local control
|
|
29
|
+
* planes that haven't been migrated keep working. Returns an empty
|
|
30
|
+
* object when neither is available — the call will then fail with 401
|
|
31
|
+
* from the control plane, which is the correct loud failure.
|
|
32
|
+
*/
|
|
33
|
+
export declare function controlPlaneAuthHeaders(fallbackUserId: string | undefined, storePath?: string): Promise<Record<string, string>>;
|
|
34
|
+
//# sourceMappingURL=control-plane-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane-fetch.d.ts","sourceRoot":"","sources":["../src/control-plane-fetch.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA2B;IACjD,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,CAAC;gBACnD,IAAI,EAAE,qBAAqB,GAAG,uBAAuB,EAAE,OAAO,EAAE,MAAM;CAInF;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoCxF;AASD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMjC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { defaultStorePath, loadStore, } from './account-store.js';
|
|
2
|
+
import { HttpClientRequest } from '@hs-x/types';
|
|
3
|
+
import { executeCliHttp } from './effect-http.js';
|
|
4
|
+
export class ControlPlaneAuthError extends Error {
|
|
5
|
+
name = 'ControlPlaneAuthError';
|
|
6
|
+
code;
|
|
7
|
+
constructor(code, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Send a request to the control plane with the locally-stored bearer
|
|
14
|
+
* session attached as `Authorization: Bearer <sessionToken>`. Throws
|
|
15
|
+
* `ControlPlaneAuthError` when the user hasn't run `hs-x login` or the
|
|
16
|
+
* stored session has expired locally; otherwise returns the raw `Response`
|
|
17
|
+
* so the caller can branch on status.
|
|
18
|
+
*/
|
|
19
|
+
export async function controlPlaneFetch(input) {
|
|
20
|
+
const session = await loadUserSession(input.storePath);
|
|
21
|
+
if (!session) {
|
|
22
|
+
throw new ControlPlaneAuthError('HSX_E_NOT_LOGGED_IN', 'No local HS-X session. Run `hs-x login` first.');
|
|
23
|
+
}
|
|
24
|
+
if (sessionExpired(session)) {
|
|
25
|
+
throw new ControlPlaneAuthError('HSX_E_SESSION_EXPIRED', 'Stored HS-X session has expired. Run `hs-x login` again.');
|
|
26
|
+
}
|
|
27
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
28
|
+
const url = new URL(input.path, input.controlPlaneUrl);
|
|
29
|
+
const headers = {
|
|
30
|
+
accept: 'application/json',
|
|
31
|
+
authorization: `Bearer ${session.sessionToken}`,
|
|
32
|
+
...(input.headers ?? {}),
|
|
33
|
+
};
|
|
34
|
+
const init = {
|
|
35
|
+
method: input.method ?? 'GET',
|
|
36
|
+
headers,
|
|
37
|
+
};
|
|
38
|
+
if (input.body !== undefined) {
|
|
39
|
+
headers['content-type'] = headers['content-type'] ?? 'application/json';
|
|
40
|
+
init.body = typeof input.body === 'string' ? input.body : JSON.stringify(input.body);
|
|
41
|
+
}
|
|
42
|
+
let request = HttpClientRequest.make(input.method ?? 'GET')(url).pipe(HttpClientRequest.setHeaders(headers));
|
|
43
|
+
if (init.body !== undefined) {
|
|
44
|
+
request = request.pipe(HttpClientRequest.bodyText(String(init.body), headers['content-type']));
|
|
45
|
+
}
|
|
46
|
+
return executeCliHttp(request, { fetchImpl });
|
|
47
|
+
}
|
|
48
|
+
async function loadUserSession(storePath = defaultStorePath()) {
|
|
49
|
+
const store = await loadStore(storePath);
|
|
50
|
+
return store.userSession;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build the auth headers for a control-plane request. Prefers a stored
|
|
54
|
+
* bearer session (issued by `hs-x login`); falls back to the legacy
|
|
55
|
+
* `x-hsx-user-id` header so test harnesses and in-memory local control
|
|
56
|
+
* planes that haven't been migrated keep working. Returns an empty
|
|
57
|
+
* object when neither is available — the call will then fail with 401
|
|
58
|
+
* from the control plane, which is the correct loud failure.
|
|
59
|
+
*/
|
|
60
|
+
export async function controlPlaneAuthHeaders(fallbackUserId, storePath = defaultStorePath()) {
|
|
61
|
+
const session = await loadUserSession(storePath);
|
|
62
|
+
if (session && !sessionExpired(session)) {
|
|
63
|
+
return { authorization: `Bearer ${session.sessionToken}` };
|
|
64
|
+
}
|
|
65
|
+
return fallbackUserId ? { 'x-hsx-user-id': fallbackUserId } : {};
|
|
66
|
+
}
|
|
67
|
+
function sessionExpired(session) {
|
|
68
|
+
const expires = Date.parse(session.expiresAt);
|
|
69
|
+
if (!Number.isFinite(expires))
|
|
70
|
+
return false;
|
|
71
|
+
return expires <= Date.now();
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=control-plane-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane-fetch.js","sourceRoot":"","sources":["../src/control-plane-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { createControlPlane } from '@hs-x/control-plane';
|
|
2
|
+
export type CreateControlPlane = typeof createControlPlane;
|
|
3
|
+
/**
|
|
4
|
+
* The in-process control plane (`@hs-x/control-plane`) is only needed for the
|
|
5
|
+
* `--local-control-plane` contract-testing path. It is a devDependency that
|
|
6
|
+
* ships inside the HS-X monorepo but is NOT part of the published CLI's runtime
|
|
7
|
+
* closure (it would otherwise drag the whole control-plane server — and its
|
|
8
|
+
* private deps — into every `npm i -g hs-x`). So load it lazily and fail with a
|
|
9
|
+
* clear message when it is unavailable.
|
|
10
|
+
*
|
|
11
|
+
* The `import type` above is erased at compile time (verbatimModuleSyntax), so
|
|
12
|
+
* the only reference to `@hs-x/control-plane` in emitted code is the dynamic
|
|
13
|
+
* `import()` below, which runs solely on the `--local-control-plane` path.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadCreateControlPlane(): Promise<CreateControlPlane>;
|
|
16
|
+
//# sourceMappingURL=control-plane-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane-loader.d.ts","sourceRoot":"","sources":["../src/control-plane-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAW1E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The in-process control plane (`@hs-x/control-plane`) is only needed for the
|
|
3
|
+
* `--local-control-plane` contract-testing path. It is a devDependency that
|
|
4
|
+
* ships inside the HS-X monorepo but is NOT part of the published CLI's runtime
|
|
5
|
+
* closure (it would otherwise drag the whole control-plane server — and its
|
|
6
|
+
* private deps — into every `npm i -g hs-x`). So load it lazily and fail with a
|
|
7
|
+
* clear message when it is unavailable.
|
|
8
|
+
*
|
|
9
|
+
* The `import type` above is erased at compile time (verbatimModuleSyntax), so
|
|
10
|
+
* the only reference to `@hs-x/control-plane` in emitted code is the dynamic
|
|
11
|
+
* `import()` below, which runs solely on the `--local-control-plane` path.
|
|
12
|
+
*/
|
|
13
|
+
export async function loadCreateControlPlane() {
|
|
14
|
+
try {
|
|
15
|
+
const mod = await import('@hs-x/control-plane');
|
|
16
|
+
return mod.createControlPlane;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error('Local control-plane mode (--local-control-plane) requires the @hs-x/control-plane ' +
|
|
20
|
+
'package, which ships only in the HS-X monorepo and is not part of the published CLI. ' +
|
|
21
|
+
'Use --control-plane-url to target a hosted control plane instead.');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=control-plane-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane-loader.js","sourceRoot":"","sources":["../src/control-plane-loader.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC,kBAAkB,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,oFAAoF;YAClF,uFAAuF;YACvF,mEAAmE,CACtE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Isolates every call into the externally-pinned HubSpot dev-stack packages so
|
|
3
|
+
* a version bump (or a breaking change in shape) only requires editing this
|
|
4
|
+
* one file.
|
|
5
|
+
*
|
|
6
|
+
* Pins (kept in @hs-x/hubspot-cli package.json):
|
|
7
|
+
* @hubspot/local-dev-lib 5.7.0
|
|
8
|
+
* @hubspot/project-parsing-lib 0.16.0
|
|
9
|
+
* @hubspot/ui-extensions-dev-server 2.0.7
|
|
10
|
+
*/
|
|
11
|
+
export interface ProjectIr {
|
|
12
|
+
readonly intermediateNodesIndexedByUid: Record<string, unknown>;
|
|
13
|
+
readonly profileData: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface PortSnapshot {
|
|
16
|
+
readonly [serverId: string]: number;
|
|
17
|
+
}
|
|
18
|
+
export interface UieDevModeInterface {
|
|
19
|
+
setup(input: unknown): Promise<void>;
|
|
20
|
+
start(input: unknown): Promise<void>;
|
|
21
|
+
cleanup(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export interface DevStack {
|
|
24
|
+
readonly translateForLocalDev: (input: {
|
|
25
|
+
projectSourceDir: string;
|
|
26
|
+
platformVersion: string;
|
|
27
|
+
accountId: number;
|
|
28
|
+
}, profile: Record<string, unknown>) => Promise<ProjectIr>;
|
|
29
|
+
readonly startPortManagerServer: () => Promise<void>;
|
|
30
|
+
readonly stopPortManagerServer: () => Promise<void>;
|
|
31
|
+
readonly getActiveServers: () => Promise<PortSnapshot>;
|
|
32
|
+
readonly requestPorts: unknown;
|
|
33
|
+
readonly getHubSpotApiOrigin: () => string;
|
|
34
|
+
readonly getHubSpotWebsiteOrigin: () => string;
|
|
35
|
+
readonly logger: unknown;
|
|
36
|
+
readonly uie: UieDevModeInterface;
|
|
37
|
+
readonly getAccountConfig: (accountId: number) => unknown;
|
|
38
|
+
}
|
|
39
|
+
export declare function loadDevStack(): Promise<DevStack>;
|
|
40
|
+
//# sourceMappingURL=compat-shim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-shim.d.ts","sourceRoot":"","sources":["../../src/dev/compat-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,KAAK,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC/E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,qBAAqB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,MAAM,CAAC;IAC3C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,MAAM,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3D;AAgBD,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CA4DtD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Isolates every call into the externally-pinned HubSpot dev-stack packages so
|
|
3
|
+
* a version bump (or a breaking change in shape) only requires editing this
|
|
4
|
+
* one file.
|
|
5
|
+
*
|
|
6
|
+
* Pins (kept in @hs-x/hubspot-cli package.json):
|
|
7
|
+
* @hubspot/local-dev-lib 5.7.0
|
|
8
|
+
* @hubspot/project-parsing-lib 0.16.0
|
|
9
|
+
* @hubspot/ui-extensions-dev-server 2.0.7
|
|
10
|
+
*/
|
|
11
|
+
import { HsxHttpClientRaw, HttpClient, HttpClientRequest, HttpClientResponse, } from '@hs-x/types';
|
|
12
|
+
import { Cause, Effect, Exit, Option, Schema } from 'effect';
|
|
13
|
+
const UnknownJsonObject = Schema.Record({ key: Schema.String, value: Schema.Unknown });
|
|
14
|
+
const runDevStackProgram = async (program) => {
|
|
15
|
+
const exit = await Effect.runPromiseExit(program);
|
|
16
|
+
return Exit.match(exit, {
|
|
17
|
+
onSuccess: (value) => value,
|
|
18
|
+
onFailure: (cause) => {
|
|
19
|
+
const failure = Cause.failureOption(cause);
|
|
20
|
+
if (Option.isSome(failure))
|
|
21
|
+
throw failure.value;
|
|
22
|
+
throw new Error(Cause.pretty(cause));
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
export async function loadDevStack() {
|
|
27
|
+
const portManager = await import('@hubspot/local-dev-lib/portManager');
|
|
28
|
+
const config = await import('@hubspot/local-dev-lib/config');
|
|
29
|
+
const urls = await import('@hubspot/local-dev-lib/urls');
|
|
30
|
+
const loggerMod = await import('@hubspot/local-dev-lib/logger');
|
|
31
|
+
const importRuntime = new Function('specifier', 'return import(specifier)');
|
|
32
|
+
const parsing = await importRuntime('@hubspot/project-parsing-lib/translate');
|
|
33
|
+
const uie = await import('@hubspot/ui-extensions-dev-server');
|
|
34
|
+
return {
|
|
35
|
+
translateForLocalDev: parsing.translateForLocalDev,
|
|
36
|
+
startPortManagerServer: portManager.startPortManagerServer,
|
|
37
|
+
stopPortManagerServer: portManager.stopPortManagerServer,
|
|
38
|
+
getActiveServers: async () => {
|
|
39
|
+
const body = await runDevStackProgram(Effect.gen(function* () {
|
|
40
|
+
const client = yield* HttpClient.HttpClient;
|
|
41
|
+
const response = yield* client
|
|
42
|
+
.execute(HttpClientRequest.get(`${portManager.BASE_URL}/servers`))
|
|
43
|
+
.pipe(Effect.scoped, Effect.mapError((error) => new Error(`Port manager request failed while listing active servers: ${error}`)));
|
|
44
|
+
if (response.status < 200 || response.status >= 300) {
|
|
45
|
+
return yield* Effect.fail(new Error(`Port manager returned ${response.status} while listing active servers.`));
|
|
46
|
+
}
|
|
47
|
+
return yield* HttpClientResponse.schemaBodyJson(UnknownJsonObject)(response).pipe(Effect.mapError((error) => new Error(`Port manager returned malformed active server data: ${error}`)));
|
|
48
|
+
}).pipe(Effect.provide(HsxHttpClientRaw)));
|
|
49
|
+
const servers = body.servers;
|
|
50
|
+
if (Array.isArray(servers)) {
|
|
51
|
+
return Object.fromEntries(servers
|
|
52
|
+
.filter((server) => server.id && typeof server.port === 'number')
|
|
53
|
+
.map((server) => [server.id, server.port]));
|
|
54
|
+
}
|
|
55
|
+
return (servers ?? {});
|
|
56
|
+
},
|
|
57
|
+
requestPorts: portManager.requestPorts,
|
|
58
|
+
getHubSpotApiOrigin: () => urls.getHubSpotApiOrigin('prod'),
|
|
59
|
+
getHubSpotWebsiteOrigin: () => urls.getHubSpotWebsiteOrigin('prod'),
|
|
60
|
+
logger: loggerMod.logger,
|
|
61
|
+
uie: uie.DevModeUnifiedInterface,
|
|
62
|
+
getAccountConfig: config.getAccountConfig,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=compat-shim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat-shim.js","sourceRoot":"","sources":["../../src/dev/compat-shim.ts"],"names":[],"mappings":"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"}
|