@camunda/ccma-shared-types 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/approvals/use-cases.const.d.ts +0 -66
  2. package/dist/approvals/use-cases.const.js +2 -11
  3. package/dist/approvals/use-cases.const.js.map +2 -2
  4. package/dist/dtos/ControlV2.dto.d.ts +10 -0
  5. package/dist/dtos/ExternalWebapp.dto.d.ts +12 -0
  6. package/dist/dtos/FeatureFlags.dto.d.ts +51 -58
  7. package/dist/dtos/FeatureFlags.dto.js +0 -10
  8. package/dist/dtos/FeatureFlags.dto.js.map +3 -3
  9. package/dist/dtos/Hdp.dto.d.ts +153 -0
  10. package/dist/dtos/SalesPlan.dto.d.ts +25 -1
  11. package/dist/dtos/SalesPlan.dto.js +19 -6
  12. package/dist/dtos/SalesPlan.dto.js.map +2 -2
  13. package/dist/index.d.ts +7 -9
  14. package/dist/index.js +16 -26
  15. package/dist/index.js.map +2 -2
  16. package/dist/permissions/accounts.permissions.d.ts +0 -33
  17. package/dist/permissions/accounts.permissions.js +0 -31
  18. package/dist/permissions/accounts.permissions.js.map +2 -2
  19. package/dist/permissions/combo.js +0 -6
  20. package/dist/permissions/combo.js.map +2 -2
  21. package/dist/types/PreprodClusterTtl.type.d.ts +33 -0
  22. package/dist/types/PreprodClusterTtl.type.js +37 -0
  23. package/dist/types/PreprodClusterTtl.type.js.map +7 -0
  24. package/dist/types/hdp.types.d.ts +6 -0
  25. package/dist/types/hdp.types.js +3 -1
  26. package/dist/types/hdp.types.js.map +2 -2
  27. package/package.json +1 -1
  28. package/dist/dtos/FeatureFlagOverride.dto.d.ts +0 -226
  29. package/dist/dtos/FeatureFlagOverride.dto.js +0 -38
  30. package/dist/dtos/FeatureFlagOverride.dto.js.map +0 -7
  31. /package/dist/_tests/{dtos/FeatureFlagOverride.dto.spec.d.ts → types/PreprodClusterTtl.type.spec.d.ts} +0 -0
@@ -1,226 +0,0 @@
1
- import type { Stage } from '../constants/misc.const.js';
2
- /**
3
- * The wire shapes of the feature flag surface of control-backend.
4
- *
5
- * They are here and not in `@camunda-cloud/featureflags`, because
6
- * `@camunda/ccma-api` is published and cannot name a type from that private
7
- * package. The RULES stay there: `resolveFlag` decides a value, and
8
- * `FLAG_REGISTRY` holds the metadata. This file carries the answer over HTTP.
9
- *
10
- * `flagPath` is a `string` in every shape below. The typed `FlagPath` needs
11
- * `Features`, and a caller of the API names a flag that the SERVER validates
12
- * against its own registry. A type that the browser holds cannot do that job,
13
- * because the server can be older or newer than the bundle.
14
- */
15
- /** Which readers an override reaches. It is `FlagOverrideScope`. */
16
- export declare const FEATURE_FLAG_OVERRIDE_SCOPES: readonly ["stage", "org"];
17
- export type FeatureFlagOverrideScope = (typeof FEATURE_FLAG_OVERRIDE_SCOPES)[number];
18
- /** Why a flag has the value that it has. It is `FlagReason`. */
19
- export declare const FEATURE_FLAG_REASONS: readonly ["DEFAULT", "OVERRIDE_STAGE", "OVERRIDE_ORG", "OVERRIDE_REFUSED"];
20
- export type FeatureFlagReason = (typeof FEATURE_FLAG_REASONS)[number];
21
- /** How long a flag is meant to live. It is `FlagType`. */
22
- export declare const FEATURE_FLAG_TYPES: readonly ["release", "ops", "perm"];
23
- export type FeatureFlagType = (typeof FEATURE_FLAG_TYPES)[number];
24
- /**
25
- * One condition of the code rule of a flag.
26
- *
27
- * The code rule is a LIST of these, and a reader gets the flag when ANY one
28
- * matches. An empty list is off for every reader. `FLAG_RULES` of
29
- * `@camunda-cloud/featureflags` holds the rules, and `defaults` evaluates the
30
- * same objects, thus the description cannot drift from the value.
31
- */
32
- export type FeatureFlagCondition =
33
- /** On for every reader. */
34
- {
35
- kind: 'always';
36
- }
37
- /** On when the stage of the reader is one of `stages`. */
38
- | {
39
- kind: 'stage';
40
- stages: Stage[];
41
- }
42
- /** On when the email address of the reader is a Camundi address. */
43
- | {
44
- kind: 'camundiEmail';
45
- }
46
- /** On when the email address of the reader has one of `domains`. */
47
- | {
48
- kind: 'emailDomain';
49
- domains: string[];
50
- }
51
- /** On when the organization of the reader is one of `orgIds`. */
52
- | {
53
- kind: 'org';
54
- orgIds: string[];
55
- };
56
- /** One stored override, as a reader of the API sees it. */
57
- export interface FeatureFlagOverrideDto {
58
- id: string;
59
- flagPath: string;
60
- scope: FeatureFlagOverrideScope;
61
- /** The stage for `stage`, and the organization id for `org`. */
62
- target: string;
63
- enabled: boolean;
64
- /** Why the person asked for it. The approval request demands one. */
65
- reason: string;
66
- /** The approval request that wrote this row. Every row names one. */
67
- approvalId: string;
68
- createdBy: {
69
- userId: string;
70
- email: string;
71
- };
72
- createdAt: string;
73
- /** When the override stops by itself. */
74
- expiresAt: string;
75
- }
76
- /**
77
- * One flag, with everything a person needs to decide about it.
78
- *
79
- * The row carries the code value AND the effective value on purpose. A page
80
- * that showed only the effective value would hide the drift, which is the one
81
- * thing an override makes easy to lose.
82
- */
83
- export interface FeatureFlagRowDto {
84
- flagPath: string;
85
- label: string;
86
- type: FeatureFlagType;
87
- owner: string;
88
- reason: string;
89
- /** Whether an override can move this flag at all. */
90
- overridable: boolean;
91
- /** The date after which a `release` flag is late. */
92
- expiresAt?: string;
93
- /**
94
- * What the code answers for the stage of this service, for NOBODY.
95
- *
96
- * The evaluation carries the stage alone: no email address and no
97
- * organization id. A flag whose condition reads one of those answers
98
- * something else for a real reader — `console.clusterSuspendButton` is
99
- * `false` here on prod and `true` for a Camundi, and
100
- * `console.privateLink87` is `false` here and `true` for an allowlisted
101
- * organization.
102
- *
103
- * It is a BASELINE, and that is the right answer for this surface: one
104
- * value that every reader of the page sees, which is what makes two
105
- * Camundis able to talk about it. A per-viewer value would answer a
106
- * different thing to each of them, and a per-organization value needs an
107
- * organization that the route does not take.
108
- */
109
- codeValue: boolean;
110
- /**
111
- * The code rule of the flag: it is on when ANY condition matches.
112
- *
113
- * This is what `codeValue` cannot say. It names the stages, the email
114
- * rules and the organization allowlist that decide the value for a real
115
- * reader.
116
- */
117
- rule: FeatureFlagCondition[];
118
- /**
119
- * The code value on each known stage, for NOBODY.
120
- *
121
- * The same baseline as `codeValue`, for every stage and not only this one.
122
- * It shows how far the flag stands on its rollout ladder.
123
- */
124
- codeValueByStage: Record<Stage, boolean>;
125
- /**
126
- * The baseline of `codeValue` with a live override in front of it.
127
- *
128
- * Same evaluation context, thus the same limit: it is what a reader with
129
- * no email address and no organization gets. Use it to see the DRIFT
130
- * between the store and the source, which is what this surface exists
131
- * for, and not as the answer for one person.
132
- */
133
- effectiveValue: boolean;
134
- /** Why `effectiveValue` is what it is. */
135
- effectiveReason: FeatureFlagReason;
136
- /** The live override of the stage, if there is one. */
137
- stageOverride?: FeatureFlagOverrideDto;
138
- /**
139
- * How many live overrides name an organization.
140
- *
141
- * A COUNT, and not the rows. The rows carry an organization id, an email
142
- * address and a reason for every organization that holds an override, and
143
- * this answer has no page, thus it would grow with the number of customers
144
- * and hand all of it to every reader. The page shows the number.
145
- */
146
- orgOverrideCount: number;
147
- }
148
- /** The answer of `GET /api/feature-flags`. */
149
- export interface FeatureFlagsDto {
150
- /** The stage that this service runs on. It decides `codeValue`. */
151
- stage: string;
152
- /** The moment when the service built this answer. */
153
- observedAt: string;
154
- flags: FeatureFlagRowDto[];
155
- }
156
- /**
157
- * The permissions that one override payload needs, on top of nothing.
158
- *
159
- * It is here, and shared, because BOTH sides run it: `permissionsFor` of the
160
- * use case stores the answer on the row, and the dialog of control-frontend
161
- * passes the same answer to `canCreate`. Two copies of this rule would let a
162
- * button offer an override that the service then refuses with a 403.
163
- *
164
- * A prod stage override reaches every customer, thus it asks for the narrower
165
- * permission as well — to approve AND to ask.
166
- */
167
- export declare function featureFlagOverridePermissions(payload: {
168
- scope: FeatureFlagOverrideScope;
169
- target: string;
170
- }): string[];
171
- /**
172
- * The one written form of a target.
173
- *
174
- * A GUID reads the same in either case, and `ABC…` and `abc…` are the same
175
- * organization. The store and the resolver compare TEXT, so two forms of one
176
- * id would be two overrides: the unique index would allow both to be live,
177
- * and a row written in capitals would never match the id that a reader
178
- * carries. Everything that writes a target passes it through here first, so
179
- * only one form ever reaches the table.
180
- *
181
- * A stage name is lowercase already, thus this does not change one.
182
- */
183
- export declare function normalizeFeatureFlagOverrideTarget(target: string): string;
184
- /**
185
- * What is wrong with the target of an override, if anything.
186
- *
187
- * It answers `undefined` when the target is good, and a sentence for a person
188
- * when it is not.
189
- *
190
- * It is here, and shared, for the same reason as
191
- * `featureFlagOverridePermissions` above: BOTH sides run it. The dialog of
192
- * control-frontend keeps the button disabled while it answers, and the create
193
- * route of control-backend refuses the call. The dialog accepted any text
194
- * that was not empty before this, thus it offered `prod` on dev and
195
- * `not-an-org` as an organization, and both ended in a 400 after the person
196
- * had filled the whole form.
197
- *
198
- * TWO rules, and the first surprises people:
199
- *
200
- * 1. A stage override names THE STAGE OF THE SERVICE, and no other. Each
201
- * deployed stage of control-backend holds its own database, thus an
202
- * override written on dev reaches dev readers alone. A request for
203
- * another stage would collect its approvals and move nothing.
204
- * 2. An org override names a GUID.
205
- */
206
- export declare function featureFlagOverrideTargetProblem(args: {
207
- scope: FeatureFlagOverrideScope;
208
- target: string;
209
- /** The stage that the service runs on. `FeatureFlagsDto.stage` carries it. */
210
- stage: string;
211
- }): string | undefined;
212
- /** The payload of a `feature-flag-override` approval request. */
213
- export interface FeatureFlagOverridePayloadDto {
214
- flagPath: string;
215
- scope: FeatureFlagOverrideScope;
216
- target: string;
217
- enabled: boolean;
218
- /**
219
- * How many days the override holds, from the moment the action RUNS.
220
- *
221
- * A number of days and not a date, for the same reason as `extend-trial`:
222
- * days pass between the request and the run, and a stored date would lose
223
- * part of its life while the request waited for its approvals.
224
- */
225
- days: number;
226
- }
@@ -1,38 +0,0 @@
1
- import { AccountsPermissions } from "../permissions/accounts.permissions.js";
2
- const ACCOUNTS_CONTROL_FLAG_OVERRIDE = AccountsPermissions.CONTROL_FLAG_OVERRIDE;
3
- const ACCOUNTS_CONTROL_FLAG_OVERRIDE_PROD = AccountsPermissions.CONTROL_FLAG_OVERRIDE_PROD;
4
- const FEATURE_FLAG_OVERRIDE_SCOPES = ["stage", "org"];
5
- const FEATURE_FLAG_REASONS = [
6
- "DEFAULT",
7
- "OVERRIDE_STAGE",
8
- "OVERRIDE_ORG",
9
- "OVERRIDE_REFUSED"
10
- ];
11
- const FEATURE_FLAG_TYPES = ["release", "ops", "perm"];
12
- function featureFlagOverridePermissions(payload) {
13
- const base = [ACCOUNTS_CONTROL_FLAG_OVERRIDE];
14
- return payload.scope === "stage" && payload.target === "prod" ? [...base, ACCOUNTS_CONTROL_FLAG_OVERRIDE_PROD] : base;
15
- }
16
- const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
17
- function normalizeFeatureFlagOverrideTarget(target) {
18
- return target.trim().toLowerCase();
19
- }
20
- function featureFlagOverrideTargetProblem(args) {
21
- const target = normalizeFeatureFlagOverrideTarget(args.target);
22
- if (target.length === 0) {
23
- return args.scope === "stage" ? "Name the stage to move." : "Name the organization to move.";
24
- }
25
- if (args.scope === "stage") {
26
- return target === args.stage ? void 0 : `This Camunda Control runs on ${args.stage} and can move only that stage. Open the request on the Camunda Control of ${target}.`;
27
- }
28
- return GUID.test(target) ? void 0 : "An organization id is a GUID, like 11111111-1111-1111-1111-111111111111.";
29
- }
30
- export {
31
- FEATURE_FLAG_OVERRIDE_SCOPES,
32
- FEATURE_FLAG_REASONS,
33
- FEATURE_FLAG_TYPES,
34
- featureFlagOverridePermissions,
35
- featureFlagOverrideTargetProblem,
36
- normalizeFeatureFlagOverrideTarget
37
- };
38
- //# sourceMappingURL=FeatureFlagOverride.dto.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/dtos/FeatureFlagOverride.dto.ts"],
4
- "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type { Stage } from '../constants/misc.const.js'\nimport { AccountsPermissions } from '../permissions/accounts.permissions.js'\n\nconst ACCOUNTS_CONTROL_FLAG_OVERRIDE = AccountsPermissions.CONTROL_FLAG_OVERRIDE\nconst ACCOUNTS_CONTROL_FLAG_OVERRIDE_PROD =\n AccountsPermissions.CONTROL_FLAG_OVERRIDE_PROD\n\n/**\n * The wire shapes of the feature flag surface of control-backend.\n *\n * They are here and not in `@camunda-cloud/featureflags`, because\n * `@camunda/ccma-api` is published and cannot name a type from that private\n * package. The RULES stay there: `resolveFlag` decides a value, and\n * `FLAG_REGISTRY` holds the metadata. This file carries the answer over HTTP.\n *\n * `flagPath` is a `string` in every shape below. The typed `FlagPath` needs\n * `Features`, and a caller of the API names a flag that the SERVER validates\n * against its own registry. A type that the browser holds cannot do that job,\n * because the server can be older or newer than the bundle.\n */\n\n/** Which readers an override reaches. It is `FlagOverrideScope`. */\nexport const FEATURE_FLAG_OVERRIDE_SCOPES = ['stage', 'org'] as const\n\nexport type FeatureFlagOverrideScope =\n (typeof FEATURE_FLAG_OVERRIDE_SCOPES)[number]\n\n/** Why a flag has the value that it has. It is `FlagReason`. */\nexport const FEATURE_FLAG_REASONS = [\n 'DEFAULT',\n 'OVERRIDE_STAGE',\n 'OVERRIDE_ORG',\n 'OVERRIDE_REFUSED',\n] as const\n\nexport type FeatureFlagReason = (typeof FEATURE_FLAG_REASONS)[number]\n\n/** How long a flag is meant to live. It is `FlagType`. */\nexport const FEATURE_FLAG_TYPES = ['release', 'ops', 'perm'] as const\n\nexport type FeatureFlagType = (typeof FEATURE_FLAG_TYPES)[number]\n\n/**\n * One condition of the code rule of a flag.\n *\n * The code rule is a LIST of these, and a reader gets the flag when ANY one\n * matches. An empty list is off for every reader. `FLAG_RULES` of\n * `@camunda-cloud/featureflags` holds the rules, and `defaults` evaluates the\n * same objects, thus the description cannot drift from the value.\n */\nexport type FeatureFlagCondition =\n /** On for every reader. */\n | { kind: 'always' }\n /** On when the stage of the reader is one of `stages`. */\n | { kind: 'stage'; stages: Stage[] }\n /** On when the email address of the reader is a Camundi address. */\n | { kind: 'camundiEmail' }\n /** On when the email address of the reader has one of `domains`. */\n | { kind: 'emailDomain'; domains: string[] }\n /** On when the organization of the reader is one of `orgIds`. */\n | { kind: 'org'; orgIds: string[] }\n\n/** One stored override, as a reader of the API sees it. */\nexport interface FeatureFlagOverrideDto {\n id: string\n flagPath: string\n scope: FeatureFlagOverrideScope\n /** The stage for `stage`, and the organization id for `org`. */\n target: string\n enabled: boolean\n /** Why the person asked for it. The approval request demands one. */\n reason: string\n /** The approval request that wrote this row. Every row names one. */\n approvalId: string\n createdBy: { userId: string; email: string }\n createdAt: string\n /** When the override stops by itself. */\n expiresAt: string\n}\n\n/**\n * One flag, with everything a person needs to decide about it.\n *\n * The row carries the code value AND the effective value on purpose. A page\n * that showed only the effective value would hide the drift, which is the one\n * thing an override makes easy to lose.\n */\nexport interface FeatureFlagRowDto {\n flagPath: string\n label: string\n type: FeatureFlagType\n owner: string\n reason: string\n /** Whether an override can move this flag at all. */\n overridable: boolean\n /** The date after which a `release` flag is late. */\n expiresAt?: string\n /**\n * What the code answers for the stage of this service, for NOBODY.\n *\n * The evaluation carries the stage alone: no email address and no\n * organization id. A flag whose condition reads one of those answers\n * something else for a real reader \u2014 `console.clusterSuspendButton` is\n * `false` here on prod and `true` for a Camundi, and\n * `console.privateLink87` is `false` here and `true` for an allowlisted\n * organization.\n *\n * It is a BASELINE, and that is the right answer for this surface: one\n * value that every reader of the page sees, which is what makes two\n * Camundis able to talk about it. A per-viewer value would answer a\n * different thing to each of them, and a per-organization value needs an\n * organization that the route does not take.\n */\n codeValue: boolean\n /**\n * The code rule of the flag: it is on when ANY condition matches.\n *\n * This is what `codeValue` cannot say. It names the stages, the email\n * rules and the organization allowlist that decide the value for a real\n * reader.\n */\n rule: FeatureFlagCondition[]\n /**\n * The code value on each known stage, for NOBODY.\n *\n * The same baseline as `codeValue`, for every stage and not only this one.\n * It shows how far the flag stands on its rollout ladder.\n */\n codeValueByStage: Record<Stage, boolean>\n /**\n * The baseline of `codeValue` with a live override in front of it.\n *\n * Same evaluation context, thus the same limit: it is what a reader with\n * no email address and no organization gets. Use it to see the DRIFT\n * between the store and the source, which is what this surface exists\n * for, and not as the answer for one person.\n */\n effectiveValue: boolean\n /** Why `effectiveValue` is what it is. */\n effectiveReason: FeatureFlagReason\n /** The live override of the stage, if there is one. */\n stageOverride?: FeatureFlagOverrideDto\n /**\n * How many live overrides name an organization.\n *\n * A COUNT, and not the rows. The rows carry an organization id, an email\n * address and a reason for every organization that holds an override, and\n * this answer has no page, thus it would grow with the number of customers\n * and hand all of it to every reader. The page shows the number.\n */\n orgOverrideCount: number\n}\n\n/** The answer of `GET /api/feature-flags`. */\nexport interface FeatureFlagsDto {\n /** The stage that this service runs on. It decides `codeValue`. */\n stage: string\n /** The moment when the service built this answer. */\n observedAt: string\n flags: FeatureFlagRowDto[]\n}\n\n/**\n * The permissions that one override payload needs, on top of nothing.\n *\n * It is here, and shared, because BOTH sides run it: `permissionsFor` of the\n * use case stores the answer on the row, and the dialog of control-frontend\n * passes the same answer to `canCreate`. Two copies of this rule would let a\n * button offer an override that the service then refuses with a 403.\n *\n * A prod stage override reaches every customer, thus it asks for the narrower\n * permission as well \u2014 to approve AND to ask.\n */\nexport function featureFlagOverridePermissions(payload: {\n scope: FeatureFlagOverrideScope\n target: string\n}): string[] {\n const base = [ACCOUNTS_CONTROL_FLAG_OVERRIDE]\n return payload.scope === 'stage' && payload.target === 'prod'\n ? [...base, ACCOUNTS_CONTROL_FLAG_OVERRIDE_PROD]\n : base\n}\n\n/**\n * A GUID, as the create route reads one.\n *\n * The server says `z.guid()`. This is the same shape for the browser, which\n * holds no zod: 8-4-4-4-12 hexadecimal characters.\n */\nconst GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/**\n * The one written form of a target.\n *\n * A GUID reads the same in either case, and `ABC\u2026` and `abc\u2026` are the same\n * organization. The store and the resolver compare TEXT, so two forms of one\n * id would be two overrides: the unique index would allow both to be live,\n * and a row written in capitals would never match the id that a reader\n * carries. Everything that writes a target passes it through here first, so\n * only one form ever reaches the table.\n *\n * A stage name is lowercase already, thus this does not change one.\n */\nexport function normalizeFeatureFlagOverrideTarget(target: string): string {\n return target.trim().toLowerCase()\n}\n\n/**\n * What is wrong with the target of an override, if anything.\n *\n * It answers `undefined` when the target is good, and a sentence for a person\n * when it is not.\n *\n * It is here, and shared, for the same reason as\n * `featureFlagOverridePermissions` above: BOTH sides run it. The dialog of\n * control-frontend keeps the button disabled while it answers, and the create\n * route of control-backend refuses the call. The dialog accepted any text\n * that was not empty before this, thus it offered `prod` on dev and\n * `not-an-org` as an organization, and both ended in a 400 after the person\n * had filled the whole form.\n *\n * TWO rules, and the first surprises people:\n *\n * 1. A stage override names THE STAGE OF THE SERVICE, and no other. Each\n * deployed stage of control-backend holds its own database, thus an\n * override written on dev reaches dev readers alone. A request for\n * another stage would collect its approvals and move nothing.\n * 2. An org override names a GUID.\n */\nexport function featureFlagOverrideTargetProblem(args: {\n scope: FeatureFlagOverrideScope\n target: string\n /** The stage that the service runs on. `FeatureFlagsDto.stage` carries it. */\n stage: string\n}): string | undefined {\n const target = normalizeFeatureFlagOverrideTarget(args.target)\n if (target.length === 0) {\n return args.scope === 'stage'\n ? 'Name the stage to move.'\n : 'Name the organization to move.'\n }\n if (args.scope === 'stage') {\n return target === args.stage\n ? undefined\n : `This Camunda Control runs on ${args.stage} and can move only that ` +\n `stage. Open the request on the Camunda Control of ${target}.`\n }\n return GUID.test(target)\n ? undefined\n : 'An organization id is a GUID, like 11111111-1111-1111-1111-111111111111.'\n}\n\n/** The payload of a `feature-flag-override` approval request. */\nexport interface FeatureFlagOverridePayloadDto {\n flagPath: string\n scope: FeatureFlagOverrideScope\n target: string\n enabled: boolean\n /**\n * How many days the override holds, from the moment the action RUNS.\n *\n * A number of days and not a date, for the same reason as `extend-trial`:\n * days pass between the request and the run, and a stored date would lose\n * part of its life while the request waited for its approvals.\n */\n days: number\n}\n"],
5
- "mappings": "AAOA,SAAS,2BAA2B;AAEpC,MAAM,iCAAiC,oBAAoB;AAC3D,MAAM,sCACJ,oBAAoB;AAiBf,MAAM,+BAA+B,CAAC,SAAS,KAAK;AAMpD,MAAM,uBAAuB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,MAAM,qBAAqB,CAAC,WAAW,OAAO,MAAM;AAuIpD,SAAS,+BAA+B,SAGlC;AACX,QAAM,OAAO,CAAC,8BAA8B;AAC5C,SAAO,QAAQ,UAAU,WAAW,QAAQ,WAAW,SACnD,CAAC,GAAG,MAAM,mCAAmC,IAC7C;AACN;AAQA,MAAM,OAAO;AAcN,SAAS,mCAAmC,QAAwB;AACzE,SAAO,OAAO,KAAK,EAAE,YAAY;AACnC;AAwBO,SAAS,iCAAiC,MAK1B;AACrB,QAAM,SAAS,mCAAmC,KAAK,MAAM;AAC7D,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,KAAK,UAAU,UAClB,4BACA;AAAA,EACN;AACA,MAAI,KAAK,UAAU,SAAS;AAC1B,WAAO,WAAW,KAAK,QACnB,SACA,gCAAgC,KAAK,KAAK,6EACa,MAAM;AAAA,EACnE;AACA,SAAO,KAAK,KAAK,MAAM,IACnB,SACA;AACN;",
6
- "names": []
7
- }