@camunda/ccma-shared-types 0.0.3 → 0.0.5

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 (50) hide show
  1. package/dist/_tests/types/AutoSleep.type.spec.d.ts +1 -0
  2. package/dist/constants/secureConnectivity.const.d.ts +1 -0
  3. package/dist/constants/secureConnectivity.const.js +5 -0
  4. package/dist/constants/secureConnectivity.const.js.map +7 -0
  5. package/dist/dtos/AlertSubscription.dto.d.ts +1 -0
  6. package/dist/dtos/AlertSubscription.dto.js.map +2 -2
  7. package/dist/dtos/CommonCluster.dto.d.ts +6 -0
  8. package/dist/dtos/Organization.dto.d.ts +4 -0
  9. package/dist/dtos/Organization.dto.js +12 -0
  10. package/dist/dtos/Organization.dto.js.map +3 -3
  11. package/dist/dtos/SalesPlan.dto.d.ts +21 -0
  12. package/dist/dtos/SalesPlan.dto.js +18 -1
  13. package/dist/dtos/SalesPlan.dto.js.map +2 -2
  14. package/dist/enums/AuditEntity.enum.d.ts +3 -2
  15. package/dist/enums/AuditEntity.enum.js +2 -1
  16. package/dist/enums/AuditEntity.enum.js.map +2 -2
  17. package/dist/enums/ClusterStatus.enum.d.ts +3 -1
  18. package/dist/enums/ClusterStatus.enum.js +2 -0
  19. package/dist/enums/ClusterStatus.enum.js.map +2 -2
  20. package/dist/enums/ErrorType.enum.d.ts +1 -0
  21. package/dist/enums/ErrorType.enum.js +1 -0
  22. package/dist/enums/ErrorType.enum.js.map +2 -2
  23. package/dist/index.d.ts +7 -3
  24. package/dist/index.js +31 -1
  25. package/dist/index.js.map +2 -2
  26. package/dist/permissions/accounts.permissions.d.ts +2 -0
  27. package/dist/permissions/accounts.permissions.js +13 -1
  28. package/dist/permissions/accounts.permissions.js.map +2 -2
  29. package/dist/permissions/combo.js +6 -0
  30. package/dist/permissions/combo.js.map +2 -2
  31. package/dist/permissions/console.permissions.d.ts +2 -0
  32. package/dist/permissions/console.permissions.js +8 -1
  33. package/dist/permissions/console.permissions.js.map +2 -2
  34. package/dist/types/AutoSleep.type.d.ts +58 -0
  35. package/dist/types/AutoSleep.type.js +49 -0
  36. package/dist/types/AutoSleep.type.js.map +7 -0
  37. package/dist/types/ConsoleSelfManaged.type.d.ts +0 -1
  38. package/dist/types/ConsoleSelfManaged.type.js.map +2 -2
  39. package/dist/types/SuspendStrategy.type.d.ts +1 -1
  40. package/dist/types/SuspendStrategy.type.js +14 -1
  41. package/dist/types/SuspendStrategy.type.js.map +2 -2
  42. package/dist/types/Telemetry.type.js +1 -0
  43. package/dist/types/Telemetry.type.js.map +1 -1
  44. package/dist/utils/string-validation.utils.d.ts +2 -0
  45. package/dist/utils/string-validation.utils.js +60 -1
  46. package/dist/utils/string-validation.utils.js.map +2 -2
  47. package/dist/utils/versionCheck.utils.d.ts +1 -1
  48. package/dist/utils/versionCheck.utils.js +33 -15
  49. package/dist/utils/versionCheck.utils.js.map +2 -2
  50. package/package.json +1 -5
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The name of the only internal sales plan eligible for the activity-based
3
+ * auto-sleep mechanism (runImmiRun).
4
+ */
5
+ export declare const INTERNAL_LOW_HARDWARE_PLAN_NAME = "Internal with Low Hardware";
6
+ /**
7
+ * Cluster tags that the 8h sleep cron targets.
8
+ * Clusters whose camunda label is null, undefined, empty, or 'dev' are queried.
9
+ * Note: null is included because the sleep cron queries the DB with `IsNull()`.
10
+ */
11
+ export declare const SLEEP_CRON_ELIGIBLE_TAGS: ReadonlyArray<string | null | undefined>;
12
+ export interface SleepCronEligibilityOptions {
13
+ /** The cluster's camunda stage tag (e.g. 'dev', 'prod', null, undefined). */
14
+ clusterTag?: string | null;
15
+ /** The runtime stage of the environment ('dev' | 'int' | 'prod'). */
16
+ stage: string;
17
+ /** The org's sales plan type. */
18
+ salesPlanType?: string;
19
+ /** The org's sales plan name. */
20
+ salesPlanName?: string;
21
+ }
22
+ /**
23
+ * Returns whether a cluster is targeted by the 8h sleep cron based on its tag.
24
+ * The cron queries clusters whose camunda label is null, undefined, empty, or 'dev'.
25
+ * null is treated the same as undefined because the DB stores absent labels as NULL.
26
+ */
27
+ export declare function isClusterTagEligibleForSleepCron(clusterTag?: string | null): boolean;
28
+ /**
29
+ * Returns whether a cluster is eligible for the 8-hour sleep cron.
30
+ *
31
+ * On preprod (dev/int): all clusters matching the tag filter are eligible
32
+ * regardless of sales plan.
33
+ *
34
+ * On prod: the cluster must match the tag filter AND the org's sales plan
35
+ * must be TRIAL, INTERNAL, or an enterprise plan in
36
+ * NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS.
37
+ */
38
+ export declare function isSleepCronEligible(options: SleepCronEligibilityOptions): boolean;
39
+ /**
40
+ * Returns whether a sales plan qualifies for the 8h sleep cron on production.
41
+ */
42
+ export declare function isSalesPlanEligibleForSleepCron(salesPlanType?: string, salesPlanName?: string): boolean;
43
+ export interface ActivitySleepEligibilityOptions {
44
+ /** The org's sales plan type. */
45
+ salesPlanType?: string;
46
+ /** The org's sales plan name. */
47
+ salesPlanName?: string;
48
+ }
49
+ /**
50
+ * Returns whether a cluster's org is eligible for the activity-based
51
+ * auto-sleep mechanism (runImmiRun).
52
+ *
53
+ * Eligible plans:
54
+ * - TRIAL (all)
55
+ * - INTERNAL only if plan name is "Internal with Low Hardware"
56
+ * - ENTERPRISE only if plan name is in NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS
57
+ */
58
+ export declare function isActivitySleepEligible(options: ActivitySleepEligibilityOptions): boolean;
@@ -0,0 +1,49 @@
1
+ import { NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS } from "../constants/misc.const.js";
2
+ import { SalesPlanType } from "./SalesPlanType.type.js";
3
+ const INTERNAL_LOW_HARDWARE_PLAN_NAME = "Internal with Low Hardware";
4
+ const SLEEP_CRON_ELIGIBLE_TAGS = [null, void 0, "", "dev"];
5
+ function isClusterTagEligibleForSleepCron(clusterTag) {
6
+ return clusterTag === null || clusterTag === void 0 || clusterTag === "" || clusterTag === "dev";
7
+ }
8
+ function isSleepCronEligible(options) {
9
+ const { clusterTag, stage, salesPlanType, salesPlanName } = options;
10
+ if (!isClusterTagEligibleForSleepCron(clusterTag)) {
11
+ return false;
12
+ }
13
+ if (stage === "dev" || stage === "int") {
14
+ return true;
15
+ }
16
+ return isSalesPlanEligibleForSleepCron(salesPlanType, salesPlanName);
17
+ }
18
+ function isSalesPlanEligibleForSleepCron(salesPlanType, salesPlanName) {
19
+ if (salesPlanType === SalesPlanType.TRIAL) return true;
20
+ if (salesPlanType === SalesPlanType.INTERNAL) return true;
21
+ if (salesPlanType === SalesPlanType.ENTERPRISE && salesPlanName !== void 0 && NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS.includes(
22
+ salesPlanName
23
+ )) {
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ function isActivitySleepEligible(options) {
29
+ const { salesPlanType, salesPlanName } = options;
30
+ if (salesPlanType === SalesPlanType.TRIAL) return true;
31
+ if (salesPlanType === SalesPlanType.INTERNAL && salesPlanName === INTERNAL_LOW_HARDWARE_PLAN_NAME) {
32
+ return true;
33
+ }
34
+ if (salesPlanType === SalesPlanType.ENTERPRISE && salesPlanName !== void 0 && NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS.includes(
35
+ salesPlanName
36
+ )) {
37
+ return true;
38
+ }
39
+ return false;
40
+ }
41
+ export {
42
+ INTERNAL_LOW_HARDWARE_PLAN_NAME,
43
+ SLEEP_CRON_ELIGIBLE_TAGS,
44
+ isActivitySleepEligible,
45
+ isClusterTagEligibleForSleepCron,
46
+ isSalesPlanEligibleForSleepCron,
47
+ isSleepCronEligible
48
+ };
49
+ //# sourceMappingURL=AutoSleep.type.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/types/AutoSleep.type.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 { NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS } from '../constants/misc.const.js'\nimport { SalesPlanType } from './SalesPlanType.type.js'\n\n/**\n * The name of the only internal sales plan eligible for the activity-based\n * auto-sleep mechanism (runImmiRun).\n */\nexport const INTERNAL_LOW_HARDWARE_PLAN_NAME = 'Internal with Low Hardware'\n\n/**\n * Cluster tags that the 8h sleep cron targets.\n * Clusters whose camunda label is null, undefined, empty, or 'dev' are queried.\n * Note: null is included because the sleep cron queries the DB with `IsNull()`.\n */\nexport const SLEEP_CRON_ELIGIBLE_TAGS: ReadonlyArray<\n string | null | undefined\n> = [null, undefined, '', 'dev']\n\n// ---------------------------------------------------------------------------\n// 8h Sleep Cron eligibility\n// ---------------------------------------------------------------------------\n\nexport interface SleepCronEligibilityOptions {\n /** The cluster's camunda stage tag (e.g. 'dev', 'prod', null, undefined). */\n clusterTag?: string | null\n /** The runtime stage of the environment ('dev' | 'int' | 'prod'). */\n stage: string\n /** The org's sales plan type. */\n salesPlanType?: string\n /** The org's sales plan name. */\n salesPlanName?: string\n}\n\n/**\n * Returns whether a cluster is targeted by the 8h sleep cron based on its tag.\n * The cron queries clusters whose camunda label is null, undefined, empty, or 'dev'.\n * null is treated the same as undefined because the DB stores absent labels as NULL.\n */\nexport function isClusterTagEligibleForSleepCron(\n clusterTag?: string | null,\n): boolean {\n return (\n clusterTag === null ||\n clusterTag === undefined ||\n clusterTag === '' ||\n clusterTag === 'dev'\n )\n}\n\n/**\n * Returns whether a cluster is eligible for the 8-hour sleep cron.\n *\n * On preprod (dev/int): all clusters matching the tag filter are eligible\n * regardless of sales plan.\n *\n * On prod: the cluster must match the tag filter AND the org's sales plan\n * must be TRIAL, INTERNAL, or an enterprise plan in\n * NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS.\n */\nexport function isSleepCronEligible(\n options: SleepCronEligibilityOptions,\n): boolean {\n const { clusterTag, stage, salesPlanType, salesPlanName } = options\n\n if (!isClusterTagEligibleForSleepCron(clusterTag)) {\n return false\n }\n\n // Preprod: all tag-matching clusters qualify\n if (stage === 'dev' || stage === 'int') {\n return true\n }\n\n // Prod: must have an eligible sales plan\n return isSalesPlanEligibleForSleepCron(salesPlanType, salesPlanName)\n}\n\n/**\n * Returns whether a sales plan qualifies for the 8h sleep cron on production.\n */\nexport function isSalesPlanEligibleForSleepCron(\n salesPlanType?: string,\n salesPlanName?: string,\n): boolean {\n if (salesPlanType === SalesPlanType.TRIAL) return true\n if (salesPlanType === SalesPlanType.INTERNAL) return true\n if (\n salesPlanType === SalesPlanType.ENTERPRISE &&\n salesPlanName !== undefined &&\n NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS.includes(\n salesPlanName,\n )\n ) {\n return true\n }\n return false\n}\n\n// ---------------------------------------------------------------------------\n// Activity-based auto-sleep (runImmiRun) eligibility\n// ---------------------------------------------------------------------------\n\nexport interface ActivitySleepEligibilityOptions {\n /** The org's sales plan type. */\n salesPlanType?: string\n /** The org's sales plan name. */\n salesPlanName?: string\n}\n\n/**\n * Returns whether a cluster's org is eligible for the activity-based\n * auto-sleep mechanism (runImmiRun).\n *\n * Eligible plans:\n * - TRIAL (all)\n * - INTERNAL only if plan name is \"Internal with Low Hardware\"\n * - ENTERPRISE only if plan name is in NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS\n */\nexport function isActivitySleepEligible(\n options: ActivitySleepEligibilityOptions,\n): boolean {\n const { salesPlanType, salesPlanName } = options\n\n if (salesPlanType === SalesPlanType.TRIAL) return true\n\n if (\n salesPlanType === SalesPlanType.INTERNAL &&\n salesPlanName === INTERNAL_LOW_HARDWARE_PLAN_NAME\n ) {\n return true\n }\n\n if (\n salesPlanType === SalesPlanType.ENTERPRISE &&\n salesPlanName !== undefined &&\n NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS.includes(\n salesPlanName,\n )\n ) {\n return true\n }\n\n return false\n}\n"],
5
+ "mappings": "AAMA,SAAS,6DAA6D;AACtE,SAAS,qBAAqB;AAMvB,MAAM,kCAAkC;AAOxC,MAAM,2BAET,CAAC,MAAM,QAAW,IAAI,KAAK;AAsBxB,SAAS,iCACd,YACS;AACT,SACE,eAAe,QACf,eAAe,UACf,eAAe,MACf,eAAe;AAEnB;AAYO,SAAS,oBACd,SACS;AACT,QAAM,EAAE,YAAY,OAAO,eAAe,cAAc,IAAI;AAE5D,MAAI,CAAC,iCAAiC,UAAU,GAAG;AACjD,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,SAAS,UAAU,OAAO;AACtC,WAAO;AAAA,EACT;AAGA,SAAO,gCAAgC,eAAe,aAAa;AACrE;AAKO,SAAS,gCACd,eACA,eACS;AACT,MAAI,kBAAkB,cAAc,MAAO,QAAO;AAClD,MAAI,kBAAkB,cAAc,SAAU,QAAO;AACrD,MACE,kBAAkB,cAAc,cAChC,kBAAkB,UAClB,sDAAsD;AAAA,IACpD;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAsBO,SAAS,wBACd,SACS;AACT,QAAM,EAAE,eAAe,cAAc,IAAI;AAEzC,MAAI,kBAAkB,cAAc,MAAO,QAAO;AAElD,MACE,kBAAkB,cAAc,YAChC,kBAAkB,iCAClB;AACA,WAAO;AAAA,EACT;AAEA,MACE,kBAAkB,cAAc,cAChC,kBAAkB,UAClB,sDAAsD;AAAA,IACpD;AAAA,EACF,GACA;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -109,7 +109,6 @@ export declare namespace ConsoleSM {
109
109
  isCommercial: boolean;
110
110
  expiresAt: number | undefined;
111
111
  discoveryModeEnabled: boolean;
112
- jobDashboardEnabled: boolean;
113
112
  };
114
113
  fatalErrors: FatalError[];
115
114
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/ConsoleSelfManaged.type.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\nexport namespace ConsoleSM {\n export const CONFIG_UNSET = 'unset'\n export type Status = 'healthy' | 'unhealthy' | 'unknown'\n\n export type AppType =\n | 'zeebe-broker'\n | 'zeebe-gateway'\n | 'operate'\n | 'tasklist'\n | 'optimize'\n | 'modeler'\n | 'console'\n | 'identity'\n | 'connectors'\n | 'orchestration'\n | 'orchestrationIdentity'\n | 'unknown'\n\n export function NameByAppType(appType: AppType): string {\n switch (appType) {\n case 'zeebe-broker':\n return 'Zeebe'\n case 'zeebe-gateway':\n return 'Zeebe Gateway'\n case 'operate':\n return 'Operate'\n case 'tasklist':\n return 'Tasklist'\n case 'optimize':\n return 'Optimize'\n case 'modeler':\n return 'Modeler'\n case 'console':\n return 'Console'\n case 'identity':\n return 'Identity'\n case 'connectors':\n return 'Connectors'\n case 'orchestration':\n return 'Orchestration'\n case 'orchestrationIdentity':\n return 'Identity'\n default:\n return 'Unknown'\n }\n }\n\n export type ClusterType = 'automation' | 'management'\n\n export interface App {\n type: AppType\n id: string\n status: Status\n url: string\n urls?: {\n grpc: string\n http: string\n }\n generation: string\n readiness?: string\n metrics?: string\n }\n\n export interface CamundaLicense {\n validLicense: boolean\n licenseType: string\n isCommercial?: boolean\n expiresAt?: string\n }\n\n export interface DiscoveredCluster {\n license: CamundaLicense\n clusterId: string\n clusterName: string\n version: string\n properties?: Record<string, string>\n }\n\n export interface Cluster {\n /**\n * Unique identifier of the cluster\n */\n uuid: string\n /**\n * Name of the cluster\n */\n name: string\n /**\n * Tags of the cluster, example: dev, stage, prod\n */\n tags?: string[]\n /**\n * Custom properties of the cluster\n */\n customProperties?: Array<{\n description?: string\n links?: Array<{\n name?: string\n url?: string\n }>\n }>\n /**\n * Namespace the cluster is running in.\n */\n namespace: string\n /**\n * Indicates if a cluster is healthy or not\n */\n status: Status\n /**\n * This is the current version of the running cluster\n */\n generation: string\n /**\n * We're distinguishing between automation and management clusters. Management clusters include applications that act globally in an installed context, like Console or Modeler. Automation clusters are the Zeebe clusters including applications like Operate, Tasklist and Optimize.\n */\n type: ClusterType\n /**\n * The list of applications running in the cluster\n */\n apps: App[]\n /**\n * audit events of the cluster\n */\n audit?: Array<{\n ts: number\n }>\n /**\n * Custom properties added by the discovery process.\n */\n discoveredClusterProperties?: Record<string, string>\n /**\n * The cluster license information\n */\n license?: CamundaLicense\n }\n\n export type TelemetryState = 'disabled' | 'online' | 'download'\n export type LicanseState = 'disabled' | 'valid' | 'invalid'\n\n export interface AppConfig {\n auth: {\n clientId: string\n audience: string\n issuer: string\n type: string\n disabled: boolean\n redirectTrailingSlash: boolean\n redirectUrl: string\n resource?: string\n }\n customerContext: {\n customerId: string\n installationId: string\n telemetry: TelemetryState\n license: LicanseState\n isCommercial: boolean\n expiresAt: number | undefined\n discoveryModeEnabled: boolean\n jobDashboardEnabled: boolean\n }\n fatalErrors: FatalError[]\n }\n\n export interface UsageMetrics {\n total: number\n }\n\n export interface UsageMetricsInstances extends UsageMetrics {}\n\n export interface UsageMetricsTaskUsers extends UsageMetrics {\n assignees: string[]\n }\n\n export interface UsageMetricsForCluster {\n id: string\n processInstances: UsageMetricsInstances\n decisionInstances: UsageMetricsInstances\n taskUsers: UsageMetricsTaskUsers\n activeTenants?: UsageMetricsInstances\n }\n\n // CONFIG PARAMS\n\n export interface ConfigParams {\n csm_context_path: string\n }\n\n // SSE\n\n export interface SendEventOptions<T> {\n type: 'status' | 'keepalive' | 'cluster-update'\n payload: T\n }\n\n export interface SseKeepAlivePayload {\n keepAlive: boolean\n }\n\n // Fatal Errors\n\n export type FatalErrorType =\n | 'configmap-not-found'\n | 'api-token-unauthorized'\n | 'api-token-unset'\n | 'customer-context-unset'\n | 'automation-clusters-unset'\n | 'management-cluster-unset'\n | 'jwks-not-reachable'\n | 'backend-error'\n | 'auth-config-incomplete'\n | 'mobx-error'\n\n export const FataErrorDescriptions: Record<\n FatalErrorType,\n { message: string; fatal: boolean }\n > = {\n 'configmap-not-found': {\n message: 'Failed to read file with configmap data',\n fatal: true,\n },\n 'api-token-unset': {\n message: 'Telemetry API token not set',\n fatal: false,\n },\n 'api-token-unauthorized': {\n message: 'Telemetry API token unauthorized',\n fatal: false,\n },\n 'customer-context-unset': {\n message: 'Customer Id or Installation Id not set',\n fatal: false,\n },\n 'automation-clusters-unset': {\n message: 'No automation clusters found',\n fatal: false,\n },\n 'management-cluster-unset': {\n message: 'No management cluster found',\n fatal: false,\n },\n 'jwks-not-reachable': {\n message: 'JWKS for authentication is not reachable',\n fatal: true,\n },\n 'backend-error': {\n message: 'Backend error',\n fatal: true,\n },\n 'auth-config-incomplete': {\n message:\n 'Auth Config incomplete. Please make sure to set all required values.',\n fatal: true,\n },\n 'mobx-error': {\n message: 'Something went wrong with object assignments.',\n fatal: false,\n },\n }\n\n export interface FatalError {\n type: FatalErrorType\n message: string\n ts: number\n fatal: boolean\n count: number\n }\n\n // DEBUG\n\n export interface DebugData {\n configmap: string\n configmapOverride?: string\n envvars: Array<{ key: string; value: string }>\n }\n\n // ///////////////////////////////////////////////////////////////////////////7\n // HEALTH CHECK\n\n export namespace Health {\n // eslint-disable-next-line no-shadow\n export enum EndpointSource {\n CONFIG_OR_ENV = 'Extra Values or Environment Variables',\n CONFIGMAP = 'ConfigMap',\n }\n\n // eslint-disable-next-line no-shadow\n export enum TEAM {\n UNSET = 'U',\n CONSOLE = 'C',\n DISTRIBUTION = 'D',\n }\n\n interface BaseContext {\n type: 'endpoint' | 'configuration'\n team: TEAM\n }\n\n export interface Endpoint extends BaseContext {\n type: 'endpoint'\n name: string\n url: string\n source: EndpointSource\n method?: 'post'\n ignore?: boolean\n }\n\n export interface Configuration extends BaseContext {\n type: 'configuration'\n source: string\n }\n\n export type Context = Endpoint | Configuration\n\n export interface Result {\n problemIdentitfied: boolean\n message: string\n context: Context\n ts?: number\n }\n\n export interface HealthCheck {\n ts: number\n results: Result[]\n }\n }\n}\n"],
5
- "mappings": "AAMO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACE,EAAMA,WAAA,eAAe;AAiBrB,WAAS,cAAc,SAA0B;AACtD,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AA3BO,EAAAA,WAAS;AAmMT,EAAMA,WAAA,wBAGT;AAAA,IACF,uBAAuB;AAAA,MACrB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,mBAAmB;AAAA,MACjB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,0BAA0B;AAAA,MACxB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,0BAA0B;AAAA,MACxB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,6BAA6B;AAAA,MAC3B,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,4BAA4B;AAAA,MAC1B,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,sBAAsB;AAAA,MACpB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,0BAA0B;AAAA,MACxB,SACE;AAAA,MACF,OAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAqBO,MAAU;AAAV,IAAUC,YAAV;AAEE,QAAK;AAAL,MAAKC,oBAAL;AACL,MAAAA,gBAAA,mBAAgB;AAChB,MAAAA,gBAAA,eAAY;AAAA,OAFF,iBAAAD,QAAA,mBAAAA,QAAA;AAML,QAAK;AAAL,MAAKE,UAAL;AACL,MAAAA,MAAA,WAAQ;AACR,MAAAA,MAAA,aAAU;AACV,MAAAA,MAAA,kBAAe;AAAA,OAHL,OAAAF,QAAA,SAAAA,QAAA;AAAA,KARG,SAAAD,WAAA,WAAAA,WAAA;AAAA,GAvRF;",
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\nexport namespace ConsoleSM {\n export const CONFIG_UNSET = 'unset'\n export type Status = 'healthy' | 'unhealthy' | 'unknown'\n\n export type AppType =\n | 'zeebe-broker'\n | 'zeebe-gateway'\n | 'operate'\n | 'tasklist'\n | 'optimize'\n | 'modeler'\n | 'console'\n | 'identity'\n | 'connectors'\n | 'orchestration'\n | 'orchestrationIdentity'\n | 'unknown'\n\n export function NameByAppType(appType: AppType): string {\n switch (appType) {\n case 'zeebe-broker':\n return 'Zeebe'\n case 'zeebe-gateway':\n return 'Zeebe Gateway'\n case 'operate':\n return 'Operate'\n case 'tasklist':\n return 'Tasklist'\n case 'optimize':\n return 'Optimize'\n case 'modeler':\n return 'Modeler'\n case 'console':\n return 'Console'\n case 'identity':\n return 'Identity'\n case 'connectors':\n return 'Connectors'\n case 'orchestration':\n return 'Orchestration'\n case 'orchestrationIdentity':\n return 'Identity'\n default:\n return 'Unknown'\n }\n }\n\n export type ClusterType = 'automation' | 'management'\n\n export interface App {\n type: AppType\n id: string\n status: Status\n url: string\n urls?: {\n grpc: string\n http: string\n }\n generation: string\n readiness?: string\n metrics?: string\n }\n\n export interface CamundaLicense {\n validLicense: boolean\n licenseType: string\n isCommercial?: boolean\n expiresAt?: string\n }\n\n export interface DiscoveredCluster {\n license: CamundaLicense\n clusterId: string\n clusterName: string\n version: string\n properties?: Record<string, string>\n }\n\n export interface Cluster {\n /**\n * Unique identifier of the cluster\n */\n uuid: string\n /**\n * Name of the cluster\n */\n name: string\n /**\n * Tags of the cluster, example: dev, stage, prod\n */\n tags?: string[]\n /**\n * Custom properties of the cluster\n */\n customProperties?: Array<{\n description?: string\n links?: Array<{\n name?: string\n url?: string\n }>\n }>\n /**\n * Namespace the cluster is running in.\n */\n namespace: string\n /**\n * Indicates if a cluster is healthy or not\n */\n status: Status\n /**\n * This is the current version of the running cluster\n */\n generation: string\n /**\n * We're distinguishing between automation and management clusters. Management clusters include applications that act globally in an installed context, like Console or Modeler. Automation clusters are the Zeebe clusters including applications like Operate, Tasklist and Optimize.\n */\n type: ClusterType\n /**\n * The list of applications running in the cluster\n */\n apps: App[]\n /**\n * audit events of the cluster\n */\n audit?: Array<{\n ts: number\n }>\n /**\n * Custom properties added by the discovery process.\n */\n discoveredClusterProperties?: Record<string, string>\n /**\n * The cluster license information\n */\n license?: CamundaLicense\n }\n\n export type TelemetryState = 'disabled' | 'online' | 'download'\n export type LicanseState = 'disabled' | 'valid' | 'invalid'\n\n export interface AppConfig {\n auth: {\n clientId: string\n audience: string\n issuer: string\n type: string\n disabled: boolean\n redirectTrailingSlash: boolean\n redirectUrl: string\n resource?: string\n }\n customerContext: {\n customerId: string\n installationId: string\n telemetry: TelemetryState\n license: LicanseState\n isCommercial: boolean\n expiresAt: number | undefined\n discoveryModeEnabled: boolean\n }\n fatalErrors: FatalError[]\n }\n\n export interface UsageMetrics {\n total: number\n }\n\n export interface UsageMetricsInstances extends UsageMetrics {}\n\n export interface UsageMetricsTaskUsers extends UsageMetrics {\n assignees: string[]\n }\n\n export interface UsageMetricsForCluster {\n id: string\n processInstances: UsageMetricsInstances\n decisionInstances: UsageMetricsInstances\n taskUsers: UsageMetricsTaskUsers\n activeTenants?: UsageMetricsInstances\n }\n\n // CONFIG PARAMS\n\n export interface ConfigParams {\n csm_context_path: string\n }\n\n // SSE\n\n export interface SendEventOptions<T> {\n type: 'status' | 'keepalive' | 'cluster-update'\n payload: T\n }\n\n export interface SseKeepAlivePayload {\n keepAlive: boolean\n }\n\n // Fatal Errors\n\n export type FatalErrorType =\n | 'configmap-not-found'\n | 'api-token-unauthorized'\n | 'api-token-unset'\n | 'customer-context-unset'\n | 'automation-clusters-unset'\n | 'management-cluster-unset'\n | 'jwks-not-reachable'\n | 'backend-error'\n | 'auth-config-incomplete'\n | 'mobx-error'\n\n export const FataErrorDescriptions: Record<\n FatalErrorType,\n { message: string; fatal: boolean }\n > = {\n 'configmap-not-found': {\n message: 'Failed to read file with configmap data',\n fatal: true,\n },\n 'api-token-unset': {\n message: 'Telemetry API token not set',\n fatal: false,\n },\n 'api-token-unauthorized': {\n message: 'Telemetry API token unauthorized',\n fatal: false,\n },\n 'customer-context-unset': {\n message: 'Customer Id or Installation Id not set',\n fatal: false,\n },\n 'automation-clusters-unset': {\n message: 'No automation clusters found',\n fatal: false,\n },\n 'management-cluster-unset': {\n message: 'No management cluster found',\n fatal: false,\n },\n 'jwks-not-reachable': {\n message: 'JWKS for authentication is not reachable',\n fatal: true,\n },\n 'backend-error': {\n message: 'Backend error',\n fatal: true,\n },\n 'auth-config-incomplete': {\n message:\n 'Auth Config incomplete. Please make sure to set all required values.',\n fatal: true,\n },\n 'mobx-error': {\n message: 'Something went wrong with object assignments.',\n fatal: false,\n },\n }\n\n export interface FatalError {\n type: FatalErrorType\n message: string\n ts: number\n fatal: boolean\n count: number\n }\n\n // DEBUG\n\n export interface DebugData {\n configmap: string\n configmapOverride?: string\n envvars: Array<{ key: string; value: string }>\n }\n\n // ///////////////////////////////////////////////////////////////////////////7\n // HEALTH CHECK\n\n export namespace Health {\n // eslint-disable-next-line no-shadow\n export enum EndpointSource {\n CONFIG_OR_ENV = 'Extra Values or Environment Variables',\n CONFIGMAP = 'ConfigMap',\n }\n\n // eslint-disable-next-line no-shadow\n export enum TEAM {\n UNSET = 'U',\n CONSOLE = 'C',\n DISTRIBUTION = 'D',\n }\n\n interface BaseContext {\n type: 'endpoint' | 'configuration'\n team: TEAM\n }\n\n export interface Endpoint extends BaseContext {\n type: 'endpoint'\n name: string\n url: string\n source: EndpointSource\n method?: 'post'\n ignore?: boolean\n }\n\n export interface Configuration extends BaseContext {\n type: 'configuration'\n source: string\n }\n\n export type Context = Endpoint | Configuration\n\n export interface Result {\n problemIdentitfied: boolean\n message: string\n context: Context\n ts?: number\n }\n\n export interface HealthCheck {\n ts: number\n results: Result[]\n }\n }\n}\n"],
5
+ "mappings": "AAMO,IAAU;AAAA,CAAV,CAAUA,eAAV;AACE,EAAMA,WAAA,eAAe;AAiBrB,WAAS,cAAc,SAA0B;AACtD,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AA3BO,EAAAA,WAAS;AAkMT,EAAMA,WAAA,wBAGT;AAAA,IACF,uBAAuB;AAAA,MACrB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,mBAAmB;AAAA,MACjB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,0BAA0B;AAAA,MACxB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,0BAA0B;AAAA,MACxB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,6BAA6B;AAAA,MAC3B,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,4BAA4B;AAAA,MAC1B,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,sBAAsB;AAAA,MACpB,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,0BAA0B;AAAA,MACxB,SACE;AAAA,MACF,OAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAqBO,MAAU;AAAV,IAAUC,YAAV;AAEE,QAAK;AAAL,MAAKC,oBAAL;AACL,MAAAA,gBAAA,mBAAgB;AAChB,MAAAA,gBAAA,eAAY;AAAA,OAFF,iBAAAD,QAAA,mBAAAA,QAAA;AAML,QAAK;AAAL,MAAKE,UAAL;AACL,MAAAA,MAAA,WAAQ;AACR,MAAAA,MAAA,aAAU;AACV,MAAAA,MAAA,kBAAe;AAAA,OAHL,OAAAF,QAAA,SAAAA,QAAA;AAAA,KARG,SAAAD,WAAA,WAAAA,WAAA;AAAA,GAtRF;",
6
6
  "names": ["ConsoleSM", "Health", "EndpointSource", "TEAM"]
7
7
  }
@@ -9,7 +9,7 @@ export interface GetSuspendStrategyOptions {
9
9
  * Determines the suspend strategy for a cluster based on the organization's sales plan.
10
10
  *
11
11
  * Returns 'ScaleDownAndDeleteDisk' if:
12
- * 1. The sales plan type is TRIAL (or INTERNAL in dev/int environments)
12
+ * 1. The sales plan type is TRIAL (or INTERNAL in dev/int environments, or ENTERPRISE in dev)
13
13
  * 2. AND the suppressDropDisks limit is NOT set to true
14
14
  *
15
15
  * Otherwise returns 'ScaleDown'.
@@ -1,7 +1,20 @@
1
1
  import { SalesPlanType } from "./SalesPlanType.type.js";
2
2
  function getSuspendStrategy(options) {
3
3
  const { salesPlanType, limits, stage } = options;
4
- const applicableSalesPlanTypes = stage && ["dev", "int"].includes(stage) ? [SalesPlanType.TRIAL, SalesPlanType.INTERNAL] : [SalesPlanType.TRIAL];
4
+ const applicableSalesPlanTypes = (() => {
5
+ switch (true) {
6
+ case stage === "dev":
7
+ return [
8
+ SalesPlanType.TRIAL,
9
+ SalesPlanType.INTERNAL,
10
+ SalesPlanType.ENTERPRISE
11
+ ];
12
+ case stage === "int":
13
+ return [SalesPlanType.TRIAL, SalesPlanType.INTERNAL];
14
+ default:
15
+ return [SalesPlanType.TRIAL];
16
+ }
17
+ })();
5
18
  const shouldDeleteDisk = salesPlanType && applicableSalesPlanTypes.includes(salesPlanType) && !(limits?.suppressDropDisks ?? false);
6
19
  return shouldDeleteDisk ? "ScaleDownAndDeleteDisk" : "ScaleDown";
7
20
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/SuspendStrategy.type.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 { Limits } from '../dtos/SalesPlan.dto.js'\nimport { SalesPlanType } from './SalesPlanType.type.js'\n\nexport type SuspendStrategy = 'ScaleDown' | 'ScaleDownAndDeleteDisk'\n\nexport interface GetSuspendStrategyOptions {\n salesPlanType?: string\n limits?: Limits\n stage?: string\n}\n\n/**\n * Determines the suspend strategy for a cluster based on the organization's sales plan.\n *\n * Returns 'ScaleDownAndDeleteDisk' if:\n * 1. The sales plan type is TRIAL (or INTERNAL in dev/int environments)\n * 2. AND the suppressDropDisks limit is NOT set to true\n *\n * Otherwise returns 'ScaleDown'.\n */\nexport function getSuspendStrategy(\n options: GetSuspendStrategyOptions,\n): SuspendStrategy {\n const { salesPlanType, limits, stage } = options\n\n const applicableSalesPlanTypes =\n stage && ['dev', 'int'].includes(stage)\n ? [SalesPlanType.TRIAL, SalesPlanType.INTERNAL]\n : [SalesPlanType.TRIAL]\n\n const shouldDeleteDisk =\n salesPlanType &&\n applicableSalesPlanTypes.includes(salesPlanType as SalesPlanType) &&\n !(limits?.suppressDropDisks ?? false)\n\n return shouldDeleteDisk ? 'ScaleDownAndDeleteDisk' : 'ScaleDown'\n}\n"],
5
- "mappings": "AAOA,SAAS,qBAAqB;AAmBvB,SAAS,mBACd,SACiB;AACjB,QAAM,EAAE,eAAe,QAAQ,MAAM,IAAI;AAEzC,QAAM,2BACJ,SAAS,CAAC,OAAO,KAAK,EAAE,SAAS,KAAK,IAClC,CAAC,cAAc,OAAO,cAAc,QAAQ,IAC5C,CAAC,cAAc,KAAK;AAE1B,QAAM,mBACJ,iBACA,yBAAyB,SAAS,aAA8B,KAChE,EAAE,QAAQ,qBAAqB;AAEjC,SAAO,mBAAmB,2BAA2B;AACvD;",
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 { Limits } from '../dtos/SalesPlan.dto.js'\nimport { SalesPlanType } from './SalesPlanType.type.js'\n\nexport type SuspendStrategy = 'ScaleDown' | 'ScaleDownAndDeleteDisk'\n\nexport interface GetSuspendStrategyOptions {\n salesPlanType?: string\n limits?: Limits\n stage?: string\n}\n\n/**\n * Determines the suspend strategy for a cluster based on the organization's sales plan.\n *\n * Returns 'ScaleDownAndDeleteDisk' if:\n * 1. The sales plan type is TRIAL (or INTERNAL in dev/int environments, or ENTERPRISE in dev)\n * 2. AND the suppressDropDisks limit is NOT set to true\n *\n * Otherwise returns 'ScaleDown'.\n */\nexport function getSuspendStrategy(\n options: GetSuspendStrategyOptions,\n): SuspendStrategy {\n const { salesPlanType, limits, stage } = options\n\n const applicableSalesPlanTypes = (() => {\n switch (true) {\n case stage === 'dev':\n return [\n SalesPlanType.TRIAL,\n SalesPlanType.INTERNAL,\n SalesPlanType.ENTERPRISE,\n ]\n case stage === 'int':\n return [SalesPlanType.TRIAL, SalesPlanType.INTERNAL]\n default:\n return [SalesPlanType.TRIAL]\n }\n })()\n\n const shouldDeleteDisk =\n salesPlanType &&\n applicableSalesPlanTypes.includes(salesPlanType as SalesPlanType) &&\n !(limits?.suppressDropDisks ?? false)\n\n return shouldDeleteDisk ? 'ScaleDownAndDeleteDisk' : 'ScaleDown'\n}\n"],
5
+ "mappings": "AAOA,SAAS,qBAAqB;AAmBvB,SAAS,mBACd,SACiB;AACjB,QAAM,EAAE,eAAe,QAAQ,MAAM,IAAI;AAEzC,QAAM,4BAA4B,MAAM;AACtC,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,eAAO;AAAA,UACL,cAAc;AAAA,UACd,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,MACF,KAAK,UAAU;AACb,eAAO,CAAC,cAAc,OAAO,cAAc,QAAQ;AAAA,MACrD;AACE,eAAO,CAAC,cAAc,KAAK;AAAA,IAC/B;AAAA,EACF,GAAG;AAEH,QAAM,mBACJ,iBACA,yBAAyB,SAAS,aAA8B,KAChE,EAAE,QAAQ,qBAAqB;AAEjC,SAAO,mBAAmB,2BAA2B;AACvD;",
6
6
  "names": []
7
7
  }
@@ -145,6 +145,7 @@ var Telemetry;
145
145
  };
146
146
  this.decode();
147
147
  }
148
+ data;
148
149
  decodedData;
149
150
  getDecodedData() {
150
151
  return this.decodedData;
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/types/Telemetry.type.ts"],
4
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\nexport namespace Telemetry {\n // //////////////////////////////////////////////////////////////////////\n // TYPES\n\n // Specifies the references a data point belongs to, like cluster xyz, component abc, etc.\n export type EntityReferenceType =\n | 'cluster'\n | 'component'\n | 'global'\n | 'user'\n | 'other'\n export interface EntityReference {\n id: string\n type: EntityReferenceType\n idx: number\n }\n\n // Specifies the data point reference.\n // eslint-disable-next-line no-shadow\n export enum DataPointValueType {\n STRING = 0,\n NUMBER = 1,\n BOOLEAN = 2,\n }\n\n export interface DataPointReference {\n key: string\n type: DataPointValueType\n tags?: Record<string, string>\n idx: number\n }\n\n // Specifies the data body\n export type Properties = Record<string, string>\n export type InstallationContextReference = 'cid' | 'iid' // cid = customerId, iid = installationId\n export interface DataContext {\n ts: number // timestamp\n installation: Record<InstallationContextReference, string>\n entities: EntityReference[]\n dataPoints: DataPointReference[]\n }\n\n // Encoded data format\n export interface EncodedData {\n context: DataContext\n properties: Properties\n }\n\n // Decoded data format\n export interface DecodedData {\n installation: Record<InstallationContextReference, string>\n dataPoints: Array<{\n entities: Array<{\n id: string\n type: EntityReferenceType\n }>\n key: string\n type: DataPointValueType\n tags?: Record<string, string>\n transferredValue: string\n value: string | number | boolean\n tsFrom: number\n tsTo?: number\n }>\n }\n\n // HTTP types\n\n export interface PostResponse {\n success: boolean\n }\n\n // PING\n\n export interface PingRequest {\n cid: string\n iid: string\n }\n\n // //////////////////////////////////////////////////////////////////////\n // HELPERS\n\n // eslint-disable-next-line no-shadow\n export enum Separator {\n LEVEL0 = '::',\n LEVEL1 = '..',\n }\n\n export interface AddDataPointOptions {\n references: Array<{ id: string; type: EntityReferenceType }>\n dataPointKey: string\n dataPointValue: string\n dataPointValueType: DataPointValueType\n dataPointTags?: Record<string, string>\n tsFrom: number\n tsTo?: number\n }\n\n // Helper class to create encoded data\n export class DataEncoder {\n private data: EncodedData = {\n context: {\n // eslint-disable-next-line id-length\n ts: Date.now(),\n installation: {\n cid: '',\n iid: '',\n },\n entities: [],\n dataPoints: [],\n },\n properties: {},\n }\n\n public init(options: { customerId: string; installationId: string }) {\n this.data = {\n context: {\n // eslint-disable-next-line id-length\n ts: Date.now(),\n installation: {\n cid: options.customerId,\n iid: options.installationId,\n },\n entities: [],\n dataPoints: [],\n },\n properties: {},\n }\n }\n\n public getEncodedData(): EncodedData {\n return this.data\n }\n\n private getReferenceIndex(\n referenceId: string,\n referenceType: EntityReferenceType,\n ): number {\n const foundReference = this.data.context.entities.find(\n (ref) => ref.id === referenceId && ref.type === referenceType,\n )\n let entityReferenceIndex = -1\n if (foundReference) {\n entityReferenceIndex = foundReference.idx\n } else {\n // new entity reference\n entityReferenceIndex = this.data.context.entities.length\n this.data.context.entities.push({\n id: referenceId,\n type: referenceType,\n idx: entityReferenceIndex,\n })\n }\n return entityReferenceIndex\n }\n\n private getDataPointIndex(\n dataPointKey: string,\n dataPointValueType: DataPointValueType,\n dataPointTags?: Record<string, string>,\n ): number {\n const foundDataPointReference = this.data.context.dataPoints.find(\n (ref) => {\n if (ref.key === dataPointKey && ref.type === dataPointValueType) {\n // check tags\n if (dataPointTags && !ref.tags) {\n return false\n } else if (!dataPointTags && ref.tags) {\n return false\n } else if (dataPointTags && ref.tags) {\n for (const [key, value] of Object.entries(dataPointTags)) {\n if (ref.tags[key] !== value) {\n return false\n }\n }\n }\n return true\n } else {\n return false\n }\n },\n )\n let dataPointReferenceIndex = -1\n if (foundDataPointReference) {\n dataPointReferenceIndex = foundDataPointReference.idx\n } else {\n // new data point reference\n dataPointReferenceIndex = this.data.context.dataPoints.length\n this.data.context.dataPoints.push({\n key: dataPointKey,\n type: dataPointValueType,\n tags: dataPointTags,\n idx: dataPointReferenceIndex,\n })\n }\n return dataPointReferenceIndex\n }\n\n public addDataPoint(options: AddDataPointOptions) {\n const {\n references,\n dataPointKey,\n dataPointValue,\n dataPointValueType,\n dataPointTags,\n tsFrom,\n tsTo,\n } = options\n\n // find references\n const foundReferences = references.map((reference) => {\n return this.getReferenceIndex(reference.id, reference.type)\n })\n\n // find data point reference\n const foundDataPointReferenceIndex = this.getDataPointIndex(\n dataPointKey,\n dataPointValueType,\n dataPointTags,\n )\n\n // calculate timestamps\n const tsFromCalculated = tsFrom - this.data.context.ts\n let tsToCalculates: number | undefined\n if (tsTo) {\n tsToCalculates = tsTo - this.data.context.ts\n }\n\n // generate data key\n // pattern: entity reference index - data point reference index - time range diff\n const entityReferenceParts: string[] = foundReferences.map((ref) =>\n String(ref),\n )\n\n const timeRangeParts: string[] = []\n timeRangeParts.push(String(tsFromCalculated))\n if (tsToCalculates) {\n timeRangeParts.push(String(tsToCalculates))\n }\n\n const keyParts: string[] = [\n entityReferenceParts.join(Separator.LEVEL1),\n String(foundDataPointReferenceIndex),\n timeRangeParts.join(Separator.LEVEL1),\n ]\n const key = keyParts.join(Separator.LEVEL0)\n\n // add data point\n this.data.properties[key] = dataPointValue\n }\n }\n\n export class DataDecoder {\n private decodedData: DecodedData\n\n constructor(private data: EncodedData) {\n this.decodedData = {\n installation: data.context.installation,\n dataPoints: [],\n }\n this.decode()\n }\n\n public getDecodedData(): DecodedData {\n return this.decodedData\n }\n\n private decode() {\n for (const [key, value] of Object.entries(this.data.properties)) {\n const keyParts = key.split(Separator.LEVEL0)\n const entityReferenceIndices = keyParts[0]\n ? keyParts[0].split(Separator.LEVEL1)\n : [-1]\n const dataPointReferenceIndex = keyParts[1] ? Number(keyParts[1]) : -1\n const timeRangeParts = keyParts[2]\n ? keyParts[2].split(Separator.LEVEL1)\n : [0]\n const tsFrom = Number(timeRangeParts[0])\n const tsTo = timeRangeParts[1] ? Number(timeRangeParts[1]) : undefined\n\n // eslint-disable-next-line array-callback-return\n const entityReferences = entityReferenceIndices.map((index) => {\n const entityReference = this.data.context.entities.find(\n (currentEntityReference) =>\n currentEntityReference.idx === Number(index),\n )\n if (entityReference) {\n return {\n id: entityReference.id,\n type: entityReference.type,\n }\n }\n })\n const dataPointReference = this.data.context.dataPoints.find(\n (dataPoint) => dataPoint.idx === dataPointReferenceIndex,\n )\n\n this.decodedData.dataPoints.push({\n entities: entityReferences ?? [],\n key: dataPointReference ? dataPointReference.key : 'unknown',\n type: dataPointReference\n ? dataPointReference.type\n : DataPointValueType.STRING,\n tags: dataPointReference ? dataPointReference.tags : undefined,\n transferredValue: value,\n value: this.getValue(\n value,\n dataPointReference?.type ?? DataPointValueType.STRING,\n ),\n tsFrom: this.data.context.ts + tsFrom,\n tsTo: tsTo ? this.data.context.ts + tsTo : undefined,\n })\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n private getValue(\n value: string,\n type: DataPointValueType,\n ): string | number | boolean {\n switch (type) {\n case DataPointValueType.BOOLEAN:\n if (['0', 'false'].includes(value)) {\n return false\n }\n if (['1', 'true'].includes(value)) {\n return true\n }\n return false\n case DataPointValueType.NUMBER: {\n // eslint-disable-next-line no-case-declarations\n let valueAsNumber = -1\n try {\n valueAsNumber = Number(value)\n } catch (_error) {\n // ignore\n }\n return valueAsNumber\n }\n default:\n return value\n }\n }\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": ["Telemetry", "DataPointValueType", "Separator"]
7
7
  }
@@ -1,4 +1,6 @@
1
1
  export declare function isValidHostname(value: string): boolean;
2
+ export declare function isValidAwsArn(value: string): boolean;
3
+ export declare function isValidPrivateLinkRegion(value: string): boolean;
2
4
  /**
3
5
  * Validates that a client name contains only allowed characters:
4
6
  * letters, digits, dashes, and underscores.
@@ -1,3 +1,24 @@
1
+ import { PRIVATE_LINK_REGIONS } from "../constants/privateLinkRegions.const.js";
2
+ const AWS_ARN_PARTITIONS = /* @__PURE__ */ new Set(["aws", "aws-cn", "aws-us-gov"]);
3
+ function isAlphaNumericOrDash(value) {
4
+ for (const char of value) {
5
+ const isLowercaseLetter = char >= "a" && char <= "z";
6
+ const isUppercaseLetter = char >= "A" && char <= "Z";
7
+ const isDigit = char >= "0" && char <= "9";
8
+ if (!isLowercaseLetter && !isUppercaseLetter && !isDigit && char !== "-") {
9
+ return false;
10
+ }
11
+ }
12
+ return true;
13
+ }
14
+ function isDigitsOnly(value) {
15
+ for (const char of value) {
16
+ if (char < "0" || char > "9") {
17
+ return false;
18
+ }
19
+ }
20
+ return true;
21
+ }
1
22
  function isValidHostname(value) {
2
23
  if (typeof value !== "string") {
3
24
  return false;
@@ -20,6 +41,42 @@ function isValidHostname(value) {
20
41
  });
21
42
  return isValid;
22
43
  }
44
+ function isValidAwsArn(value) {
45
+ if (typeof value !== "string") {
46
+ return false;
47
+ }
48
+ if (value.length === 0 || value.includes("*")) {
49
+ return false;
50
+ }
51
+ const segments = value.split(":");
52
+ if (segments.length < 6) {
53
+ return false;
54
+ }
55
+ const [prefix, partition, service, region, accountId, ...resourceParts] = segments;
56
+ const resource = resourceParts.join(":");
57
+ if (prefix !== "arn" || !AWS_ARN_PARTITIONS.has(partition)) {
58
+ return false;
59
+ }
60
+ if (!service || !isAlphaNumericOrDash(service)) {
61
+ return false;
62
+ }
63
+ if (service === "iam" && accountId.length === 0) {
64
+ return false;
65
+ }
66
+ if (region && !isAlphaNumericOrDash(region)) {
67
+ return false;
68
+ }
69
+ if (accountId && (!isDigitsOnly(accountId) || accountId.length !== 12)) {
70
+ return false;
71
+ }
72
+ return resource.length > 0;
73
+ }
74
+ function isValidPrivateLinkRegion(value) {
75
+ if (typeof value !== "string") {
76
+ return false;
77
+ }
78
+ return PRIVATE_LINK_REGIONS.includes(value);
79
+ }
23
80
  const CLIENT_NAME_REGEX = /^[a-zA-Z0-9_-]+$/u;
24
81
  function isValidClientName(name) {
25
82
  if (typeof name !== "string") {
@@ -86,9 +143,11 @@ function isValidCIDRList(cidrList) {
86
143
  return entries.every((entry) => isValidCIDR(entry));
87
144
  }
88
145
  export {
146
+ isValidAwsArn,
89
147
  isValidCIDR,
90
148
  isValidCIDRList,
91
149
  isValidClientName,
92
- isValidHostname
150
+ isValidHostname,
151
+ isValidPrivateLinkRegion
93
152
  };
94
153
  //# sourceMappingURL=string-validation.utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/string-validation.utils.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\nexport function isValidHostname(value: string) {\n if (typeof value !== 'string') {\n return false\n }\n\n const validHostnameChars = /^[a-zA-Z0-9-.]{1,253}\\.?$/gu\n if (!validHostnameChars.test(value)) {\n return false\n }\n\n if (value.endsWith('.')) {\n // eslint-disable-next-line no-param-reassign\n value = value.slice(0, value.length - 1)\n }\n\n if (value.length > 253) {\n return false\n }\n\n const labels = value.split('.')\n\n const isValid = labels.every((label) => {\n // eslint-disable-next-line prefer-named-capture-group\n const validLabelChars = /^([a-zA-Z0-9-]+)$/gu\n\n const validLabel =\n validLabelChars.test(label) &&\n label.length < 64 &&\n !label.startsWith('-') &&\n !label.endsWith('-')\n\n return validLabel\n })\n\n return isValid\n}\n\n/**\n * Regular expression to validate client names.\n * Allows only letters (a-z, A-Z), digits (0-9), dashes (-), and underscores (_).\n * This matches the frontend validation in console-frontend/src/models/validation/input.ts\n */\nconst CLIENT_NAME_REGEX = /^[a-zA-Z0-9_-]+$/u\n\n/**\n * Validates that a client name contains only allowed characters:\n * letters, digits, dashes, and underscores.\n *\n * @param name - The client name to validate\n * @returns true if the name is valid, false otherwise\n */\nexport function isValidClientName(name: string): boolean {\n if (typeof name !== 'string') {\n return false\n }\n\n if (name.trim().length === 0) {\n return false\n }\n\n return CLIENT_NAME_REGEX.test(name)\n}\n\n/**\n * Validates a single IPv4 address or CIDR notation.\n *\n * Valid examples:\n * - 192.168.1.1\n * - 10.0.0.0/8\n * - 0.0.0.0/0\n * - 255.255.255.255/32\n *\n * Invalid examples:\n * - 999.999.999.999 (octets must be 0-255)\n * - 1.2.3.4/55 (prefix must be 0-32)\n * - 256.1.1.1 (octets must be 0-255)\n * - 1.2.3 (must have 4 octets)\n *\n * @param cidr - The IPv4 address or CIDR notation to validate\n * @returns true if the CIDR is valid, false otherwise\n */\nexport function isValidCIDR(cidr: string): boolean {\n if (typeof cidr !== 'string') {\n return false\n }\n\n const trimmed = cidr.trim()\n\n if (trimmed.length === 0) {\n return false\n }\n\n // Split IP and prefix\n const parts = trimmed.split('/')\n\n // Must have either IP only or IP/prefix\n if (parts.length > 2) {\n return false\n }\n\n const ip = parts[0]\n const prefix = parts[1]\n\n // Validate IP address\n const octets = ip.split('.')\n\n // Must have exactly 4 octets\n if (octets.length !== 4) {\n return false\n }\n\n // Validate each octet\n for (const octet of octets) {\n // Check if it's a valid number\n if (!/^\\d+$/u.test(octet)) {\n return false\n }\n\n const num = parseInt(octet, 10)\n\n // Octet must be 0-255\n if (num < 0 || num > 255) {\n return false\n }\n\n // Leading zeros are not allowed (except for \"0\" itself)\n if (octet.length > 1 && octet.startsWith('0')) {\n return false\n }\n }\n\n // If prefix is present, validate it\n if (prefix !== undefined) {\n if (!/^\\d+$/u.test(prefix)) {\n return false\n }\n\n const prefixNum = parseInt(prefix, 10)\n\n // Prefix must be 0-32 for IPv4\n if (prefixNum < 0 || prefixNum > 32) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Validates a comma-separated list of IPv4 addresses and/or CIDR notations.\n *\n * Valid examples:\n * - \"192.168.1.1\"\n * - \"192.168.1.1,10.0.0.0/8\"\n * - \"192.168.1.1, 10.0.0.0/8\" (spaces are trimmed)\n *\n * Invalid examples:\n * - \"192.168.1.1,999.999.999.999\" (second entry is invalid)\n * - \"1.2.3.4/55\" (prefix is invalid)\n *\n * @param cidrList - A comma-separated list of IPv4 addresses or CIDR notations\n * @returns true if all entries in the list are valid, false otherwise\n */\nexport function isValidCIDRList(cidrList: string): boolean {\n if (typeof cidrList !== 'string') {\n return false\n }\n\n const trimmed = cidrList.trim()\n\n if (trimmed.length === 0) {\n return false\n }\n\n const entries = trimmed.split(',')\n\n // At least one entry must be present\n if (entries.length === 0) {\n return false\n }\n\n // All entries must be valid CIDRs\n return entries.every((entry) => isValidCIDR(entry))\n}\n"],
5
- "mappings": "AAMO,SAAS,gBAAgB,OAAe;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB;AAC3B,MAAI,CAAC,mBAAmB,KAAK,KAAK,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,GAAG,GAAG;AAEvB,YAAQ,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAAA,EACzC;AAEA,MAAI,MAAM,SAAS,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,MAAM,GAAG;AAE9B,QAAM,UAAU,OAAO,MAAM,CAAC,UAAU;AAEtC,UAAM,kBAAkB;AAExB,UAAM,aACJ,gBAAgB,KAAK,KAAK,KAC1B,MAAM,SAAS,MACf,CAAC,MAAM,WAAW,GAAG,KACrB,CAAC,MAAM,SAAS,GAAG;AAErB,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;AAOA,MAAM,oBAAoB;AASnB,SAAS,kBAAkB,MAAuB;AACvD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,KAAK,IAAI;AACpC;AAoBO,SAAS,YAAY,MAAuB;AACjD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,KAAK;AAE1B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAG/B,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,MAAM,CAAC;AAClB,QAAM,SAAS,MAAM,CAAC;AAGtB,QAAM,SAAS,GAAG,MAAM,GAAG;AAG3B,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,aAAW,SAAS,QAAQ;AAE1B,QAAI,CAAC,SAAS,KAAK,KAAK,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,SAAS,OAAO,EAAE;AAG9B,QAAI,MAAM,KAAK,MAAM,KAAK;AACxB,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,SAAS,KAAK,MAAM,WAAW,GAAG,GAAG;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,WAAW,QAAW;AACxB,QAAI,CAAC,SAAS,KAAK,MAAM,GAAG;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,SAAS,QAAQ,EAAE;AAGrC,QAAI,YAAY,KAAK,YAAY,IAAI;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAiBO,SAAS,gBAAgB,UAA2B;AACzD,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,KAAK;AAE9B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,MAAM,GAAG;AAGjC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,SAAO,QAAQ,MAAM,CAAC,UAAU,YAAY,KAAK,CAAC;AACpD;",
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 { PRIVATE_LINK_REGIONS } from '../constants/privateLinkRegions.const.js'\n\nconst AWS_ARN_PARTITIONS = new Set(['aws', 'aws-cn', 'aws-us-gov'])\n\nfunction isAlphaNumericOrDash(value: string): boolean {\n for (const char of value) {\n const isLowercaseLetter = char >= 'a' && char <= 'z'\n const isUppercaseLetter = char >= 'A' && char <= 'Z'\n const isDigit = char >= '0' && char <= '9'\n\n if (!isLowercaseLetter && !isUppercaseLetter && !isDigit && char !== '-') {\n return false\n }\n }\n\n return true\n}\n\nfunction isDigitsOnly(value: string): boolean {\n for (const char of value) {\n if (char < '0' || char > '9') {\n return false\n }\n }\n\n return true\n}\n\nexport function isValidHostname(value: string) {\n if (typeof value !== 'string') {\n return false\n }\n\n const validHostnameChars = /^[a-zA-Z0-9-.]{1,253}\\.?$/gu\n if (!validHostnameChars.test(value)) {\n return false\n }\n\n if (value.endsWith('.')) {\n // eslint-disable-next-line no-param-reassign\n value = value.slice(0, value.length - 1)\n }\n\n if (value.length > 253) {\n return false\n }\n\n const labels = value.split('.')\n\n const isValid = labels.every((label) => {\n // eslint-disable-next-line prefer-named-capture-group\n const validLabelChars = /^([a-zA-Z0-9-]+)$/gu\n\n const validLabel =\n validLabelChars.test(label) &&\n label.length < 64 &&\n !label.startsWith('-') &&\n !label.endsWith('-')\n\n return validLabel\n })\n\n return isValid\n}\n\nexport function isValidAwsArn(value: string): boolean {\n if (typeof value !== 'string') {\n return false\n }\n\n if (value.length === 0 || value.includes('*')) {\n return false\n }\n\n const segments = value.split(':')\n\n if (segments.length < 6) {\n return false\n }\n\n const [prefix, partition, service, region, accountId, ...resourceParts] =\n segments\n const resource = resourceParts.join(':')\n\n if (prefix !== 'arn' || !AWS_ARN_PARTITIONS.has(partition)) {\n return false\n }\n\n if (!service || !isAlphaNumericOrDash(service)) {\n return false\n }\n\n if (service === 'iam' && accountId.length === 0) {\n return false\n }\n\n if (region && !isAlphaNumericOrDash(region)) {\n return false\n }\n\n if (accountId && (!isDigitsOnly(accountId) || accountId.length !== 12)) {\n return false\n }\n\n return resource.length > 0\n}\n\nexport function isValidPrivateLinkRegion(value: string): boolean {\n if (typeof value !== 'string') {\n return false\n }\n\n return PRIVATE_LINK_REGIONS.includes(value)\n}\n\n/**\n * Regular expression to validate client names.\n * Allows only letters (a-z, A-Z), digits (0-9), dashes (-), and underscores (_).\n * This matches the frontend validation in console-frontend/src/models/validation/input.ts\n */\nconst CLIENT_NAME_REGEX = /^[a-zA-Z0-9_-]+$/u\n\n/**\n * Validates that a client name contains only allowed characters:\n * letters, digits, dashes, and underscores.\n *\n * @param name - The client name to validate\n * @returns true if the name is valid, false otherwise\n */\nexport function isValidClientName(name: string): boolean {\n if (typeof name !== 'string') {\n return false\n }\n\n if (name.trim().length === 0) {\n return false\n }\n\n return CLIENT_NAME_REGEX.test(name)\n}\n\n/**\n * Validates a single IPv4 address or CIDR notation.\n *\n * Valid examples:\n * - 192.168.1.1\n * - 10.0.0.0/8\n * - 0.0.0.0/0\n * - 255.255.255.255/32\n *\n * Invalid examples:\n * - 999.999.999.999 (octets must be 0-255)\n * - 1.2.3.4/55 (prefix must be 0-32)\n * - 256.1.1.1 (octets must be 0-255)\n * - 1.2.3 (must have 4 octets)\n *\n * @param cidr - The IPv4 address or CIDR notation to validate\n * @returns true if the CIDR is valid, false otherwise\n */\nexport function isValidCIDR(cidr: string): boolean {\n if (typeof cidr !== 'string') {\n return false\n }\n\n const trimmed = cidr.trim()\n\n if (trimmed.length === 0) {\n return false\n }\n\n // Split IP and prefix\n const parts = trimmed.split('/')\n\n // Must have either IP only or IP/prefix\n if (parts.length > 2) {\n return false\n }\n\n const ip = parts[0]\n const prefix = parts[1]\n\n // Validate IP address\n const octets = ip.split('.')\n\n // Must have exactly 4 octets\n if (octets.length !== 4) {\n return false\n }\n\n // Validate each octet\n for (const octet of octets) {\n // Check if it's a valid number\n if (!/^\\d+$/u.test(octet)) {\n return false\n }\n\n const num = parseInt(octet, 10)\n\n // Octet must be 0-255\n if (num < 0 || num > 255) {\n return false\n }\n\n // Leading zeros are not allowed (except for \"0\" itself)\n if (octet.length > 1 && octet.startsWith('0')) {\n return false\n }\n }\n\n // If prefix is present, validate it\n if (prefix !== undefined) {\n if (!/^\\d+$/u.test(prefix)) {\n return false\n }\n\n const prefixNum = parseInt(prefix, 10)\n\n // Prefix must be 0-32 for IPv4\n if (prefixNum < 0 || prefixNum > 32) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Validates a comma-separated list of IPv4 addresses and/or CIDR notations.\n *\n * Valid examples:\n * - \"192.168.1.1\"\n * - \"192.168.1.1,10.0.0.0/8\"\n * - \"192.168.1.1, 10.0.0.0/8\" (spaces are trimmed)\n *\n * Invalid examples:\n * - \"192.168.1.1,999.999.999.999\" (second entry is invalid)\n * - \"1.2.3.4/55\" (prefix is invalid)\n *\n * @param cidrList - A comma-separated list of IPv4 addresses or CIDR notations\n * @returns true if all entries in the list are valid, false otherwise\n */\nexport function isValidCIDRList(cidrList: string): boolean {\n if (typeof cidrList !== 'string') {\n return false\n }\n\n const trimmed = cidrList.trim()\n\n if (trimmed.length === 0) {\n return false\n }\n\n const entries = trimmed.split(',')\n\n // At least one entry must be present\n if (entries.length === 0) {\n return false\n }\n\n // All entries must be valid CIDRs\n return entries.every((entry) => isValidCIDR(entry))\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -8,7 +8,7 @@ export declare enum VersionCheckOperator {
8
8
  }
9
9
  export declare const checkVersion: (params: {
10
10
  possiblyVersionOrDockerPath?: string;
11
- trueForSnapshot: boolean;
11
+ trueForSnapshot: boolean | "compare";
12
12
  operator: VersionCheckOperator;
13
13
  versionToCompareTo: string;
14
14
  trueOnInvalidVersion?: boolean;
@@ -9,7 +9,22 @@ var VersionCheckOperator = /* @__PURE__ */ ((VersionCheckOperator2) => {
9
9
  return VersionCheckOperator2;
10
10
  })(VersionCheckOperator || {});
11
11
  const checkVersion = (params) => {
12
- if (!semver.valid(params.versionToCompareTo)) {
12
+ if (params.versionToCompareTo === "SNAPSHOT") {
13
+ return false;
14
+ }
15
+ let versionToCompareTo = params.versionToCompareTo;
16
+ if (versionToCompareTo.endsWith("-SNAPSHOT")) {
17
+ versionToCompareTo = versionToCompareTo.replace("-SNAPSHOT", "");
18
+ const parts = versionToCompareTo.split(".");
19
+ if (parts.length === 1) {
20
+ versionToCompareTo = `${parts[0]}.0.0`;
21
+ } else if (parts.length === 2) {
22
+ versionToCompareTo = `${parts[0]}.${parts[1]}.0`;
23
+ } else if (parts.length === 3) {
24
+ versionToCompareTo = `${parts[0]}.${parts[1]}.${parts[2]}`;
25
+ }
26
+ }
27
+ if (!semver.valid(versionToCompareTo)) {
13
28
  throw new Error("Invalid version to compare to");
14
29
  }
15
30
  let version = "";
@@ -23,24 +38,27 @@ const checkVersion = (params) => {
23
38
  }
24
39
  if (params.trueForSnapshot && version.includes("SNAPSHOT")) {
25
40
  if (version === "SNAPSHOT") {
26
- return true;
27
- }
28
- version = version.replace("-SNAPSHOT", "");
29
- if (version.split(".").length === 1) {
30
- version = `${version}.99.99`;
31
- }
32
- if (version.split(".").length === 2) {
33
- version = `${version}.99`;
34
- }
35
- if (version.split(".").length === 3) {
36
- version = `${version.split(".")[0]}.${version.split(".")[1]}.99`;
41
+ if (params.trueForSnapshot !== "compare") {
42
+ return true;
43
+ }
44
+ } else {
45
+ version = version.replace("-SNAPSHOT", "");
46
+ if (version.split(".").length === 1) {
47
+ version = `${version}.99.99`;
48
+ }
49
+ if (version.split(".").length === 2) {
50
+ version = `${version}.99`;
51
+ }
52
+ if (version.split(".").length === 3) {
53
+ version = `${version.split(".")[0]}.${version.split(".")[1]}.99`;
54
+ }
37
55
  }
38
56
  }
39
57
  let parsedVersionToCompareTo = "";
40
- if (semver.valid(params.versionToCompareTo ?? "")) {
41
- parsedVersionToCompareTo = params.versionToCompareTo ?? "";
58
+ if (semver.valid(versionToCompareTo ?? "")) {
59
+ parsedVersionToCompareTo = versionToCompareTo ?? "";
42
60
  } else {
43
- const versionSplit = params.versionToCompareTo?.split(":") ?? [];
61
+ const versionSplit = versionToCompareTo?.split(":") ?? [];
44
62
  if (versionSplit.length > 1) {
45
63
  parsedVersionToCompareTo = versionSplit[1];
46
64
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/versionCheck.utils.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 * as semver from 'semver'\n\n// eslint-disable-next-line no-shadow\nexport enum VersionCheckOperator {\n LessThan,\n LessThanOrEqual,\n GreaterThan,\n GreaterThanOrEqual,\n SameMajor,\n SameMinor,\n}\n\nexport const checkVersion = (params: {\n possiblyVersionOrDockerPath?: string\n trueForSnapshot: boolean\n operator: VersionCheckOperator\n versionToCompareTo: string\n trueOnInvalidVersion?: boolean\n}) => {\n if (!semver.valid(params.versionToCompareTo)) {\n throw new Error('Invalid version to compare to')\n }\n let version: string = ''\n if (semver.valid(params.possiblyVersionOrDockerPath ?? '')) {\n version = params.possiblyVersionOrDockerPath ?? ''\n } else {\n const versionSplit = params.possiblyVersionOrDockerPath?.split(':') ?? []\n if (versionSplit.length > 1) {\n version = versionSplit[1]\n }\n }\n if (params.trueForSnapshot && version.includes('SNAPSHOT')) {\n if (version === 'SNAPSHOT') {\n return true\n }\n version = version.replace('-SNAPSHOT', '')\n if (version.split('.').length === 1) {\n version = `${version}.99.99`\n }\n if (version.split('.').length === 2) {\n version = `${version}.99`\n }\n if (version.split('.').length === 3) {\n version = `${version.split('.')[0]}.${version.split('.')[1]}.99`\n }\n }\n\n let parsedVersionToCompareTo: string = ''\n if (semver.valid(params.versionToCompareTo ?? '')) {\n parsedVersionToCompareTo = params.versionToCompareTo ?? ''\n } else {\n const versionSplit = params.versionToCompareTo?.split(':') ?? []\n if (versionSplit.length > 1) {\n parsedVersionToCompareTo = versionSplit[1]\n }\n }\n if (params.trueForSnapshot && parsedVersionToCompareTo === 'SNAPSHOT') {\n return true\n }\n\n if (!semver.valid(version)) {\n return !!params.trueOnInvalidVersion\n }\n\n switch (params.operator) {\n case VersionCheckOperator.LessThan:\n return semver.lt(version, parsedVersionToCompareTo)\n case VersionCheckOperator.LessThanOrEqual:\n return semver.lte(version, parsedVersionToCompareTo)\n case VersionCheckOperator.GreaterThan:\n return semver.gt(version, parsedVersionToCompareTo)\n case VersionCheckOperator.GreaterThanOrEqual:\n return semver.gte(version, parsedVersionToCompareTo)\n case VersionCheckOperator.SameMajor:\n return semver.major(version) === semver.major(parsedVersionToCompareTo)\n case VersionCheckOperator.SameMinor:\n return (\n semver.major(version) === semver.major(parsedVersionToCompareTo) &&\n semver.minor(version) === semver.minor(parsedVersionToCompareTo)\n )\n default:\n return false\n }\n}\n"],
5
- "mappings": "AAMA,YAAY,YAAY;AAGjB,IAAK,uBAAL,kBAAKA,0BAAL;AACL,EAAAA,4CAAA;AACA,EAAAA,4CAAA;AACA,EAAAA,4CAAA;AACA,EAAAA,4CAAA;AACA,EAAAA,4CAAA;AACA,EAAAA,4CAAA;AANU,SAAAA;AAAA,GAAA;AASL,MAAM,eAAe,CAAC,WAMvB;AACJ,MAAI,CAAC,OAAO,MAAM,OAAO,kBAAkB,GAAG;AAC5C,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,MAAI,UAAkB;AACtB,MAAI,OAAO,MAAM,OAAO,+BAA+B,EAAE,GAAG;AAC1D,cAAU,OAAO,+BAA+B;AAAA,EAClD,OAAO;AACL,UAAM,eAAe,OAAO,6BAA6B,MAAM,GAAG,KAAK,CAAC;AACxE,QAAI,aAAa,SAAS,GAAG;AAC3B,gBAAU,aAAa,CAAC;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,OAAO,mBAAmB,QAAQ,SAAS,UAAU,GAAG;AAC1D,QAAI,YAAY,YAAY;AAC1B,aAAO;AAAA,IACT;AACA,cAAU,QAAQ,QAAQ,aAAa,EAAE;AACzC,QAAI,QAAQ,MAAM,GAAG,EAAE,WAAW,GAAG;AACnC,gBAAU,GAAG,OAAO;AAAA,IACtB;AACA,QAAI,QAAQ,MAAM,GAAG,EAAE,WAAW,GAAG;AACnC,gBAAU,GAAG,OAAO;AAAA,IACtB;AACA,QAAI,QAAQ,MAAM,GAAG,EAAE,WAAW,GAAG;AACnC,gBAAU,GAAG,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,2BAAmC;AACvC,MAAI,OAAO,MAAM,OAAO,sBAAsB,EAAE,GAAG;AACjD,+BAA2B,OAAO,sBAAsB;AAAA,EAC1D,OAAO;AACL,UAAM,eAAe,OAAO,oBAAoB,MAAM,GAAG,KAAK,CAAC;AAC/D,QAAI,aAAa,SAAS,GAAG;AAC3B,iCAA2B,aAAa,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,OAAO,mBAAmB,6BAA6B,YAAY;AACrE,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,MAAM,OAAO,GAAG;AAC1B,WAAO,CAAC,CAAC,OAAO;AAAA,EAClB;AAEA,UAAQ,OAAO,UAAU;AAAA,IACvB,KAAK;AACH,aAAO,OAAO,GAAG,SAAS,wBAAwB;AAAA,IACpD,KAAK;AACH,aAAO,OAAO,IAAI,SAAS,wBAAwB;AAAA,IACrD,KAAK;AACH,aAAO,OAAO,GAAG,SAAS,wBAAwB;AAAA,IACpD,KAAK;AACH,aAAO,OAAO,IAAI,SAAS,wBAAwB;AAAA,IACrD,KAAK;AACH,aAAO,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,wBAAwB;AAAA,IACxE,KAAK;AACH,aACE,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,wBAAwB,KAC/D,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,wBAAwB;AAAA,IAEnE;AACE,aAAO;AAAA,EACX;AACF;",
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 * as semver from 'semver'\n\n// eslint-disable-next-line no-shadow\nexport enum VersionCheckOperator {\n LessThan,\n LessThanOrEqual,\n GreaterThan,\n GreaterThanOrEqual,\n SameMajor,\n SameMinor,\n}\n\nexport const checkVersion = (params: {\n possiblyVersionOrDockerPath?: string\n trueForSnapshot: boolean | 'compare'\n operator: VersionCheckOperator\n versionToCompareTo: string\n trueOnInvalidVersion?: boolean\n}) => {\n // quick exit: if the versionToCompareTo is\n // - `SNAPSHOT` there is not a lot we can compare here to, so we return false directly\n // - ends with `-SNAPSHOT` we ignore the `-SNAPSHOT` part for the comparison, guess a good matching semver compliant version and try to move on with the generated one in the code\n if (params.versionToCompareTo === 'SNAPSHOT') {\n return false\n }\n let versionToCompareTo = params.versionToCompareTo\n if (versionToCompareTo.endsWith('-SNAPSHOT')) {\n versionToCompareTo = versionToCompareTo.replace('-SNAPSHOT', '')\n const parts = versionToCompareTo.split('.')\n if (parts.length === 1) {\n versionToCompareTo = `${parts[0]}.0.0`\n } else if (parts.length === 2) {\n versionToCompareTo = `${parts[0]}.${parts[1]}.0`\n } else if (parts.length === 3) {\n versionToCompareTo = `${parts[0]}.${parts[1]}.${parts[2]}`\n }\n }\n if (!semver.valid(versionToCompareTo)) {\n throw new Error('Invalid version to compare to')\n }\n let version: string = ''\n if (semver.valid(params.possiblyVersionOrDockerPath ?? '')) {\n version = params.possiblyVersionOrDockerPath ?? ''\n } else {\n const versionSplit = params.possiblyVersionOrDockerPath?.split(':') ?? []\n if (versionSplit.length > 1) {\n version = versionSplit[1]\n }\n }\n if (params.trueForSnapshot && version.includes('SNAPSHOT')) {\n if (version === 'SNAPSHOT') {\n // bare SNAPSHOT: `true` short-circuits here; `'compare'` falls through to invalid-version handling\n if (params.trueForSnapshot !== 'compare') {\n return true\n }\n } else {\n version = version.replace('-SNAPSHOT', '')\n if (version.split('.').length === 1) {\n version = `${version}.99.99`\n }\n if (version.split('.').length === 2) {\n version = `${version}.99`\n }\n if (version.split('.').length === 3) {\n version = `${version.split('.')[0]}.${version.split('.')[1]}.99`\n }\n }\n }\n\n let parsedVersionToCompareTo: string = ''\n if (semver.valid(versionToCompareTo ?? '')) {\n parsedVersionToCompareTo = versionToCompareTo ?? ''\n } else {\n const versionSplit = versionToCompareTo?.split(':') ?? []\n if (versionSplit.length > 1) {\n parsedVersionToCompareTo = versionSplit[1]\n }\n }\n if (params.trueForSnapshot && parsedVersionToCompareTo === 'SNAPSHOT') {\n return true\n }\n\n if (!semver.valid(version)) {\n return !!params.trueOnInvalidVersion\n }\n\n switch (params.operator) {\n case VersionCheckOperator.LessThan:\n return semver.lt(version, parsedVersionToCompareTo)\n case VersionCheckOperator.LessThanOrEqual:\n return semver.lte(version, parsedVersionToCompareTo)\n case VersionCheckOperator.GreaterThan:\n return semver.gt(version, parsedVersionToCompareTo)\n case VersionCheckOperator.GreaterThanOrEqual:\n return semver.gte(version, parsedVersionToCompareTo)\n case VersionCheckOperator.SameMajor:\n return semver.major(version) === semver.major(parsedVersionToCompareTo)\n case VersionCheckOperator.SameMinor:\n return (\n semver.major(version) === semver.major(parsedVersionToCompareTo) &&\n semver.minor(version) === semver.minor(parsedVersionToCompareTo)\n )\n default:\n return false\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["VersionCheckOperator"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camunda/ccma-shared-types",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Shared TypeScript types for Camunda Cloud Management Apps",
5
5
  "bugs": {
6
6
  "url": "https://github.com/camunda/camunda-cloud-management-apps/issues"
@@ -15,10 +15,6 @@
15
15
  "type": "module",
16
16
  "main": "dist/index.js",
17
17
  "types": "dist/index.d.ts",
18
- "browser": {
19
- "./dist/index.js": "./src/index.ts",
20
- "./dist/index.d.ts": "./src/index.ts"
21
- },
22
18
  "files": [
23
19
  "dist"
24
20
  ],