@hs-x/cli 0.3.6 → 0.4.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 +126 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +58 -59
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/kit.d.ts.map +1 -1
- package/dist/cli/kit.js +1 -1
- package/dist/cli/kit.js.map +1 -1
- package/dist/cloudflare-auth.d.ts +19 -0
- package/dist/cloudflare-auth.d.ts.map +1 -1
- package/dist/cloudflare-auth.js +83 -2
- package/dist/cloudflare-auth.js.map +1 -1
- package/dist/cloudflare-oauth.d.ts.map +1 -1
- package/dist/cloudflare-oauth.js +18 -19
- package/dist/cloudflare-oauth.js.map +1 -1
- package/dist/cloudflare-scoped-resource.d.ts +41 -0
- package/dist/cloudflare-scoped-resource.d.ts.map +1 -0
- package/dist/cloudflare-scoped-resource.js +74 -0
- package/dist/cloudflare-scoped-resource.js.map +1 -0
- package/dist/command-catalog.d.ts +13 -0
- package/dist/command-catalog.d.ts.map +1 -0
- package/dist/command-catalog.js +50 -0
- package/dist/command-catalog.js.map +1 -0
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +287 -47
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +274 -38
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/control-plane-read.d.ts +31 -3
- package/dist/commands/control-plane-read.d.ts.map +1 -1
- package/dist/commands/control-plane-read.js +136 -37
- package/dist/commands/control-plane-read.js.map +1 -1
- package/dist/commands/deploy-retry.d.ts +20 -0
- package/dist/commands/deploy-retry.d.ts.map +1 -0
- package/dist/commands/deploy-retry.js +106 -0
- package/dist/commands/deploy-retry.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -8
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +1027 -373
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +19 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +1378 -88
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +27 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/flags.d.ts +9 -4
- package/dist/commands/flags.d.ts.map +1 -1
- package/dist/commands/flags.js +208 -80
- package/dist/commands/flags.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +177 -86
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +74 -15
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/project.d.ts +107 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +586 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/secrets.d.ts +2 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +15 -5
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/validate.d.ts +19 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +26 -7
- package/dist/commands/validate.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/control-plane-tenant-provisioning.d.ts +24 -0
- package/dist/control-plane-tenant-provisioning.d.ts.map +1 -0
- package/dist/control-plane-tenant-provisioning.js +85 -0
- package/dist/control-plane-tenant-provisioning.js.map +1 -0
- package/dist/deploy-targets.d.ts +24 -0
- package/dist/deploy-targets.d.ts.map +1 -0
- package/dist/deploy-targets.js +38 -0
- package/dist/deploy-targets.js.map +1 -0
- package/dist/dev/account-selection.d.ts +16 -0
- package/dist/dev/account-selection.d.ts.map +1 -0
- package/dist/dev/account-selection.js +22 -0
- package/dist/dev/account-selection.js.map +1 -0
- package/dist/dev/browser-log-bridge.d.ts +32 -0
- package/dist/dev/browser-log-bridge.d.ts.map +1 -0
- package/dist/dev/browser-log-bridge.js +156 -0
- package/dist/dev/browser-log-bridge.js.map +1 -0
- package/dist/dev/compat-shim.d.ts +3 -3
- package/dist/dev/compat-shim.d.ts.map +1 -1
- package/dist/dev/compat-shim.js +29 -4
- package/dist/dev/compat-shim.js.map +1 -1
- package/dist/dev/component-selection.d.ts +25 -0
- package/dist/dev/component-selection.d.ts.map +1 -0
- package/dist/dev/component-selection.js +79 -0
- package/dist/dev/component-selection.js.map +1 -0
- package/dist/dev/console-capture.d.ts +18 -0
- package/dist/dev/console-capture.d.ts.map +1 -0
- package/dist/dev/console-capture.js +57 -0
- package/dist/dev/console-capture.js.map +1 -0
- package/dist/dev/event-bus.d.ts +1 -1
- package/dist/dev/event-bus.js +1 -1
- package/dist/dev/frontend-log-relay.d.ts +27 -0
- package/dist/dev/frontend-log-relay.d.ts.map +1 -0
- package/dist/dev/frontend-log-relay.js +102 -0
- package/dist/dev/frontend-log-relay.js.map +1 -0
- package/dist/dev/invoke.d.ts +3 -4
- package/dist/dev/invoke.d.ts.map +1 -1
- package/dist/dev/invoke.js +9 -4
- package/dist/dev/invoke.js.map +1 -1
- package/dist/dev/keyboard.d.ts +1 -0
- package/dist/dev/keyboard.d.ts.map +1 -1
- package/dist/dev/keyboard.js +9 -3
- package/dist/dev/keyboard.js.map +1 -1
- package/dist/dev/log-server.js +3 -0
- package/dist/dev/log-server.js.map +1 -1
- package/dist/dev/loopback-http-listener.d.ts +18 -0
- package/dist/dev/loopback-http-listener.d.ts.map +1 -0
- package/dist/dev/loopback-http-listener.js +91 -0
- package/dist/dev/loopback-http-listener.js.map +1 -0
- package/dist/dev/managed-session.d.ts +124 -0
- package/dist/dev/managed-session.d.ts.map +1 -0
- package/dist/dev/managed-session.js +597 -0
- package/dist/dev/managed-session.js.map +1 -0
- package/dist/dev/port-process.d.ts +21 -0
- package/dist/dev/port-process.d.ts.map +1 -0
- package/dist/dev/port-process.js +145 -0
- package/dist/dev/port-process.js.map +1 -0
- package/dist/dev/session-manager.d.ts +11 -1
- package/dist/dev/session-manager.d.ts.map +1 -1
- package/dist/dev/session-manager.js +65 -14
- package/dist/dev/session-manager.js.map +1 -1
- package/dist/dev/stream-event-format.d.ts +14 -0
- package/dist/dev/stream-event-format.d.ts.map +1 -0
- package/dist/dev/stream-event-format.js +262 -0
- package/dist/dev/stream-event-format.js.map +1 -0
- package/dist/dev/stream-filter.d.ts.map +1 -1
- package/dist/dev/stream-filter.js +16 -1
- package/dist/dev/stream-filter.js.map +1 -1
- package/dist/dev/stream-renderer.d.ts +4 -2
- package/dist/dev/stream-renderer.d.ts.map +1 -1
- package/dist/dev/stream-renderer.js +224 -84
- package/dist/dev/stream-renderer.js.map +1 -1
- package/dist/errors-registry.d.ts.map +1 -1
- package/dist/errors-registry.js +246 -0
- package/dist/errors-registry.js.map +1 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +20 -3
- package/dist/help.js.map +1 -1
- package/dist/hubspot-app-logs.d.ts +38 -5
- package/dist/hubspot-app-logs.d.ts.map +1 -1
- package/dist/hubspot-app-logs.js +88 -17
- package/dist/hubspot-app-logs.js.map +1 -1
- package/dist/hubspot-auth.d.ts +19 -1
- package/dist/hubspot-auth.d.ts.map +1 -1
- package/dist/hubspot-auth.js +228 -83
- package/dist/hubspot-auth.js.map +1 -1
- package/dist/hubspot-developer-client.d.ts +87 -0
- package/dist/hubspot-developer-client.d.ts.map +1 -1
- package/dist/hubspot-developer-client.js +232 -1
- package/dist/hubspot-developer-client.js.map +1 -1
- package/dist/hubspot-project-archive.d.ts +21 -0
- package/dist/hubspot-project-archive.d.ts.map +1 -0
- package/dist/hubspot-project-archive.js +281 -0
- package/dist/hubspot-project-archive.js.map +1 -0
- package/dist/hubspot-project.d.ts +32 -0
- package/dist/hubspot-project.d.ts.map +1 -0
- package/dist/hubspot-project.js +269 -0
- package/dist/hubspot-project.js.map +1 -0
- package/dist/local-project-picker.js +1 -1
- package/dist/local-project-picker.js.map +1 -1
- package/dist/machine-artifact.d.ts +16 -0
- package/dist/machine-artifact.d.ts.map +1 -0
- package/dist/machine-artifact.js +18 -0
- package/dist/machine-artifact.js.map +1 -0
- package/dist/machine-id.d.ts +15 -0
- package/dist/machine-id.d.ts.map +1 -1
- package/dist/machine-id.js +53 -0
- package/dist/machine-id.js.map +1 -1
- package/dist/mutation-consent.d.ts +20 -0
- package/dist/mutation-consent.d.ts.map +1 -0
- package/dist/mutation-consent.js +9 -0
- package/dist/mutation-consent.js.map +1 -0
- package/dist/output-context.d.ts +3 -0
- package/dist/output-context.d.ts.map +1 -1
- package/dist/output-context.js +7 -1
- package/dist/output-context.js.map +1 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +123 -48
- package/dist/prompt.js.map +1 -1
- package/dist/reporter/index.js +1 -1
- package/dist/reporter/index.js.map +1 -1
- package/dist/reporter/style.d.ts.map +1 -1
- package/dist/reporter/style.js +5 -0
- package/dist/reporter/style.js.map +1 -1
- package/dist/services/hubspot-dev-client.js +3 -0
- package/dist/services/hubspot-dev-client.js.map +1 -1
- package/dist/services/telemetry.d.ts +1 -2
- package/dist/services/telemetry.d.ts.map +1 -1
- package/dist/services/telemetry.js +1 -10
- package/dist/services/telemetry.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +1 -7
- package/dist/telemetry.js.map +1 -1
- package/dist/tenant-data-plane-provisioning.d.ts +35 -0
- package/dist/tenant-data-plane-provisioning.d.ts.map +1 -0
- package/dist/tenant-data-plane-provisioning.js +38 -0
- package/dist/tenant-data-plane-provisioning.js.map +1 -0
- package/package.json +14 -12
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
import { cp, lstat, mkdtemp, open, readFile, readdir, rm, writeFile, } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { isAbsolute, join, relative, resolve } from 'node:path';
|
|
6
|
+
import { Zip, ZipDeflate, ZipPassThrough } from 'fflate';
|
|
7
|
+
/** A local source-tree violation that must fail before any HubSpot mutation. */
|
|
8
|
+
export class HubSpotProjectArchiveSourceError extends Error {
|
|
9
|
+
reason;
|
|
10
|
+
hint;
|
|
11
|
+
relativePath;
|
|
12
|
+
name = 'HubSpotProjectArchiveSourceError';
|
|
13
|
+
code = 'HSX_E_INPUT_INVALID';
|
|
14
|
+
constructor(reason, message, hint, relativePath) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.reason = reason;
|
|
17
|
+
this.hint = hint;
|
|
18
|
+
this.relativePath = relativePath;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function writeLocalHubSpotProjectArchive(root, projectName, options = { sourceOnly: false }) {
|
|
22
|
+
// Scan the full copied tree even for source-only uploads: staging copies
|
|
23
|
+
// hsproject.json before patching the project name, so a link anywhere in the
|
|
24
|
+
// copied input must be rejected before cp/writeFile can follow it.
|
|
25
|
+
const fullSourceFingerprint = await fingerprintHubSpotArchiveSource(root, false);
|
|
26
|
+
const sourceFingerprint = options.sourceOnly
|
|
27
|
+
? await fingerprintHubSpotArchiveSource(root, true)
|
|
28
|
+
: fullSourceFingerprint;
|
|
29
|
+
if (options.expectedSourceFingerprint &&
|
|
30
|
+
sourceFingerprint !== options.expectedSourceFingerprint) {
|
|
31
|
+
throw sourceChangedError();
|
|
32
|
+
}
|
|
33
|
+
const outDir = await mkdtemp(join(tmpdir(), 'hs-x-hubspot-project-'));
|
|
34
|
+
const archivePath = join(outDir, `${projectName.replace(/[^a-zA-Z0-9._-]+/g, '-')}-hubspot-project.zip`);
|
|
35
|
+
const stageDir = join(outDir, 'project');
|
|
36
|
+
try {
|
|
37
|
+
await cp(root, stageDir, {
|
|
38
|
+
recursive: true,
|
|
39
|
+
dereference: false,
|
|
40
|
+
verbatimSymlinks: true,
|
|
41
|
+
filter(source) {
|
|
42
|
+
return !isExcludedHubSpotArchivePath(root, source);
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
// Bind the private staged copy to the complete source snapshot. A regular
|
|
46
|
+
// file edit or a file-to-link swap during cp changes this fingerprint; a
|
|
47
|
+
// copied link throws before patching or zip can touch its target.
|
|
48
|
+
const stagedFullFingerprint = await fingerprintHubSpotArchiveSource(stageDir, false);
|
|
49
|
+
if (stagedFullFingerprint !== fullSourceFingerprint) {
|
|
50
|
+
throw sourceChangedError();
|
|
51
|
+
}
|
|
52
|
+
await patchHubSpotProjectName(stageDir, projectName);
|
|
53
|
+
const archiveRoot = options.sourceOnly ? await hubSpotProjectSourceRoot(stageDir) : stageDir;
|
|
54
|
+
const stagedArchiveFingerprint = await fingerprintHubSpotArchiveSource(stageDir, options.sourceOnly);
|
|
55
|
+
await writeZipArchive(archiveRoot, archivePath);
|
|
56
|
+
if ((await fingerprintHubSpotArchiveSource(stageDir, options.sourceOnly)) !==
|
|
57
|
+
stagedArchiveFingerprint) {
|
|
58
|
+
throw sourceChangedError();
|
|
59
|
+
}
|
|
60
|
+
return archivePath;
|
|
61
|
+
}
|
|
62
|
+
catch (cause) {
|
|
63
|
+
await rm(outDir, { recursive: true, force: true });
|
|
64
|
+
throw cause;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function fingerprintHubSpotArchiveSource(projectRoot, sourceOnly) {
|
|
68
|
+
const projectRootMetadata = await lstat(projectRoot);
|
|
69
|
+
if (projectRootMetadata.isSymbolicLink()) {
|
|
70
|
+
throw symbolicLinkError(projectRoot, projectRoot);
|
|
71
|
+
}
|
|
72
|
+
if (!projectRootMetadata.isDirectory()) {
|
|
73
|
+
throw unsupportedEntryError(projectRoot, projectRoot);
|
|
74
|
+
}
|
|
75
|
+
const archiveRoot = sourceOnly ? await hubSpotProjectSourceRoot(projectRoot) : projectRoot;
|
|
76
|
+
const hash = createHash('sha256');
|
|
77
|
+
async function visit(directory) {
|
|
78
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
79
|
+
entries.sort((left, right) => compareArchiveNames(left.name, right.name));
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
const path = join(directory, entry.name);
|
|
82
|
+
if (isExcludedHubSpotArchivePath(projectRoot, path))
|
|
83
|
+
continue;
|
|
84
|
+
const archivePath = relative(archiveRoot, path).replaceAll('\\', '/');
|
|
85
|
+
if (entry.isDirectory()) {
|
|
86
|
+
hash.update(`directory\0${archivePath}\0`);
|
|
87
|
+
await visit(path);
|
|
88
|
+
}
|
|
89
|
+
else if (entry.isSymbolicLink()) {
|
|
90
|
+
throw symbolicLinkError(projectRoot, path);
|
|
91
|
+
}
|
|
92
|
+
else if (entry.isFile()) {
|
|
93
|
+
hash.update(`file\0${archivePath}\0`);
|
|
94
|
+
hash.update(await readFile(path));
|
|
95
|
+
hash.update('\0');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw unsupportedEntryError(projectRoot, path);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
await visit(archiveRoot);
|
|
103
|
+
return `sha256:${hash.digest('hex')}`;
|
|
104
|
+
}
|
|
105
|
+
async function hubSpotProjectSourceRoot(root) {
|
|
106
|
+
const config = await readHubSpotProjectConfig(root);
|
|
107
|
+
const srcDir = typeof config.srcDir === 'string' ? config.srcDir : 'src';
|
|
108
|
+
const projectRoot = resolve(root);
|
|
109
|
+
const sourceRoot = resolve(projectRoot, srcDir);
|
|
110
|
+
const sourceRelativePath = relative(projectRoot, sourceRoot);
|
|
111
|
+
if (sourceRelativePath === '..' ||
|
|
112
|
+
sourceRelativePath.startsWith('../') ||
|
|
113
|
+
sourceRelativePath.startsWith('..\\') ||
|
|
114
|
+
isAbsolute(sourceRelativePath)) {
|
|
115
|
+
throw new HubSpotProjectArchiveSourceError('outside-project', 'HubSpot project srcDir must stay inside the project root.', 'Move the source directory inside the project and update hsproject.json, then review a fresh deploy plan.');
|
|
116
|
+
}
|
|
117
|
+
return sourceRoot;
|
|
118
|
+
}
|
|
119
|
+
async function patchHubSpotProjectName(root, projectName) {
|
|
120
|
+
const path = join(root, 'hsproject.json');
|
|
121
|
+
const raw = await readFile(path, 'utf8').catch(() => undefined);
|
|
122
|
+
if (!raw)
|
|
123
|
+
return;
|
|
124
|
+
const parsed = JSON.parse(raw);
|
|
125
|
+
if (!isRecord(parsed))
|
|
126
|
+
return;
|
|
127
|
+
await writeFile(path, `${JSON.stringify({ ...parsed, name: projectName }, null, 2)}\n`);
|
|
128
|
+
}
|
|
129
|
+
async function readHubSpotProjectConfig(root) {
|
|
130
|
+
const raw = await readFile(join(root, 'hsproject.json'), 'utf8').catch(() => '{}');
|
|
131
|
+
const parsed = JSON.parse(raw);
|
|
132
|
+
return isRecord(parsed) ? parsed : {};
|
|
133
|
+
}
|
|
134
|
+
function isExcludedHubSpotArchivePath(projectRoot, path) {
|
|
135
|
+
const projectRelativePath = relative(projectRoot, path);
|
|
136
|
+
const segments = projectRelativePath.split(/[\\/]/);
|
|
137
|
+
return segments.includes('node_modules') || segments.includes('.hs-x');
|
|
138
|
+
}
|
|
139
|
+
// ZIP stores timestamps in local DOS time. A local constructor keeps the
|
|
140
|
+
// encoded date at the ZIP epoch in every timezone and makes repeated archives
|
|
141
|
+
// byte-for-byte reproducible.
|
|
142
|
+
const DETERMINISTIC_ZIP_MTIME = new Date(1980, 0, 1, 0, 0, 0, 0);
|
|
143
|
+
const DETERMINISTIC_FILE_ATTRIBUTES = 0o644 << 16;
|
|
144
|
+
const DETERMINISTIC_DIRECTORY_ATTRIBUTES = (0o755 << 16) | 0x10;
|
|
145
|
+
async function writeZipArchive(root, archivePath) {
|
|
146
|
+
const entries = await collectHubSpotArchiveEntries(root);
|
|
147
|
+
const output = await open(archivePath, 'wx');
|
|
148
|
+
let pendingWrite = Promise.resolve();
|
|
149
|
+
let zipError;
|
|
150
|
+
const zip = new Zip((error, chunk) => {
|
|
151
|
+
if (error) {
|
|
152
|
+
zipError ??= error;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
pendingWrite = pendingWrite.then(() => writeAll(output, chunk));
|
|
156
|
+
});
|
|
157
|
+
async function flushOutput() {
|
|
158
|
+
await pendingWrite;
|
|
159
|
+
if (zipError)
|
|
160
|
+
throw zipError;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
for (const entry of entries) {
|
|
164
|
+
if (entry.kind === 'directory') {
|
|
165
|
+
const directory = new ZipPassThrough(`${entry.archivePath}/`);
|
|
166
|
+
directory.mtime = DETERMINISTIC_ZIP_MTIME;
|
|
167
|
+
directory.os = 3;
|
|
168
|
+
directory.attrs = DETERMINISTIC_DIRECTORY_ATTRIBUTES;
|
|
169
|
+
zip.add(directory);
|
|
170
|
+
directory.push(new Uint8Array(), true);
|
|
171
|
+
await flushOutput();
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const file = new ZipDeflate(entry.archivePath, { level: 6 });
|
|
175
|
+
file.mtime = DETERMINISTIC_ZIP_MTIME;
|
|
176
|
+
file.os = 3;
|
|
177
|
+
file.attrs = DETERMINISTIC_FILE_ATTRIBUTES;
|
|
178
|
+
zip.add(file);
|
|
179
|
+
for await (const chunk of createReadStream(entry.absolutePath)) {
|
|
180
|
+
file.push(chunk);
|
|
181
|
+
await flushOutput();
|
|
182
|
+
}
|
|
183
|
+
file.push(new Uint8Array(), true);
|
|
184
|
+
await flushOutput();
|
|
185
|
+
}
|
|
186
|
+
zip.end();
|
|
187
|
+
await flushOutput();
|
|
188
|
+
}
|
|
189
|
+
catch (cause) {
|
|
190
|
+
zip.terminate();
|
|
191
|
+
if (cause instanceof HubSpotProjectArchiveSourceError)
|
|
192
|
+
throw cause;
|
|
193
|
+
throw new Error('Unable to create HubSpot project zip archive.', { cause });
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
await output.close();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function collectHubSpotArchiveEntries(root) {
|
|
200
|
+
const rootMetadata = await lstat(root);
|
|
201
|
+
if (rootMetadata.isSymbolicLink())
|
|
202
|
+
throw symbolicLinkError(root, root);
|
|
203
|
+
if (!rootMetadata.isDirectory())
|
|
204
|
+
throw unsupportedEntryError(root, root);
|
|
205
|
+
const entries = [];
|
|
206
|
+
async function visit(directory) {
|
|
207
|
+
const names = await readdir(directory);
|
|
208
|
+
names.sort(compareArchiveNames);
|
|
209
|
+
for (const name of names) {
|
|
210
|
+
const absolutePath = join(directory, name);
|
|
211
|
+
if (isExcludedHubSpotArchivePath(root, absolutePath))
|
|
212
|
+
continue;
|
|
213
|
+
const metadata = await lstat(absolutePath);
|
|
214
|
+
const archivePath = relative(root, absolutePath).replaceAll('\\', '/');
|
|
215
|
+
if (metadata.isSymbolicLink()) {
|
|
216
|
+
throw symbolicLinkError(root, absolutePath);
|
|
217
|
+
}
|
|
218
|
+
if (metadata.isDirectory()) {
|
|
219
|
+
entries.push({ kind: 'directory', absolutePath, archivePath });
|
|
220
|
+
await visit(absolutePath);
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (metadata.isFile()) {
|
|
224
|
+
entries.push({ kind: 'file', absolutePath, archivePath });
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
throw unsupportedEntryError(root, absolutePath);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
await visit(root);
|
|
231
|
+
return entries;
|
|
232
|
+
}
|
|
233
|
+
function compareArchiveNames(left, right) {
|
|
234
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
235
|
+
}
|
|
236
|
+
async function writeAll(output, chunk) {
|
|
237
|
+
let offset = 0;
|
|
238
|
+
while (offset < chunk.byteLength) {
|
|
239
|
+
const { bytesWritten } = await output.write(chunk, offset, chunk.byteLength - offset, null);
|
|
240
|
+
if (bytesWritten === 0)
|
|
241
|
+
throw new Error('Archive output stopped accepting bytes.');
|
|
242
|
+
offset += bytesWritten;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function symbolicLinkError(projectRoot, path) {
|
|
246
|
+
const relativePath = safeProjectRelativePath(projectRoot, path);
|
|
247
|
+
return new HubSpotProjectArchiveSourceError('symbolic-link', `HubSpot deploy sources cannot contain symbolic links: ${relativePath}.`, 'Replace the link with a regular file or directory whose bytes live inside the project, then review a fresh deploy plan.', relativePath);
|
|
248
|
+
}
|
|
249
|
+
function sourceChangedError() {
|
|
250
|
+
return new HubSpotProjectArchiveSourceError('source-changed', 'HubSpot project sources changed after the deploy preview.', 'Wait for local edits or generators to settle, then review a fresh plan before consenting.');
|
|
251
|
+
}
|
|
252
|
+
function unsupportedEntryError(projectRoot, path) {
|
|
253
|
+
const relativePath = safeProjectRelativePath(projectRoot, path);
|
|
254
|
+
return new HubSpotProjectArchiveSourceError('unsupported-entry', `HubSpot deploy sources must contain only regular files and directories: ${relativePath}.`, 'Remove the FIFO, socket, or device entry, replace it with a regular file if needed, then review a fresh deploy plan.', relativePath);
|
|
255
|
+
}
|
|
256
|
+
const MAX_DIAGNOSTIC_PATH_LENGTH = 240;
|
|
257
|
+
function safeProjectRelativePath(projectRoot, path) {
|
|
258
|
+
const relativePath = relative(resolve(projectRoot), resolve(path));
|
|
259
|
+
if (relativePath === '..' ||
|
|
260
|
+
relativePath.startsWith('../') ||
|
|
261
|
+
relativePath.startsWith('..\\') ||
|
|
262
|
+
isAbsolute(relativePath)) {
|
|
263
|
+
return '<outside project root>';
|
|
264
|
+
}
|
|
265
|
+
const normalized = (relativePath || '.').replaceAll('\\', '/');
|
|
266
|
+
const escaped = Array.from(normalized, (character) => {
|
|
267
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
268
|
+
return codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)
|
|
269
|
+
? `\\x${codePoint.toString(16).padStart(2, '0')}`
|
|
270
|
+
: character;
|
|
271
|
+
}).join('');
|
|
272
|
+
if (escaped.length <= MAX_DIAGNOSTIC_PATH_LENGTH)
|
|
273
|
+
return escaped;
|
|
274
|
+
const tailLength = 80;
|
|
275
|
+
const headLength = MAX_DIAGNOSTIC_PATH_LENGTH - tailLength - 1;
|
|
276
|
+
return `${escaped.slice(0, headLength)}…${escaped.slice(-tailLength)}`;
|
|
277
|
+
}
|
|
278
|
+
function isRecord(value) {
|
|
279
|
+
return typeof value === 'object' && value !== null;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=hubspot-project-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubspot-project-archive.js","sourceRoot":"","sources":["../src/hubspot-project-archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ValidationResult } from '@hs-x/validator';
|
|
2
|
+
export type LocalProjectMode = 'hs-x' | 'hubspot-direct' | 'none';
|
|
3
|
+
export interface HubSpotProjectDescriptor {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly platformVersion: string;
|
|
6
|
+
readonly srcDir: string;
|
|
7
|
+
readonly appUid?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* HS-X projects commonly contain both markers because codegen emits the
|
|
11
|
+
* HubSpot bundle beside `hsx.config.ts`. The HS-X marker therefore wins; an
|
|
12
|
+
* `hsproject.json` without it is a permanent HubSpot-direct project and must
|
|
13
|
+
* never be routed through the control plane implicitly.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectLocalProjectMode(root: string): Promise<LocalProjectMode>;
|
|
16
|
+
export declare function readHubSpotProjectDescriptor(root: string): Promise<HubSpotProjectDescriptor>;
|
|
17
|
+
/**
|
|
18
|
+
* Validate a native HubSpot project with HubSpot's own project parser. This is
|
|
19
|
+
* deliberately separate from `@hs-x/validator`: direct projects do not need
|
|
20
|
+
* `hsx.config.ts`, HS-X capabilities, Cloudflare, or an HS-X account.
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateHubSpotProject(input: {
|
|
23
|
+
readonly root: string;
|
|
24
|
+
readonly profile?: string;
|
|
25
|
+
}): Promise<ValidationResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Convert a third-party parser failure into a bounded diagnostic. Never call
|
|
28
|
+
* `toString()` on the failure: HubSpot errors can render nested request and
|
|
29
|
+
* credential context there even when their message is harmless.
|
|
30
|
+
*/
|
|
31
|
+
export declare function describeHubSpotValidationError(cause: unknown): string;
|
|
32
|
+
//# sourceMappingURL=hubspot-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubspot-project.d.ts","sourceRoot":"","sources":["../src/hubspot-project.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAWD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQpF;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,CAAC,CAwBnC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2D5B;AAyCD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA0BrE"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { access, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
async function fileExists(path) {
|
|
4
|
+
try {
|
|
5
|
+
await access(path);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* HS-X projects commonly contain both markers because codegen emits the
|
|
14
|
+
* HubSpot bundle beside `hsx.config.ts`. The HS-X marker therefore wins; an
|
|
15
|
+
* `hsproject.json` without it is a permanent HubSpot-direct project and must
|
|
16
|
+
* never be routed through the control plane implicitly.
|
|
17
|
+
*/
|
|
18
|
+
export async function detectLocalProjectMode(root) {
|
|
19
|
+
const [hasHsxConfig, hasHubSpotProject] = await Promise.all([
|
|
20
|
+
fileExists(join(root, 'hsx.config.ts')),
|
|
21
|
+
fileExists(join(root, 'hsproject.json')),
|
|
22
|
+
]);
|
|
23
|
+
if (hasHsxConfig)
|
|
24
|
+
return 'hs-x';
|
|
25
|
+
if (hasHubSpotProject)
|
|
26
|
+
return 'hubspot-direct';
|
|
27
|
+
return 'none';
|
|
28
|
+
}
|
|
29
|
+
export async function readHubSpotProjectDescriptor(root) {
|
|
30
|
+
const projectPath = join(root, 'hsproject.json');
|
|
31
|
+
let parsed;
|
|
32
|
+
try {
|
|
33
|
+
parsed = JSON.parse(await readFile(projectPath, 'utf8'));
|
|
34
|
+
}
|
|
35
|
+
catch (cause) {
|
|
36
|
+
throw new Error(`Could not read ${projectPath}: ${describeHubSpotValidationError(cause)}`);
|
|
37
|
+
}
|
|
38
|
+
if (!isRecord(parsed)) {
|
|
39
|
+
throw new Error('hsproject.json must contain a JSON object.');
|
|
40
|
+
}
|
|
41
|
+
const name = nonEmptyString(parsed.name);
|
|
42
|
+
const platformVersion = nonEmptyString(parsed.platformVersion);
|
|
43
|
+
const srcDir = nonEmptyString(parsed.srcDir) ?? 'src';
|
|
44
|
+
if (!name)
|
|
45
|
+
throw new Error('hsproject.json is missing a non-empty `name`.');
|
|
46
|
+
if (!platformVersion) {
|
|
47
|
+
throw new Error('hsproject.json is missing a non-empty `platformVersion`.');
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
name,
|
|
51
|
+
platformVersion,
|
|
52
|
+
srcDir,
|
|
53
|
+
...(await readAppUid(root, srcDir)),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate a native HubSpot project with HubSpot's own project parser. This is
|
|
58
|
+
* deliberately separate from `@hs-x/validator`: direct projects do not need
|
|
59
|
+
* `hsx.config.ts`, HS-X capabilities, Cloudflare, or an HS-X account.
|
|
60
|
+
*/
|
|
61
|
+
export async function validateHubSpotProject(input) {
|
|
62
|
+
const diagnostics = [];
|
|
63
|
+
let descriptor;
|
|
64
|
+
try {
|
|
65
|
+
descriptor = await readHubSpotProjectDescriptor(input.root);
|
|
66
|
+
}
|
|
67
|
+
catch (cause) {
|
|
68
|
+
diagnostics.push({
|
|
69
|
+
code: 'hubspot.project.invalid',
|
|
70
|
+
severity: 'error',
|
|
71
|
+
message: describeHubSpotValidationError(cause),
|
|
72
|
+
file: 'hsproject.json',
|
|
73
|
+
});
|
|
74
|
+
return validationResult(input.root, diagnostics, 1);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const [{ translate }, { getProjectMetadata }] = await Promise.all([
|
|
78
|
+
import('@hubspot/project-parsing-lib/translate'),
|
|
79
|
+
import('@hubspot/project-parsing-lib/projects'),
|
|
80
|
+
]);
|
|
81
|
+
const sourceDir = join(input.root, descriptor.srcDir);
|
|
82
|
+
const [translated, metadata] = await Promise.all([
|
|
83
|
+
translate({
|
|
84
|
+
projectSourceDir: sourceDir,
|
|
85
|
+
platformVersion: descriptor.platformVersion,
|
|
86
|
+
}, {
|
|
87
|
+
// Validation is intentionally local-only. Account credentials are
|
|
88
|
+
// resolved only by explicit live commands such as deploy/dev.
|
|
89
|
+
skipValidation: true,
|
|
90
|
+
...(input.profile ? { profile: input.profile } : {}),
|
|
91
|
+
}),
|
|
92
|
+
getProjectMetadata(sourceDir),
|
|
93
|
+
]);
|
|
94
|
+
for (const file of translated.skippedHsMetaFiles) {
|
|
95
|
+
diagnostics.push({
|
|
96
|
+
code: 'hubspot.component.skipped',
|
|
97
|
+
severity: 'warning',
|
|
98
|
+
message: 'HubSpot skipped this component while translating the project.',
|
|
99
|
+
file,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
diagnostics.push({
|
|
103
|
+
code: 'hubspot.schema.deferred',
|
|
104
|
+
severity: 'warning',
|
|
105
|
+
message: 'Local structure parsed successfully; account-scoped component schemas were not checked.',
|
|
106
|
+
});
|
|
107
|
+
return validationResult(input.root, diagnostics, metadata.hsMetaFiles.length + 1);
|
|
108
|
+
}
|
|
109
|
+
catch (cause) {
|
|
110
|
+
diagnostics.push({
|
|
111
|
+
code: 'hubspot.project.invalid',
|
|
112
|
+
severity: 'error',
|
|
113
|
+
message: describeHubSpotValidationError(cause),
|
|
114
|
+
});
|
|
115
|
+
return validationResult(input.root, diagnostics, 1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function validationResult(root, diagnostics, filesChecked) {
|
|
119
|
+
return {
|
|
120
|
+
ok: diagnostics.every((diagnostic) => diagnostic.severity !== 'error'),
|
|
121
|
+
root,
|
|
122
|
+
diagnostics,
|
|
123
|
+
filesChecked,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function readAppUid(root, srcDir) {
|
|
127
|
+
const candidates = [
|
|
128
|
+
join(root, srcDir, 'app', 'app-hsmeta.json'),
|
|
129
|
+
join(root, srcDir, 'app-hsmeta.json'),
|
|
130
|
+
];
|
|
131
|
+
for (const path of candidates) {
|
|
132
|
+
try {
|
|
133
|
+
const parsed = JSON.parse(await readFile(path, 'utf8'));
|
|
134
|
+
if (isRecord(parsed)) {
|
|
135
|
+
const appUid = nonEmptyString(parsed.uid);
|
|
136
|
+
if (appUid)
|
|
137
|
+
return { appUid };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// The HubSpot translator reports malformed component metadata during
|
|
142
|
+
// validation. Descriptor reads stay tolerant so logs/status can still
|
|
143
|
+
// explain the project-level problem.
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return {};
|
|
147
|
+
}
|
|
148
|
+
const HUBSPOT_VALIDATION_ERROR_FALLBACK = 'HubSpot project validation failed.';
|
|
149
|
+
const SENSITIVE_VALIDATION_CONTEXT = /(?:derivedContext|encodedOAuthRefreshToken|oauthRefreshToken|refreshToken|accessToken|personalAccessKey|developerApiKey|apiKey|clientSecret|password|authorization|\bbearer\b)/iu;
|
|
150
|
+
const KNOWN_VALIDATION_TOKEN = /\bpat-[a-z0-9][a-z0-9._-]{5,}\b/giu;
|
|
151
|
+
/**
|
|
152
|
+
* Convert a third-party parser failure into a bounded diagnostic. Never call
|
|
153
|
+
* `toString()` on the failure: HubSpot errors can render nested request and
|
|
154
|
+
* credential context there even when their message is harmless.
|
|
155
|
+
*/
|
|
156
|
+
export function describeHubSpotValidationError(cause) {
|
|
157
|
+
const rawMessage = cause instanceof Error
|
|
158
|
+
? cause.message
|
|
159
|
+
: isRecord(cause) && typeof cause.message === 'string'
|
|
160
|
+
? cause.message
|
|
161
|
+
: typeof cause === 'string'
|
|
162
|
+
? cause
|
|
163
|
+
: undefined;
|
|
164
|
+
const message = rawMessage
|
|
165
|
+
?.split(/\r?\n/u)
|
|
166
|
+
.map((line) => line.trim())
|
|
167
|
+
.find((line) => line.length > 0);
|
|
168
|
+
if (!message) {
|
|
169
|
+
return HUBSPOT_VALIDATION_ERROR_FALLBACK;
|
|
170
|
+
}
|
|
171
|
+
const terminalSafeMessage = stripTerminalEscapeSequences(message)
|
|
172
|
+
.split('')
|
|
173
|
+
.map((character) => (isTerminalControlCharacter(character) ? ' ' : character))
|
|
174
|
+
.join('')
|
|
175
|
+
.replace(/\s+/gu, ' ')
|
|
176
|
+
.trim();
|
|
177
|
+
if (!terminalSafeMessage || SENSITIVE_VALIDATION_CONTEXT.test(terminalSafeMessage)) {
|
|
178
|
+
return HUBSPOT_VALIDATION_ERROR_FALLBACK;
|
|
179
|
+
}
|
|
180
|
+
return terminalSafeMessage.replace(KNOWN_VALIDATION_TOKEN, '[REDACTED]').slice(0, 500);
|
|
181
|
+
}
|
|
182
|
+
function isTerminalControlCharacter(character) {
|
|
183
|
+
const code = character.charCodeAt(0);
|
|
184
|
+
return code <= 0x1f || (code >= 0x7f && code <= 0x9f);
|
|
185
|
+
}
|
|
186
|
+
const MAX_VALIDATION_ERROR_SCAN_LENGTH = 2_000;
|
|
187
|
+
const ESCAPE = 0x1b;
|
|
188
|
+
const BELL = 0x07;
|
|
189
|
+
const STRING_TERMINATOR = 0x9c;
|
|
190
|
+
/**
|
|
191
|
+
* Strip terminal escape protocols before the remaining C0/C1 bytes are
|
|
192
|
+
* normalized. Dropping only ESC would leave OSC hyperlinks and DCS payloads
|
|
193
|
+
* visible, so consume each complete control string (or the bounded remainder
|
|
194
|
+
* when it is unterminated).
|
|
195
|
+
*/
|
|
196
|
+
function stripTerminalEscapeSequences(value) {
|
|
197
|
+
const input = value.slice(0, MAX_VALIDATION_ERROR_SCAN_LENGTH);
|
|
198
|
+
let output = '';
|
|
199
|
+
let index = 0;
|
|
200
|
+
while (index < input.length) {
|
|
201
|
+
const code = input.charCodeAt(index);
|
|
202
|
+
if (code === ESCAPE) {
|
|
203
|
+
const next = input.charCodeAt(index + 1);
|
|
204
|
+
if (next === 0x5b) {
|
|
205
|
+
index = consumeControlSequence(input, index + 2);
|
|
206
|
+
}
|
|
207
|
+
else if (next === 0x5d) {
|
|
208
|
+
index = consumeControlString(input, index + 2, true);
|
|
209
|
+
}
|
|
210
|
+
else if (next === 0x50 || next === 0x58 || next === 0x5e || next === 0x5f) {
|
|
211
|
+
index = consumeControlString(input, index + 2, false);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
index = consumeEscapeSequence(input, index + 1);
|
|
215
|
+
}
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
if (code === 0x9b) {
|
|
219
|
+
index = consumeControlSequence(input, index + 1);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (code === 0x9d) {
|
|
223
|
+
index = consumeControlString(input, index + 1, true);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (code === 0x90 || code === 0x98 || code === 0x9e || code === 0x9f) {
|
|
227
|
+
index = consumeControlString(input, index + 1, false);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
output += input[index] ?? '';
|
|
231
|
+
index += 1;
|
|
232
|
+
}
|
|
233
|
+
return output;
|
|
234
|
+
}
|
|
235
|
+
function consumeControlSequence(input, start) {
|
|
236
|
+
for (let index = start; index < input.length; index += 1) {
|
|
237
|
+
const code = input.charCodeAt(index);
|
|
238
|
+
if (code >= 0x40 && code <= 0x7e)
|
|
239
|
+
return index + 1;
|
|
240
|
+
}
|
|
241
|
+
return input.length;
|
|
242
|
+
}
|
|
243
|
+
function consumeControlString(input, start, bellTerminates) {
|
|
244
|
+
for (let index = start; index < input.length; index += 1) {
|
|
245
|
+
const code = input.charCodeAt(index);
|
|
246
|
+
if ((bellTerminates && code === BELL) || code === STRING_TERMINATOR)
|
|
247
|
+
return index + 1;
|
|
248
|
+
if (code === ESCAPE && input.charCodeAt(index + 1) === 0x5c)
|
|
249
|
+
return index + 2;
|
|
250
|
+
}
|
|
251
|
+
return input.length;
|
|
252
|
+
}
|
|
253
|
+
function consumeEscapeSequence(input, start) {
|
|
254
|
+
let index = start;
|
|
255
|
+
while (index < input.length) {
|
|
256
|
+
const code = input.charCodeAt(index);
|
|
257
|
+
index += 1;
|
|
258
|
+
if (code < 0x20 || code > 0x2f)
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
return index;
|
|
262
|
+
}
|
|
263
|
+
function isRecord(value) {
|
|
264
|
+
return typeof value === 'object' && value !== null;
|
|
265
|
+
}
|
|
266
|
+
function nonEmptyString(value) {
|
|
267
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=hubspot-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubspot-project.js","sourceRoot":"","sources":["../src/hubspot-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ export class LocalProjectPickerCancelled extends Error {
|
|
|
25
25
|
*/
|
|
26
26
|
export async function discoverLocalProjects(input) {
|
|
27
27
|
const workspaceRoot = resolve(input.root);
|
|
28
|
-
const markers = input.markers ?? ['hsx.config.ts'];
|
|
28
|
+
const markers = input.markers ?? ['hsx.config.ts', 'hsproject.json'];
|
|
29
29
|
const maxDepth = input.maxDepth ?? 4;
|
|
30
30
|
const maxDirectories = input.maxDirectories ?? 500;
|
|
31
31
|
const excluded = input.excludedDirectories ?? DEFAULT_EXCLUDED_DIRECTORIES;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-project-picker.js","sourceRoot":"","sources":["../src/local-project-picker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG9D,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,WAAW;IACX,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,WAAW;CACZ,CAAC,CAAC;AAaH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD;QACE,KAAK,CAAC,YAAY,CAAC,CAAC;IACtB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAM3C;IACC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"local-project-picker.js","sourceRoot":"","sources":["../src/local-project-picker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG9D,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,WAAW;IACX,OAAO;IACP,UAAU;IACV,MAAM;IACN,cAAc;IACd,WAAW;CACZ,CAAC,CAAC;AAaH,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD;QACE,KAAK,CAAC,YAAY,CAAC,CAAC;IACtB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAM3C;IACC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrC,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,GAAG,CAAC;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,IAAI,4BAA4B,CAAC;IAC3E,MAAM,KAAK,GAAkE;QAC3E,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE;KACvC,CAAC;IACF,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,cAAc,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,MAAM;QACpB,OAAO,IAAI,CAAC,CAAC;QAEb,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,OAAO,CAAC,SAAS;gBACvB,YAAY,EAAE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG;gBAC/D,IAAI,EAAE,MAAM,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;gBACxD,MAAM;aACP,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ;YAAE,SAAS;QACxC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACvF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzF,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAC7F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAMzC;IACC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC;QAC3C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC;IACxE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,sBAAsB;QAChD,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,WAAW,EAAE,OAAO,CAAC,YAAY;SAClC,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,2BAA2B,EAAE,CAAC;IACpE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC1E,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACxB,CAAC;aAAM,IAAI,MAAM,KAAK,gBAAgB,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;YAC7D,MAAM,SAAS,GACb,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;gBAC/D,CAAC,CAAE,MAAM,CAAC,SAAqC;gBAC/C,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAClF,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACjF,CAAC;YACF,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;IACzE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|