atmn 2.0.33 → 2.0.35
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/dist/bin.js +1409 -188
- package/dist/index.js +220 -19
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/actions/pull/webhooks/appendWebhook.ts +84 -0
- package/src/actions/pull/webhooks/applyWebhooksPull.ts +111 -0
- package/src/actions/pull/webhooks/locateWebhook.ts +22 -0
- package/src/actions/pull/webhooks/removeWebhookEnv.ts +141 -0
- package/src/actions/pull/webhooks/types.ts +20 -0
- package/src/actions/pull/webhooks/updateWebhook.ts +138 -0
- package/src/actions/pull.ts +32 -2
- package/src/actions/push/pushLanesError.ts +47 -0
- package/src/actions/push.ts +220 -60
- package/src/actions/webhooks/applyWebhooks.ts +52 -0
- package/src/actions/webhooks/isDashboardWebhook.ts +9 -0
- package/src/actions/webhooks/newWebhookId.ts +4 -0
- package/src/actions/webhooks/previewWebhooks.ts +40 -0
- package/src/actions/webhooks/resolveWebhookEnv.ts +34 -0
- package/src/actions/webhooks/resolveWebhooksForEnv.ts +29 -0
- package/src/actions/webhooks/types/webhookEnv.ts +9 -0
- package/src/actions/webhooks/webhookSecretName.ts +22 -0
- package/src/actions/webhooks/writeWebhookSecrets.ts +55 -0
- package/src/cli.ts +20 -1
- package/src/config/loadConfig.ts +3 -0
- package/src/generated/apiRoutes.ts +165 -1
- package/src/generated/client.ts +239 -1
- package/src/generated/emit.ts +20 -1
- package/src/generated/emitRuntime.ts +8 -0
- package/src/generated/isLocalWebhookUrl.ts +64 -0
- package/src/generated/lintRules.ts +95 -0
- package/src/generated/lintRuntime.ts +113 -10
- package/src/generated/sandboxName.ts +52 -0
- package/src/generated/skills.ts +10 -10
- package/src/generated/webhooks.ts +36 -0
- package/src/generated/wire.ts +32 -5
- package/src/index.ts +1 -0
- package/src/render/renderPreview.ts +17 -2
- package/src/render/renderWebhooks.ts +92 -0
- package/src/surgery/appendPropertyEdit.ts +9 -3
- package/src/surgery/patchFixturePaths.ts +57 -5
package/dist/bin.js
CHANGED
|
@@ -4,7 +4,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
4
4
|
|
|
5
5
|
// src/cli.ts
|
|
6
6
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
7
|
-
import { join as
|
|
7
|
+
import { join as join15 } from "node:path";
|
|
8
8
|
import { Command } from "commander";
|
|
9
9
|
|
|
10
10
|
// src/auth/oauthConfig.ts
|
|
@@ -3793,7 +3793,7 @@ var API_ROUTES = [
|
|
|
3793
3793
|
name: "name",
|
|
3794
3794
|
type: "string",
|
|
3795
3795
|
required: true,
|
|
3796
|
-
description: "A name for the sandbox, unique within your organization."
|
|
3796
|
+
description: "A name for the sandbox, unique within your organization. No spaces, and it can't be `live` or `sandbox`."
|
|
3797
3797
|
},
|
|
3798
3798
|
{
|
|
3799
3799
|
name: "color",
|
|
@@ -3839,9 +3839,206 @@ var API_ROUTES = [
|
|
|
3839
3839
|
description: "Wipes every customer, plan, feature and migration draft in the sandbox the calling key belongs to, leaving the sandbox itself, its secret keys and its settings in place. There is no id to pass: a sandbox's own key resets that sandbox, and an organization's test-mode key resets its default sandbox environment. Refused for live keys — only sandboxes can be reset. Cannot be undone.",
|
|
3840
3840
|
body: "none",
|
|
3841
3841
|
fields: []
|
|
3842
|
+
},
|
|
3843
|
+
{
|
|
3844
|
+
group: "webhooks",
|
|
3845
|
+
method: "create",
|
|
3846
|
+
path: "/v1/webhooks.create",
|
|
3847
|
+
description: "Creates a webhook: a URL Autumn sends the listed events to, in the environment of the calling key. You choose the `id`, and it can't be changed later. Returns the signing secret once, in this response — store it, it cannot be read back.",
|
|
3848
|
+
body: "object",
|
|
3849
|
+
fields: [
|
|
3850
|
+
{
|
|
3851
|
+
name: "id",
|
|
3852
|
+
type: "string",
|
|
3853
|
+
required: true,
|
|
3854
|
+
description: "Your ID for the webhook: letters, digits, `-` and `_`. It can't be changed after creation."
|
|
3855
|
+
},
|
|
3856
|
+
{
|
|
3857
|
+
name: "url",
|
|
3858
|
+
type: "string",
|
|
3859
|
+
required: true,
|
|
3860
|
+
description: "The https URL Autumn sends events to. Localhost and private-network addresses are rejected; tunnels such as ngrok work."
|
|
3861
|
+
},
|
|
3862
|
+
{
|
|
3863
|
+
name: "events",
|
|
3864
|
+
type: "json",
|
|
3865
|
+
required: true,
|
|
3866
|
+
description: "The events sent to this webhook. At least one. `vercel.*` events can't be mixed with other events."
|
|
3867
|
+
},
|
|
3868
|
+
{
|
|
3869
|
+
name: "description",
|
|
3870
|
+
type: "string",
|
|
3871
|
+
required: false,
|
|
3872
|
+
description: "A note for your own reference."
|
|
3873
|
+
},
|
|
3874
|
+
{
|
|
3875
|
+
name: "disabled",
|
|
3876
|
+
type: "boolean",
|
|
3877
|
+
required: false,
|
|
3878
|
+
description: "When true, no events are sent to the webhook."
|
|
3879
|
+
}
|
|
3880
|
+
]
|
|
3881
|
+
},
|
|
3882
|
+
{
|
|
3883
|
+
group: "webhooks",
|
|
3884
|
+
method: "get",
|
|
3885
|
+
path: "/v1/webhooks.get",
|
|
3886
|
+
description: "Gets one webhook by ID. The signing secret is never returned here — only `webhooks.create` and `webhooks.sync` show one, when they create the webhook.",
|
|
3887
|
+
body: "object",
|
|
3888
|
+
fields: [
|
|
3889
|
+
{
|
|
3890
|
+
name: "id",
|
|
3891
|
+
type: "string",
|
|
3892
|
+
required: true,
|
|
3893
|
+
description: "The webhook's ID. Webhooks made in the dashboard use the `ep_…` ID shown by `webhooks.list`."
|
|
3894
|
+
}
|
|
3895
|
+
]
|
|
3896
|
+
},
|
|
3897
|
+
{
|
|
3898
|
+
group: "webhooks",
|
|
3899
|
+
method: "list",
|
|
3900
|
+
path: "/v1/webhooks.list",
|
|
3901
|
+
description: "Lists every webhook in the environment of the calling key, including ones made in the dashboard (these show their `ep_…` ID).",
|
|
3902
|
+
body: "none",
|
|
3903
|
+
fields: []
|
|
3904
|
+
},
|
|
3905
|
+
{
|
|
3906
|
+
group: "webhooks",
|
|
3907
|
+
method: "update",
|
|
3908
|
+
path: "/v1/webhooks.update",
|
|
3909
|
+
description: "Updates a webhook's URL, events, description or disabled state. Only the fields you pass change. The ID can't be changed — to rename, create a new webhook.",
|
|
3910
|
+
body: "object",
|
|
3911
|
+
fields: [
|
|
3912
|
+
{
|
|
3913
|
+
name: "id",
|
|
3914
|
+
type: "string",
|
|
3915
|
+
required: true,
|
|
3916
|
+
description: "The webhook's ID. Webhooks made in the dashboard use the `ep_…` ID shown by `webhooks.list`."
|
|
3917
|
+
},
|
|
3918
|
+
{
|
|
3919
|
+
name: "url",
|
|
3920
|
+
type: "string",
|
|
3921
|
+
required: false,
|
|
3922
|
+
description: "The https URL Autumn sends events to. Localhost and private-network addresses are rejected; tunnels such as ngrok work."
|
|
3923
|
+
},
|
|
3924
|
+
{
|
|
3925
|
+
name: "events",
|
|
3926
|
+
type: "json",
|
|
3927
|
+
required: false,
|
|
3928
|
+
description: "The events sent to this webhook. At least one. `vercel.*` events can't be mixed with other events."
|
|
3929
|
+
},
|
|
3930
|
+
{
|
|
3931
|
+
name: "description",
|
|
3932
|
+
type: "string",
|
|
3933
|
+
required: false,
|
|
3934
|
+
description: "A note for your own reference."
|
|
3935
|
+
},
|
|
3936
|
+
{
|
|
3937
|
+
name: "disabled",
|
|
3938
|
+
type: "boolean",
|
|
3939
|
+
required: false,
|
|
3940
|
+
description: "When true, no events are sent to the webhook."
|
|
3941
|
+
}
|
|
3942
|
+
]
|
|
3943
|
+
},
|
|
3944
|
+
{
|
|
3945
|
+
group: "webhooks",
|
|
3946
|
+
method: "delete",
|
|
3947
|
+
path: "/v1/webhooks.delete",
|
|
3948
|
+
description: "Permanently deletes a webhook. Autumn stops sending it events immediately. Cannot be undone.",
|
|
3949
|
+
body: "object",
|
|
3950
|
+
fields: [
|
|
3951
|
+
{
|
|
3952
|
+
name: "id",
|
|
3953
|
+
type: "string",
|
|
3954
|
+
required: true,
|
|
3955
|
+
description: "The webhook's ID. Webhooks made in the dashboard use the `ep_…` ID shown by `webhooks.list`."
|
|
3956
|
+
}
|
|
3957
|
+
]
|
|
3958
|
+
},
|
|
3959
|
+
{
|
|
3960
|
+
group: "webhooks",
|
|
3961
|
+
method: "preview_sync",
|
|
3962
|
+
path: "/v1/webhooks.preview_sync",
|
|
3963
|
+
description: "Shows what `webhooks.sync` would do with the same body, without changing anything: which webhooks it would create or update, and which existing ones it would leave alone because the body doesn't list them.",
|
|
3964
|
+
body: "object",
|
|
3965
|
+
fields: [
|
|
3966
|
+
{
|
|
3967
|
+
name: "webhooks",
|
|
3968
|
+
type: "json",
|
|
3969
|
+
required: true,
|
|
3970
|
+
description: "The webhooks to create or update. Webhooks not listed are left alone; nothing is deleted."
|
|
3971
|
+
}
|
|
3972
|
+
]
|
|
3973
|
+
},
|
|
3974
|
+
{
|
|
3975
|
+
group: "webhooks",
|
|
3976
|
+
method: "sync",
|
|
3977
|
+
path: "/v1/webhooks.sync",
|
|
3978
|
+
description: "Makes the listed webhooks exist as described: creates missing ones and updates ones that differ. Webhooks not listed are left alone — sync never deletes. Returns the signing secret of each webhook it created, once. Each webhook is applied on its own: failures are listed in `errors` while the rest still apply, and the request fails only when none could be applied.",
|
|
3979
|
+
body: "object",
|
|
3980
|
+
fields: [
|
|
3981
|
+
{
|
|
3982
|
+
name: "webhooks",
|
|
3983
|
+
type: "json",
|
|
3984
|
+
required: true,
|
|
3985
|
+
description: "The webhooks to create or update. Webhooks not listed are left alone; nothing is deleted."
|
|
3986
|
+
}
|
|
3987
|
+
]
|
|
3842
3988
|
}
|
|
3843
3989
|
];
|
|
3844
3990
|
|
|
3991
|
+
// src/generated/isLocalWebhookUrl.ts
|
|
3992
|
+
var PRIVATE_IPV4_RANGES = [
|
|
3993
|
+
[0, 32],
|
|
3994
|
+
[2130706432, 8],
|
|
3995
|
+
[167772160, 8],
|
|
3996
|
+
[2886729728, 12],
|
|
3997
|
+
[3232235520, 16],
|
|
3998
|
+
[2851995648, 16]
|
|
3999
|
+
];
|
|
4000
|
+
var parseIpv4 = (host) => {
|
|
4001
|
+
const parts = host.split(".");
|
|
4002
|
+
if (parts.length !== 4)
|
|
4003
|
+
return null;
|
|
4004
|
+
if (parts.some((part) => !/^\d+$/.test(part) || Number(part) > 255)) {
|
|
4005
|
+
return null;
|
|
4006
|
+
}
|
|
4007
|
+
return parts.reduce((acc, part) => acc * 256 + Number(part), 0);
|
|
4008
|
+
};
|
|
4009
|
+
var isPrivateIpv4 = (address) => PRIVATE_IPV4_RANGES.some(([base, prefixBits]) => {
|
|
4010
|
+
const mask = prefixBits === 0 ? 0 : 4294967295 << 32 - prefixBits >>> 0;
|
|
4011
|
+
return (address & mask) >>> 0 === base;
|
|
4012
|
+
});
|
|
4013
|
+
var isLocalIpv6 = (host) => {
|
|
4014
|
+
if (host === "::1" || host === "::")
|
|
4015
|
+
return true;
|
|
4016
|
+
if (/^fe[89ab][0-9a-f]:/.test(host))
|
|
4017
|
+
return true;
|
|
4018
|
+
if (/^f[cd][0-9a-f]{0,2}:/.test(host))
|
|
4019
|
+
return true;
|
|
4020
|
+
const [, high, low] = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/) ?? [];
|
|
4021
|
+
if (!high || !low)
|
|
4022
|
+
return false;
|
|
4023
|
+
return isPrivateIpv4(Number.parseInt(high, 16) * 65536 + Number.parseInt(low, 16));
|
|
4024
|
+
};
|
|
4025
|
+
var isLocalWebhookUrl = (url) => {
|
|
4026
|
+
let hostname;
|
|
4027
|
+
try {
|
|
4028
|
+
hostname = new URL(url).hostname.toLowerCase().replace(/\.$/, "");
|
|
4029
|
+
} catch {
|
|
4030
|
+
return false;
|
|
4031
|
+
}
|
|
4032
|
+
if (hostname.startsWith("[") && hostname.endsWith("]")) {
|
|
4033
|
+
return isLocalIpv6(hostname.slice(1, -1));
|
|
4034
|
+
}
|
|
4035
|
+
if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
|
|
4036
|
+
return true;
|
|
4037
|
+
}
|
|
4038
|
+
const ipv4 = parseIpv4(hostname);
|
|
4039
|
+
return ipv4 !== null && isPrivateIpv4(ipv4);
|
|
4040
|
+
};
|
|
4041
|
+
|
|
3845
4042
|
// src/generated/lintRules.ts
|
|
3846
4043
|
var LINT_RULES = {
|
|
3847
4044
|
features: {
|
|
@@ -4145,6 +4342,10 @@ var LINT_RULES = {
|
|
|
4145
4342
|
keys: {
|
|
4146
4343
|
minLength: 1,
|
|
4147
4344
|
maxLength: 64
|
|
4345
|
+
},
|
|
4346
|
+
values: {
|
|
4347
|
+
minLength: 1,
|
|
4348
|
+
maxLength: 128
|
|
4148
4349
|
}
|
|
4149
4350
|
},
|
|
4150
4351
|
"plans.billingControls.usageLimits": {
|
|
@@ -4168,6 +4369,10 @@ var LINT_RULES = {
|
|
|
4168
4369
|
keys: {
|
|
4169
4370
|
minLength: 1,
|
|
4170
4371
|
maxLength: 64
|
|
4372
|
+
},
|
|
4373
|
+
values: {
|
|
4374
|
+
minLength: 1,
|
|
4375
|
+
maxLength: 128
|
|
4171
4376
|
}
|
|
4172
4377
|
},
|
|
4173
4378
|
"plans.freeTrial": {
|
|
@@ -5138,6 +5343,10 @@ var LINT_RULES = {
|
|
|
5138
5343
|
keys: {
|
|
5139
5344
|
minLength: 1,
|
|
5140
5345
|
maxLength: 64
|
|
5346
|
+
},
|
|
5347
|
+
values: {
|
|
5348
|
+
minLength: 1,
|
|
5349
|
+
maxLength: 128
|
|
5141
5350
|
}
|
|
5142
5351
|
},
|
|
5143
5352
|
"plans.variants.customize.billingControls.usageLimits": {
|
|
@@ -5161,6 +5370,10 @@ var LINT_RULES = {
|
|
|
5161
5370
|
keys: {
|
|
5162
5371
|
minLength: 1,
|
|
5163
5372
|
maxLength: 64
|
|
5373
|
+
},
|
|
5374
|
+
values: {
|
|
5375
|
+
minLength: 1,
|
|
5376
|
+
maxLength: 128
|
|
5164
5377
|
}
|
|
5165
5378
|
},
|
|
5166
5379
|
"plans.variants.customize.freeTrial": {
|
|
@@ -5987,6 +6200,80 @@ var LINT_RULES = {
|
|
|
5987
6200
|
exclusiveMinimum: 0
|
|
5988
6201
|
}
|
|
5989
6202
|
}
|
|
6203
|
+
},
|
|
6204
|
+
webhooks: {
|
|
6205
|
+
label: "webhook",
|
|
6206
|
+
idField: "id",
|
|
6207
|
+
required: ["events", "id", "url"],
|
|
6208
|
+
fields: {
|
|
6209
|
+
id: {
|
|
6210
|
+
minLength: 1,
|
|
6211
|
+
maxLength: 256,
|
|
6212
|
+
pattern: "^[a-zA-Z0-9_-]+$"
|
|
6213
|
+
},
|
|
6214
|
+
events: {
|
|
6215
|
+
minItems: 1
|
|
6216
|
+
}
|
|
6217
|
+
},
|
|
6218
|
+
rules: [
|
|
6219
|
+
{
|
|
6220
|
+
kind: "unique",
|
|
6221
|
+
field: "id",
|
|
6222
|
+
because: "Two webhooks claiming one id race to define the same endpoint."
|
|
6223
|
+
},
|
|
6224
|
+
{
|
|
6225
|
+
kind: "unique",
|
|
6226
|
+
field: "id",
|
|
6227
|
+
asEnvName: true,
|
|
6228
|
+
because: "Each webhook's signing secret is saved as AUTUMN_WEBHOOK_<ID>_SECRET, so these two would overwrite each other's secret. Rename one."
|
|
6229
|
+
},
|
|
6230
|
+
{
|
|
6231
|
+
kind: "rejects",
|
|
6232
|
+
field: "url",
|
|
6233
|
+
check: "isLocalWebhookUrl",
|
|
6234
|
+
because: "Autumn delivers from the internet, so localhost and private-network addresses can never be reached. Use a public URL or a tunnel (e.g. ngrok)."
|
|
6235
|
+
},
|
|
6236
|
+
{
|
|
6237
|
+
kind: "uniformPrefix",
|
|
6238
|
+
field: "events",
|
|
6239
|
+
prefix: "vercel.",
|
|
6240
|
+
because: "vercel.* events can't be mixed with other events in one webhook: they're delivered from a separate app. Make one webhook for each."
|
|
6241
|
+
},
|
|
6242
|
+
{
|
|
6243
|
+
kind: "nonEmpty",
|
|
6244
|
+
field: "url",
|
|
6245
|
+
warning: true,
|
|
6246
|
+
because: "With no environment key the webhook is registered nowhere. Add `live`, `sandbox` or a sandbox's slug."
|
|
6247
|
+
},
|
|
6248
|
+
{
|
|
6249
|
+
kind: "knownValues",
|
|
6250
|
+
field: "events",
|
|
6251
|
+
values: [
|
|
6252
|
+
"customer.products.updated",
|
|
6253
|
+
"customer.threshold_reached",
|
|
6254
|
+
"balances.usage_alert_triggered",
|
|
6255
|
+
"balances.limit_reached",
|
|
6256
|
+
"billing.auto_topup_failed",
|
|
6257
|
+
"billing.auto_topup_succeeded",
|
|
6258
|
+
"billing.updated",
|
|
6259
|
+
"invoice.finalized",
|
|
6260
|
+
"vercel.resources.deleted",
|
|
6261
|
+
"vercel.resources.provisioned",
|
|
6262
|
+
"vercel.resources.rotate_secrets",
|
|
6263
|
+
"vercel.webhooks.event"
|
|
6264
|
+
],
|
|
6265
|
+
warning: true,
|
|
6266
|
+
because: "isn't known to this atmn version; the server will check it."
|
|
6267
|
+
}
|
|
6268
|
+
]
|
|
6269
|
+
},
|
|
6270
|
+
"webhooks.url": {
|
|
6271
|
+
keys: {
|
|
6272
|
+
pattern: "^[a-z0-9_-]+$"
|
|
6273
|
+
},
|
|
6274
|
+
values: {
|
|
6275
|
+
pattern: "^[Hh][Tt][Tt][Pp][Ss]:\\/\\/"
|
|
6276
|
+
}
|
|
5990
6277
|
}
|
|
5991
6278
|
};
|
|
5992
6279
|
|
|
@@ -6157,7 +6444,8 @@ var entryRuleFailures = ({
|
|
|
6157
6444
|
entry,
|
|
6158
6445
|
rule,
|
|
6159
6446
|
document,
|
|
6160
|
-
parent
|
|
6447
|
+
parent,
|
|
6448
|
+
checks
|
|
6161
6449
|
}) => {
|
|
6162
6450
|
switch (rule.kind) {
|
|
6163
6451
|
case "requiredWhen": {
|
|
@@ -6197,9 +6485,29 @@ var entryRuleFailures = ({
|
|
|
6197
6485
|
}
|
|
6198
6486
|
case "nonEmpty": {
|
|
6199
6487
|
const value = entry[rule.field];
|
|
6200
|
-
|
|
6488
|
+
const empty = Array.isArray(value) ? value.length === 0 : isEntry(value) && Object.keys(value).length === 0;
|
|
6489
|
+
return empty ? [`${rule.field} is empty. ${rule.because}`] : [];
|
|
6490
|
+
}
|
|
6491
|
+
case "knownValues": {
|
|
6492
|
+
const value = entry[rule.field];
|
|
6493
|
+
if (!Array.isArray(value))
|
|
6494
|
+
return [];
|
|
6495
|
+
return value.filter((item) => typeof item === "string" && !rule.values.includes(item)).map((item) => `\`${item}\` ${rule.because}`);
|
|
6496
|
+
}
|
|
6497
|
+
case "uniformPrefix": {
|
|
6498
|
+
const value = entry[rule.field];
|
|
6499
|
+
if (!Array.isArray(value))
|
|
6500
|
+
return [];
|
|
6501
|
+
const prefixed = value.filter((item) => typeof item === "string" && item.startsWith(rule.prefix)).length;
|
|
6502
|
+
return prefixed === 0 || prefixed === value.length ? [] : [rule.because];
|
|
6503
|
+
}
|
|
6504
|
+
case "rejects": {
|
|
6505
|
+
const value = entry[rule.field];
|
|
6506
|
+
const check = checks[rule.check];
|
|
6507
|
+
if (check === undefined)
|
|
6201
6508
|
return [];
|
|
6202
|
-
|
|
6509
|
+
const stated = typeof value === "string" ? [value] : isEntry(value) ? Object.values(value).filter((item) => typeof item === "string") : [];
|
|
6510
|
+
return stated.filter((item) => check(item)).map((item) => `${rule.field} ${show(item)} is refused. ${rule.because}`);
|
|
6203
6511
|
}
|
|
6204
6512
|
case "compare": {
|
|
6205
6513
|
const a = entry[rule.field];
|
|
@@ -6261,7 +6569,7 @@ var checkUnique = ({
|
|
|
6261
6569
|
trail,
|
|
6262
6570
|
issues
|
|
6263
6571
|
}) => {
|
|
6264
|
-
const seen = new
|
|
6572
|
+
const seen = new Map;
|
|
6265
6573
|
for (const [index, entry] of entries.entries()) {
|
|
6266
6574
|
if (!isEntry(entry))
|
|
6267
6575
|
continue;
|
|
@@ -6272,15 +6580,25 @@ var checkUnique = ({
|
|
|
6272
6580
|
const pair = rule.alongside === undefined ? undefined : entry[rule.alongside];
|
|
6273
6581
|
if (rule.alongside !== undefined && typeof pair !== "string")
|
|
6274
6582
|
continue;
|
|
6275
|
-
const
|
|
6276
|
-
|
|
6583
|
+
const normalized = rule.asEnvName ? value.toUpperCase().replace(/-/g, "_") : value;
|
|
6584
|
+
const composite = rule.alongside === undefined ? normalized : `${normalized}@${pair}`;
|
|
6585
|
+
const first = seen.get(composite);
|
|
6586
|
+
if (rule.asEnvName && first !== undefined) {
|
|
6587
|
+
if (first !== value)
|
|
6588
|
+
issues.push({
|
|
6589
|
+
path: render([...trail, crumbFor({ node, key, entry, index })]),
|
|
6590
|
+
message: `${fieldName} ${show(value)} and ${show(first)} both read as ${normalized} in an env var name. ${rule.because}`
|
|
6591
|
+
});
|
|
6592
|
+
continue;
|
|
6593
|
+
}
|
|
6594
|
+
if (first !== undefined) {
|
|
6277
6595
|
const label = rule.alongside === undefined ? `${fieldName} ${show(value)}` : `${fieldName} ${show(value)} with ${rule.alongside} ${show(pair)}`;
|
|
6278
6596
|
issues.push({
|
|
6279
6597
|
path: render([...trail, crumbFor({ node, key, entry, index })]),
|
|
6280
6598
|
message: `${label} is used more than once. ${rule.because}`
|
|
6281
6599
|
});
|
|
6282
6600
|
}
|
|
6283
|
-
seen.
|
|
6601
|
+
seen.set(composite, value);
|
|
6284
6602
|
}
|
|
6285
6603
|
};
|
|
6286
6604
|
var pinOf = ({
|
|
@@ -6421,13 +6739,15 @@ var checkEntry = ({
|
|
|
6421
6739
|
checkVariants({ entry, variants: node.variants, at, issues: walk.issues });
|
|
6422
6740
|
}
|
|
6423
6741
|
for (const rule of node.rules ?? []) {
|
|
6742
|
+
const warning = "warning" in rule && rule.warning === true;
|
|
6424
6743
|
for (const message of entryRuleFailures({
|
|
6425
6744
|
entry,
|
|
6426
6745
|
rule,
|
|
6427
6746
|
document: walk.document,
|
|
6428
|
-
parent
|
|
6747
|
+
parent,
|
|
6748
|
+
checks: walk.checks
|
|
6429
6749
|
})) {
|
|
6430
|
-
walk.issues.push({ path: at, message });
|
|
6750
|
+
walk.issues.push({ path: at, message, ...warning ? { warning } : {} });
|
|
6431
6751
|
}
|
|
6432
6752
|
}
|
|
6433
6753
|
};
|
|
@@ -6490,7 +6810,17 @@ var walkValue = ({
|
|
|
6490
6810
|
return;
|
|
6491
6811
|
if (walk.hints.recordPaths.has(path)) {
|
|
6492
6812
|
const keys = walk.rules[path]?.keys;
|
|
6813
|
+
const values = walk.rules[path]?.values;
|
|
6493
6814
|
for (const [recordKey, child] of Object.entries(value)) {
|
|
6815
|
+
if (values && !isEntry(child) && !Array.isArray(child)) {
|
|
6816
|
+
for (const message of constraintFailures({
|
|
6817
|
+
name: `${key}.${recordKey}`,
|
|
6818
|
+
value: child,
|
|
6819
|
+
constraints: values
|
|
6820
|
+
})) {
|
|
6821
|
+
walk.issues.push({ path: render(trail), message });
|
|
6822
|
+
}
|
|
6823
|
+
}
|
|
6494
6824
|
if (keys) {
|
|
6495
6825
|
for (const message of constraintFailures({
|
|
6496
6826
|
name: `${key} key ${show(recordKey)}`,
|
|
@@ -6516,9 +6846,10 @@ var walkValue = ({
|
|
|
6516
6846
|
var lintDocument = ({
|
|
6517
6847
|
document,
|
|
6518
6848
|
rules,
|
|
6519
|
-
hints
|
|
6849
|
+
hints,
|
|
6850
|
+
checks = {}
|
|
6520
6851
|
}) => {
|
|
6521
|
-
const walk = { document, rules, hints, issues: [] };
|
|
6852
|
+
const walk = { document, rules, hints, checks, issues: [] };
|
|
6522
6853
|
walkEntry({ entry: document, path: "", trail: [], walk });
|
|
6523
6854
|
return walk.issues;
|
|
6524
6855
|
};
|
|
@@ -6653,7 +6984,8 @@ var CATALOG_HINTS = hintsOf({
|
|
|
6653
6984
|
"plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers",
|
|
6654
6985
|
"plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match",
|
|
6655
6986
|
"plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups",
|
|
6656
|
-
"plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups"
|
|
6987
|
+
"plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups",
|
|
6988
|
+
"webhooks.url"
|
|
6657
6989
|
],
|
|
6658
6990
|
frozenPaths: [
|
|
6659
6991
|
"plans.licenses.metadata",
|
|
@@ -6670,15 +7002,19 @@ var stated = (config) => ({
|
|
|
6670
7002
|
} : {},
|
|
6671
7003
|
...config.rewards !== undefined ? { rewards: config.rewards } : {},
|
|
6672
7004
|
...config.referralPrograms !== undefined ? { referralPrograms: config.referralPrograms } : {},
|
|
6673
|
-
...config.settings !== undefined ? { settings: config.settings } : {}
|
|
7005
|
+
...config.settings !== undefined ? { settings: config.settings } : {},
|
|
7006
|
+
...config.webhooks !== undefined ? { webhooks: config.webhooks } : {}
|
|
6674
7007
|
});
|
|
6675
7008
|
var SINGLETON_KEYS = ["settings"];
|
|
7009
|
+
var LIST_KEYS = ["webhooks"];
|
|
7010
|
+
var WARNINGS_KEY = "lint_warnings";
|
|
6676
7011
|
var CONFIG_KEYS = [
|
|
6677
7012
|
"features",
|
|
6678
7013
|
"plans",
|
|
6679
7014
|
"rewards",
|
|
6680
7015
|
"referralPrograms",
|
|
6681
|
-
"settings"
|
|
7016
|
+
"settings",
|
|
7017
|
+
"webhooks"
|
|
6682
7018
|
];
|
|
6683
7019
|
var unknownKeyIssue = (key) => key === "planVersions" ? {
|
|
6684
7020
|
path: key,
|
|
@@ -6688,10 +7024,14 @@ var unknownKeyIssue = (key) => key === "planVersions" ? {
|
|
|
6688
7024
|
message: `${key} is not a config field. The fields are ${CONFIG_KEYS.join(", ")}.`
|
|
6689
7025
|
};
|
|
6690
7026
|
var splitWire = (document) => ({
|
|
6691
|
-
catalog: Object.fromEntries(Object.entries(document).filter(([key]) => !SINGLETON_KEYS.includes(key))),
|
|
7027
|
+
catalog: Object.fromEntries(Object.entries(document).filter(([key]) => !SINGLETON_KEYS.includes(key) && !LIST_KEYS.includes(key) && key !== WARNINGS_KEY)),
|
|
6692
7028
|
singletons: {
|
|
6693
7029
|
settings: document.settings === undefined ? undefined : { config: document.settings }
|
|
6694
|
-
}
|
|
7030
|
+
},
|
|
7031
|
+
lists: {
|
|
7032
|
+
webhooks: document.webhooks
|
|
7033
|
+
},
|
|
7034
|
+
warnings: document[WARNINGS_KEY] ?? []
|
|
6695
7035
|
});
|
|
6696
7036
|
var atmn = (config) => {
|
|
6697
7037
|
const unknownKeys = Object.keys(config).filter((key) => !CONFIG_KEYS.includes(key));
|
|
@@ -6701,16 +7041,20 @@ var atmn = (config) => {
|
|
|
6701
7041
|
const issues = lintDocument({
|
|
6702
7042
|
document,
|
|
6703
7043
|
rules: LINT_RULES,
|
|
6704
|
-
hints: CATALOG_HINTS
|
|
7044
|
+
hints: CATALOG_HINTS,
|
|
7045
|
+
checks: { isLocalWebhookUrl }
|
|
6705
7046
|
});
|
|
6706
|
-
|
|
6707
|
-
|
|
7047
|
+
const errors = issues.filter((issue) => issue.warning !== true);
|
|
7048
|
+
if (errors.length > 0)
|
|
7049
|
+
throw new ConfigError(errors);
|
|
7050
|
+
const warnings = issues.filter((issue) => issue.warning === true);
|
|
6708
7051
|
return {
|
|
6709
7052
|
...toWire({
|
|
6710
7053
|
value: document,
|
|
6711
7054
|
path: "",
|
|
6712
7055
|
hints: CATALOG_HINTS
|
|
6713
7056
|
}),
|
|
7057
|
+
...warnings.length > 0 ? { [WARNINGS_KEY]: warnings } : {},
|
|
6714
7058
|
skip_deletions: false,
|
|
6715
7059
|
migration: { draft: true }
|
|
6716
7060
|
};
|
|
@@ -6780,6 +7124,21 @@ var RESETSANDBOX_REQUEST_HINTS = hintsOf({
|
|
|
6780
7124
|
frozenPaths: [],
|
|
6781
7125
|
renamedPaths: {}
|
|
6782
7126
|
});
|
|
7127
|
+
var LISTWEBHOOKS_REQUEST_HINTS = hintsOf({
|
|
7128
|
+
recordPaths: [],
|
|
7129
|
+
frozenPaths: [],
|
|
7130
|
+
renamedPaths: {}
|
|
7131
|
+
});
|
|
7132
|
+
var PREVIEWSYNCWEBHOOKS_REQUEST_HINTS = hintsOf({
|
|
7133
|
+
recordPaths: [],
|
|
7134
|
+
frozenPaths: [],
|
|
7135
|
+
renamedPaths: {}
|
|
7136
|
+
});
|
|
7137
|
+
var SYNCWEBHOOKS_REQUEST_HINTS = hintsOf({
|
|
7138
|
+
recordPaths: [],
|
|
7139
|
+
frozenPaths: [],
|
|
7140
|
+
renamedPaths: {}
|
|
7141
|
+
});
|
|
6783
7142
|
var DIFF_RESPONSE_HINTS = hintsOf({
|
|
6784
7143
|
recordPaths: ["migrations.operations.customer.customize.addItems.featureOverride.creditSchema.dimensions", "migrations.operations.customer.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "migrations.operations.customer.customize.addItems.featureOverride.creditSchema.multipliers", "migrations.operations.customer.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "migrations.operations.customer.customize.addItems.featureOverride.markups.modelMarkups", "migrations.operations.customer.customize.addItems.featureOverride.markups.providerMarkups", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenses.plan.billingControls.usageAlerts.filter.properties", "plans.licenses.plan.billingControls.usageLimits.filter.properties", "plans.licenses.plan.items.featureOverride.creditSchema.dimensions", "plans.licenses.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.plan.items.featureOverride.creditSchema.multipliers", "plans.licenses.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.plan.items.featureOverride.markups.modelMarkups", "plans.licenses.plan.items.featureOverride.markups.providerMarkups", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenses.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenses.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.customize.billingControls.usageLimits.filter.properties", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.planChange.plan.billingControls.usageLimits.filter.properties", "plans.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties"],
|
|
6785
7144
|
frozenPaths: ["features.previousAttributes", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "migrations.operations.customer.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.metadata", "plans.licenseParents.planChange.licenseChanges.plan.metadata", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.plan.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.licenseParents.planChange.plan.metadata", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.previousAttributes.metadata", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.licenseParents.siblingVersions.planChange.plan.metadata", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.previousAttributes.metadata", "plans.licenses.metadata", "plans.licenses.plan.metadata", "plans.licenses.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.metadata", "plans.planChange.licenseChanges.plan.metadata", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.planChange.plan.metadata", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.planChange.plan.metadata", "plans.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.planChange.plan.metadata", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.previousAttributes.metadata", "plans.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.metadata", "plans.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.planChange.plan.metadata", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.planChange.plan.metadata", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.plan.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.previousAttributes.metadata", "plans.variants.planChange.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.metadata", "plans.variants.planChange.licenseChanges.plan.metadata", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.planChange.plan.metadata", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.variants.planChange.plan.metadata", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.planChange.previousAttributes.metadata", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.variants.siblingVersions.planChange.plan.metadata", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.previousAttributes.metadata", "referralPrograms.previousAttributes", "rewards.previousAttributes"],
|
|
@@ -6835,6 +7194,21 @@ var RESETSANDBOX_RESPONSE_HINTS = hintsOf({
|
|
|
6835
7194
|
frozenPaths: [],
|
|
6836
7195
|
renamedPaths: {}
|
|
6837
7196
|
});
|
|
7197
|
+
var LISTWEBHOOKS_RESPONSE_HINTS = hintsOf({
|
|
7198
|
+
recordPaths: [],
|
|
7199
|
+
frozenPaths: [],
|
|
7200
|
+
renamedPaths: {}
|
|
7201
|
+
});
|
|
7202
|
+
var PREVIEWSYNCWEBHOOKS_RESPONSE_HINTS = hintsOf({
|
|
7203
|
+
recordPaths: [],
|
|
7204
|
+
frozenPaths: [],
|
|
7205
|
+
renamedPaths: {}
|
|
7206
|
+
});
|
|
7207
|
+
var SYNCWEBHOOKS_RESPONSE_HINTS = hintsOf({
|
|
7208
|
+
recordPaths: [],
|
|
7209
|
+
frozenPaths: [],
|
|
7210
|
+
renamedPaths: {}
|
|
7211
|
+
});
|
|
6838
7212
|
var createClient = (options) => ({
|
|
6839
7213
|
diff: async (body) => toFixture({
|
|
6840
7214
|
value: await post({ options, path: "/v1/catalogV2.diff", body }),
|
|
@@ -6890,11 +7264,26 @@ var createClient = (options) => ({
|
|
|
6890
7264
|
value: await post({ options, path: "/v1/sandboxes.reset", body: toWire({ value: body, path: "", hints: RESETSANDBOX_REQUEST_HINTS }) }),
|
|
6891
7265
|
path: "",
|
|
6892
7266
|
hints: RESETSANDBOX_RESPONSE_HINTS
|
|
7267
|
+
}),
|
|
7268
|
+
listWebhooks: async (body) => toFixture({
|
|
7269
|
+
value: await post({ options, path: "/v1/webhooks.list", body: toWire({ value: body, path: "", hints: LISTWEBHOOKS_REQUEST_HINTS }) }),
|
|
7270
|
+
path: "",
|
|
7271
|
+
hints: LISTWEBHOOKS_RESPONSE_HINTS
|
|
7272
|
+
}),
|
|
7273
|
+
previewSyncWebhooks: async (body) => toFixture({
|
|
7274
|
+
value: await post({ options, path: "/v1/webhooks.preview_sync", body: toWire({ value: body, path: "", hints: PREVIEWSYNCWEBHOOKS_REQUEST_HINTS }) }),
|
|
7275
|
+
path: "",
|
|
7276
|
+
hints: PREVIEWSYNCWEBHOOKS_RESPONSE_HINTS
|
|
7277
|
+
}),
|
|
7278
|
+
syncWebhooks: async (body) => toFixture({
|
|
7279
|
+
value: await post({ options, path: "/v1/webhooks.sync", body: toWire({ value: body, path: "", hints: SYNCWEBHOOKS_REQUEST_HINTS }) }),
|
|
7280
|
+
path: "",
|
|
7281
|
+
hints: SYNCWEBHOOKS_RESPONSE_HINTS
|
|
6893
7282
|
})
|
|
6894
7283
|
});
|
|
6895
7284
|
|
|
6896
7285
|
// src/version.ts
|
|
6897
|
-
var version = "2.0.
|
|
7286
|
+
var version = "2.0.35";
|
|
6898
7287
|
|
|
6899
7288
|
// src/http/autumnFetch.ts
|
|
6900
7289
|
var runtime = typeof Bun !== "undefined" ? `bun ${Bun.version}` : `node ${process.versions.node}`;
|
|
@@ -9024,6 +9413,19 @@ var SINGLETONS = {
|
|
|
9024
9413
|
]
|
|
9025
9414
|
}
|
|
9026
9415
|
};
|
|
9416
|
+
var SYNCED_LISTS = {
|
|
9417
|
+
webhooks: {
|
|
9418
|
+
wireKey: "webhooks",
|
|
9419
|
+
builder: "webhook",
|
|
9420
|
+
idField: "id",
|
|
9421
|
+
responseIdField: "id",
|
|
9422
|
+
keys: ["id", "url", "events", "description", "disabled"],
|
|
9423
|
+
required: ["events", "id", "url"],
|
|
9424
|
+
paths: ["description", "disabled", "events", "id", "url"],
|
|
9425
|
+
pull: true,
|
|
9426
|
+
envKeyed: ["url"]
|
|
9427
|
+
}
|
|
9428
|
+
};
|
|
9027
9429
|
var NESTED_FIXTURES = {
|
|
9028
9430
|
variants: {
|
|
9029
9431
|
builder: "variant",
|
|
@@ -9136,16 +9538,16 @@ import { dirname as dirname4, join as join7 } from "node:path";
|
|
|
9136
9538
|
import chalk3 from "chalk";
|
|
9137
9539
|
|
|
9138
9540
|
// src/generated/skills.ts
|
|
9139
|
-
var SKILLS_VERSION = "2.0.
|
|
9541
|
+
var SKILLS_VERSION = "2.0.35";
|
|
9140
9542
|
var SKILLS = [
|
|
9141
9543
|
{
|
|
9142
9544
|
name: "autumn-setup",
|
|
9143
9545
|
description: "First-time Autumn setup — install the atmn CLI, connect to an org (sign in, or keyless with no account), turn the user's pricing into autumn.config.ts, and push it to a sandbox org. Use when the user is new to Autumn, pastes an Autumn setup prompt, or asks to set up Autumn, add billing, monetization, subscriptions, usage-based billing, pricing, or plans. If Autumn is already set up, use autumn-catalog instead.",
|
|
9144
|
-
version: "2.0.
|
|
9546
|
+
version: "2.0.35",
|
|
9145
9547
|
markdown: `---
|
|
9146
9548
|
name: autumn-setup
|
|
9147
9549
|
description: First-time Autumn setup — install the atmn CLI, connect to an org (sign in, or keyless with no account), turn the user's pricing into autumn.config.ts, and push it to a sandbox org. Use when the user is new to Autumn, pastes an Autumn setup prompt, or asks to set up Autumn, add billing, monetization, subscriptions, usage-based billing, pricing, or plans. If Autumn is already set up, use autumn-catalog instead.
|
|
9148
|
-
version: 2.0.
|
|
9550
|
+
version: 2.0.35
|
|
9149
9551
|
---
|
|
9150
9552
|
|
|
9151
9553
|
# Setup
|
|
@@ -9303,11 +9705,11 @@ Then stop. Don't keep building, don't tour the dashboard, don't deploy anything.
|
|
|
9303
9705
|
{
|
|
9304
9706
|
name: "autumn-catalog",
|
|
9305
9707
|
description: "Modeling a user's pricing into an Autumn catalog — deciding the structure (plans, variants, add-ons, licenses, credit systems, pooled balances) before writing config, then filling in the numbers. Use when the user describes their pricing or asks to model, change, or push a catalog.",
|
|
9306
|
-
version: "2.0.
|
|
9708
|
+
version: "2.0.35",
|
|
9307
9709
|
markdown: `---
|
|
9308
9710
|
name: autumn-catalog
|
|
9309
9711
|
description: Modeling a user's pricing into an Autumn catalog — deciding the structure (plans, variants, add-ons, licenses, credit systems, pooled balances) before writing config, then filling in the numbers. Use when the user describes their pricing or asks to model, change, or push a catalog.
|
|
9310
|
-
version: 2.0.
|
|
9712
|
+
version: 2.0.35
|
|
9311
9713
|
---
|
|
9312
9714
|
|
|
9313
9715
|
# Catalog
|
|
@@ -13174,7 +13576,7 @@ Pitch: "Pro $20/mo or $200/yr — 1,000 messages per month either way."
|
|
|
13174
13576
|
},
|
|
13175
13577
|
{
|
|
13176
13578
|
path: "references/atmn.md",
|
|
13177
|
-
contents: "# atmn catalog flows\n\nContents: commands · when to use it · the config is the catalog's state (versions, renames, drafts) · variants and licenses · config shapes · splitting the config · update loop · pull · sandboxes and keys · what to show the user.\n\nUse `atmn` when a project has or should have an `autumn.config.ts` source of truth.\n\nCommands — these two, not `atmn preview` (that does not exist):\n\n```sh\natmn push # lints, then previews the diff; applies nothing\natmn push --yes # apply exactly what the preview showed\n```\n\n`push` without `--yes` is always a dry run, on a clean org too, and it never asks anything: `--yes` is the only gate. The commands that do ask (`init`, `login --keyless`, `sandbox use`, `skills install`) print the flag to pass instead whenever there is no TTY, which is every agent run; `--headless` forces that in a terminal.\n\n## When to use it\n\n- New project: run `atmn init`. It connects (sign in, or keyless), places the config, pulls whatever the org already holds, and installs these skills beside it.\n- Existing project: if `autumn.config.ts` exists, run `atmn pull` first so every row carries its server ids, then edit and push. Never rewrite a config that predates you from scratch.\n- Use MCP/API directly when the user wants dashboard/API-first changes or there is no local config workflow.\n\n## The config is the catalog's state\n\nThe document is the whole desired catalog for every collection it states. A plan or feature missing from a stated `plans` / `features` is a deletion (archived when customers depend on it). A collection left out entirely is not managed. That rule reaches down to versions: **a version row missing from `plans` is deleted too**.\n\nEvery version of a plan is a row in `plans`. Rows of one plan share a `planId`; each names its version with `versionSlug`; exactly one is `active: true` and the rest `active: false`. There is no history collection and no timeline — array order means nothing. What a version *is* (a group of customers, not a step in time) is the `autumn-concepts` skill's: read `references/plan.md` in the `autumn-concepts` skill. This file owns how rows express it.\n\nTwo fields make a row addressable:\n\n- `planId` + `versionSlug` — what you write. The pair names exactly one version. `versionSlug` is required on every plan row and every variant row, including a plan's only version; an omitted slug is a lint error, never an implicit `v1`.\n- `internalId` — the server's stable id. It is minted on the first `push --yes` and written back into the fixture; `pull` writes it for every row that lacks one. A fixture carrying it can be renamed (`planId`, `featureId`, `versionSlug`) and the server treats that as a rename, not a delete plus create.\n\n**This is where atmn differs from the API and the dashboard.** Those send one plan entry plus flags — `versioning`, `active`, `propagate` — as `references/catalog-update.md` describes. A config has none of those flags. The intent is read off the rows — which rows exist, which one is active, which carry an `internalId` — and the preview reports what the server derived. If the preview says something other than what you meant, change the rows and preview again; never look for a flag.\n\n| You want | Row edit | Preview shows |\n|---|---|---|\n| Change a version in place (active or history) | edit that row; keep its `versionSlug` and `internalId` | `~ pro@v1`, a migration for its customers |\n| The same change on every version | make the edit on every row of the plan | one `~` per row |\n| A new version; customers stay on the old one | add a row: same `planId`, new `versionSlug`, `active: true`, **no `internalId`**; flip the old row to `active: false` | `+ pro@v2`, and `active: true -> false` on the old row |\n| A draft nobody can buy yet | add the row with `active: false` beside the active one | `+` with no pointer move |\n| Rename the plan id | change `planId` on **every** row of the plan (all carry `internalId`) | a rename, not `-` + `+` |\n| Rename a version | change `versionSlug` on a row that carries `internalId` | `Version slug` rename |\n| Retire a version | remove its row | `-`; refused while customers are on it (it names both exits: migrate them, or archive the whole plan) |\n\nGuards the lint applies before anything is sent: a plan with no active row or two active rows (`mark the one customers can buy active: true and the rest active: false`), a missing `versionSlug`, the same `planId` + `versionSlug` twice. A plan whose only row is `active: false` is refused — a draft needs an active sibling.\n\nNumbers vs slugs: the server numbers versions in creation order and the preview labels rows with that number (`pro@v2`). The config never states numbers, only slugs. Push a `v1` row after `v2` already exists and the server numbers it higher; the slug still says `v1`. Never read a preview number back as the slug.\n\n## Variants and licenses\n\nWhat a variant's customize can change, when a base edit reaches a variant, and how a license link anchors to a child version are catalog-wide: `references/catalog-update.md`. What is atmn's:\n\n- A variant is an entry in its base row's `variants` array and a license link an entry in the parent row's `licenses` array: `variant({...})` and `license({...})` fixtures, inline or imported from their own files, edited in place there. Pull writes new ones in that form. Every entry the config lists is a declared overlay; there is no `propagate` in a config, so a base edit reaches a variant through the entry you write, not a follow flag.\n- Minting a base version means listing the variant entries again under the new base row, each with the new `versionSlug` and no `internalId`. The old entries stay under the old base row. One variant version cannot serve two base rows; the lint names both rows and says to version and relink the variant.\n- To retire a variant, set `archived: true` on its entry. A variant left out of the array is a deletion, refused while customers hold it.\n- Every `license({...})` states `versionSlug` — the lint refuses one without it — because the link is pinned to that child version and a config that names it links the same version in every environment. Pull writes it back. Minting a child version moves no parent; relinking a parent is editing that slug.\n\n## Config shapes\n\n`autumn.config.ts` uses the atmn package types, not raw API JSON. Field names are camelCase: `featureId`, `planId`, `billingMethod`, `billingUnits`, `freeTrial`, `intervalCount`, `versionSlug`. Follow the exported types from the package when editing config. Amounts are plain dollars: $20 is `20`, never `2000`.\n\nBuilders — `feature`, `plan`, `variant`, `license`. Items are plain objects on the plan; there is no `item()` builder and fixtures expose `featureId` / `planId`, never `.id`. A plan with an active `v2`, its `v1` kept for the customers still on it, each with an annual variant:\n\n```ts\nimport { atmn, feature, plan, variant } from \"atmn\";\n\nexport const messages = feature({\n featureId: \"messages\",\n name: \"Messages\",\n type: \"metered\",\n consumable: true,\n});\n\nexport const proAnnualV2 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v2\",\n name: \"Pro Annual\",\n customize: { price: { amount: 250, interval: \"year\" } },\n});\n\nexport const proAnnualV1 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v1\",\n name: \"Pro Annual\",\n customize: { price: { amount: 200, interval: \"year\" } },\n});\n\nexport const proV2 = plan({\n planId: \"pro\",\n versionSlug: \"v2\",\n active: true,\n name: \"Pro\",\n price: { amount: 25, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 10000, reset: { interval: \"month\" } }],\n variants: [proAnnualV2],\n});\n\nexport const proV1 = plan({\n internalId: \"prod_…\", // written back by push --yes / pull\n planId: \"pro\",\n versionSlug: \"v1\",\n active: false,\n name: \"Pro\",\n price: { amount: 20, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 5000, reset: { interval: \"month\" } }],\n variants: [proAnnualV1],\n});\n\nexport default atmn({ features: [messages], plans: [proV2, proV1] });\n```\n\nBefore `proV2` existed, `proV1` was the active row; minting `v2` was adding `proV2` without an `internalId` and flipping `proV1` to `active: false`.\n\nUsage-priced item:\n\n```ts\n{\n featureId: messages.featureId,\n included: 10000,\n reset: { interval: \"month\" },\n price: {\n amount: 0.9,\n billingMethod: \"usage_based\",\n billingUnits: 1000,\n interval: \"month\",\n },\n}\n```\n\n## Splitting the config\n\n`atmn init` scaffolds four files: `autumn.config.ts` (the root, `export default atmn({...})`), `features.ts`, `plans.ts`, `rewards.ts`. Every version of every plan lives in the `plans` array — active and history rows side by side. The config is ordinary TypeScript, so a row can be lifted into its own file under any export name and referenced from the array; `pull` follows imports and edits each fixture where it lives, and appends rows it has to add to the imported array. What it cannot do is edit a fixture that is not a plain literal — a spread, a helper call, a `.map()` — and it says so and writes nothing rather than guess.\n\n## Update loop\n\n1. Inspect or create `autumn.config.ts`.\n2. Edit the config to represent the desired catalog.\n3. Run `atmn push` to preview changes.\n4. Show the user the plan diffs, the customer impact, which plans mint a new version, and the draft migrations it would create. If the versioning is not what they meant, change the rows (table above) and preview again.\n5. Rerun `atmn push --yes` to apply the same preview.\n6. Report created/updated/deleted/archived features and plans, and the draft migrations the output lists. `push --yes` also writes `internalId` (and any `versionSlug` the server assigned) back into the fixtures — say so; those edits are expected.\n\nTwo notes push prints that are worth relaying: a plan removed while an id-less plan appears looks like a rename — pull first so the fixture carries its id; and a config still stating a deprecated field (`entityFeatureId`) gets a note naming the replacement.\n\n## Pull\n\n`atmn pull` writes the server's catalog back into the config in place: it flips `active` where the dashboard promoted a version, appends versions the config never mentioned, and backfills `internalId` and `versionSlug`. Run it after anyone touches the dashboard, and before editing a config you did not write. With no config yet, `pull` asks which folder to create it in; headless, it prints the `-c <dir>` hint and stops, so run `atmn init` or pass `-c` instead.\n\n`atmn pull --overwrite` is different: it rewrites `autumn.config.ts` and the `features.ts`, `plans.ts` and `rewards.ts` beside it from the server. It never deletes a file, and it leaves alone any file that does not import the package. It needs `--yes`, and it is the right move only when the config describes a different org than the key — the tell is `Your config no longer matches this org's catalog`. Anywhere else, a plain `pull` is what you want.\n\n## Sandboxes and keys\n\n- `atmn sandbox use <name>` pins a named sandbox; every command after it targets that sandbox until `atmn sandbox use --clear`.\n- `atmn reset --yes` empties the pinned sandbox; `atmn push --yes` rebuilds it from the config.\n- `atmn env --json` says which org, sandbox and key a command would hit, with `notes` on what to do when something is off.\n- A missing key fails fast and names the fix: `AUTUMN_SECRET_KEY is not set. Run atmn login, or atmn login --keyless if you don't have an account.` — hand that to the setup flow, don't ask the user to paste a key.\n\n## What to show the user\n\n- Which plans mint a new version, and the draft migrations that come with them.\n- Feature/plan/version deletions that will archive instead because dependencies or customers exist.\n- Which sandbox is pinned before applying anything."
|
|
13579
|
+
contents: "# atmn catalog flows\n\nContents: commands · when to use it · the config is the catalog's state (versions, renames, drafts) · variants and licenses · config shapes · splitting the config · update loop · pull · webhooks · sandboxes and keys · what to show the user.\n\nUse `atmn` when a project has or should have an `autumn.config.ts` source of truth.\n\nCommands — these two, not `atmn preview` (that does not exist):\n\n```sh\natmn push # lints, then previews the diff; applies nothing\natmn push --yes # apply exactly what the preview showed\n```\n\n`push` without `--yes` is always a dry run, on a clean org too, and it never asks anything: `--yes` is the only gate. The commands that do ask (`init`, `login --keyless`, `sandbox use`, `skills install`) print the flag to pass instead whenever there is no TTY, which is every agent run; `--headless` forces that in a terminal.\n\n## When to use it\n\n- New project: run `atmn init`. It connects (sign in, or keyless), places the config, pulls whatever the org already holds, and installs these skills beside it.\n- Existing project: if `autumn.config.ts` exists, run `atmn pull` first so every row carries its server ids, then edit and push. Never rewrite a config that predates you from scratch.\n- Use MCP/API directly when the user wants dashboard/API-first changes or there is no local config workflow.\n\n## The config is the catalog's state\n\nThe document is the whole desired catalog for every collection it states. A plan or feature missing from a stated `plans` / `features` is a deletion (archived when customers depend on it). A collection left out entirely is not managed. That rule reaches down to versions: **a version row missing from `plans` is deleted too**.\n\nEvery version of a plan is a row in `plans`. Rows of one plan share a `planId`; each names its version with `versionSlug`; exactly one is `active: true` and the rest `active: false`. There is no history collection and no timeline — array order means nothing. What a version *is* (a group of customers, not a step in time) is the `autumn-concepts` skill's: read `references/plan.md` in the `autumn-concepts` skill. This file owns how rows express it.\n\nTwo fields make a row addressable:\n\n- `planId` + `versionSlug` — what you write. The pair names exactly one version. `versionSlug` is required on every plan row and every variant row, including a plan's only version; an omitted slug is a lint error, never an implicit `v1`.\n- `internalId` — the server's stable id. It is minted on the first `push --yes` and written back into the fixture; `pull` writes it for every row that lacks one. A fixture carrying it can be renamed (`planId`, `featureId`, `versionSlug`) and the server treats that as a rename, not a delete plus create.\n\n**This is where atmn differs from the API and the dashboard.** Those send one plan entry plus flags — `versioning`, `active`, `propagate` — as `references/catalog-update.md` describes. A config has none of those flags. The intent is read off the rows — which rows exist, which one is active, which carry an `internalId` — and the preview reports what the server derived. If the preview says something other than what you meant, change the rows and preview again; never look for a flag.\n\n| You want | Row edit | Preview shows |\n|---|---|---|\n| Change a version in place (active or history) | edit that row; keep its `versionSlug` and `internalId` | `~ pro@v1`, a migration for its customers |\n| The same change on every version | make the edit on every row of the plan | one `~` per row |\n| A new version; customers stay on the old one | add a row: same `planId`, new `versionSlug`, `active: true`, **no `internalId`**; flip the old row to `active: false` | `+ pro@v2`, and `active: true -> false` on the old row |\n| A draft nobody can buy yet | add the row with `active: false` beside the active one | `+` with no pointer move |\n| Rename the plan id | change `planId` on **every** row of the plan (all carry `internalId`) | a rename, not `-` + `+` |\n| Rename a version | change `versionSlug` on a row that carries `internalId` | `Version slug` rename |\n| Retire a version | remove its row | `-`; refused while customers are on it (it names both exits: migrate them, or archive the whole plan) |\n\nGuards the lint applies before anything is sent: a plan with no active row or two active rows (`mark the one customers can buy active: true and the rest active: false`), a missing `versionSlug`, the same `planId` + `versionSlug` twice. A plan whose only row is `active: false` is refused — a draft needs an active sibling.\n\nNumbers vs slugs: the server numbers versions in creation order and the preview labels rows with that number (`pro@v2`). The config never states numbers, only slugs. Push a `v1` row after `v2` already exists and the server numbers it higher; the slug still says `v1`. Never read a preview number back as the slug.\n\n## Variants and licenses\n\nWhat a variant's customize can change, when a base edit reaches a variant, and how a license link anchors to a child version are catalog-wide: `references/catalog-update.md`. What is atmn's:\n\n- A variant is an entry in its base row's `variants` array and a license link an entry in the parent row's `licenses` array: `variant({...})` and `license({...})` fixtures, inline or imported from their own files, edited in place there. Pull writes new ones in that form. Every entry the config lists is a declared overlay; there is no `propagate` in a config, so a base edit reaches a variant through the entry you write, not a follow flag.\n- Minting a base version means listing the variant entries again under the new base row, each with the new `versionSlug` and no `internalId`. The old entries stay under the old base row. One variant version cannot serve two base rows; the lint names both rows and says to version and relink the variant.\n- To retire a variant, set `archived: true` on its entry. A variant left out of the array is a deletion, refused while customers hold it.\n- Every `license({...})` states `versionSlug` — the lint refuses one without it — because the link is pinned to that child version and a config that names it links the same version in every environment. Pull writes it back. Minting a child version moves no parent; relinking a parent is editing that slug.\n\n## Config shapes\n\n`autumn.config.ts` uses the atmn package types, not raw API JSON. Field names are camelCase: `featureId`, `planId`, `billingMethod`, `billingUnits`, `freeTrial`, `intervalCount`, `versionSlug`. Follow the exported types from the package when editing config. Amounts are plain dollars: $20 is `20`, never `2000`.\n\nBuilders — `feature`, `plan`, `variant`, `license`. Items are plain objects on the plan; there is no `item()` builder and fixtures expose `featureId` / `planId`, never `.id`. A plan with an active `v2`, its `v1` kept for the customers still on it, each with an annual variant:\n\n```ts\nimport { atmn, feature, plan, variant } from \"atmn\";\n\nexport const messages = feature({\n featureId: \"messages\",\n name: \"Messages\",\n type: \"metered\",\n consumable: true,\n});\n\nexport const proAnnualV2 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v2\",\n name: \"Pro Annual\",\n customize: { price: { amount: 250, interval: \"year\" } },\n});\n\nexport const proAnnualV1 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v1\",\n name: \"Pro Annual\",\n customize: { price: { amount: 200, interval: \"year\" } },\n});\n\nexport const proV2 = plan({\n planId: \"pro\",\n versionSlug: \"v2\",\n active: true,\n name: \"Pro\",\n price: { amount: 25, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 10000, reset: { interval: \"month\" } }],\n variants: [proAnnualV2],\n});\n\nexport const proV1 = plan({\n internalId: \"prod_…\", // written back by push --yes / pull\n planId: \"pro\",\n versionSlug: \"v1\",\n active: false,\n name: \"Pro\",\n price: { amount: 20, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 5000, reset: { interval: \"month\" } }],\n variants: [proAnnualV1],\n});\n\nexport default atmn({ features: [messages], plans: [proV2, proV1] });\n```\n\nBefore `proV2` existed, `proV1` was the active row; minting `v2` was adding `proV2` without an `internalId` and flipping `proV1` to `active: false`.\n\nUsage-priced item:\n\n```ts\n{\n featureId: messages.featureId,\n included: 10000,\n reset: { interval: \"month\" },\n price: {\n amount: 0.9,\n billingMethod: \"usage_based\",\n billingUnits: 1000,\n interval: \"month\",\n },\n}\n```\n\n## Splitting the config\n\n`atmn init` scaffolds four files: `autumn.config.ts` (the root, `export default atmn({...})`), `features.ts`, `plans.ts`, `rewards.ts`. Every version of every plan lives in the `plans` array — active and history rows side by side. The config is ordinary TypeScript, so a row can be lifted into its own file under any export name and referenced from the array; `pull` follows imports and edits each fixture where it lives, and appends rows it has to add to the imported array. What it cannot do is edit a fixture that is not a plain literal — a spread, a helper call, a `.map()` — and it says so and writes nothing rather than guess.\n\n## Update loop\n\n1. Inspect or create `autumn.config.ts`.\n2. Edit the config to represent the desired catalog.\n3. Run `atmn push` to preview changes.\n4. Show the user the plan diffs, the customer impact, which plans mint a new version, and the draft migrations it would create. If the versioning is not what they meant, change the rows (table above) and preview again.\n5. Rerun `atmn push --yes` to apply the same preview.\n6. Report created/updated/deleted/archived features and plans, and the draft migrations the output lists. `push --yes` also writes `internalId` (and any `versionSlug` the server assigned) back into the fixtures — say so; those edits are expected.\n\nTwo notes push prints that are worth relaying: a plan removed while an id-less plan appears looks like a rename — pull first so the fixture carries its id; and a config still stating a deprecated field (`entityFeatureId`) gets a note naming the replacement.\n\n## Pull\n\n`atmn pull` writes the server's catalog back into the config in place: it flips `active` where the dashboard promoted a version, appends versions the config never mentioned, and backfills `internalId` and `versionSlug`. Run it after anyone touches the dashboard, and before editing a config you did not write. With no config yet, `pull` asks which folder to create it in; headless, it prints the `-c <dir>` hint and stops, so run `atmn init` or pass `-c` instead.\n\n`atmn pull --overwrite` is different: it rewrites `autumn.config.ts` and the `features.ts`, `plans.ts` and `rewards.ts` beside it from the server. It never deletes a file, and it leaves alone any file that does not import the package. It needs `--yes`, and it is the right move only when the config describes a different org than the key — the tell is `Your config no longer matches this org's catalog`. Anywhere else, a plain `pull` is what you want.\n\n## Webhooks\n\n`webhooks` in the config lists the Autumn webhooks it manages, keyed by `id`. Unlike the catalog it is never a deletion list: `push` creates or updates the webhooks it states and leaves every other webhook alone (the preview shows them as `unmanaged`).\n\n`url` is a map keyed by environment, never one string. A missing key means \"don't register this webhook there\", which is not an error:\n\n```ts\nimport { atmn, webhook } from \"atmn\";\n\nexport default atmn({\n webhooks: [\n webhook({\n id: \"billing\",\n events: [\"billing.updated\", \"balances.limit_reached\"],\n url: {\n live: \"https://myapp.com/api/autumn\", // atmn push -p\n sandbox: \"https://staging.myapp.com/api/autumn\", // the default sandbox\n \"qa-team\": \"https://qa.myapp.com/api/autumn\", // atmn sandbox use qa-team\n },\n }),\n ],\n});\n```\n\n- Keys: `live` for `-p`, `sandbox` for the default sandbox, or a named sandbox's slug (its name lowercased; no spaces). Never copy a sandbox URL into `live`: ask the user for the production URL, or leave `live` out.\n- Every URL must be https and publicly reachable; localhost and private networks are refused, tunnels such as ngrok work. `events` needs at least one entry.\n- `id` is permanent: changing it registers a new webhook. Two ids that differ only by case or `-`/`_` are refused.\n- The preview gives a changed URL its own line (`billing url: old → new`). Read it out to the user before `--yes`.\n- `push --yes` writes each new webhook's signing secret once and prints exactly where: `AUTUMN_WEBHOOK_<ID>_SECRET` in `.env.prod` for `-p`, `AUTUMN_WEBHOOK_<ID>_<ORG4>_SECRET` in `.env.local` (or `.env`) for a sandbox. Relay the variable name and file; never print or read the secret.\n- `pull` edits only the target env's key: it adds webhooks it finds, sets a changed URL, removes the env's key when the server no longer has that webhook, and deletes a webhook whose map ends up empty. A URL written as code (`process.env.X`) is never rewritten; pull warns when it differs from the server. Webhooks already in the dashboard will be pulled and be editable in the config once you pull as usual. Since the dashboard doesn't let you set an ID, a permanent ID will be assigned to this for future reference.\n\n## Sandboxes and keys\n\n- `atmn sandbox use <name>` pins a named sandbox; every command after it targets that sandbox until `atmn sandbox use --clear`.\n- `atmn reset --yes` empties the pinned sandbox; `atmn push --yes` rebuilds it from the config.\n- `atmn env --json` says which org, sandbox and key a command would hit, with `notes` on what to do when something is off.\n- A missing key fails fast and names the fix: `AUTUMN_SECRET_KEY is not set. Run atmn login, or atmn login --keyless if you don't have an account.` — hand that to the setup flow, don't ask the user to paste a key.\n\n## What to show the user\n\n- Which plans mint a new version, and the draft migrations that come with them.\n- Feature/plan/version deletions that will archive instead because dependencies or customers exist.\n- Which sandbox is pinned before applying anything."
|
|
13178
13580
|
},
|
|
13179
13581
|
{
|
|
13180
13582
|
path: "references/catalog-update.md",
|
|
@@ -13189,11 +13591,11 @@ Pitch: "Pro $20/mo or $200/yr — 1,000 messages per month either way."
|
|
|
13189
13591
|
{
|
|
13190
13592
|
name: "autumn-integrate",
|
|
13191
13593
|
description: "Integrating Autumn into an app's backend — creating customers, billing flows (attach, checkout, upgrade, cancel), gating features with check, recording usage with track, and exposing billing data to the frontend. Use when the user asks to integrate Autumn, add billing/payments to their app, gate features, meter usage, or build checkout/upgrade flows. Requires a pushed catalog; use autumn-catalog first if plans don't exist yet.",
|
|
13192
|
-
version: "2.0.
|
|
13594
|
+
version: "2.0.35",
|
|
13193
13595
|
markdown: `---
|
|
13194
13596
|
name: autumn-integrate
|
|
13195
13597
|
description: Integrating Autumn into an app's backend — creating customers, billing flows (attach, checkout, upgrade, cancel), gating features with check, recording usage with track, and exposing billing data to the frontend. Use when the user asks to integrate Autumn, add billing/payments to their app, gate features, meter usage, or build checkout/upgrade flows. Requires a pushed catalog; use autumn-catalog first if plans don't exist yet.
|
|
13196
|
-
version: 2.0.
|
|
13598
|
+
version: 2.0.35
|
|
13197
13599
|
---
|
|
13198
13600
|
|
|
13199
13601
|
# Integrate
|
|
@@ -17795,11 +18197,11 @@ Monitor your logs for this message. If you see it, check [status.useautumn.com](
|
|
|
17795
18197
|
{
|
|
17796
18198
|
name: "autumn-concepts",
|
|
17797
18199
|
description: "Understanding Autumn's billing objects before acting on them — what a plan version is and what active means, when a trial starts or ends billing, how entity- and seat-scoped subscriptions differ from the customer's own, what a customize diff actually changes, and how caps, overage, and top-ups behave. Load before versioning, editing, or drafting a plan, or when a customer's state does not match the plain reading of their plan.",
|
|
17798
|
-
version: "2.0.
|
|
18200
|
+
version: "2.0.35",
|
|
17799
18201
|
markdown: `---
|
|
17800
18202
|
name: autumn-concepts
|
|
17801
18203
|
description: Understanding Autumn's billing objects before acting on them — what a plan version is and what active means, when a trial starts or ends billing, how entity- and seat-scoped subscriptions differ from the customer's own, what a customize diff actually changes, and how caps, overage, and top-ups behave. Load before versioning, editing, or drafting a plan, or when a customer's state does not match the plain reading of their plan.
|
|
17802
|
-
version: 2.0.
|
|
18204
|
+
version: 2.0.35
|
|
17803
18205
|
---
|
|
17804
18206
|
|
|
17805
18207
|
# Concepts
|
|
@@ -19060,13 +19462,13 @@ Wrote ${writtenKeys.join(" and ")} to ${envPath}
|
|
|
19060
19462
|
|
|
19061
19463
|
// src/actions/pull.ts
|
|
19062
19464
|
import {
|
|
19063
|
-
existsSync as
|
|
19465
|
+
existsSync as existsSync13,
|
|
19064
19466
|
mkdirSync as mkdirSync4,
|
|
19065
|
-
readFileSync as
|
|
19467
|
+
readFileSync as readFileSync14,
|
|
19066
19468
|
unlinkSync,
|
|
19067
|
-
writeFileSync as
|
|
19469
|
+
writeFileSync as writeFileSync10
|
|
19068
19470
|
} from "node:fs";
|
|
19069
|
-
import { basename as basename3, dirname as
|
|
19471
|
+
import { basename as basename3, dirname as dirname12, join as join14 } from "node:path";
|
|
19070
19472
|
|
|
19071
19473
|
// src/config/loadConfig.ts
|
|
19072
19474
|
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
@@ -19542,7 +19944,8 @@ var importConfigModule = async ({
|
|
|
19542
19944
|
}) => {
|
|
19543
19945
|
const result = spawnSync2(process.execPath, importConfigArgs({ path }), {
|
|
19544
19946
|
cwd: dirname7(path),
|
|
19545
|
-
encoding: "utf8"
|
|
19947
|
+
encoding: "utf8",
|
|
19948
|
+
env: process.env
|
|
19546
19949
|
});
|
|
19547
19950
|
if (result.status !== 0 || result.stdout.length === 0) {
|
|
19548
19951
|
throw new Error(result.stderr.trim() || `Failed to load ${path}`);
|
|
@@ -20142,9 +20545,11 @@ var appendPropertyEdit = ({
|
|
|
20142
20545
|
const afterComma = trailingComma ? lastEnd + between.indexOf(",") + 1 : lastEnd;
|
|
20143
20546
|
if (multiline) {
|
|
20144
20547
|
const indent = leadingIndentOfLine(source, last.range().start.index);
|
|
20548
|
+
const restOfLine = source.slice(afterComma, lineEndOf(source, afterComma));
|
|
20549
|
+
const at = trailingComma && /^\s*\/\/.*$/.test(restOfLine) ? afterComma + restOfLine.length : afterComma;
|
|
20145
20550
|
return {
|
|
20146
|
-
startPos:
|
|
20147
|
-
endPos:
|
|
20551
|
+
startPos: at,
|
|
20552
|
+
endPos: at,
|
|
20148
20553
|
insertedText: trailingComma ? `
|
|
20149
20554
|
${indent}${pair},` : `,
|
|
20150
20555
|
${indent}${pair},`
|
|
@@ -20258,12 +20663,42 @@ var matchesLiteral = ({
|
|
|
20258
20663
|
const proposed = readFixtureValue({ node: literal[0] });
|
|
20259
20664
|
return !isDynamic(proposed) && isDeepStrictEqual(value, proposed);
|
|
20260
20665
|
};
|
|
20261
|
-
var
|
|
20666
|
+
var PLAIN_IDENTIFIER2 = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
20667
|
+
var keyText2 = ({
|
|
20668
|
+
key,
|
|
20669
|
+
bareKeys
|
|
20670
|
+
}) => bareKeys && PLAIN_IDENTIFIER2.test(key) ? key : JSON.stringify(key);
|
|
20671
|
+
var wholeLineEdit = ({
|
|
20672
|
+
source,
|
|
20673
|
+
member,
|
|
20674
|
+
comma
|
|
20675
|
+
}) => {
|
|
20676
|
+
const start = member.range().start.index;
|
|
20677
|
+
const lineStart = lineStartOf(source, start);
|
|
20678
|
+
if (source.slice(lineStart, start).trim() !== "")
|
|
20679
|
+
return null;
|
|
20680
|
+
const end = Math.max(member.range().end.index, comma?.range().end.index ?? 0);
|
|
20681
|
+
const lineEnd = lineEndOf(source, end);
|
|
20682
|
+
if (!/^\s*(\/\/.*)?$/.test(source.slice(end, lineEnd)))
|
|
20683
|
+
return null;
|
|
20684
|
+
return {
|
|
20685
|
+
startPos: lineStart,
|
|
20686
|
+
endPos: Math.min(lineEnd + 1, source.length),
|
|
20687
|
+
insertedText: ""
|
|
20688
|
+
};
|
|
20689
|
+
};
|
|
20690
|
+
var removeMemberEdits = ({
|
|
20691
|
+
source,
|
|
20692
|
+
member
|
|
20693
|
+
}) => {
|
|
20262
20694
|
const siblings = member.parent()?.children() ?? [];
|
|
20263
20695
|
const index = siblings.findIndex((sibling) => sibling.range().start.index === member.range().start.index);
|
|
20264
20696
|
const next = siblings.slice(index + 1).find((sibling) => sibling.kind() !== "comment");
|
|
20265
20697
|
const previous = siblings.slice(0, index).reverse().find((sibling) => sibling.kind() !== "comment");
|
|
20266
20698
|
const comma = next?.kind() === "," ? next : previous?.kind() === "," ? previous : null;
|
|
20699
|
+
const line = comma === next || comma === null ? wholeLineEdit({ source, member, comma }) : null;
|
|
20700
|
+
if (line !== null)
|
|
20701
|
+
return [line];
|
|
20267
20702
|
return [member, ...comma === null ? [] : [comma]].map((node) => ({
|
|
20268
20703
|
startPos: node.range().start.index,
|
|
20269
20704
|
endPos: node.range().end.index,
|
|
@@ -20275,7 +20710,8 @@ var pathEdits = ({
|
|
|
20275
20710
|
object,
|
|
20276
20711
|
path,
|
|
20277
20712
|
text,
|
|
20278
|
-
builders
|
|
20713
|
+
builders,
|
|
20714
|
+
bareKeys
|
|
20279
20715
|
}) => {
|
|
20280
20716
|
let current = object;
|
|
20281
20717
|
for (let index = 0;index < path.length; index += 1) {
|
|
@@ -20317,8 +20753,8 @@ var pathEdits = ({
|
|
|
20317
20753
|
return "missing-array-element";
|
|
20318
20754
|
let inserted = text;
|
|
20319
20755
|
for (const key of remaining.reverse())
|
|
20320
|
-
inserted = `{ ${
|
|
20321
|
-
const pair = `${
|
|
20756
|
+
inserted = `{ ${keyText2({ key: String(key), bareKeys })}: ${inserted} }`;
|
|
20757
|
+
const pair = `${keyText2({ key: segment, bareKeys })}: ${inserted}`;
|
|
20322
20758
|
const members = current.namedChildren().filter((child) => child.kind() !== "comment");
|
|
20323
20759
|
if (members.length === 0) {
|
|
20324
20760
|
const closing = current.range().end.index - 1;
|
|
@@ -20340,7 +20776,7 @@ var pathEdits = ({
|
|
|
20340
20776
|
if (isDynamic(currentValue))
|
|
20341
20777
|
return "dynamic-value";
|
|
20342
20778
|
if (text === null)
|
|
20343
|
-
return member === undefined ? "array-element-removal" : removeMemberEdits({ member });
|
|
20779
|
+
return member === undefined ? "array-element-removal" : removeMemberEdits({ source, member });
|
|
20344
20780
|
if (matchesLiteral({ value: currentValue, text }))
|
|
20345
20781
|
return [];
|
|
20346
20782
|
return [
|
|
@@ -20360,7 +20796,8 @@ var patchFixturePaths = ({
|
|
|
20360
20796
|
id,
|
|
20361
20797
|
where,
|
|
20362
20798
|
assignments,
|
|
20363
|
-
builders = []
|
|
20799
|
+
builders = [],
|
|
20800
|
+
bareKeys = false
|
|
20364
20801
|
}) => {
|
|
20365
20802
|
const selector = { builder, idField, id, where, allowDynamic: true };
|
|
20366
20803
|
const initial = findFixtures({ source, ...selector });
|
|
@@ -20371,7 +20808,7 @@ var patchFixturePaths = ({
|
|
|
20371
20808
|
const matches = findFixtures({ source, ...selector });
|
|
20372
20809
|
const match = matches[0];
|
|
20373
20810
|
const object = matches.length === 1 && match !== undefined ? fixtureObjectOf(match) : null;
|
|
20374
|
-
const edits = object === null ? "ambiguous-fixture" : pathEdits({ source, object, builders, ...assignment });
|
|
20811
|
+
const edits = object === null ? "ambiguous-fixture" : pathEdits({ source, object, builders, bareKeys, ...assignment });
|
|
20375
20812
|
if (typeof edits === "string") {
|
|
20376
20813
|
skipped.push({ path: assignment.path, reason: edits });
|
|
20377
20814
|
continue;
|
|
@@ -22016,40 +22453,493 @@ var rewriteConfig = ({
|
|
|
22016
22453
|
return { rewritten: [configPath, ...rewritten], kept };
|
|
22017
22454
|
};
|
|
22018
22455
|
|
|
22019
|
-
// src/
|
|
22020
|
-
|
|
22456
|
+
// src/actions/webhooks/isDashboardWebhook.ts
|
|
22457
|
+
var SVIX_ENDPOINT_ID = /^ep_[0-9A-Za-z]{27}$/;
|
|
22458
|
+
var isDashboardWebhook = ({ id }) => SVIX_ENDPOINT_ID.test(id);
|
|
22021
22459
|
|
|
22022
|
-
// src/
|
|
22023
|
-
var
|
|
22024
|
-
|
|
22025
|
-
|
|
22026
|
-
|
|
22027
|
-
|
|
22028
|
-
|
|
22029
|
-
|
|
22030
|
-
|
|
22031
|
-
|
|
22032
|
-
|
|
22033
|
-
|
|
22034
|
-
|
|
22035
|
-
|
|
22036
|
-
|
|
22037
|
-
|
|
22038
|
-
|
|
22039
|
-
|
|
22040
|
-
|
|
22041
|
-
|
|
22042
|
-
|
|
22460
|
+
// ../ksuid/src/base62.ts
|
|
22461
|
+
var ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
22462
|
+
var base62Encode = ({
|
|
22463
|
+
bytes,
|
|
22464
|
+
padTo
|
|
22465
|
+
}) => {
|
|
22466
|
+
const digits = [];
|
|
22467
|
+
const working = new Uint8Array(bytes);
|
|
22468
|
+
let allZero = false;
|
|
22469
|
+
while (!allZero) {
|
|
22470
|
+
allZero = true;
|
|
22471
|
+
let remainder = 0;
|
|
22472
|
+
for (let i = 0;i < working.length; i++) {
|
|
22473
|
+
const accumulator = remainder * 256 + working[i];
|
|
22474
|
+
working[i] = Math.floor(accumulator / 62);
|
|
22475
|
+
remainder = accumulator % 62;
|
|
22476
|
+
if (working[i] !== 0)
|
|
22477
|
+
allZero = false;
|
|
22478
|
+
}
|
|
22479
|
+
digits.push(remainder);
|
|
22480
|
+
}
|
|
22481
|
+
digits.reverse();
|
|
22482
|
+
while (digits.length < padTo) {
|
|
22483
|
+
digits.unshift(0);
|
|
22484
|
+
}
|
|
22485
|
+
return digits.map((d) => ALPHABET[d]).join("");
|
|
22486
|
+
};
|
|
22487
|
+
|
|
22488
|
+
// ../ksuid/src/random.ts
|
|
22489
|
+
var getRandomBytes = ({ size }) => {
|
|
22490
|
+
const buffer = new Uint8Array(size);
|
|
22491
|
+
globalThis.crypto.getRandomValues(buffer);
|
|
22492
|
+
return buffer;
|
|
22493
|
+
};
|
|
22494
|
+
|
|
22495
|
+
// ../ksuid/src/index.ts
|
|
22496
|
+
var KSUID_EPOCH = 1400000000;
|
|
22497
|
+
var PAYLOAD_BYTES = 20;
|
|
22498
|
+
var ENCODED_LENGTH = 27;
|
|
22499
|
+
var generateKsuid = ({ prefix = "" } = {}) => {
|
|
22500
|
+
const payload = new Uint8Array(PAYLOAD_BYTES);
|
|
22501
|
+
const timestamp = Math.floor(Date.now() / 1000) - KSUID_EPOCH;
|
|
22502
|
+
payload[0] = timestamp >>> 24 & 255;
|
|
22503
|
+
payload[1] = timestamp >>> 16 & 255;
|
|
22504
|
+
payload[2] = timestamp >>> 8 & 255;
|
|
22505
|
+
payload[3] = timestamp & 255;
|
|
22506
|
+
const randomBytes = getRandomBytes({ size: 16 });
|
|
22507
|
+
payload.set(randomBytes, 4);
|
|
22508
|
+
const encoded = base62Encode({ bytes: payload, padTo: ENCODED_LENGTH });
|
|
22509
|
+
return `${prefix}${encoded}`;
|
|
22510
|
+
};
|
|
22511
|
+
|
|
22512
|
+
// src/actions/webhooks/newWebhookId.ts
|
|
22513
|
+
var newWebhookId = () => generateKsuid({ prefix: "wh_" });
|
|
22514
|
+
|
|
22515
|
+
// src/actions/pull/webhooks/appendWebhook.ts
|
|
22516
|
+
var SPEC = SYNCED_LISTS.webhooks;
|
|
22517
|
+
var COLLECTION = "webhooks";
|
|
22518
|
+
var fixtureRowOf = ({
|
|
22519
|
+
webhook,
|
|
22520
|
+
envKey
|
|
22521
|
+
}) => ({
|
|
22522
|
+
id: webhook.id,
|
|
22523
|
+
url: { [envKey]: webhook.url },
|
|
22524
|
+
events: webhook.events,
|
|
22525
|
+
...webhook.description ? { description: webhook.description } : {},
|
|
22526
|
+
...webhook.disabled ? { disabled: true } : {}
|
|
22527
|
+
});
|
|
22528
|
+
var appendWebhook = ({
|
|
22529
|
+
pull,
|
|
22530
|
+
webhook,
|
|
22531
|
+
envKey
|
|
22532
|
+
}) => {
|
|
22533
|
+
const { configPath, files } = pull;
|
|
22534
|
+
const configSource = files.get(configPath) ?? "";
|
|
22535
|
+
const withKey = insertCollection({
|
|
22536
|
+
source: configSource,
|
|
22537
|
+
collection: COLLECTION
|
|
22538
|
+
});
|
|
22539
|
+
if (withKey === null)
|
|
22540
|
+
return "append to `webhooks` by hand: no atmn({...}) call";
|
|
22541
|
+
const spreads = rootSpreadNames({ source: configSource });
|
|
22542
|
+
if (withKey !== configSource && spreads.length > 0)
|
|
22543
|
+
return `append to \`webhooks\` by hand: atmn() spreads \`${spreads.join("`, `")}\`, which may already hold it`;
|
|
22544
|
+
files.set(configPath, withKey);
|
|
22545
|
+
const target = resolveCollectionTarget({
|
|
22546
|
+
configPath,
|
|
22547
|
+
files,
|
|
22548
|
+
collection: COLLECTION
|
|
22549
|
+
});
|
|
22550
|
+
if (target === null)
|
|
22551
|
+
return "append to `webhooks` by hand: it is not an array literal";
|
|
22552
|
+
const text = (indent) => emitFixture({
|
|
22553
|
+
spec: SPEC,
|
|
22554
|
+
row: fixtureRowOf({ webhook, envKey }),
|
|
22555
|
+
includeMappings: false,
|
|
22556
|
+
indent
|
|
22557
|
+
});
|
|
22558
|
+
const source = files.get(target.file) ?? "";
|
|
22559
|
+
const updated = target.kind === "inline" ? appendToCollection({ source, collection: COLLECTION, text }) : appendToBinding({ source, name: target.name, text });
|
|
22560
|
+
if (updated === null)
|
|
22561
|
+
return "append to `webhooks` by hand: it is not an array literal";
|
|
22562
|
+
files.set(target.file, ensureBuilderImport({
|
|
22563
|
+
source: updated,
|
|
22564
|
+
builder: SPEC.builder,
|
|
22565
|
+
collection: COLLECTION
|
|
22566
|
+
}));
|
|
22567
|
+
return null;
|
|
22568
|
+
};
|
|
22569
|
+
|
|
22570
|
+
// src/actions/pull/webhooks/locateWebhook.ts
|
|
22571
|
+
var SPEC2 = SYNCED_LISTS.webhooks;
|
|
22572
|
+
var locateWebhook = ({
|
|
22573
|
+
pull,
|
|
22574
|
+
id
|
|
22575
|
+
}) => locateFixture({
|
|
22576
|
+
configPath: pull.configPath,
|
|
22577
|
+
files: pull.files,
|
|
22578
|
+
builder: SPEC2.builder,
|
|
22579
|
+
idField: SPEC2.idField,
|
|
22580
|
+
id,
|
|
22581
|
+
allowDynamic: true
|
|
22582
|
+
});
|
|
22583
|
+
|
|
22584
|
+
// src/actions/pull/webhooks/updateWebhook.ts
|
|
22585
|
+
import { isDeepStrictEqual as isDeepStrictEqual2 } from "node:util";
|
|
22586
|
+
var SPEC3 = SYNCED_LISTS.webhooks;
|
|
22587
|
+
var sameEvents = (left, right) => Array.isArray(left) && isDeepStrictEqual2([...left].sort(), [...right].sort());
|
|
22588
|
+
var fieldAssignments = ({
|
|
22589
|
+
webhook,
|
|
22590
|
+
stated: stated2
|
|
22591
|
+
}) => {
|
|
22592
|
+
const assignments = [];
|
|
22593
|
+
if (webhook.events.length > 0 && !sameEvents(stated2.events, webhook.events))
|
|
22594
|
+
assignments.push({
|
|
22595
|
+
path: ["events"],
|
|
22596
|
+
text: `[${webhook.events.map((event) => JSON.stringify(event)).join(", ")}]`
|
|
22597
|
+
});
|
|
22598
|
+
if ((stated2.description ?? "") !== (webhook.description ?? ""))
|
|
22599
|
+
assignments.push({
|
|
22600
|
+
path: ["description"],
|
|
22601
|
+
text: webhook.description ? JSON.stringify(webhook.description) : null
|
|
22602
|
+
});
|
|
22603
|
+
if (stated2.disabled === true !== webhook.disabled)
|
|
22604
|
+
assignments.push({
|
|
22605
|
+
path: ["disabled"],
|
|
22606
|
+
text: webhook.disabled ? "true" : null
|
|
22607
|
+
});
|
|
22608
|
+
return assignments;
|
|
22609
|
+
};
|
|
22610
|
+
var nonLiteralUrlWarning = ({
|
|
22611
|
+
id,
|
|
22612
|
+
envKey,
|
|
22613
|
+
server,
|
|
22614
|
+
config
|
|
22615
|
+
}) => {
|
|
22616
|
+
const pad = " ".repeat(id.length + 4);
|
|
22617
|
+
return [
|
|
22618
|
+
`⚠ ${id} url.${envKey} isn't a plain string, so pull left it untouched`,
|
|
22619
|
+
`${pad}server: ${server ?? "(not registered)"}`,
|
|
22620
|
+
`${pad}your config: ${typeof config === "string" ? config : "(no value)"}`,
|
|
22621
|
+
`${pad}Update it by hand, or make it a string and pull will manage it.`
|
|
22622
|
+
].join(`
|
|
22623
|
+
`);
|
|
22624
|
+
};
|
|
22625
|
+
var updateWebhook = ({
|
|
22626
|
+
pull,
|
|
22627
|
+
webhook,
|
|
22628
|
+
stated: stated2,
|
|
22629
|
+
envKey
|
|
22630
|
+
}) => {
|
|
22631
|
+
const result = { lines: [], warnings: [], unlocated: [] };
|
|
22632
|
+
if (webhook.events.length === 0 && Array.isArray(stated2.events))
|
|
22633
|
+
result.warnings.push(`⚠ ${webhook.id} the dashboard webhook at this url receives every event; your next push narrows it to ${stated2.events.join(", ")}`);
|
|
22634
|
+
const located = locateWebhook({ pull, id: webhook.id });
|
|
22635
|
+
if (located === null) {
|
|
22636
|
+
result.unlocated.push({
|
|
22637
|
+
id: webhook.id,
|
|
22638
|
+
action: "update from the server by hand"
|
|
22639
|
+
});
|
|
22640
|
+
return result;
|
|
22641
|
+
}
|
|
22642
|
+
const patched = patchFixturePaths({
|
|
22643
|
+
source: located.source,
|
|
22644
|
+
builder: SPEC3.builder,
|
|
22645
|
+
idField: SPEC3.idField,
|
|
22646
|
+
id: webhook.id,
|
|
22647
|
+
assignments: [
|
|
22648
|
+
{ path: ["url", envKey], text: JSON.stringify(webhook.url) },
|
|
22649
|
+
...fieldAssignments({ webhook, stated: stated2 })
|
|
22650
|
+
],
|
|
22651
|
+
bareKeys: true
|
|
22652
|
+
});
|
|
22653
|
+
if (patched === null) {
|
|
22654
|
+
result.unlocated.push({
|
|
22655
|
+
id: webhook.id,
|
|
22656
|
+
action: "update from the server by hand"
|
|
22657
|
+
});
|
|
22658
|
+
return result;
|
|
22659
|
+
}
|
|
22660
|
+
for (const { path } of patched.skipped) {
|
|
22661
|
+
const field = path.join(".");
|
|
22662
|
+
if (field !== `url.${envKey}`) {
|
|
22663
|
+
result.warnings.push(`⚠ ${webhook.id} ${field} isn't a plain literal, so pull left it untouched`);
|
|
22664
|
+
continue;
|
|
22665
|
+
}
|
|
22666
|
+
const config = stated2.url?.[envKey];
|
|
22667
|
+
if (config === webhook.url)
|
|
22668
|
+
continue;
|
|
22669
|
+
result.warnings.push(nonLiteralUrlWarning({
|
|
22670
|
+
id: webhook.id,
|
|
22671
|
+
envKey,
|
|
22672
|
+
server: webhook.url,
|
|
22673
|
+
config
|
|
22674
|
+
}));
|
|
22675
|
+
}
|
|
22676
|
+
if (patched.source === located.source)
|
|
22677
|
+
return result;
|
|
22678
|
+
pull.files.set(located.file, patched.source);
|
|
22679
|
+
result.lines.push(`~ webhook ${webhook.id}`);
|
|
22680
|
+
return result;
|
|
22681
|
+
};
|
|
22682
|
+
|
|
22683
|
+
// src/actions/pull/webhooks/removeWebhookEnv.ts
|
|
22684
|
+
var SPEC4 = SYNCED_LISTS.webhooks;
|
|
22685
|
+
var urlMapIsEmpty = ({
|
|
22686
|
+
pull,
|
|
22687
|
+
id
|
|
22688
|
+
}) => {
|
|
22689
|
+
const located = locateWebhook({ pull, id });
|
|
22690
|
+
const object = located === null ? null : fixtureObjectOf(located.node);
|
|
22691
|
+
const member = object?.namedChildren().find((child) => child.kind() === "pair" && child.field("key") !== null && fixtureKeyOf({ node: child.field("key") }) === "url");
|
|
22692
|
+
const value = member?.field("value");
|
|
22693
|
+
if (value === null || value === undefined)
|
|
22694
|
+
return false;
|
|
22695
|
+
const read = readFixtureValue({ node: value });
|
|
22696
|
+
return typeof read === "object" && read !== null && Object.keys(read).length === 0;
|
|
22697
|
+
};
|
|
22698
|
+
var deleteWebhook = ({
|
|
22699
|
+
pull,
|
|
22700
|
+
id
|
|
22701
|
+
}) => {
|
|
22702
|
+
const located = locateWebhook({ pull, id });
|
|
22703
|
+
if (located === null)
|
|
22704
|
+
return false;
|
|
22705
|
+
const removed = deleteFixtureLiteral({
|
|
22706
|
+
source: located.source,
|
|
22707
|
+
builder: SPEC4.builder,
|
|
22708
|
+
idField: SPEC4.idField,
|
|
22709
|
+
id
|
|
22710
|
+
});
|
|
22711
|
+
if (removed === null)
|
|
22712
|
+
return false;
|
|
22713
|
+
pull.files.set(located.file, removed.source);
|
|
22714
|
+
if (removed.exportedName !== undefined) {
|
|
22715
|
+
const referenceFiles = new Set([pull.configPath]);
|
|
22716
|
+
const target = resolveCollectionTarget({
|
|
22717
|
+
configPath: pull.configPath,
|
|
22718
|
+
files: pull.files,
|
|
22719
|
+
collection: "webhooks"
|
|
22720
|
+
});
|
|
22721
|
+
if (target !== null)
|
|
22722
|
+
referenceFiles.add(target.file);
|
|
22723
|
+
for (const file of referenceFiles)
|
|
22724
|
+
pull.files.set(file, deleteReference({
|
|
22725
|
+
source: pull.files.get(file) ?? "",
|
|
22726
|
+
name: removed.exportedName
|
|
22727
|
+
}));
|
|
22728
|
+
}
|
|
22729
|
+
return true;
|
|
22730
|
+
};
|
|
22731
|
+
var removeWebhookEnv = ({
|
|
22732
|
+
pull,
|
|
22733
|
+
stated: stated2,
|
|
22734
|
+
envKey
|
|
22735
|
+
}) => {
|
|
22736
|
+
const result = { lines: [], warnings: [], unlocated: [] };
|
|
22737
|
+
const located = locateWebhook({ pull, id: stated2.id });
|
|
22738
|
+
const patched = located === null ? null : patchFixturePaths({
|
|
22739
|
+
source: located.source,
|
|
22740
|
+
builder: SPEC4.builder,
|
|
22741
|
+
idField: SPEC4.idField,
|
|
22742
|
+
id: stated2.id,
|
|
22743
|
+
assignments: [{ path: ["url", envKey], text: null }]
|
|
22744
|
+
});
|
|
22745
|
+
if (located === null || patched === null) {
|
|
22746
|
+
result.unlocated.push({
|
|
22747
|
+
id: stated2.id,
|
|
22748
|
+
action: `remove url.${envKey} by hand`
|
|
22749
|
+
});
|
|
22750
|
+
return result;
|
|
22751
|
+
}
|
|
22752
|
+
if (patched.skipped.length > 0) {
|
|
22753
|
+
result.warnings.push(nonLiteralUrlWarning({
|
|
22754
|
+
id: stated2.id,
|
|
22755
|
+
envKey,
|
|
22756
|
+
server: undefined,
|
|
22757
|
+
config: stated2.url?.[envKey]
|
|
22758
|
+
}));
|
|
22759
|
+
return result;
|
|
22760
|
+
}
|
|
22761
|
+
if (patched.source === located.source)
|
|
22762
|
+
return result;
|
|
22763
|
+
pull.files.set(located.file, patched.source);
|
|
22764
|
+
if (urlMapIsEmpty({ pull, id: stated2.id })) {
|
|
22765
|
+
if (deleteWebhook({ pull, id: stated2.id })) {
|
|
22766
|
+
result.lines.push(`- webhook ${stated2.id}`);
|
|
22767
|
+
return result;
|
|
22768
|
+
}
|
|
22769
|
+
result.unlocated.push({
|
|
22770
|
+
id: stated2.id,
|
|
22771
|
+
action: "delete the webhook by hand: its url map is now empty"
|
|
22772
|
+
});
|
|
22773
|
+
return result;
|
|
22774
|
+
}
|
|
22775
|
+
result.lines.push(`- webhook ${stated2.id} url.${envKey}`);
|
|
22776
|
+
return result;
|
|
22777
|
+
};
|
|
22778
|
+
|
|
22779
|
+
// src/actions/pull/webhooks/applyWebhooksPull.ts
|
|
22780
|
+
var isVercelWebhook = (events) => Array.isArray(events) && events.length > 0 && events.every((event) => typeof event === "string" && event.startsWith("vercel."));
|
|
22781
|
+
var merge = (target, source) => {
|
|
22782
|
+
target.lines.push(...source.lines);
|
|
22783
|
+
target.warnings.push(...source.warnings);
|
|
22784
|
+
target.unlocated.push(...source.unlocated);
|
|
22785
|
+
};
|
|
22786
|
+
var applyWebhooksPull = ({
|
|
22787
|
+
pull,
|
|
22788
|
+
remote,
|
|
22789
|
+
stated: stated2,
|
|
22790
|
+
envKey,
|
|
22791
|
+
newId = newWebhookId
|
|
22792
|
+
}) => {
|
|
22793
|
+
const result = { lines: [], warnings: [], unlocated: [] };
|
|
22794
|
+
const statedById = new Map((stated2 ?? []).map((row) => [row.id, row]));
|
|
22795
|
+
const fromDashboard = (webhook) => !statedById.has(webhook.id) && isDashboardWebhook(webhook);
|
|
22796
|
+
const present = new Set;
|
|
22797
|
+
for (const webhook of remote) {
|
|
22798
|
+
if (fromDashboard(webhook)) {
|
|
22799
|
+
const represented = (stated2 ?? []).find((row2) => row2.url?.[envKey] === webhook.url && isVercelWebhook(row2.events) === isVercelWebhook(webhook.events));
|
|
22800
|
+
if (represented !== undefined) {
|
|
22801
|
+
present.add(represented.id);
|
|
22802
|
+
merge(result, updateWebhook({
|
|
22803
|
+
pull,
|
|
22804
|
+
webhook: { ...webhook, id: represented.id },
|
|
22805
|
+
stated: represented,
|
|
22806
|
+
envKey
|
|
22807
|
+
}));
|
|
22808
|
+
continue;
|
|
22809
|
+
}
|
|
22810
|
+
if (webhook.events.length === 0) {
|
|
22811
|
+
result.lines.push(`· webhook ${webhook.id} receives every event; give it an event list in the dashboard, or add it to your config, to manage it here`);
|
|
22812
|
+
continue;
|
|
22813
|
+
}
|
|
22814
|
+
const id = newId();
|
|
22815
|
+
const failure2 = appendWebhook({
|
|
22816
|
+
pull,
|
|
22817
|
+
webhook: { ...webhook, id },
|
|
22818
|
+
envKey
|
|
22819
|
+
});
|
|
22820
|
+
if (failure2 === null)
|
|
22821
|
+
result.lines.push(`+ webhook ${id} (made in the dashboard; push adopts it by URL)`);
|
|
22822
|
+
else
|
|
22823
|
+
result.unlocated.push({ id, action: failure2 });
|
|
22824
|
+
continue;
|
|
22825
|
+
}
|
|
22826
|
+
present.add(webhook.id);
|
|
22827
|
+
const row = statedById.get(webhook.id);
|
|
22828
|
+
if (row !== undefined) {
|
|
22829
|
+
merge(result, updateWebhook({ pull, webhook, stated: row, envKey }));
|
|
22830
|
+
continue;
|
|
22831
|
+
}
|
|
22832
|
+
const failure = appendWebhook({ pull, webhook, envKey });
|
|
22833
|
+
if (failure === null)
|
|
22834
|
+
result.lines.push(`+ webhook ${webhook.id}`);
|
|
22835
|
+
else
|
|
22836
|
+
result.unlocated.push({ id: webhook.id, action: failure });
|
|
22837
|
+
}
|
|
22838
|
+
for (const row of stated2 ?? []) {
|
|
22839
|
+
if (present.has(row.id) || row.url?.[envKey] === undefined)
|
|
22840
|
+
continue;
|
|
22841
|
+
merge(result, removeWebhookEnv({ pull, stated: row, envKey }));
|
|
22842
|
+
}
|
|
22843
|
+
return result;
|
|
22844
|
+
};
|
|
22845
|
+
|
|
22846
|
+
// src/render/renderPreview.ts
|
|
22847
|
+
import chalk5 from "chalk";
|
|
22848
|
+
|
|
22849
|
+
// src/generated/labels.ts
|
|
22850
|
+
var PREVIOUS_ATTRIBUTE_LABELS = {
|
|
22851
|
+
name: "Name",
|
|
22852
|
+
description: "Description",
|
|
22853
|
+
group: "Group",
|
|
22854
|
+
add_on: "Add-on",
|
|
22855
|
+
auto_enable: "Default plan",
|
|
22856
|
+
free_trial: "Free trial",
|
|
22857
|
+
config: "Config",
|
|
22858
|
+
active: "Active version",
|
|
22859
|
+
billing_controls: "Billing controls",
|
|
22860
|
+
processors: "Processor mappings",
|
|
22861
|
+
base_variant_id: "Base plan",
|
|
22862
|
+
base_version: "Base version",
|
|
22863
|
+
base_version_slug: "Base version slug",
|
|
22864
|
+
cancel_on_past_due: "Cancel on past due",
|
|
22865
|
+
reverse_deduction_order: "Reverse deduction order",
|
|
22866
|
+
block_overdue_entitlements: "Block access while overdue",
|
|
22867
|
+
invoice_memos: "Invoice memos",
|
|
22868
|
+
disable_overage_billing: "Disable overage billing",
|
|
22869
|
+
persist_free_overage: "Pay down overages",
|
|
22043
22870
|
automatic_tax: "Automatic tax",
|
|
22044
22871
|
multi_currency: "Multi-currency",
|
|
22045
22872
|
id: "ID"
|
|
22046
22873
|
};
|
|
22047
22874
|
|
|
22875
|
+
// src/render/renderWebhooks.ts
|
|
22876
|
+
import chalk4 from "chalk";
|
|
22877
|
+
var webhooksHaveWork = ({
|
|
22878
|
+
webhooks
|
|
22879
|
+
}) => (webhooks?.changes ?? []).some((change) => change.action !== "unmanaged");
|
|
22880
|
+
var DETAIL_INDENT = " ";
|
|
22881
|
+
var list2 = (values) => values.length === 0 ? "(none)" : values.join(", ");
|
|
22882
|
+
var updateDetails = ({
|
|
22883
|
+
id,
|
|
22884
|
+
before,
|
|
22885
|
+
after
|
|
22886
|
+
}) => {
|
|
22887
|
+
const lines = [];
|
|
22888
|
+
if (before.url !== after.url)
|
|
22889
|
+
lines.push(`${id} url: ${before.url} → ${after.url}`);
|
|
22890
|
+
const events = (state) => [...state.events].sort();
|
|
22891
|
+
if (events(before).join() !== events(after).join())
|
|
22892
|
+
lines.push(`events: ${list2(events(before))} → ${list2(events(after))}`);
|
|
22893
|
+
if ((before.description ?? "") !== (after.description ?? ""))
|
|
22894
|
+
lines.push(`description: ${JSON.stringify(before.description ?? "")} → ${JSON.stringify(after.description ?? "")}`);
|
|
22895
|
+
if (before.disabled !== after.disabled)
|
|
22896
|
+
lines.push(`disabled: ${before.disabled} → ${after.disabled}`);
|
|
22897
|
+
return lines.map((line) => `${DETAIL_INDENT}${chalk4.yellow(line)}`);
|
|
22898
|
+
};
|
|
22899
|
+
var renderChange = ({ change }) => {
|
|
22900
|
+
if (change.action === "create")
|
|
22901
|
+
return [
|
|
22902
|
+
` ${chalk4.green(`+ ${change.id}`)}${chalk4.dim(` ${change.webhook.url}`)}`,
|
|
22903
|
+
`${DETAIL_INDENT}${chalk4.dim(`events: ${list2(change.webhook.events)}`)}`
|
|
22904
|
+
];
|
|
22905
|
+
if (change.action === "adopt")
|
|
22906
|
+
return [
|
|
22907
|
+
` ${chalk4.yellow(`~ ${change.id}`)} ${chalk4.bold("adopt")} ${chalk4.dim("existing dashboard webhook · signing secret unchanged")}`,
|
|
22908
|
+
...updateDetails({
|
|
22909
|
+
id: change.id,
|
|
22910
|
+
before: change.before,
|
|
22911
|
+
after: change.after
|
|
22912
|
+
})
|
|
22913
|
+
];
|
|
22914
|
+
if (change.action === "update")
|
|
22915
|
+
return [
|
|
22916
|
+
` ${chalk4.yellow(`~ ${change.id}`)}`,
|
|
22917
|
+
...updateDetails({
|
|
22918
|
+
id: change.id,
|
|
22919
|
+
before: change.before,
|
|
22920
|
+
after: change.after
|
|
22921
|
+
})
|
|
22922
|
+
];
|
|
22923
|
+
return [
|
|
22924
|
+
chalk4.dim(` · ${change.id} unmanaged (not in your config; atmn leaves it alone)`)
|
|
22925
|
+
];
|
|
22926
|
+
};
|
|
22927
|
+
var renderWebhooks = ({
|
|
22928
|
+
webhooks
|
|
22929
|
+
}) => {
|
|
22930
|
+
const rows = webhooks.changes.flatMap((change) => renderChange({ change }));
|
|
22931
|
+
if (rows.length === 0)
|
|
22932
|
+
return null;
|
|
22933
|
+
const count = webhooks.changes.filter((change) => change.action !== "unmanaged").length;
|
|
22934
|
+
return [chalk4.bold(`Webhooks (${count})`), ...rows].join(`
|
|
22935
|
+
`);
|
|
22936
|
+
};
|
|
22937
|
+
|
|
22048
22938
|
// src/render/renderPreview.ts
|
|
22049
22939
|
var MARKERS = {
|
|
22050
|
-
create: { symbol: "+", paint:
|
|
22051
|
-
update: { symbol: "~", paint:
|
|
22052
|
-
delete: { symbol: "-", paint:
|
|
22940
|
+
create: { symbol: "+", paint: chalk5.green },
|
|
22941
|
+
update: { symbol: "~", paint: chalk5.yellow },
|
|
22942
|
+
delete: { symbol: "-", paint: chalk5.red }
|
|
22053
22943
|
};
|
|
22054
22944
|
var APPLIED_ACTIONS = new Set(["create", "update", "delete"]);
|
|
22055
22945
|
var NESTED_ACTIONS = {
|
|
@@ -22060,7 +22950,7 @@ var NESTED_ACTIONS = {
|
|
|
22060
22950
|
};
|
|
22061
22951
|
var marker = (action) => MARKERS[NESTED_ACTIONS[action ?? ""] ?? action ?? ""] ?? {
|
|
22062
22952
|
symbol: "?",
|
|
22063
|
-
paint:
|
|
22953
|
+
paint: chalk5.dim
|
|
22064
22954
|
};
|
|
22065
22955
|
var line = ({
|
|
22066
22956
|
action,
|
|
@@ -22069,7 +22959,7 @@ var line = ({
|
|
|
22069
22959
|
indent = " "
|
|
22070
22960
|
}) => {
|
|
22071
22961
|
const { symbol, paint } = marker(action);
|
|
22072
|
-
const suffix = label && label !== id ?
|
|
22962
|
+
const suffix = label && label !== id ? chalk5.dim(` ${label}`) : "";
|
|
22073
22963
|
return `${indent}${paint(`${symbol} ${id}`)}${suffix}`;
|
|
22074
22964
|
};
|
|
22075
22965
|
var formatValue = (value) => {
|
|
@@ -22214,7 +23104,7 @@ var renderLicenseChanges = ({
|
|
|
22214
23104
|
}) => licenseChanges.flatMap((change) => {
|
|
22215
23105
|
const id = change.version === undefined ? change.licensePlanId ?? "?" : `${change.licensePlanId}@v${change.version}`;
|
|
22216
23106
|
return [
|
|
22217
|
-
`${line({ action: change.action, id, indent })}${
|
|
23107
|
+
`${line({ action: change.action, id, indent })}${chalk5.dim(" (license)")}`,
|
|
22218
23108
|
...renderPreviousAttributes({
|
|
22219
23109
|
attributes: change.previousAttributes,
|
|
22220
23110
|
indent: `${indent} `,
|
|
@@ -22288,16 +23178,16 @@ var nestedRowHasWork = (entry) => {
|
|
|
22288
23178
|
return false;
|
|
22289
23179
|
};
|
|
22290
23180
|
var rowHasWork = (row) => isChange(row) || Object.values(row).some((value) => Array.isArray(value) && value.some(nestedRowHasWork));
|
|
22291
|
-
var
|
|
22292
|
-
var VARIANT_INDENT =
|
|
23181
|
+
var DETAIL_INDENT2 = " ";
|
|
23182
|
+
var VARIANT_INDENT = DETAIL_INDENT2;
|
|
22293
23183
|
var planRowId = (row) => row.version === undefined ? row.planId ?? "?" : `${row.planId}@v${row.version}`;
|
|
22294
23184
|
var contextLine = ({
|
|
22295
23185
|
id,
|
|
22296
23186
|
label,
|
|
22297
23187
|
indent = " "
|
|
22298
23188
|
}) => {
|
|
22299
|
-
const suffix = label && label !== id ?
|
|
22300
|
-
return `${indent} ${
|
|
23189
|
+
const suffix = label && label !== id ? chalk5.dim(` ${label}`) : "";
|
|
23190
|
+
return `${indent} ${chalk5.dim(id)}${suffix}`;
|
|
22301
23191
|
};
|
|
22302
23192
|
var isVariantCreate = (variant) => variant.internalId === null || variant.internalId === undefined;
|
|
22303
23193
|
var variantCreateLabel = (planChange) => {
|
|
@@ -22316,7 +23206,7 @@ var renderVariantRow = ({
|
|
|
22316
23206
|
const nested = (variant.siblingVersions ?? []).filter(nestedRowHasWork).flatMap((sibling) => renderVariantRow({ variant: sibling, baseId, indent: detailIndent }));
|
|
22317
23207
|
if (variant.variantAction === "propagated") {
|
|
22318
23208
|
return [
|
|
22319
|
-
`${line({ action: "update", id, indent })}${
|
|
23209
|
+
`${line({ action: "update", id, indent })}${chalk5.dim(` follows ${baseId}`)}`,
|
|
22320
23210
|
...nested
|
|
22321
23211
|
];
|
|
22322
23212
|
}
|
|
@@ -22368,11 +23258,11 @@ var renderPlanRow = ({ plan }) => {
|
|
|
22368
23258
|
const fresh = isFreshRow(plan);
|
|
22369
23259
|
return [
|
|
22370
23260
|
isChange(plan) ? line({ action: fresh ? "create" : plan.action, id, label: plan.name }) : contextLine({ id, label: plan.name }),
|
|
22371
|
-
...renderIdentityChanges({ row: plan, indent:
|
|
23261
|
+
...renderIdentityChanges({ row: plan, indent: DETAIL_INDENT2 }),
|
|
22372
23262
|
...plan.planChange ? renderPlanChangeDetail({
|
|
22373
23263
|
planChange: plan.planChange,
|
|
22374
23264
|
current: currentAttributes(plan),
|
|
22375
|
-
indent:
|
|
23265
|
+
indent: DETAIL_INDENT2,
|
|
22376
23266
|
fresh
|
|
22377
23267
|
}) : [],
|
|
22378
23268
|
...renderVariantLanes({ plan })
|
|
@@ -22418,7 +23308,7 @@ var renderPlannedMigrations = ({
|
|
|
22418
23308
|
migrations,
|
|
22419
23309
|
plans
|
|
22420
23310
|
}) => [
|
|
22421
|
-
|
|
23311
|
+
chalk5.bold(`Migrations (${migrations.length})`),
|
|
22422
23312
|
...migrations.flatMap((migration) => (migration.plans ?? []).flatMap((target) => (target.versions ?? []).flatMap((version2) => {
|
|
22423
23313
|
const row = planRowForTarget({
|
|
22424
23314
|
plans,
|
|
@@ -22427,10 +23317,10 @@ var renderPlannedMigrations = ({
|
|
|
22427
23317
|
});
|
|
22428
23318
|
const custom = migration.includeCustom ? ", customized plans too" : "";
|
|
22429
23319
|
return [
|
|
22430
|
-
` ${
|
|
23320
|
+
` ${chalk5.cyan(`${target.planId} v${version2}`)}${customerCount({ row })}${custom}`,
|
|
22431
23321
|
...row?.planChange ? renderPlanChangeDetail({
|
|
22432
23322
|
planChange: row.planChange,
|
|
22433
|
-
indent:
|
|
23323
|
+
indent: DETAIL_INDENT2
|
|
22434
23324
|
}) : []
|
|
22435
23325
|
];
|
|
22436
23326
|
})))
|
|
@@ -22440,8 +23330,8 @@ var renderMigrationLinks = ({
|
|
|
22440
23330
|
migrations,
|
|
22441
23331
|
migrationLinkBase
|
|
22442
23332
|
}) => [
|
|
22443
|
-
|
|
22444
|
-
...migrations.map((migration) => migrationLinkBase && migration.id ? ` ${
|
|
23333
|
+
chalk5.bold(`Draft migrations (${migrations.length})`),
|
|
23334
|
+
...migrations.map((migration) => migrationLinkBase && migration.id ? ` ${chalk5.cyan(`${migrationLinkBase}/migrations/${migration.id}`)}` : ` ${chalk5.cyan(migration.id ?? "?")}`)
|
|
22445
23335
|
].join(`
|
|
22446
23336
|
`);
|
|
22447
23337
|
var UNMANAGED_NOTE = "unmanaged (set false explicitly to disable; atmn won't override)";
|
|
@@ -22449,10 +23339,10 @@ var renderSettingChange = ({ change }) => {
|
|
|
22449
23339
|
const label = labelFor(change.key ?? "?");
|
|
22450
23340
|
if (change.action === "unmanaged") {
|
|
22451
23341
|
const { symbol: symbol2, paint: paint2 } = marker("update");
|
|
22452
|
-
return `${
|
|
23342
|
+
return `${DETAIL_INDENT2}${paint2(`${symbol2} ${label}: ${formatValue(change.previous)} -> ${UNMANAGED_NOTE}`)}`;
|
|
22453
23343
|
}
|
|
22454
23344
|
const { symbol, paint } = marker("update");
|
|
22455
|
-
return `${
|
|
23345
|
+
return `${DETAIL_INDENT2}${paint(`${symbol} ${label}: ${formatValue(change.previous)} -> ${formatValue(change.current)}`)}`;
|
|
22456
23346
|
};
|
|
22457
23347
|
var settingChanges = (settings) => settings?.config?.changes ?? [];
|
|
22458
23348
|
var settingsHaveWork = ({
|
|
@@ -22468,20 +23358,21 @@ var renderPreview = ({
|
|
|
22468
23358
|
const referralPrograms = (preview.referralPrograms ?? []).filter(rowHasWork);
|
|
22469
23359
|
const migrations = preview.migrations ?? [];
|
|
22470
23360
|
const settings = settingChanges(preview.settings);
|
|
22471
|
-
|
|
22472
|
-
|
|
23361
|
+
const webhooks = preview.webhooks === undefined ? null : renderWebhooks({ webhooks: preview.webhooks });
|
|
23362
|
+
if (features.length === 0 && plans.length === 0 && rewards.length === 0 && referralPrograms.length === 0 && settings.length === 0 && webhooks === null) {
|
|
23363
|
+
return chalk5.dim("No changes. Your catalog matches your config.");
|
|
22473
23364
|
}
|
|
22474
23365
|
const sections = [];
|
|
22475
23366
|
if (settings.length > 0) {
|
|
22476
23367
|
sections.push([
|
|
22477
|
-
|
|
23368
|
+
chalk5.bold(`Settings (${settings.length})`),
|
|
22478
23369
|
...settings.map((change) => renderSettingChange({ change }))
|
|
22479
23370
|
].join(`
|
|
22480
23371
|
`));
|
|
22481
23372
|
}
|
|
22482
23373
|
if (features.length > 0) {
|
|
22483
23374
|
sections.push([
|
|
22484
|
-
|
|
23375
|
+
chalk5.bold(`Features (${features.length})`),
|
|
22485
23376
|
...features.flatMap((feature) => [
|
|
22486
23377
|
line({
|
|
22487
23378
|
action: feature.action,
|
|
@@ -22490,7 +23381,7 @@ var renderPreview = ({
|
|
|
22490
23381
|
}),
|
|
22491
23382
|
...renderPreviousAttributes({
|
|
22492
23383
|
attributes: feature.previousAttributes,
|
|
22493
|
-
indent:
|
|
23384
|
+
indent: DETAIL_INDENT2
|
|
22494
23385
|
})
|
|
22495
23386
|
])
|
|
22496
23387
|
].join(`
|
|
@@ -22498,14 +23389,14 @@ var renderPreview = ({
|
|
|
22498
23389
|
}
|
|
22499
23390
|
if (plans.length > 0) {
|
|
22500
23391
|
sections.push([
|
|
22501
|
-
|
|
23392
|
+
chalk5.bold(`Plans (${plans.length})`),
|
|
22502
23393
|
...plans.flatMap((plan) => renderPlanRow({ plan }))
|
|
22503
23394
|
].join(`
|
|
22504
23395
|
`));
|
|
22505
23396
|
}
|
|
22506
23397
|
if (rewards.length > 0) {
|
|
22507
23398
|
sections.push([
|
|
22508
|
-
|
|
23399
|
+
chalk5.bold(`Rewards (${rewards.length})`),
|
|
22509
23400
|
...rewards.flatMap((reward) => [
|
|
22510
23401
|
line({
|
|
22511
23402
|
action: reward.action,
|
|
@@ -22514,7 +23405,7 @@ var renderPreview = ({
|
|
|
22514
23405
|
}),
|
|
22515
23406
|
...renderPreviousAttributes({
|
|
22516
23407
|
attributes: reward.previousAttributes,
|
|
22517
|
-
indent:
|
|
23408
|
+
indent: DETAIL_INDENT2
|
|
22518
23409
|
})
|
|
22519
23410
|
])
|
|
22520
23411
|
].join(`
|
|
@@ -22522,7 +23413,7 @@ var renderPreview = ({
|
|
|
22522
23413
|
}
|
|
22523
23414
|
if (referralPrograms.length > 0) {
|
|
22524
23415
|
sections.push([
|
|
22525
|
-
|
|
23416
|
+
chalk5.bold(`Referral programs (${referralPrograms.length})`),
|
|
22526
23417
|
...referralPrograms.flatMap((program) => [
|
|
22527
23418
|
line({
|
|
22528
23419
|
action: program.action,
|
|
@@ -22531,12 +23422,14 @@ var renderPreview = ({
|
|
|
22531
23422
|
}),
|
|
22532
23423
|
...renderPreviousAttributes({
|
|
22533
23424
|
attributes: program.previousAttributes,
|
|
22534
|
-
indent:
|
|
23425
|
+
indent: DETAIL_INDENT2
|
|
22535
23426
|
})
|
|
22536
23427
|
])
|
|
22537
23428
|
].join(`
|
|
22538
23429
|
`));
|
|
22539
23430
|
}
|
|
23431
|
+
if (webhooks !== null)
|
|
23432
|
+
sections.push(webhooks);
|
|
22540
23433
|
if (migrations.length > 0) {
|
|
22541
23434
|
sections.push(renderPlannedMigrations({ migrations, plans }));
|
|
22542
23435
|
}
|
|
@@ -22546,7 +23439,7 @@ var renderPreview = ({
|
|
|
22546
23439
|
};
|
|
22547
23440
|
var previewIsEmpty = ({
|
|
22548
23441
|
preview
|
|
22549
|
-
}) => !(preview.features ?? []).some(rowHasWork) && !(preview.plans ?? []).some(rowHasWork) && !(preview.rewards ?? []).some(rowHasWork) && !(preview.referralPrograms ?? []).some(rowHasWork) && !settingsHaveWork({ settings: preview.settings });
|
|
23442
|
+
}) => !(preview.features ?? []).some(rowHasWork) && !(preview.plans ?? []).some(rowHasWork) && !(preview.rewards ?? []).some(rowHasWork) && !(preview.referralPrograms ?? []).some(rowHasWork) && !settingsHaveWork({ settings: preview.settings }) && !webhooksHaveWork({ webhooks: preview.webhooks });
|
|
22550
23443
|
|
|
22551
23444
|
// src/actions/push/backfillInternalIds.ts
|
|
22552
23445
|
import { readFileSync as readFileSync12, writeFileSync as writeFileSync8 } from "node:fs";
|
|
@@ -22955,6 +23848,42 @@ var renderDeprecatedUses = ({
|
|
|
22955
23848
|
}) => uses.map((use) => `note: ${use.collection} "${use.id}" states deprecated \`${use.path}\`. ${use.reason}`).join(`
|
|
22956
23849
|
`);
|
|
22957
23850
|
|
|
23851
|
+
// src/actions/push/pushLanesError.ts
|
|
23852
|
+
var messageOf = (error) => error instanceof Error ? error.message : String(error);
|
|
23853
|
+
|
|
23854
|
+
class PushLanesError extends Error {
|
|
23855
|
+
failures;
|
|
23856
|
+
constructor({
|
|
23857
|
+
stage,
|
|
23858
|
+
failures
|
|
23859
|
+
}) {
|
|
23860
|
+
super([
|
|
23861
|
+
`push ${stage} failed in ${failures.length} of its lanes:`,
|
|
23862
|
+
...failures.map(({ lane, error }) => `
|
|
23863
|
+
${lane}
|
|
23864
|
+
${messageOf(error).replace(/\n/g, `
|
|
23865
|
+
`)}`)
|
|
23866
|
+
].join(`
|
|
23867
|
+
`));
|
|
23868
|
+
this.name = "PushLanesError";
|
|
23869
|
+
this.failures = failures;
|
|
23870
|
+
}
|
|
23871
|
+
}
|
|
23872
|
+
var settleLanes = async (lanes) => {
|
|
23873
|
+
const names = Object.keys(lanes);
|
|
23874
|
+
const settled = await Promise.allSettled(names.map((name) => lanes[name]));
|
|
23875
|
+
const values = {};
|
|
23876
|
+
const failures = [];
|
|
23877
|
+
settled.forEach((result, index) => {
|
|
23878
|
+
const lane = names[index];
|
|
23879
|
+
if (result.status === "fulfilled")
|
|
23880
|
+
values[lane] = result.value;
|
|
23881
|
+
else
|
|
23882
|
+
failures.push({ lane, error: result.reason });
|
|
23883
|
+
});
|
|
23884
|
+
return { values, failures };
|
|
23885
|
+
};
|
|
23886
|
+
|
|
22958
23887
|
// src/actions/sandbox/withSandboxScopeHint.ts
|
|
22959
23888
|
var SCOPE_REFUSAL = "Insufficient scopes";
|
|
22960
23889
|
var SANDBOX_LOGIN_HINT = "Your key can't manage sandboxes: it was minted before atmn asked for platform:write. Run atmn login again to mint one that can.";
|
|
@@ -22966,6 +23895,121 @@ var withScopeHint = ({
|
|
|
22966
23895
|
hint: hint2
|
|
22967
23896
|
}) => error instanceof AutumnApiError && error.message.includes(SCOPE_REFUSAL) ? new Error(hint2, { cause: error }) : error;
|
|
22968
23897
|
|
|
23898
|
+
// src/actions/webhooks/writeWebhookSecrets.ts
|
|
23899
|
+
import { existsSync as existsSync12, readFileSync as readFileSync13, writeFileSync as writeFileSync9 } from "node:fs";
|
|
23900
|
+
import { dirname as dirname11, join as join13, relative as relative6 } from "node:path";
|
|
23901
|
+
|
|
23902
|
+
// src/actions/webhooks/webhookSecretName.ts
|
|
23903
|
+
var envNameSegment = (value) => value.toUpperCase().replace(/-/g, "_");
|
|
23904
|
+
var webhookSecretName = ({
|
|
23905
|
+
id,
|
|
23906
|
+
orgId
|
|
23907
|
+
}) => {
|
|
23908
|
+
const org4 = orgId === undefined ? "" : `_${envNameSegment(orgId.replace(/^org_/, "").slice(0, 4))}`;
|
|
23909
|
+
return `AUTUMN_WEBHOOK_${envNameSegment(id)}${org4}_SECRET`;
|
|
23910
|
+
};
|
|
23911
|
+
|
|
23912
|
+
// src/actions/webhooks/writeWebhookSecrets.ts
|
|
23913
|
+
var PROD_ENV_FILE = ".env.prod";
|
|
23914
|
+
var prodEnvPath = ({ envDirs }) => {
|
|
23915
|
+
const nearest = findEnvFile({ dirs: envDirs });
|
|
23916
|
+
return join13(nearest === undefined ? envDirs[0] ?? process.cwd() : dirname11(nearest), PROD_ENV_FILE);
|
|
23917
|
+
};
|
|
23918
|
+
var writeWebhookSecrets = async ({
|
|
23919
|
+
secrets,
|
|
23920
|
+
env,
|
|
23921
|
+
envDirs,
|
|
23922
|
+
cwd
|
|
23923
|
+
}) => {
|
|
23924
|
+
if (secrets.length === 0)
|
|
23925
|
+
return [];
|
|
23926
|
+
const orgId = env.live ? undefined : await env.orgId();
|
|
23927
|
+
const values = Object.fromEntries(secrets.map(({ id, secret }) => [webhookSecretName({ id, orgId }), secret]));
|
|
23928
|
+
let path;
|
|
23929
|
+
if (env.live) {
|
|
23930
|
+
path = prodEnvPath({ envDirs });
|
|
23931
|
+
const content = existsSync12(path) ? readFileSync13(path, "utf8") : "";
|
|
23932
|
+
writeFileSync9(path, upsertEnvContent({ content, values }), { mode: 384 });
|
|
23933
|
+
} else {
|
|
23934
|
+
path = writeEnvValues({ dirs: envDirs, values });
|
|
23935
|
+
}
|
|
23936
|
+
const file = relative6(cwd, path) || path;
|
|
23937
|
+
return Object.keys(values).map((name) => `Saved webhook secret as ${name} in ${file}`);
|
|
23938
|
+
};
|
|
23939
|
+
|
|
23940
|
+
// src/actions/webhooks/applyWebhooks.ts
|
|
23941
|
+
var applyWebhooks = async ({
|
|
23942
|
+
client,
|
|
23943
|
+
lane,
|
|
23944
|
+
envDirs,
|
|
23945
|
+
cwd,
|
|
23946
|
+
write
|
|
23947
|
+
}) => {
|
|
23948
|
+
if (lane === undefined || !webhooksHaveWork({ webhooks: lane.preview }))
|
|
23949
|
+
return;
|
|
23950
|
+
const result = await client.syncWebhooks(lane.body);
|
|
23951
|
+
const saved = await writeWebhookSecrets({
|
|
23952
|
+
secrets: result.secrets,
|
|
23953
|
+
env: lane.env,
|
|
23954
|
+
envDirs,
|
|
23955
|
+
cwd
|
|
23956
|
+
});
|
|
23957
|
+
const failed = new Set([
|
|
23958
|
+
...result.errors.map(({ id }) => id),
|
|
23959
|
+
...result.secrets.map(({ id }) => id)
|
|
23960
|
+
]);
|
|
23961
|
+
const adopted = lane.preview.changes.filter((change) => change.action === "adopt" && !failed.has(change.id)).map((change) => `Adopted ${change.id} (existing dashboard webhook); its signing secret is unchanged, nothing written`);
|
|
23962
|
+
write(`
|
|
23963
|
+
Applied webhooks.
|
|
23964
|
+
${[...adopted, ...saved].map((line2) => `${line2}
|
|
23965
|
+
`).join("")}`);
|
|
23966
|
+
if (result.errors.length > 0)
|
|
23967
|
+
throw new Error(result.errors.map(({ id, message }) => `${id}: ${message}`).join(`
|
|
23968
|
+
`));
|
|
23969
|
+
};
|
|
23970
|
+
|
|
23971
|
+
// src/actions/webhooks/resolveWebhooksForEnv.ts
|
|
23972
|
+
var resolveWebhooksForEnv = ({
|
|
23973
|
+
rows,
|
|
23974
|
+
envKey
|
|
23975
|
+
}) => {
|
|
23976
|
+
const { envKeyed } = SYNCED_LISTS.webhooks;
|
|
23977
|
+
const webhooks = [];
|
|
23978
|
+
for (const row of rows) {
|
|
23979
|
+
const values = envKeyed.map((field) => row[field]?.[envKey]);
|
|
23980
|
+
if (values.some((value) => typeof value !== "string"))
|
|
23981
|
+
continue;
|
|
23982
|
+
webhooks.push({
|
|
23983
|
+
...row,
|
|
23984
|
+
...Object.fromEntries(envKeyed.map((field, index) => [field, values[index]]))
|
|
23985
|
+
});
|
|
23986
|
+
}
|
|
23987
|
+
return webhooks;
|
|
23988
|
+
};
|
|
23989
|
+
|
|
23990
|
+
// src/actions/webhooks/previewWebhooks.ts
|
|
23991
|
+
var previewWebhooks = async ({
|
|
23992
|
+
client,
|
|
23993
|
+
rows,
|
|
23994
|
+
webhookEnv
|
|
23995
|
+
}) => {
|
|
23996
|
+
if (rows === undefined)
|
|
23997
|
+
return;
|
|
23998
|
+
if (webhookEnv === undefined)
|
|
23999
|
+
throw new Error("webhooks need the target environment to pick each url.");
|
|
24000
|
+
const env = await webhookEnv();
|
|
24001
|
+
const webhooks = resolveWebhooksForEnv({
|
|
24002
|
+
rows,
|
|
24003
|
+
envKey: env.key
|
|
24004
|
+
});
|
|
24005
|
+
const body = { webhooks };
|
|
24006
|
+
const { changes, errors } = await client.previewSyncWebhooks(body);
|
|
24007
|
+
if (errors.length > 0)
|
|
24008
|
+
throw new Error(errors.map(({ id, message }) => `${id}: ${message}`).join(`
|
|
24009
|
+
`));
|
|
24010
|
+
return { preview: { changes }, body, env };
|
|
24011
|
+
};
|
|
24012
|
+
|
|
22969
24013
|
// src/actions/push.ts
|
|
22970
24014
|
var previewSettings = async ({
|
|
22971
24015
|
client,
|
|
@@ -23036,63 +24080,64 @@ var configSearchDirs = ({
|
|
|
23036
24080
|
const project = resolveProject({ cwd, configFlag: configPath });
|
|
23037
24081
|
return [...new Set([project.configDir, cwd, ...project.envDirs])];
|
|
23038
24082
|
};
|
|
23039
|
-
var
|
|
23040
|
-
|
|
23041
|
-
|
|
23042
|
-
|
|
23043
|
-
|
|
23044
|
-
|
|
23045
|
-
|
|
23046
|
-
|
|
23047
|
-
|
|
23048
|
-
const dirs = configSearchDirs({ cwd, configPath: configFlag });
|
|
23049
|
-
loadEnvFiles({ dirs: project.envDirs });
|
|
23050
|
-
const { path: configPath, wire: document } = await loadConfig({
|
|
23051
|
-
dirs,
|
|
23052
|
-
...project.configPath === null ? {} : { configPath: project.configPath }
|
|
23053
|
-
});
|
|
23054
|
-
const { catalog: wire, singletons } = splitWire(document);
|
|
23055
|
-
const deprecated = deprecatedUsesIn({ wire });
|
|
23056
|
-
if (deprecated.length > 0)
|
|
23057
|
-
write(`${renderDeprecatedUses({ uses: deprecated })}
|
|
23058
|
-
|
|
24083
|
+
var pushExitCode = ({
|
|
24084
|
+
apply,
|
|
24085
|
+
result
|
|
24086
|
+
}) => !apply && result.catalogDeferred === true ? 1 : 0;
|
|
24087
|
+
var renderCatalogDeferral = ({ error }) => [
|
|
24088
|
+
"Catalog: not previewed yet. It depends on the settings above, so it is previewed again once they apply.",
|
|
24089
|
+
` Against the current settings it fails: ${error instanceof Error ? error.message : String(error)}`,
|
|
24090
|
+
" With --yes: settings apply, then the catalog is previewed again and applied if that preview passes."
|
|
24091
|
+
].join(`
|
|
23059
24092
|
`);
|
|
23060
|
-
|
|
23061
|
-
|
|
23062
|
-
const settingsWork = settingsBody !== undefined && settingsHaveWork({ settings });
|
|
23063
|
-
if (settingsWork) {
|
|
23064
|
-
write(`${renderPreview({ preview: { settings } })}
|
|
24093
|
+
var renderLintWarnings = ({ warnings }) => warnings.map((warning) => `⚠ ${warning.path}
|
|
24094
|
+
${warning.message}`).join(`
|
|
23065
24095
|
`);
|
|
23066
|
-
|
|
23067
|
-
|
|
23068
|
-
|
|
23069
|
-
|
|
23070
|
-
|
|
23071
|
-
|
|
23072
|
-
|
|
24096
|
+
var applySettings = async ({
|
|
24097
|
+
client,
|
|
24098
|
+
settingsBody,
|
|
24099
|
+
settings,
|
|
24100
|
+
catalogPreview,
|
|
24101
|
+
wire,
|
|
24102
|
+
write,
|
|
24103
|
+
migrationLinkBase,
|
|
24104
|
+
catalogDeferred
|
|
24105
|
+
}) => {
|
|
24106
|
+
if (settingsBody === undefined || !settingsHaveWork({ settings }))
|
|
24107
|
+
return catalogPreview;
|
|
24108
|
+
try {
|
|
24109
|
+
await client.updateOrganization(settingsBody);
|
|
24110
|
+
} catch (error) {
|
|
24111
|
+
throw withSettingsScopeHint({ error });
|
|
24112
|
+
}
|
|
24113
|
+
write(`
|
|
23073
24114
|
Applied settings.
|
|
23074
|
-
|
|
23075
24115
|
`);
|
|
23076
|
-
|
|
24116
|
+
let preview;
|
|
24117
|
+
try {
|
|
24118
|
+
preview = await client.previewUpdate(wire);
|
|
24119
|
+
} catch (error) {
|
|
24120
|
+
if (!catalogDeferred)
|
|
24121
|
+
throw error;
|
|
24122
|
+
throw new Error(`Applied settings, but the catalog still fails its preview, so the catalog and webhooks were not applied:
|
|
24123
|
+
${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
23077
24124
|
}
|
|
23078
|
-
|
|
23079
|
-
|
|
23080
|
-
|
|
23081
|
-
...settingsWork ? {} : { settings }
|
|
23082
|
-
};
|
|
23083
|
-
write(`${renderPreview({ preview, migrationLinkBase })}
|
|
23084
|
-
`);
|
|
23085
|
-
const renameHint2 = possibleRenameHint({ preview, wire });
|
|
23086
|
-
if (renameHint2 !== null)
|
|
23087
|
-
write(`${renameHint2}
|
|
23088
|
-
|
|
24125
|
+
if (catalogDeferred)
|
|
24126
|
+
write(`
|
|
24127
|
+
${renderPreview({ preview, migrationLinkBase })}
|
|
23089
24128
|
`);
|
|
23090
|
-
|
|
23091
|
-
|
|
23092
|
-
|
|
23093
|
-
|
|
23094
|
-
|
|
23095
|
-
|
|
24129
|
+
return preview;
|
|
24130
|
+
};
|
|
24131
|
+
var applyCatalog = async ({
|
|
24132
|
+
client,
|
|
24133
|
+
preview,
|
|
24134
|
+
wire,
|
|
24135
|
+
configPath,
|
|
24136
|
+
write,
|
|
24137
|
+
migrationLinkBase
|
|
24138
|
+
}) => {
|
|
24139
|
+
if (previewIsEmpty({ preview }))
|
|
24140
|
+
return { migrationIds: [] };
|
|
23096
24141
|
const applied = await client.update(wire);
|
|
23097
24142
|
const migrationIds = (applied.migrations ?? []).map((migration) => migration.id).filter((id) => typeof id === "string");
|
|
23098
24143
|
write(`
|
|
@@ -23119,7 +24164,107 @@ Applied.
|
|
|
23119
24164
|
if (backfilled.length > 0 || slugged.length > 0) {
|
|
23120
24165
|
write(backfillSummary({ backfilled, slugged }));
|
|
23121
24166
|
}
|
|
23122
|
-
return {
|
|
24167
|
+
return { applied, migrationIds };
|
|
24168
|
+
};
|
|
24169
|
+
var runPush = async ({
|
|
24170
|
+
client,
|
|
24171
|
+
cwd = process.cwd(),
|
|
24172
|
+
configPath: configFlag,
|
|
24173
|
+
dryRun = false,
|
|
24174
|
+
write = (text) => process.stdout.write(text),
|
|
24175
|
+
migrationLinkBase,
|
|
24176
|
+
webhookEnv
|
|
24177
|
+
}) => {
|
|
24178
|
+
const project = resolveProject({ cwd, configFlag });
|
|
24179
|
+
const dirs = configSearchDirs({ cwd, configPath: configFlag });
|
|
24180
|
+
loadEnvFiles({ dirs: project.envDirs });
|
|
24181
|
+
const { path: configPath, wire: document } = await loadConfig({
|
|
24182
|
+
dirs,
|
|
24183
|
+
...project.configPath === null ? {} : { configPath: project.configPath }
|
|
24184
|
+
});
|
|
24185
|
+
const { catalog: wire, singletons, lists, warnings } = splitWire(document);
|
|
24186
|
+
if (warnings.length > 0)
|
|
24187
|
+
write(`${renderLintWarnings({ warnings })}
|
|
24188
|
+
|
|
24189
|
+
`);
|
|
24190
|
+
const deprecated = deprecatedUsesIn({ wire });
|
|
24191
|
+
if (deprecated.length > 0)
|
|
24192
|
+
write(`${renderDeprecatedUses({ uses: deprecated })}
|
|
24193
|
+
|
|
24194
|
+
`);
|
|
24195
|
+
const settingsBody = singletons.settings;
|
|
24196
|
+
const previews = await settleLanes({
|
|
24197
|
+
settings: previewSettings({ client, body: settingsBody }),
|
|
24198
|
+
catalog: client.previewUpdate(wire),
|
|
24199
|
+
webhooks: previewWebhooks({
|
|
24200
|
+
client,
|
|
24201
|
+
rows: lists.webhooks,
|
|
24202
|
+
webhookEnv
|
|
24203
|
+
})
|
|
24204
|
+
});
|
|
24205
|
+
const { settings, webhooks } = previews.values;
|
|
24206
|
+
const catalogDeferral = settingsBody !== undefined && settingsHaveWork({ settings }) ? previews.failures.find((failure) => failure.lane === "catalog") : undefined;
|
|
24207
|
+
const failures = previews.failures.filter((failure) => failure !== catalogDeferral);
|
|
24208
|
+
if (failures.length > 0)
|
|
24209
|
+
throw new PushLanesError({ stage: "preview", failures });
|
|
24210
|
+
const catalogPreview = previews.values.catalog ?? {};
|
|
24211
|
+
const preview = {
|
|
24212
|
+
...catalogPreview,
|
|
24213
|
+
settings,
|
|
24214
|
+
...webhooks === undefined ? {} : { webhooks: webhooks.preview }
|
|
24215
|
+
};
|
|
24216
|
+
write(`${renderPreview({ preview, migrationLinkBase })}
|
|
24217
|
+
`);
|
|
24218
|
+
if (catalogDeferral !== undefined)
|
|
24219
|
+
write(`
|
|
24220
|
+
${renderCatalogDeferral({ error: catalogDeferral.error })}
|
|
24221
|
+
`);
|
|
24222
|
+
const renameHint2 = possibleRenameHint({ preview, wire });
|
|
24223
|
+
if (renameHint2 !== null)
|
|
24224
|
+
write(`${renameHint2}
|
|
24225
|
+
|
|
24226
|
+
`);
|
|
24227
|
+
const catalogDeferred = catalogDeferral !== undefined;
|
|
24228
|
+
if (dryRun || previewIsEmpty({ preview }))
|
|
24229
|
+
return { configPath, preview, migrationIds: [], catalogDeferred };
|
|
24230
|
+
const settingsStep = () => applySettings({
|
|
24231
|
+
client,
|
|
24232
|
+
settingsBody,
|
|
24233
|
+
settings,
|
|
24234
|
+
catalogPreview,
|
|
24235
|
+
wire,
|
|
24236
|
+
write,
|
|
24237
|
+
migrationLinkBase,
|
|
24238
|
+
catalogDeferred
|
|
24239
|
+
});
|
|
24240
|
+
const catalogStep = (previewAfterSettings) => applyCatalog({
|
|
24241
|
+
client,
|
|
24242
|
+
preview: previewAfterSettings,
|
|
24243
|
+
wire,
|
|
24244
|
+
configPath,
|
|
24245
|
+
write,
|
|
24246
|
+
migrationLinkBase
|
|
24247
|
+
});
|
|
24248
|
+
const settled = catalogDeferred ? await settingsStep() : undefined;
|
|
24249
|
+
const applied = await settleLanes({
|
|
24250
|
+
catalog: settled === undefined ? settingsStep().then(catalogStep) : catalogStep(settled),
|
|
24251
|
+
webhooks: applyWebhooks({
|
|
24252
|
+
client,
|
|
24253
|
+
lane: webhooks,
|
|
24254
|
+
envDirs: project.envDirs,
|
|
24255
|
+
cwd,
|
|
24256
|
+
write
|
|
24257
|
+
})
|
|
24258
|
+
});
|
|
24259
|
+
if (applied.failures.length > 0)
|
|
24260
|
+
throw new PushLanesError({ stage: "apply", failures: applied.failures });
|
|
24261
|
+
return {
|
|
24262
|
+
configPath,
|
|
24263
|
+
preview,
|
|
24264
|
+
applied: applied.values.catalog?.applied,
|
|
24265
|
+
migrationIds: applied.values.catalog?.migrationIds ?? [],
|
|
24266
|
+
catalogDeferred
|
|
24267
|
+
};
|
|
23123
24268
|
};
|
|
23124
24269
|
|
|
23125
24270
|
// src/actions/pull.ts
|
|
@@ -23235,14 +24380,15 @@ var runPull = async ({
|
|
|
23235
24380
|
imports,
|
|
23236
24381
|
overwrite = false,
|
|
23237
24382
|
yes = false,
|
|
23238
|
-
prompter = createPrompter({ interactive: false, write })
|
|
24383
|
+
prompter = createPrompter({ interactive: false, write }),
|
|
24384
|
+
webhookEnv
|
|
23239
24385
|
}) => {
|
|
23240
24386
|
const project = resolveProject({ cwd, configFlag });
|
|
23241
24387
|
if (overwrite && !yes) {
|
|
23242
24388
|
write(`This rewrites autumn.config.ts and the features.ts, plans.ts and rewards.ts beside it from your org's catalog. Other files are left alone. Re-run with --yes to overwrite.
|
|
23243
24389
|
`);
|
|
23244
24390
|
return {
|
|
23245
|
-
configPath: project.configPath ??
|
|
24391
|
+
configPath: project.configPath ?? join14(project.configDir, "autumn.config.ts"),
|
|
23246
24392
|
appended: [],
|
|
23247
24393
|
replaced: [],
|
|
23248
24394
|
deleted: []
|
|
@@ -23255,7 +24401,7 @@ var runPull = async ({
|
|
|
23255
24401
|
if (project.configPath === null) {
|
|
23256
24402
|
const chosen = await chooseConfigDir({ cwd, prompter });
|
|
23257
24403
|
scaffoldDir = chosen.configDir;
|
|
23258
|
-
scaffoldPath =
|
|
24404
|
+
scaffoldPath = join14(scaffoldDir, "autumn.config.ts");
|
|
23259
24405
|
if (scaffoldDir !== cwd && writeRootMarker({ repoRoot: chosen.repoRoot, configPath: scaffoldPath }))
|
|
23260
24406
|
prompter.write(`${done("Recorded in package.json so atmn finds it from anywhere")}
|
|
23261
24407
|
`);
|
|
@@ -23269,18 +24415,19 @@ var runPull = async ({
|
|
|
23269
24415
|
overwrite,
|
|
23270
24416
|
write
|
|
23271
24417
|
});
|
|
23272
|
-
const { catalog: wire, singletons } = splitWire(document);
|
|
23273
|
-
const [preview, catalog, settingsPreview] = await Promise.all([
|
|
24418
|
+
const { catalog: wire, singletons, lists } = splitWire(document);
|
|
24419
|
+
const [preview, catalog, settingsPreview, webhooks] = await Promise.all([
|
|
23274
24420
|
diffOrExplain({ client, wire }),
|
|
23275
24421
|
client.get({ include_versions: true }),
|
|
23276
|
-
client.previewUpdateOrganization(singletons.settings ?? { config: {} })
|
|
24422
|
+
client.previewUpdateOrganization(singletons.settings ?? { config: {} }),
|
|
24423
|
+
webhookEnv === undefined ? undefined : Promise.all([webhookEnv(), client.listWebhooks({})])
|
|
23277
24424
|
]);
|
|
23278
24425
|
const files = new Map;
|
|
23279
|
-
files.set(configPath,
|
|
23280
|
-
for (const file of listSourceFiles({ directory:
|
|
24426
|
+
files.set(configPath, readFileSync14(configPath, "utf8"));
|
|
24427
|
+
for (const file of listSourceFiles({ directory: dirname12(configPath) })) {
|
|
23281
24428
|
if (file === configPath || files.has(file))
|
|
23282
24429
|
continue;
|
|
23283
|
-
files.set(file,
|
|
24430
|
+
files.set(file, readFileSync14(file, "utf8"));
|
|
23284
24431
|
}
|
|
23285
24432
|
const originals = new Map(files);
|
|
23286
24433
|
const appended = [];
|
|
@@ -23344,6 +24491,22 @@ var runPull = async ({
|
|
|
23344
24491
|
action: `set by hand: \`${singleton}\` is not an object literal`
|
|
23345
24492
|
})));
|
|
23346
24493
|
}
|
|
24494
|
+
const webhookWarnings = [];
|
|
24495
|
+
if (webhooks !== undefined) {
|
|
24496
|
+
const [env, { list: list3 }] = webhooks;
|
|
24497
|
+
const applied = applyWebhooksPull({
|
|
24498
|
+
pull: { configPath, files },
|
|
24499
|
+
remote: list3,
|
|
24500
|
+
stated: lists.webhooks,
|
|
24501
|
+
envKey: env.key
|
|
24502
|
+
});
|
|
24503
|
+
lines.push(...applied.lines);
|
|
24504
|
+
webhookWarnings.push(...applied.warnings);
|
|
24505
|
+
unlocated.push(...applied.unlocated.map((entry) => ({
|
|
24506
|
+
collection: "webhooks",
|
|
24507
|
+
...entry
|
|
24508
|
+
})));
|
|
24509
|
+
}
|
|
23347
24510
|
if (includeMappings) {
|
|
23348
24511
|
const managedCatalog = Object.fromEntries(Object.entries(COLLECTIONS).filter(([, spec]) => spec.wireKey !== undefined && wire[spec.wireKey] !== undefined).map(([collection]) => [collection, catalogRows[collection]]));
|
|
23349
24512
|
const mapped = applyMappings({
|
|
@@ -23364,11 +24527,11 @@ var runPull = async ({
|
|
|
23364
24527
|
for (const [file, source] of files) {
|
|
23365
24528
|
if (source === originals.get(file))
|
|
23366
24529
|
continue;
|
|
23367
|
-
mkdirSync4(
|
|
23368
|
-
|
|
24530
|
+
mkdirSync4(dirname12(file), { recursive: true });
|
|
24531
|
+
writeFileSync10(file, source, "utf8");
|
|
23369
24532
|
if (!originals.has(file)) {
|
|
23370
|
-
const keep =
|
|
23371
|
-
if (
|
|
24533
|
+
const keep = join14(dirname12(file), ".gitkeep");
|
|
24534
|
+
if (existsSync13(keep))
|
|
23372
24535
|
unlinkSync(keep);
|
|
23373
24536
|
}
|
|
23374
24537
|
}
|
|
@@ -23380,6 +24543,12 @@ var runPull = async ({
|
|
|
23380
24543
|
lines.push(`↳ wrote internalId into ${backfilled.length} fixture${backfilled.length === 1 ? "" : "s"}`);
|
|
23381
24544
|
if (slugged.length > 0)
|
|
23382
24545
|
lines.push(`↳ wrote versionSlug into ${slugged.length} fixture${slugged.length === 1 ? "" : "s"}`);
|
|
24546
|
+
if (webhookWarnings.length > 0)
|
|
24547
|
+
write(`${webhookWarnings.join(`
|
|
24548
|
+
|
|
24549
|
+
`)}
|
|
24550
|
+
|
|
24551
|
+
`);
|
|
23383
24552
|
write(lines.length === 0 ? `Nothing to pull.
|
|
23384
24553
|
` : `${lines.join(`
|
|
23385
24554
|
`)}
|
|
@@ -23511,8 +24680,8 @@ var runSandboxDelete = async ({
|
|
|
23511
24680
|
write = (text) => process.stdout.write(text),
|
|
23512
24681
|
writeError = (text) => process.stderr.write(text)
|
|
23513
24682
|
}) => {
|
|
23514
|
-
const { list:
|
|
23515
|
-
const sandbox =
|
|
24683
|
+
const { list: list3 } = await client.listSandboxes({});
|
|
24684
|
+
const sandbox = list3.find((entry) => entry.id === id);
|
|
23516
24685
|
if (sandbox === undefined) {
|
|
23517
24686
|
throw new Error(`No sandbox with id ${id}. Run atmn sandbox list.`);
|
|
23518
24687
|
}
|
|
@@ -23539,7 +24708,7 @@ var runSandboxDelete = async ({
|
|
|
23539
24708
|
};
|
|
23540
24709
|
|
|
23541
24710
|
// src/render/renderSandboxes.ts
|
|
23542
|
-
import
|
|
24711
|
+
import chalk6 from "chalk";
|
|
23543
24712
|
var MINUTE = 60000;
|
|
23544
24713
|
var HOUR = 60 * MINUTE;
|
|
23545
24714
|
var DAY = 24 * HOUR;
|
|
@@ -23578,7 +24747,7 @@ var renderSandboxes = ({
|
|
|
23578
24747
|
now = Date.now()
|
|
23579
24748
|
}) => {
|
|
23580
24749
|
if (sandboxes.length === 0)
|
|
23581
|
-
return
|
|
24750
|
+
return chalk6.dim(NO_SANDBOXES);
|
|
23582
24751
|
const rows = sandboxes.map((sandbox) => [
|
|
23583
24752
|
sandbox.id,
|
|
23584
24753
|
stripTerminalControls(sandbox.name),
|
|
@@ -23586,11 +24755,11 @@ var renderSandboxes = ({
|
|
|
23586
24755
|
]);
|
|
23587
24756
|
const widths = columnWidths({ rows });
|
|
23588
24757
|
return [
|
|
23589
|
-
|
|
24758
|
+
chalk6.dim(tableLine({ cells: HEADERS, widths, marker: "" })),
|
|
23590
24759
|
...rows.map((cells, index) => tableLine({
|
|
23591
24760
|
cells,
|
|
23592
24761
|
widths,
|
|
23593
|
-
marker: sandboxes[index]?.id === currentSandboxId ?
|
|
24762
|
+
marker: sandboxes[index]?.id === currentSandboxId ? chalk6.dim(`${GAP2}${CURRENT_MARKER}`) : ""
|
|
23594
24763
|
}))
|
|
23595
24764
|
].join(`
|
|
23596
24765
|
`);
|
|
@@ -23615,7 +24784,7 @@ var runSandboxList = async ({
|
|
|
23615
24784
|
};
|
|
23616
24785
|
|
|
23617
24786
|
// src/prompt/select.ts
|
|
23618
|
-
import
|
|
24787
|
+
import chalk7 from "chalk";
|
|
23619
24788
|
var PAGE_SIZE = 10;
|
|
23620
24789
|
var CURRENT_MARKER2 = "← current";
|
|
23621
24790
|
var renderChoices = ({
|
|
@@ -23628,14 +24797,14 @@ var renderChoices = ({
|
|
|
23628
24797
|
const start = page * PAGE_SIZE;
|
|
23629
24798
|
const rows = visible.slice(start, start + PAGE_SIZE).map((choice, index) => {
|
|
23630
24799
|
const selected = start + index === cursor;
|
|
23631
|
-
const pointer = selected ?
|
|
23632
|
-
const label = selected ?
|
|
23633
|
-
const detail = choice.detail === undefined ? "" : ` ${
|
|
23634
|
-
const current = choice.current ? ` ${
|
|
24800
|
+
const pointer = selected ? chalk7.cyan("❯") : " ";
|
|
24801
|
+
const label = selected ? chalk7.bold(choice.label) : choice.label;
|
|
24802
|
+
const detail = choice.detail === undefined ? "" : ` ${chalk7.dim(`(${choice.detail})`)}`;
|
|
24803
|
+
const current = choice.current ? ` ${chalk7.dim(CURRENT_MARKER2)}` : "";
|
|
23635
24804
|
return `${pointer} ${label}${detail}${current}`;
|
|
23636
24805
|
});
|
|
23637
|
-
const footer = visible.length > PAGE_SIZE ?
|
|
23638
|
-
const search = ` ${
|
|
24806
|
+
const footer = visible.length > PAGE_SIZE ? chalk7.dim(` ${start + 1}-${Math.min(start + PAGE_SIZE, visible.length)} of ${visible.length}`) : "";
|
|
24807
|
+
const search = ` ${chalk7.dim("type to filter:")} ${filter}`;
|
|
23639
24808
|
return [...rows, ...footer ? [footer] : [], search].join(`
|
|
23640
24809
|
`);
|
|
23641
24810
|
};
|
|
@@ -23771,9 +24940,9 @@ var runSandboxUse = async ({
|
|
|
23771
24940
|
}
|
|
23772
24941
|
if (client === undefined || org === undefined)
|
|
23773
24942
|
throw new Error("sandbox use needs the main key to list sandboxes.");
|
|
23774
|
-
const { list:
|
|
24943
|
+
const { list: list3 } = await client.listSandboxes({});
|
|
23775
24944
|
const currentId = process.env[SANDBOX_PIN_NAME];
|
|
23776
|
-
const choices = choicesOf({ sandboxes:
|
|
24945
|
+
const choices = choicesOf({ sandboxes: list3, currentId });
|
|
23777
24946
|
let picked;
|
|
23778
24947
|
if (query !== undefined && query !== "") {
|
|
23779
24948
|
picked = matchChoice({ choices, query });
|
|
@@ -23781,7 +24950,7 @@ var runSandboxUse = async ({
|
|
|
23781
24950
|
throw new Error(`No sandbox named or with id ${JSON.stringify(query)}. Run atmn sandbox list.`);
|
|
23782
24951
|
} else {
|
|
23783
24952
|
if (!prompter.interactive)
|
|
23784
|
-
prompter.write(`${renderSandboxes({ sandboxes:
|
|
24953
|
+
prompter.write(`${renderSandboxes({ sandboxes: list3, currentSandboxId: currentId })}
|
|
23785
24954
|
`);
|
|
23786
24955
|
picked = await select({
|
|
23787
24956
|
prompter,
|
|
@@ -23792,7 +24961,7 @@ var runSandboxUse = async ({
|
|
|
23792
24961
|
if (picked === null)
|
|
23793
24962
|
return null;
|
|
23794
24963
|
}
|
|
23795
|
-
const sandbox =
|
|
24964
|
+
const sandbox = list3.find((row) => row.id === picked.value);
|
|
23796
24965
|
if (sandbox === undefined)
|
|
23797
24966
|
throw new Error("Sandbox vanished from the list.");
|
|
23798
24967
|
const keyName = sandboxKeyName({ sandboxId: sandbox.id });
|
|
@@ -23829,6 +24998,47 @@ var runSandboxUse = async ({
|
|
|
23829
24998
|
return result;
|
|
23830
24999
|
};
|
|
23831
25000
|
|
|
25001
|
+
// src/generated/sandboxName.ts
|
|
25002
|
+
var RESERVED_SANDBOX_SLUGS = new Set([
|
|
25003
|
+
"products",
|
|
25004
|
+
"customers",
|
|
25005
|
+
"features",
|
|
25006
|
+
"migrations",
|
|
25007
|
+
"dev",
|
|
25008
|
+
"analytics",
|
|
25009
|
+
"settings",
|
|
25010
|
+
"admin",
|
|
25011
|
+
"chat",
|
|
25012
|
+
"quickstart",
|
|
25013
|
+
"onboarding",
|
|
25014
|
+
"impersonate-redirect",
|
|
25015
|
+
"trmnl"
|
|
25016
|
+
]);
|
|
25017
|
+
var ENV_SANDBOX_SLUGS = new Set(["live", "sandbox"]);
|
|
25018
|
+
var sandboxSlug = (name) => name.toLowerCase().replace(/ /g, "-").replace(/[^\w\s-]/g, "");
|
|
25019
|
+
|
|
25020
|
+
// src/actions/webhooks/resolveWebhookEnv.ts
|
|
25021
|
+
var memoized = (fetchOrgInfo2) => {
|
|
25022
|
+
let pending;
|
|
25023
|
+
return () => {
|
|
25024
|
+
pending ??= fetchOrgInfo2();
|
|
25025
|
+
return pending;
|
|
25026
|
+
};
|
|
25027
|
+
};
|
|
25028
|
+
var resolveWebhookEnv = async ({
|
|
25029
|
+
target,
|
|
25030
|
+
prod,
|
|
25031
|
+
fetchOrgInfo: fetchOrgInfo2
|
|
25032
|
+
}) => {
|
|
25033
|
+
const orgInfo = memoized(fetchOrgInfo2);
|
|
25034
|
+
const orgId = async () => (await orgInfo()).id;
|
|
25035
|
+
if (prod)
|
|
25036
|
+
return { key: "live", live: true, orgId };
|
|
25037
|
+
if (target.sandboxId === undefined)
|
|
25038
|
+
return { key: "sandbox", live: false, orgId };
|
|
25039
|
+
return { key: sandboxSlug((await orgInfo()).name), live: false, orgId };
|
|
25040
|
+
};
|
|
25041
|
+
|
|
23832
25042
|
// src/cli.ts
|
|
23833
25043
|
var normalizeVersionFlag = ({ argv }) => argv.map((token) => token === "-v" ? "--version" : token);
|
|
23834
25044
|
var withTargetFlags = (program) => program.option("-p, --prod", "target production instead of sandbox").option("--sandbox <sandboxId>", "target a specific sandbox").option("-l, --local", "target a local server (default port 8080)").option("--port <port>", "port of a local server (implies --local)").option("-b, --base-url <url>", "send to this URL instead").option("--client-id <id>", "OAuth client id the CLI identifies as").option("-c, --config <path>", "autumn.config.ts, or the folder holding it (default: found from cwd or the root package.json)").option("--headless", "never prompt: print what a command needs and stop (default when not a TTY)");
|
|
@@ -23855,11 +25065,11 @@ ${hint(flagHint)}
|
|
|
23855
25065
|
`);
|
|
23856
25066
|
throw new NeedsInputError(flagHint);
|
|
23857
25067
|
}
|
|
23858
|
-
return
|
|
25068
|
+
return join15(project.configDir, SKILLS_DIR_NAME);
|
|
23859
25069
|
};
|
|
23860
25070
|
var writeStaleSkillsHint = ({ command }) => {
|
|
23861
25071
|
const stale = staleSkillsHint({
|
|
23862
|
-
dir:
|
|
25072
|
+
dir: join15(projectOf({ command }).configDir, SKILLS_DIR_NAME)
|
|
23863
25073
|
});
|
|
23864
25074
|
if (stale !== null)
|
|
23865
25075
|
process.stdout.write(`${stale}
|
|
@@ -23913,13 +25123,21 @@ var pinnedSandboxName = async ({
|
|
|
23913
25123
|
if (target.sandboxId === undefined)
|
|
23914
25124
|
return {};
|
|
23915
25125
|
try {
|
|
23916
|
-
const { list:
|
|
23917
|
-
const name =
|
|
25126
|
+
const { list: list3 } = await sandboxClientFor({ target }).listSandboxes({});
|
|
25127
|
+
const name = list3.find((row) => row.id === target.sandboxId)?.name;
|
|
23918
25128
|
return name === undefined ? {} : { sandboxName: name };
|
|
23919
25129
|
} catch {
|
|
23920
25130
|
return {};
|
|
23921
25131
|
}
|
|
23922
25132
|
};
|
|
25133
|
+
var webhookEnvFor = ({ target, command }) => () => resolveWebhookEnv({
|
|
25134
|
+
target,
|
|
25135
|
+
prod: command.optsWithGlobals().prod === true,
|
|
25136
|
+
fetchOrgInfo: () => fetchOrgInfo({
|
|
25137
|
+
baseUrl: targetBaseUrl({ target }),
|
|
25138
|
+
secretKey: requireSecretKey({ target })
|
|
25139
|
+
})
|
|
25140
|
+
});
|
|
23923
25141
|
var mainOrgInfo = ({ target }) => {
|
|
23924
25142
|
const main = managementTarget({ target });
|
|
23925
25143
|
return fetchOrgInfo({
|
|
@@ -24017,8 +25235,10 @@ Linking a keyless org to an account:
|
|
|
24017
25235
|
const result = await runPush({
|
|
24018
25236
|
client: clientFor({ target }),
|
|
24019
25237
|
configPath: configFlagOf({ command }),
|
|
24020
|
-
dryRun: !apply
|
|
25238
|
+
dryRun: !apply,
|
|
25239
|
+
webhookEnv: webhookEnvFor({ target, command })
|
|
24021
25240
|
});
|
|
25241
|
+
process.exitCode = pushExitCode({ apply, result });
|
|
24022
25242
|
if (!apply && !previewIsEmpty({ preview: result.preview }))
|
|
24023
25243
|
process.stdout.write(options.dryRun === true ? `
|
|
24024
25244
|
Dry run — nothing applied.
|
|
@@ -24065,7 +25285,8 @@ Nothing applied. Re-run with --yes to apply these changes.
|
|
|
24065
25285
|
includeMappings: options.includeMappings === true,
|
|
24066
25286
|
overwrite: options.overwrite === true,
|
|
24067
25287
|
yes: options.yes === true,
|
|
24068
|
-
prompter: prompterFor({ command })
|
|
25288
|
+
prompter: prompterFor({ command }),
|
|
25289
|
+
webhookEnv: webhookEnvFor({ target, command })
|
|
24069
25290
|
});
|
|
24070
25291
|
writeStaleSkillsHint({ command });
|
|
24071
25292
|
});
|