@revfleet/hscli 0.8.7 → 0.8.11
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/CHANGELOG.md +247 -0
- package/CONTRIBUTING.md +120 -0
- package/README.md +42 -8
- package/brand/readme-hero.svg +25 -0
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/account/index.js +5 -6
- package/dist/commands/account/index.js.map +1 -1
- package/dist/commands/api/index.js +43 -3
- package/dist/commands/api/index.js.map +1 -1
- package/dist/commands/auth/index.js +74 -13
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/cms/hubdb.js +31 -0
- package/dist/commands/cms/hubdb.js.map +1 -1
- package/dist/commands/cms/index.js +27 -0
- package/dist/commands/cms/index.js.map +1 -1
- package/dist/commands/cms/source-code.js +21 -0
- package/dist/commands/cms/source-code.js.map +1 -1
- package/dist/commands/communication-preferences/index.js +11 -12
- package/dist/commands/communication-preferences/index.js.map +1 -1
- package/dist/commands/crm/activities.d.ts +3 -0
- package/dist/commands/crm/activities.js +186 -0
- package/dist/commands/crm/activities.js.map +1 -0
- package/dist/commands/crm/index.js +4 -0
- package/dist/commands/crm/index.js.map +1 -1
- package/dist/commands/crm/migration.d.ts +3 -0
- package/dist/commands/crm/migration.js +155 -0
- package/dist/commands/crm/migration.js.map +1 -0
- package/dist/commands/crm/properties.js +105 -18
- package/dist/commands/crm/properties.js.map +1 -1
- package/dist/commands/crm/property-batch.d.ts +34 -0
- package/dist/commands/crm/property-batch.js +205 -0
- package/dist/commands/crm/property-batch.js.map +1 -0
- package/dist/commands/crm/shared.d.ts +1 -0
- package/dist/commands/crm/shared.js +3 -4
- package/dist/commands/crm/shared.js.map +1 -1
- package/dist/commands/doctor/index.js +119 -1
- package/dist/commands/doctor/index.js.map +1 -1
- package/dist/commands/events/index.js +7 -8
- package/dist/commands/events/index.js.map +1 -1
- package/dist/commands/forms/index.js +47 -6
- package/dist/commands/forms/index.js.map +1 -1
- package/dist/commands/forms/legacy-v2.d.ts +6 -0
- package/dist/commands/forms/legacy-v2.js +350 -0
- package/dist/commands/forms/legacy-v2.js.map +1 -0
- package/dist/commands/forms/property-preflight.d.ts +20 -0
- package/dist/commands/forms/property-preflight.js +99 -0
- package/dist/commands/forms/property-preflight.js.map +1 -0
- package/dist/commands/guide/index.d.ts +3 -0
- package/dist/commands/guide/index.js +231 -0
- package/dist/commands/guide/index.js.map +1 -0
- package/dist/commands/marketing/index.js +3 -4
- package/dist/commands/marketing/index.js.map +1 -1
- package/dist/commands/settings/index.js +249 -14
- package/dist/commands/settings/index.js.map +1 -1
- package/dist/core/auth.d.ts +7 -1
- package/dist/core/auth.js +45 -7
- package/dist/core/auth.js.map +1 -1
- package/dist/core/http.d.ts +43 -0
- package/dist/core/http.js +227 -57
- package/dist/core/http.js.map +1 -1
- package/dist/core/output.d.ts +2 -0
- package/dist/core/output.js +1 -1
- package/dist/core/output.js.map +1 -1
- package/dist/core/plugins.d.ts +5 -2
- package/dist/core/plugins.js +18 -1
- package/dist/core/plugins.js.map +1 -1
- package/dist/core/scopes.d.ts +29 -0
- package/dist/core/scopes.js +415 -0
- package/dist/core/scopes.js.map +1 -0
- package/dist/core/telemetry-context.d.ts +13 -0
- package/dist/core/telemetry-context.js +30 -0
- package/dist/core/telemetry-context.js.map +1 -0
- package/dist/mcp/ext-tools.d.ts +1 -1
- package/dist/mcp/ext-tools.js +52 -1
- package/dist/mcp/ext-tools.js.map +1 -1
- package/dist/mcp/hubspot-modules.d.ts +30 -0
- package/dist/mcp/hubspot-modules.js +305 -0
- package/dist/mcp/hubspot-modules.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +120 -48
- package/dist/mcp/server.js.map +1 -1
- package/docs/ARCHITECTURE.md +39 -0
- package/docs/CAPABILITY_LIBRARY.md +639 -0
- package/docs/CMS_SETUP.md +349 -0
- package/docs/COMMAND_COMPATIBILITY.md +24 -0
- package/docs/COMMAND_TREE.md +199 -0
- package/docs/COMMERCE_SETUP.md +400 -0
- package/docs/COMPARISON.md +146 -0
- package/docs/COOKBOOK.md +896 -0
- package/docs/INTEGRATIONS_NOTIFICATIONS_SETUP.md +352 -0
- package/docs/MARKETING_SETUP.md +509 -0
- package/docs/MCP.md +172 -0
- package/docs/OPERATIONAL_PLAYBOOKS.md +322 -0
- package/docs/OPERATIONS_SETUP.md +362 -0
- package/docs/PLUGIN_GUIDE.md +158 -0
- package/docs/POLICY_EXAMPLE.json +57 -0
- package/docs/PORTAL_SETUP.md +684 -0
- package/docs/PUBLISHING.md +154 -0
- package/docs/RELEASE_GOVERNANCE.md +34 -0
- package/docs/REPORTING_SETUP.md +310 -0
- package/docs/ROADMAP-DATE-BASED-API.md +103 -0
- package/docs/ROADMAP_PHASE1_TO_3.md +96 -0
- package/docs/SAFETY_MODEL.md +40 -0
- package/docs/SALES_SETUP.md +369 -0
- package/docs/SERVICE_SETUP.md +403 -0
- package/docs/TESTING_PLAN.md +89 -0
- package/docs/TIERS.md +320 -0
- package/docs/TUTORIALS/audit-portal-writes.md +150 -0
- package/docs/TUTORIALS/secure-agent-writes.md +177 -0
- package/docs/TUTORIALS/trace-replay-repro.md +147 -0
- package/docs/WHY_HOW_WHAT.md +81 -0
- package/package.json +7 -2
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { HubSpotClient } from "../../core/http.js";
|
|
1
|
+
import { createClient } from "../../core/http.js";
|
|
3
2
|
import { printResult } from "../../core/output.js";
|
|
4
3
|
import { encodePathSegment, maybeWrite, parseJsonPayload } from "../crm/shared.js";
|
|
5
4
|
export function registerCommunicationPreferences(program, getCtx) {
|
|
@@ -9,7 +8,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
9
8
|
.description("List subscription types")
|
|
10
9
|
.action(async () => {
|
|
11
10
|
const ctx = getCtx();
|
|
12
|
-
const client =
|
|
11
|
+
const client = createClient(ctx.profile);
|
|
13
12
|
const res = await client.request("/communication-preferences/v3/definitions");
|
|
14
13
|
printResult(ctx, res);
|
|
15
14
|
});
|
|
@@ -19,7 +18,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
19
18
|
.description("Get subscription status for an email address")
|
|
20
19
|
.action(async (email) => {
|
|
21
20
|
const ctx = getCtx();
|
|
22
|
-
const client =
|
|
21
|
+
const client = createClient(ctx.profile);
|
|
23
22
|
const res = await client.request(`/communication-preferences/v3/status/email/${encodePathSegment(email, "email")}`);
|
|
24
23
|
printResult(ctx, res);
|
|
25
24
|
});
|
|
@@ -29,7 +28,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
29
28
|
.description("Subscribe a contact")
|
|
30
29
|
.action(async (opts) => {
|
|
31
30
|
const ctx = getCtx();
|
|
32
|
-
const client =
|
|
31
|
+
const client = createClient(ctx.profile);
|
|
33
32
|
const payload = parseJsonPayload(opts.data);
|
|
34
33
|
const res = await maybeWrite(ctx, client, "POST", "/communication-preferences/v3/subscribe", payload);
|
|
35
34
|
printResult(ctx, res);
|
|
@@ -40,7 +39,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
40
39
|
.description("Unsubscribe a contact")
|
|
41
40
|
.action(async (opts) => {
|
|
42
41
|
const ctx = getCtx();
|
|
43
|
-
const client =
|
|
42
|
+
const client = createClient(ctx.profile);
|
|
44
43
|
const payload = parseJsonPayload(opts.data);
|
|
45
44
|
const res = await maybeWrite(ctx, client, "POST", "/communication-preferences/v3/unsubscribe", payload);
|
|
46
45
|
printResult(ctx, res);
|
|
@@ -52,7 +51,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
52
51
|
.requiredOption("--data <payload>", "Batch input JSON: { inputs: [{ subscriberIdString, channel, subscriptionId }, ...] }")
|
|
53
52
|
.action(async (opts) => {
|
|
54
53
|
const ctx = getCtx();
|
|
55
|
-
const client =
|
|
54
|
+
const client = createClient(ctx.profile);
|
|
56
55
|
const payload = parseJsonPayload(opts.data);
|
|
57
56
|
const res = await client.request("/communication/preferences/v4/statuses/batch-read", { method: "POST", body: payload });
|
|
58
57
|
printResult(ctx, res);
|
|
@@ -62,7 +61,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
62
61
|
.requiredOption("--data <payload>", "Batch update payload JSON")
|
|
63
62
|
.action(async (opts) => {
|
|
64
63
|
const ctx = getCtx();
|
|
65
|
-
const client =
|
|
64
|
+
const client = createClient(ctx.profile);
|
|
66
65
|
const payload = parseJsonPayload(opts.data);
|
|
67
66
|
const res = await maybeWrite(ctx, client, "POST", "/communication/preferences/v4/statuses/batch-update", payload);
|
|
68
67
|
printResult(ctx, res);
|
|
@@ -72,7 +71,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
72
71
|
.requiredOption("--data <payload>", "Batch subscribe payload JSON")
|
|
73
72
|
.action(async (opts) => {
|
|
74
73
|
const ctx = getCtx();
|
|
75
|
-
const client =
|
|
74
|
+
const client = createClient(ctx.profile);
|
|
76
75
|
const payload = parseJsonPayload(opts.data);
|
|
77
76
|
const res = await maybeWrite(ctx, client, "POST", "/communication/preferences/v4/subscribe-batch", payload);
|
|
78
77
|
printResult(ctx, res);
|
|
@@ -82,7 +81,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
82
81
|
.requiredOption("--data <payload>", "Batch unsubscribe payload JSON")
|
|
83
82
|
.action(async (opts) => {
|
|
84
83
|
const ctx = getCtx();
|
|
85
|
-
const client =
|
|
84
|
+
const client = createClient(ctx.profile);
|
|
86
85
|
const payload = parseJsonPayload(opts.data);
|
|
87
86
|
const res = await maybeWrite(ctx, client, "POST", "/communication/preferences/v4/unsubscribe-batch", payload);
|
|
88
87
|
printResult(ctx, res);
|
|
@@ -91,7 +90,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
91
90
|
.description("List subscription definitions (v4)")
|
|
92
91
|
.action(async () => {
|
|
93
92
|
const ctx = getCtx();
|
|
94
|
-
const client =
|
|
93
|
+
const client = createClient(ctx.profile);
|
|
95
94
|
const res = await client.request("/communication/preferences/v4/subscriptions");
|
|
96
95
|
printResult(ctx, res);
|
|
97
96
|
});
|
|
@@ -99,7 +98,7 @@ export function registerCommunicationPreferences(program, getCtx) {
|
|
|
99
98
|
.description("List supported channels (email, sms, whatsapp, etc.)")
|
|
100
99
|
.action(async () => {
|
|
101
100
|
const ctx = getCtx();
|
|
102
|
-
const client =
|
|
101
|
+
const client = createClient(ctx.profile);
|
|
103
102
|
const res = await client.request("/communication/preferences/v4/channels");
|
|
104
103
|
printResult(ctx, res);
|
|
105
104
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/communication-preferences/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/communication-preferences/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { createClient } from "../../core/http.js";
|
|
3
|
+
import { printResult } from "../../core/output.js";
|
|
4
|
+
import { encodePathSegment, parseNumberFlag } from "./shared.js";
|
|
5
|
+
const DEFAULT_ENGAGEMENT_TYPES = ["notes", "emails", "calls", "tasks", "meetings"];
|
|
6
|
+
const DEFAULT_HISTORY_PROPERTIES = [
|
|
7
|
+
"createdate",
|
|
8
|
+
"lifecyclestage",
|
|
9
|
+
"hubspot_owner_id",
|
|
10
|
+
"hs_analytics_source",
|
|
11
|
+
"hs_analytics_source_data_1",
|
|
12
|
+
"hs_analytics_source_data_2",
|
|
13
|
+
"hs_latest_source",
|
|
14
|
+
"hs_latest_source_data_1",
|
|
15
|
+
"hs_latest_source_data_2",
|
|
16
|
+
"hs_object_source",
|
|
17
|
+
"hs_object_source_label",
|
|
18
|
+
];
|
|
19
|
+
const OBJECT_TYPE_IDS = {
|
|
20
|
+
contacts: "0-1",
|
|
21
|
+
contact: "0-1",
|
|
22
|
+
companies: "0-2",
|
|
23
|
+
company: "0-2",
|
|
24
|
+
deals: "0-3",
|
|
25
|
+
deal: "0-3",
|
|
26
|
+
tickets: "0-5",
|
|
27
|
+
ticket: "0-5",
|
|
28
|
+
};
|
|
29
|
+
const ENGAGEMENT_PROPERTIES = {
|
|
30
|
+
notes: ["hs_timestamp", "hs_note_body", "hs_attachment_ids", "hubspot_owner_id", "hs_createdate", "hs_lastmodifieddate"],
|
|
31
|
+
emails: ["hs_timestamp", "hs_email_subject", "hs_email_text", "hs_email_html", "hs_email_direction", "hs_email_status", "hubspot_owner_id", "hs_createdate", "hs_lastmodifieddate"],
|
|
32
|
+
calls: ["hs_timestamp", "hs_call_title", "hs_call_body", "hs_call_duration", "hs_call_direction", "hs_call_disposition", "hs_call_recording_url", "hubspot_owner_id", "hs_createdate", "hs_lastmodifieddate"],
|
|
33
|
+
tasks: ["hs_timestamp", "hs_task_subject", "hs_task_body", "hs_task_status", "hs_task_priority", "hs_task_type", "hubspot_owner_id", "hs_createdate", "hs_lastmodifieddate"],
|
|
34
|
+
meetings: ["hs_timestamp", "hs_meeting_title", "hs_meeting_body", "hs_meeting_start_time", "hs_meeting_end_time", "hs_meeting_outcome", "hubspot_owner_id", "hs_createdate", "hs_lastmodifieddate"],
|
|
35
|
+
};
|
|
36
|
+
function parseCsv(raw, fallback) {
|
|
37
|
+
const source = raw?.trim() ? raw : fallback.join(",");
|
|
38
|
+
return source
|
|
39
|
+
.split(",")
|
|
40
|
+
.map((part) => part.trim())
|
|
41
|
+
.filter(Boolean);
|
|
42
|
+
}
|
|
43
|
+
function serializeError(err) {
|
|
44
|
+
if (err && typeof err === "object") {
|
|
45
|
+
const record = err;
|
|
46
|
+
return {
|
|
47
|
+
code: typeof record.code === "string" ? record.code : "REQUEST_FAILED",
|
|
48
|
+
message: typeof record.message === "string" ? record.message : String(err),
|
|
49
|
+
...(typeof record.status === "number" ? { status: record.status } : {}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return { code: "REQUEST_FAILED", message: String(err) };
|
|
53
|
+
}
|
|
54
|
+
async function capture(client, path, options) {
|
|
55
|
+
try {
|
|
56
|
+
return { ok: true, data: await client.request(path, options) };
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return { ok: false, error: serializeError(err) };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function responseResults(value) {
|
|
63
|
+
if (!value.ok || !value.data || typeof value.data !== "object" || Array.isArray(value.data))
|
|
64
|
+
return [];
|
|
65
|
+
const results = value.data.results;
|
|
66
|
+
if (!Array.isArray(results))
|
|
67
|
+
return [];
|
|
68
|
+
return results.filter((item) => item !== null && typeof item === "object" && !Array.isArray(item));
|
|
69
|
+
}
|
|
70
|
+
function associationIds(value) {
|
|
71
|
+
return responseResults(value)
|
|
72
|
+
.map((item) => item.toObjectId ?? item.id)
|
|
73
|
+
.filter((id) => typeof id === "string" || typeof id === "number")
|
|
74
|
+
.map(String);
|
|
75
|
+
}
|
|
76
|
+
function chunk(items, size) {
|
|
77
|
+
const chunks = [];
|
|
78
|
+
for (let i = 0; i < items.length; i += size)
|
|
79
|
+
chunks.push(items.slice(i, i + size));
|
|
80
|
+
return chunks;
|
|
81
|
+
}
|
|
82
|
+
function objectTypeIdFor(objectType, override) {
|
|
83
|
+
if (override?.trim())
|
|
84
|
+
return override.trim();
|
|
85
|
+
return OBJECT_TYPE_IDS[objectType.trim().toLowerCase()] ?? objectType;
|
|
86
|
+
}
|
|
87
|
+
async function exportEngagementType(client, objectTypeSegment, recordIdSegment, engagementType, limit) {
|
|
88
|
+
const engagementTypeSegment = encodePathSegment(engagementType, "engagementType");
|
|
89
|
+
const associations = await capture(client, `/crm/v4/objects/${objectTypeSegment}/${recordIdSegment}/associations/${engagementTypeSegment}?limit=${limit}`);
|
|
90
|
+
const ids = associationIds(associations);
|
|
91
|
+
const batches = [];
|
|
92
|
+
const properties = ENGAGEMENT_PROPERTIES[engagementType] ?? ["hs_timestamp", "hubspot_owner_id", "hs_createdate", "hs_lastmodifieddate"];
|
|
93
|
+
for (const idChunk of chunk(ids, 100)) {
|
|
94
|
+
batches.push(await capture(client, `/crm/v3/objects/${engagementTypeSegment}/batch/read`, {
|
|
95
|
+
method: "POST",
|
|
96
|
+
body: {
|
|
97
|
+
properties,
|
|
98
|
+
inputs: idChunk.map((id) => ({ id })),
|
|
99
|
+
},
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
return { associations, ids, batches };
|
|
103
|
+
}
|
|
104
|
+
async function exportMemberships(client, objectTypeId, recordIdSegment, hydrateLists) {
|
|
105
|
+
const memberships = await capture(client, `/crm/v3/lists/records/${encodePathSegment(objectTypeId, "objectTypeId")}/${recordIdSegment}/memberships`);
|
|
106
|
+
if (!hydrateLists)
|
|
107
|
+
return { memberships };
|
|
108
|
+
const lists = {};
|
|
109
|
+
for (const membership of responseResults(memberships)) {
|
|
110
|
+
const listId = membership.listId;
|
|
111
|
+
if (typeof listId !== "string" && typeof listId !== "number")
|
|
112
|
+
continue;
|
|
113
|
+
const key = String(listId);
|
|
114
|
+
if (lists[key])
|
|
115
|
+
continue;
|
|
116
|
+
lists[key] = await capture(client, `/crm/v3/lists/${encodePathSegment(key, "listId")}`);
|
|
117
|
+
}
|
|
118
|
+
return { memberships, lists };
|
|
119
|
+
}
|
|
120
|
+
export function registerActivities(crm, getCtx) {
|
|
121
|
+
const activities = crm.command("activities").description("Recoverable CRM activity export helpers");
|
|
122
|
+
activities
|
|
123
|
+
.command("export")
|
|
124
|
+
.description("Export recoverable activities for one CRM record: engagements, segment memberships, and selected property history")
|
|
125
|
+
.argument("<objectType>")
|
|
126
|
+
.argument("<recordId>")
|
|
127
|
+
.option("--engagement-types <csv>", "Engagement object types to include", DEFAULT_ENGAGEMENT_TYPES.join(","))
|
|
128
|
+
.option("--history-properties <csv>", "Properties to request with history", DEFAULT_HISTORY_PROPERTIES.join(","))
|
|
129
|
+
.option("--membership-object-type-id <id>", "Override Lists API objectTypeId, e.g. 0-1 for contacts")
|
|
130
|
+
.option("--limit <n>", "Max association records per engagement type", "100")
|
|
131
|
+
.option("--no-engagements", "Do not export associated notes/emails/calls/tasks/meetings")
|
|
132
|
+
.option("--no-memberships", "Do not export segment/list memberships")
|
|
133
|
+
.option("--no-list-details", "Do not hydrate list names/details for memberships")
|
|
134
|
+
.option("--no-property-history", "Do not request propertiesWithHistory")
|
|
135
|
+
.option("--out <file>", "Write the activity bundle to a JSON file")
|
|
136
|
+
.action(async (objectType, recordId, opts) => {
|
|
137
|
+
const ctx = getCtx();
|
|
138
|
+
const client = createClient(ctx.profile);
|
|
139
|
+
const objectTypeSegment = encodePathSegment(objectType, "objectType");
|
|
140
|
+
const recordIdSegment = encodePathSegment(recordId, "recordId");
|
|
141
|
+
const limit = parseNumberFlag(opts.limit, "--limit");
|
|
142
|
+
const historyProperties = parseCsv(opts.historyProperties, DEFAULT_HISTORY_PROPERTIES);
|
|
143
|
+
const recordParams = new URLSearchParams();
|
|
144
|
+
if (opts.propertyHistory) {
|
|
145
|
+
recordParams.set("properties", historyProperties.join(","));
|
|
146
|
+
recordParams.set("propertiesWithHistory", historyProperties.join(","));
|
|
147
|
+
}
|
|
148
|
+
const recordPath = `/crm/v3/objects/${objectTypeSegment}/${recordIdSegment}${recordParams.size ? `?${recordParams.toString()}` : ""}`;
|
|
149
|
+
const engagements = {};
|
|
150
|
+
if (opts.engagements) {
|
|
151
|
+
for (const engagementType of parseCsv(opts.engagementTypes, DEFAULT_ENGAGEMENT_TYPES)) {
|
|
152
|
+
engagements[engagementType] = await exportEngagementType(client, objectTypeSegment, recordIdSegment, engagementType, limit);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const memberships = opts.memberships
|
|
156
|
+
? await exportMemberships(client, objectTypeIdFor(objectType, opts.membershipObjectTypeId), recordIdSegment, Boolean(opts.listDetails))
|
|
157
|
+
: undefined;
|
|
158
|
+
const bundle = {
|
|
159
|
+
manifestVersion: 1,
|
|
160
|
+
generatedAt: new Date().toISOString(),
|
|
161
|
+
profile: ctx.profile,
|
|
162
|
+
objectType,
|
|
163
|
+
recordId,
|
|
164
|
+
coverage: {
|
|
165
|
+
recovered: [
|
|
166
|
+
...(opts.engagements ? ["notes", "emails", "calls", "tasks", "meetings"] : []),
|
|
167
|
+
...(opts.memberships ? ["current segment/list memberships with first/last added timestamps"] : []),
|
|
168
|
+
...(opts.propertyHistory ? ["selected property history such as lifecycle stage, owner, source, createdate"] : []),
|
|
169
|
+
],
|
|
170
|
+
limits: [
|
|
171
|
+
"HubSpot does not expose the full CRM record activity feed as one public replay endpoint.",
|
|
172
|
+
"Segment/list membership export captures membership state/timestamps available from the Lists API; removed historical memberships may not be present.",
|
|
173
|
+
"Created-from and moved-to-stage UI cards are reconstructed from object properties/history where available, not copied as native activity cards.",
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
record: await capture(client, recordPath),
|
|
177
|
+
memberships,
|
|
178
|
+
engagements,
|
|
179
|
+
};
|
|
180
|
+
if (opts.out) {
|
|
181
|
+
writeFileSync(String(opts.out), `${JSON.stringify(bundle, null, 2)}\n`, "utf8");
|
|
182
|
+
}
|
|
183
|
+
printResult(ctx, opts.out ? { written: opts.out, ...bundle } : bundle);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=activities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activities.js","sourceRoot":"","sources":["../../../src/commands/crm/activities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,wBAAwB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACnF,MAAM,0BAA0B,GAAG;IACjC,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,qBAAqB;IACrB,4BAA4B;IAC5B,4BAA4B;IAC5B,kBAAkB;IAClB,yBAAyB;IACzB,yBAAyB;IACzB,kBAAkB;IAClB,wBAAwB;CACzB,CAAC;AAEF,MAAM,eAAe,GAA2B;IAC9C,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,MAAM,qBAAqB,GAA6B;IACtD,KAAK,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC;IACxH,MAAM,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC;IACnL,KAAK,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC;IAC7M,KAAK,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC;IAC5K,QAAQ,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC;CACpM,CAAC;AAIF,SAAS,QAAQ,CAAC,GAAuB,EAAE,QAAkB;IAC3D,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,MAAM;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,GAA8D,CAAC;QAC9E,OAAO;YACL,IAAI,EAAE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB;YACtE,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAC1E,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;IACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAqB,EAAE,IAAY,EAAE,OAA6C;IACvG,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAuB;IAC9C,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACvG,MAAM,OAAO,GAAI,KAAK,CAAC,IAA8B,CAAC,OAAO,CAAC;IAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAmC,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACtI,CAAC;AAED,SAAS,cAAc,CAAC,KAAuB;IAC7C,OAAO,eAAe,CAAC,KAAK,CAAC;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC;SACzC,MAAM,CAAC,CAAC,EAAE,EAAyB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,CAAC;SACvF,GAAG,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAI,KAAU,EAAE,IAAY;IACxC,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB,EAAE,QAAiB;IAC5D,IAAI,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC7C,OAAO,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,UAAU,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,MAAqB,EACrB,iBAAyB,EACzB,eAAuB,EACvB,cAAsB,EACtB,KAAa;IAEb,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,MAAM,EACN,mBAAmB,iBAAiB,IAAI,eAAe,iBAAiB,qBAAqB,UAAU,KAAK,EAAE,CAC/G,CAAC;IACF,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,qBAAqB,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,CAAC,CAAC;IACzI,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,mBAAmB,qBAAqB,aAAa,EAAE;YACxF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,UAAU;gBACV,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;aACtC;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAqB,EACrB,YAAoB,EACpB,eAAuB,EACvB,YAAqB;IAErB,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,MAAM,EACN,yBAAyB,iBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,IAAI,eAAe,cAAc,CAC1G,CAAC;IACF,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,KAAK,MAAM,UAAU,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACvE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,KAAK,CAAC,GAAG,CAAC;YAAE,SAAS;QACzB,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,iBAAiB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAY,EAAE,MAAwB;IACvE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,yCAAyC,CAAC,CAAC;IAEpG,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mHAAmH,CAAC;SAChI,QAAQ,CAAC,cAAc,CAAC;SACxB,QAAQ,CAAC,YAAY,CAAC;SACtB,MAAM,CAAC,0BAA0B,EAAE,oCAAoC,EAAE,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC5G,MAAM,CAAC,4BAA4B,EAAE,oCAAoC,EAAE,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAChH,MAAM,CAAC,kCAAkC,EAAE,wDAAwD,CAAC;SACpG,MAAM,CAAC,aAAa,EAAE,6CAA6C,EAAE,KAAK,CAAC;SAC3E,MAAM,CAAC,kBAAkB,EAAE,4DAA4D,CAAC;SACxF,MAAM,CAAC,kBAAkB,EAAE,wCAAwC,CAAC;SACpE,MAAM,CAAC,mBAAmB,EAAE,mDAAmD,CAAC;SAChF,MAAM,CAAC,uBAAuB,EAAE,sCAAsC,CAAC;SACvE,MAAM,CAAC,cAAc,EAAE,0CAA0C,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACtE,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,0BAA0B,CAAC,CAAC;QAEvF,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,UAAU,GAAG,mBAAmB,iBAAiB,IAAI,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAEtI,MAAM,WAAW,GAAqE,EAAE,CAAC;QACzF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,wBAAwB,CAAC,EAAE,CAAC;gBACtF,WAAW,CAAC,cAAc,CAAC,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;YAC9H,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;YAClC,CAAC,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvI,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,MAAM,GAAG;YACb,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,UAAU;YACV,QAAQ;YACR,QAAQ,EAAE;gBACR,SAAS,EAAE;oBACT,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9E,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,mEAAmE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClG,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,8EAA8E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClH;gBACD,MAAM,EAAE;oBACN,0FAA0F;oBAC1F,sJAAsJ;oBACtJ,iJAAiJ;iBAClJ;aACF;YACD,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;YACzC,WAAW;YACX,WAAW;SACZ,CAAC;QAEF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;QACD,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -28,6 +28,8 @@ import { registerTaxes } from "./taxes.js";
|
|
|
28
28
|
import { registerCommunications } from "./communications.js";
|
|
29
29
|
import { registerUsersObject } from "./users.js";
|
|
30
30
|
import { registerDatedApi } from "./dated.js";
|
|
31
|
+
import { registerMigration } from "./migration.js";
|
|
32
|
+
import { registerActivities } from "./activities.js";
|
|
31
33
|
export function registerCrm(program, getCtx) {
|
|
32
34
|
const crm = program.command("crm").description("HubSpot CRM objects");
|
|
33
35
|
registerContacts(crm, getCtx);
|
|
@@ -60,5 +62,7 @@ export function registerCrm(program, getCtx) {
|
|
|
60
62
|
registerCommunications(crm, getCtx);
|
|
61
63
|
registerUsersObject(crm, getCtx);
|
|
62
64
|
registerDatedApi(crm, getCtx);
|
|
65
|
+
registerMigration(crm, getCtx);
|
|
66
|
+
registerActivities(crm, getCtx);
|
|
63
67
|
}
|
|
64
68
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/crm/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/crm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { createClient } from "../../core/http.js";
|
|
3
|
+
import { printResult } from "../../core/output.js";
|
|
4
|
+
import { encodePathSegment } from "./shared.js";
|
|
5
|
+
const DEFAULT_OBJECTS = ["contacts", "companies", "deals", "tickets"];
|
|
6
|
+
const DEFAULT_PIPELINE_OBJECTS = ["deals", "tickets"];
|
|
7
|
+
const DEFAULT_ASSOCIATION_PAIRS = [
|
|
8
|
+
["contacts", "companies"],
|
|
9
|
+
["companies", "contacts"],
|
|
10
|
+
["contacts", "deals"],
|
|
11
|
+
["deals", "contacts"],
|
|
12
|
+
["companies", "deals"],
|
|
13
|
+
["deals", "companies"],
|
|
14
|
+
["deals", "tickets"],
|
|
15
|
+
["tickets", "deals"],
|
|
16
|
+
];
|
|
17
|
+
function parseCsv(raw, fallback) {
|
|
18
|
+
const source = raw?.trim() ? raw : fallback.join(",");
|
|
19
|
+
return source
|
|
20
|
+
.split(",")
|
|
21
|
+
.map((part) => part.trim())
|
|
22
|
+
.filter(Boolean);
|
|
23
|
+
}
|
|
24
|
+
function parsePairs(raw) {
|
|
25
|
+
const source = raw?.trim() ? raw : DEFAULT_ASSOCIATION_PAIRS.map(([from, to]) => `${from}:${to}`).join(",");
|
|
26
|
+
return source
|
|
27
|
+
.split(",")
|
|
28
|
+
.map((part) => part.trim())
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
.map((part) => part.split(":").map((segment) => segment.trim()))
|
|
31
|
+
.filter((pair) => pair.length === 2 && pair.every(Boolean));
|
|
32
|
+
}
|
|
33
|
+
function serializeError(err) {
|
|
34
|
+
if (err && typeof err === "object") {
|
|
35
|
+
const record = err;
|
|
36
|
+
return {
|
|
37
|
+
code: typeof record.code === "string" ? record.code : "REQUEST_FAILED",
|
|
38
|
+
message: typeof record.message === "string" ? record.message : String(err),
|
|
39
|
+
...(typeof record.status === "number" ? { status: record.status } : {}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return { code: "REQUEST_FAILED", message: String(err) };
|
|
43
|
+
}
|
|
44
|
+
async function capture(client, path) {
|
|
45
|
+
try {
|
|
46
|
+
return { ok: true, data: await client.request(path) };
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return { ok: false, error: serializeError(err) };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function responseResults(value) {
|
|
53
|
+
if (!value.ok || !value.data || typeof value.data !== "object" || Array.isArray(value.data))
|
|
54
|
+
return [];
|
|
55
|
+
const results = value.data.results;
|
|
56
|
+
if (!Array.isArray(results))
|
|
57
|
+
return [];
|
|
58
|
+
return results.filter((item) => item !== null && typeof item === "object" && !Array.isArray(item));
|
|
59
|
+
}
|
|
60
|
+
async function collectPipelineMetadata(client, objectType) {
|
|
61
|
+
const objectTypeSegment = encodePathSegment(objectType, "objectType");
|
|
62
|
+
const list = await capture(client, `/crm/v3/pipelines/${objectTypeSegment}`);
|
|
63
|
+
const details = [];
|
|
64
|
+
for (const pipeline of responseResults(list)) {
|
|
65
|
+
if (typeof pipeline.id !== "string" || !pipeline.id.trim())
|
|
66
|
+
continue;
|
|
67
|
+
const pipelineIdSegment = encodePathSegment(pipeline.id, "pipelineId");
|
|
68
|
+
details.push({
|
|
69
|
+
id: pipeline.id,
|
|
70
|
+
pipeline: await capture(client, `/crm/v3/pipelines/${objectTypeSegment}/${pipelineIdSegment}`),
|
|
71
|
+
stages: await capture(client, `/crm/v3/pipelines/${objectTypeSegment}/${pipelineIdSegment}/stages`),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return { list, details };
|
|
75
|
+
}
|
|
76
|
+
export function registerMigration(crm, getCtx) {
|
|
77
|
+
const migration = crm.command("migration").description("Migration planning and metadata export helpers");
|
|
78
|
+
migration
|
|
79
|
+
.command("export-metadata")
|
|
80
|
+
.description("Export schema/pipeline metadata needed before migrating a HubSpot portal")
|
|
81
|
+
.option("--objects <csv>", "Object types for properties + property groups", DEFAULT_OBJECTS.join(","))
|
|
82
|
+
.option("--pipeline-objects <csv>", "Object types for pipelines + stages", DEFAULT_PIPELINE_OBJECTS.join(","))
|
|
83
|
+
.option("--no-owners", "Do not include CRM owners")
|
|
84
|
+
.option("--no-teams", "Do not include settings teams")
|
|
85
|
+
.option("--no-business-units", "Do not include business units")
|
|
86
|
+
.option("--no-currencies", "Do not include currencies")
|
|
87
|
+
.option("--no-custom-schemas", "Do not include custom object schemas")
|
|
88
|
+
.option("--no-association-labels", "Do not include standard association label metadata")
|
|
89
|
+
.option("--association-pairs <csv>", "Association label pairs as from:to,from:to; supports custom object type IDs")
|
|
90
|
+
.option("--out <file>", "Write the manifest to a JSON file")
|
|
91
|
+
.action(async (opts) => {
|
|
92
|
+
const ctx = getCtx();
|
|
93
|
+
const client = createClient(ctx.profile);
|
|
94
|
+
const objects = parseCsv(opts.objects, DEFAULT_OBJECTS);
|
|
95
|
+
const pipelineObjects = parseCsv(opts.pipelineObjects, DEFAULT_PIPELINE_OBJECTS);
|
|
96
|
+
const propertyGroups = {};
|
|
97
|
+
const properties = {};
|
|
98
|
+
for (const objectType of objects) {
|
|
99
|
+
const objectTypeSegment = encodePathSegment(objectType, "objectType");
|
|
100
|
+
propertyGroups[objectType] = await capture(client, `/crm/v3/properties/${objectTypeSegment}/groups`);
|
|
101
|
+
properties[objectType] = await capture(client, `/crm/v3/properties/${objectTypeSegment}`);
|
|
102
|
+
}
|
|
103
|
+
const pipelines = {};
|
|
104
|
+
for (const objectType of pipelineObjects) {
|
|
105
|
+
pipelines[objectType] = await collectPipelineMetadata(client, objectType);
|
|
106
|
+
}
|
|
107
|
+
const associationLabels = {};
|
|
108
|
+
if (opts.associationLabels) {
|
|
109
|
+
for (const [from, to] of parsePairs(opts.associationPairs)) {
|
|
110
|
+
associationLabels[`${from}:${to}`] = await capture(client, `/crm/v4/associations/${encodePathSegment(from, "fromObjectType")}/${encodePathSegment(to, "toObjectType")}/labels`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const manifest = {
|
|
114
|
+
manifestVersion: 1,
|
|
115
|
+
generatedAt: new Date().toISOString(),
|
|
116
|
+
profile: ctx.profile,
|
|
117
|
+
intent: "portal-migration-metadata",
|
|
118
|
+
requiredForReplayOrder: [
|
|
119
|
+
"customSchemas",
|
|
120
|
+
"propertyGroups",
|
|
121
|
+
"properties",
|
|
122
|
+
"pipelines",
|
|
123
|
+
"associationLabels",
|
|
124
|
+
"ownersAndTeamsMapping",
|
|
125
|
+
],
|
|
126
|
+
notes: [
|
|
127
|
+
"Property group labels/displayOrder come from the source portal response; do not derive labels from groupName.",
|
|
128
|
+
"Pipeline metadata includes pipeline detail and stage detail so stage IDs, labels, displayOrder, and metadata can be mapped before record migration.",
|
|
129
|
+
"Owners, teams, currencies, and business units are mapping inputs. They are exported for planning, not blindly replayed.",
|
|
130
|
+
],
|
|
131
|
+
objects,
|
|
132
|
+
pipelineObjects,
|
|
133
|
+
propertyGroups,
|
|
134
|
+
properties,
|
|
135
|
+
pipelines,
|
|
136
|
+
customSchemas: opts.customSchemas ? await capture(client, "/crm/v3/schemas") : undefined,
|
|
137
|
+
owners: opts.owners ? await capture(client, "/crm/v3/owners/?limit=500") : undefined,
|
|
138
|
+
teams: opts.teams ? await capture(client, "/settings/v3/users/teams") : undefined,
|
|
139
|
+
businessUnits: opts.businessUnits ? await capture(client, "/settings/v3/business-units/?limit=100") : undefined,
|
|
140
|
+
currencies: opts.currencies ? await capture(client, "/settings/v3/currencies") : undefined,
|
|
141
|
+
associationLabels: opts.associationLabels ? associationLabels : undefined,
|
|
142
|
+
recommendedNextCommands: [
|
|
143
|
+
"hscli --dry-run crm properties batch-create contacts --skip-existing --skip-label-collisions --data @contacts-properties.json",
|
|
144
|
+
"hscli --force crm properties batch-create contacts --skip-existing --skip-label-collisions --data @contacts-properties.json",
|
|
145
|
+
"hscli crm pipelines list deals",
|
|
146
|
+
"hscli crm pipelines get deals <pipelineId>",
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
if (opts.out) {
|
|
150
|
+
writeFileSync(String(opts.out), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
151
|
+
}
|
|
152
|
+
printResult(ctx, opts.out ? { written: opts.out, ...manifest } : manifest);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../src/commands/crm/migration.ts"],"names":[],"mappings":"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"}
|