Addresses
How Kalup names every resource, as type:path, and where you will see and use those names
Every resource Kalup knows has one address, <type>:<path>. The address is the same in your files, in the IR, in every error and in every command's output, so it is how you point at a resource anywhere in Kalup.
property:companies/billing_status
group:companies/billing
object:subscriptionThe types in this version
| Type | Path | Example | Comes from |
|---|---|---|---|
property | <object>/<internal name> | property:companies/billing_status | a p.* entry under properties |
group | <object>/<group name> | group:companies/billing | an entry under groups |
object | <custom object name> | object:subscription | a defineCustomObject file |
The parts come straight from your files:
<object>is the object's name as HubSpot knows it:companies,contacts,deals, or a custom object's name such assubscription. It is the first argument ofdefineObjectordefineCustomObject.<internal name>is the property's internal name, the first argument of the builder:p.enum('billing_status', ...). Not the camelCase key.<group name>is the key undergroups.
export const Company = defineObject('companies', {
groups: {
billing: { label: 'Billing' }, // group:companies/billing
},
properties: {
billingStatus: p.enum('billing_status', { // property:companies/billing_status
label: 'Billing status',
group: 'billing',
fieldType: 'select',
options: [{ value: 'active', label: 'Active' }],
}),
name: p.string('name'), // property:companies/name
},
})Standard objects such as companies have no object: address, because HubSpot defines them and Kalup never creates or changes them. Only custom objects do.
Coming with later releases: pipeline:, stage: and association: addresses, for example pipeline:deals/enterprise.
Naming rules
An address is lowercase type letters, a colon, and a path with no spaces. Because the path uses HubSpot's internal names, it is usually lowercase with underscores, and it is case sensitive: property:companies/Billing_Status is a different address from property:companies/billing_status.
Each address can appear once. Two definitions of the same property or group, even in different files, are E_DUPLICATE_ADDRESS, and validate names both places.
Where you see addresses
In the IR. kalup ir prints every resource keyed by its address. An excerpt:
{
"resources": {
"group:companies/billing": { "type": "group", "managed": true, "definition": { "label": "Billing" } },
"property:companies/billing_status": {
"type": "property",
"managed": true,
"definition": {
"label": "Billing status",
"group": { "$ref": "group:companies/billing" }
}
}
}
}A definition points at another resource with { "$ref": "<address>" }, never with a HubSpot ID. That is why the same files work against any portal.
In pull output. Every change pull reports names its address, and a field change adds #field:
companies: 1 added, 1 changed, 12 unchanged, 0 missing in portal
added: property:companies/renewal_date
changed: property:companies/billing_status#label "Billing status" -> "Billing state"In pull --discover. Resources in the portal but outside your scope are listed by address, with what to add to bring them in.
In issues. validate and every other command explain problems in terms of addresses, for example override 'property:companies/billing_state' is not an address in config.
Where you use addresses
--only on pull. Limit a pull to the addresses that match a glob. * matches any run of characters, / included:
npx kalup pull --target sandbox --only 'property:companies/*'
npx kalup pull --target sandbox --only '*billing*'Quote the glob so your shell does not expand it.
overrides in kalup.config.ts. Each override is keyed by the address it changes in one target. An override for an address your files do not define is E_UNKNOWN_OVERRIDE. See Targets and credentials.
To list every valid address in your project, run npx kalup ir and read the keys of resources.