@camunda/ccma-shared-types 5.0.0 → 7.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 (100) hide show
  1. package/dist/_tests/approvals/dns-subdomain.spec.d.ts +1 -0
  2. package/dist/_tests/approvals/expected-value.spec.d.ts +1 -0
  3. package/dist/_tests/charts/chart-query.spec.d.ts +1 -0
  4. package/dist/_tests/constants/customer-hardware-sizing.const.spec.d.ts +1 -0
  5. package/dist/_tests/dashboards/definition.spec.d.ts +1 -0
  6. package/dist/_tests/dtos/ClusterPlanWhiteList.spec.d.ts +1 -0
  7. package/dist/_tests/utils/elasticsearchPlanPath.utils.spec.d.ts +1 -0
  8. package/dist/_tests/utils/upgradeGateReason.utils.spec.d.ts +1 -0
  9. package/dist/approvals/dns-subdomain.d.ts +12 -0
  10. package/dist/approvals/dns-subdomain.js +16 -0
  11. package/dist/approvals/dns-subdomain.js.map +7 -0
  12. package/dist/approvals/expected-value.d.ts +33 -0
  13. package/dist/approvals/expected-value.js +26 -0
  14. package/dist/approvals/expected-value.js.map +7 -0
  15. package/dist/approvals/policy.js +1 -1
  16. package/dist/approvals/policy.js.map +2 -2
  17. package/dist/approvals/use-cases.const.d.ts +96 -0
  18. package/dist/approvals/use-cases.const.js +59 -2
  19. package/dist/approvals/use-cases.const.js.map +2 -2
  20. package/dist/charts/chart-metrics.d.ts +35 -0
  21. package/dist/charts/chart-metrics.js +188 -0
  22. package/dist/charts/chart-metrics.js.map +7 -0
  23. package/dist/charts/chart-query.d.ts +55 -0
  24. package/dist/charts/chart-query.js +376 -0
  25. package/dist/charts/chart-query.js.map +7 -0
  26. package/dist/charts/chart-spec.d.ts +103 -0
  27. package/dist/charts/chart-spec.js +79 -0
  28. package/dist/charts/chart-spec.js.map +7 -0
  29. package/dist/charts/index.d.ts +3 -0
  30. package/dist/charts/index.js +59 -0
  31. package/dist/charts/index.js.map +7 -0
  32. package/dist/constants/customer-hardware-sizing.const.d.ts +124 -0
  33. package/dist/constants/customer-hardware-sizing.const.js +266 -0
  34. package/dist/constants/customer-hardware-sizing.const.js.map +7 -0
  35. package/dist/constants/version-gates.const.d.ts +12 -0
  36. package/dist/constants/version-gates.const.js +2 -0
  37. package/dist/constants/version-gates.const.js.map +2 -2
  38. package/dist/dashboards/definition.d.ts +86 -0
  39. package/dist/dashboards/definition.js +137 -0
  40. package/dist/dashboards/definition.js.map +7 -0
  41. package/dist/dtos/Annotation.dto.d.ts +1 -1
  42. package/dist/dtos/Annotation.dto.js +10 -2
  43. package/dist/dtos/Annotation.dto.js.map +2 -2
  44. package/dist/dtos/ApprovalJob.dto.d.ts +33 -3
  45. package/dist/dtos/ApprovalJob.dto.js.map +2 -2
  46. package/dist/dtos/ClusterPlanTypeChange.dto.d.ts +23 -0
  47. package/dist/dtos/ClusterPlanTypeChange.dto.js +1 -0
  48. package/dist/dtos/ClusterPlanTypeChange.dto.js.map +7 -0
  49. package/dist/dtos/CommonCluster.dto.d.ts +5 -0
  50. package/dist/dtos/ControlV2.dto.d.ts +17 -0
  51. package/dist/dtos/Dashboard.dto.d.ts +336 -0
  52. package/dist/dtos/Dashboard.dto.js +70 -0
  53. package/dist/dtos/Dashboard.dto.js.map +7 -0
  54. package/dist/dtos/EarlyAccessFeature.dto.d.ts +1 -0
  55. package/dist/dtos/FeatureFlags.dto.d.ts +96 -54
  56. package/dist/dtos/Hdp.dto.d.ts +5 -88
  57. package/dist/dtos/Organization.dto.d.ts +21 -0
  58. package/dist/dtos/Organization.dto.js.map +1 -1
  59. package/dist/dtos/SalesPlan.dto.d.ts +18 -0
  60. package/dist/dtos/SalesPlan.dto.js +18 -0
  61. package/dist/dtos/SalesPlan.dto.js.map +2 -2
  62. package/dist/dtos/UpgradeReadiness.dto.d.ts +32 -0
  63. package/dist/dtos/UpgradeReadiness.dto.js +1 -0
  64. package/dist/dtos/UpgradeReadiness.dto.js.map +7 -0
  65. package/dist/enums/SystemAuditEntity.enum.d.ts +5 -2
  66. package/dist/enums/SystemAuditEntity.enum.js +3 -0
  67. package/dist/enums/SystemAuditEntity.enum.js.map +2 -2
  68. package/dist/index.d.ts +18 -5
  69. package/dist/index.js +192 -1
  70. package/dist/index.js.map +2 -2
  71. package/dist/permissions/accounts.permissions.d.ts +12 -0
  72. package/dist/permissions/accounts.permissions.js +11 -0
  73. package/dist/permissions/accounts.permissions.js.map +2 -2
  74. package/dist/permissions/combo.js +5 -0
  75. package/dist/permissions/combo.js.map +2 -2
  76. package/dist/search/compiler.d.ts +20 -0
  77. package/dist/search/compiler.js +48 -11
  78. package/dist/search/compiler.js.map +2 -2
  79. package/dist/search/index.d.ts +1 -1
  80. package/dist/search/index.js.map +2 -2
  81. package/dist/search/organization-search-fields.d.ts +5 -2
  82. package/dist/search/organization-search-fields.js +9 -1
  83. package/dist/search/organization-search-fields.js.map +2 -2
  84. package/dist/search/parser.d.ts +3 -0
  85. package/dist/search/parser.js +3 -1
  86. package/dist/search/parser.js.map +2 -2
  87. package/dist/types/ClusterBulkOperation.type.d.ts +14 -0
  88. package/dist/types/ClusterPlanFields.type.js +74 -74
  89. package/dist/types/ClusterPlanFields.type.js.map +2 -2
  90. package/dist/utils/elasticsearchPlanPath.utils.d.ts +20 -0
  91. package/dist/utils/elasticsearchPlanPath.utils.js +32 -0
  92. package/dist/utils/elasticsearchPlanPath.utils.js.map +7 -0
  93. package/dist/utils/qa-user.utils.d.ts +14 -0
  94. package/dist/utils/qa-user.utils.js +14 -0
  95. package/dist/utils/qa-user.utils.js.map +7 -0
  96. package/dist/utils/qa-user.utils.spec.d.ts +1 -0
  97. package/dist/utils/upgradeGateReason.utils.d.ts +8 -0
  98. package/dist/utils/upgradeGateReason.utils.js +23 -0
  99. package/dist/utils/upgradeGateReason.utils.js.map +7 -0
  100. package/package.json +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/charts/chart-query.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 { isLuceneQueryError, type QueryNode } from '../search/ast.js'\nimport { closestField } from '../search/compiler.js'\nimport { findSearchField, type SearchFieldSpec } from '../search/fields.js'\nimport { parseLuceneQuery } from '../search/parser.js'\nimport {\n CHART_METRICS,\n type ChartMetricSpec,\n findChartDimension,\n findChartMetric,\n} from './chart-metrics.js'\nimport {\n CHART_DAY_GRAIN_MAX_DAYS,\n CHART_GRAIN_DEFAULT,\n CHART_GRAINS,\n CHART_ID_MAX_LENGTH,\n CHART_QUERY_MAX_LENGTH,\n CHART_TOP_DEFAULT,\n CHART_TOP_MAX,\n CHART_WINDOW_AMOUNT_MAX,\n CHART_WINDOW_DEFAULT,\n CHART_WINDOW_UNITS,\n type ChartGrain,\n type ChartSpec,\n type ChartWindow,\n type ChartWindowUnit,\n chartToday,\n chartWindowRange,\n} from './chart-spec.js'\n\n// ============================================================================\n// The chart query language.\n//\n// query = metric clause*\n// clause = \"by\" dimension | \"every\" grain | \"over\" duration\n// | \"top\" integer | \"where\" lucene\n// duration = integer (\"d\" | \"w\" | \"m\")\n//\n// Keywords are case-insensitive, and each clause occurs at most one time.\n// `where` is the last clause: the rest of the text is the Lucene filter of\n// Fleet query, over the filter fields of the metric. The frontend and the\n// backend run the same checks, so a query that the field accepts also runs.\n// ============================================================================\n\nexport type ChartQueryErrorKind =\n | 'syntax'\n | 'unknown-metric'\n | 'unknown-dimension'\n | 'unknown-field'\n | 'bad-value'\n\nexport class ChartQueryError extends Error {\n readonly kind: ChartQueryErrorKind\n /** A name to use instead, for \"did you mean\". */\n readonly suggestion?: string\n\n constructor(message: string, kind: ChartQueryErrorKind, suggestion?: string) {\n super(message)\n this.name = 'ChartQueryError'\n this.kind = kind\n this.suggestion = suggestion\n }\n}\n\n/** Type guard that works across package boundaries. */\nexport const isChartQueryError = (error: unknown): error is ChartQueryError =>\n error instanceof ChartQueryError ||\n (typeof error === 'object' &&\n error !== null &&\n (error as { name?: unknown }).name === 'ChartQueryError')\n\n/**\n * The answer of `POST /api/dashboards/chart-queries/check`: the canonical spec\n * of a valid query, or what is wrong with a query and how to fix it. A wrong\n * query is an answer and not a failure, so a client reads `valid`.\n */\nexport type ChartQueryCheck =\n | { valid: true; spec: ChartSpec; query: string }\n | {\n valid: false\n error: {\n kind: ChartQueryErrorKind\n message: string\n suggestion?: string\n }\n }\n\nconst KEYWORDS = ['by', 'every', 'over', 'top', 'where'] as const\ntype Keyword = (typeof KEYWORDS)[number]\n\nconst DURATION = /^(\\d{1,4})([dwm])$/i\nconst INTEGER = /^\\d{1,4}$/\n\nexport interface ChartQueryOptions {\n metrics?: readonly ChartMetricSpec[]\n /** `YYYY-MM-DD`. The default is today in UTC. */\n today?: string\n}\n\n/**\n * Parse and validate a chart query. Gives the canonical {@link ChartSpec}:\n * the ids in the spelling of the catalogue, and the defaults filled in.\n * Throws {@link ChartQueryError}.\n */\nexport const parseChartQuery = (\n text: string,\n options: ChartQueryOptions = {},\n): ChartSpec => validateChartSpec(readChartQueryText(text), options)\n\n/** The clauses of the text, with no check against the catalogue. */\nconst readChartQueryText = (text: string): ChartSpec => {\n if (text.length > CHART_QUERY_MAX_LENGTH) {\n throw new ChartQueryError(\n `The query is too long. The maximum is ${CHART_QUERY_MAX_LENGTH} characters.`,\n 'syntax',\n )\n }\n const tokens = [...text.matchAll(/\\S+/g)]\n if (tokens.length === 0) {\n throw new ChartQueryError(\n 'The query is empty. Start with a metric.',\n 'syntax',\n )\n }\n const metric = tokens[0][0]\n if (isKeyword(metric)) {\n throw new ChartQueryError(\n `The query starts with \"${metric}\". Start with a metric.`,\n 'syntax',\n )\n }\n\n const spec: Partial<ChartSpec> & { metric: string } = { metric }\n const seen = new Set<Keyword>()\n let index = 1\n while (index < tokens.length) {\n const word = tokens[index][0]\n const keyword = word.toLowerCase()\n if (!isKeyword(keyword)) {\n const suggestion = closestField(keyword, KEYWORDS)\n throw new ChartQueryError(\n `\"${word}\" is not a clause.${suggestion ? ` Did you mean \"${suggestion}\"?` : ''} Use by, every, over, top or where.`,\n 'syntax',\n suggestion,\n )\n }\n if (seen.has(keyword)) {\n throw new ChartQueryError(\n `\"${keyword}\" occurs more than one time.`,\n 'syntax',\n )\n }\n seen.add(keyword)\n\n if (keyword === 'where') {\n const start = (tokens[index].index ?? 0) + word.length\n const filter = text.slice(start).trim()\n if (filter.length === 0) {\n throw new ChartQueryError('\"where\" has no filter after it.', 'syntax')\n }\n spec.filter = filter\n break\n }\n\n const value = tokens[index + 1]?.[0]\n if (value === undefined || isKeyword(value.toLowerCase())) {\n throw new ChartQueryError(`\"${keyword}\" has no value after it.`, 'syntax')\n }\n switch (keyword) {\n case 'by':\n spec.by = value\n break\n case 'every':\n spec.grain = readGrain(value)\n break\n case 'over':\n spec.window = readDuration(value)\n break\n case 'top':\n spec.top = readTop(value)\n break\n }\n index += 2\n }\n\n return {\n ...spec,\n grain: spec.grain ?? CHART_GRAIN_DEFAULT,\n window: spec.window ?? CHART_WINDOW_DEFAULT,\n }\n}\n\nconst isKeyword = (word: string): word is Keyword =>\n (KEYWORDS as readonly string[]).includes(word)\n\nconst readGrain = (value: string): ChartGrain => {\n const grain = value.toLowerCase()\n if (!(CHART_GRAINS as readonly string[]).includes(grain)) {\n throw new ChartQueryError(\n `\"every ${value}\" is not a bucket. Use day, week or month.`,\n 'bad-value',\n )\n }\n return grain as ChartGrain\n}\n\nconst readDuration = (value: string): ChartWindow => {\n const match = DURATION.exec(value)\n if (!match || Number(match[1]) === 0) {\n throw new ChartQueryError(\n `\"over ${value}\" is not a duration. Use a number and d, w or m, for example 90d.`,\n 'bad-value',\n )\n }\n return {\n amount: Number(match[1]),\n unit: match[2].toLowerCase() as ChartWindowUnit,\n }\n}\n\nconst readTop = (value: string): number => {\n if (!INTEGER.test(value)) {\n throw new ChartQueryError(`\"top ${value}\" is not a number.`, 'bad-value')\n }\n return Number(value)\n}\n\n/**\n * Check a spec against the catalogue and give it in canonical form. The chart\n * route runs this on every request body, so a spec that a tile stored long ago\n * gets the rules of today. Throws {@link ChartQueryError}.\n */\nexport const validateChartSpec = (\n spec: ChartSpec,\n options: ChartQueryOptions = {},\n): ChartSpec => {\n const metrics = options.metrics ?? CHART_METRICS\n const metric = findChartMetric(spec.metric, metrics)\n if (!metric) {\n const suggestion = closestField(\n spec.metric,\n metrics.map((entry) => entry.id),\n )\n throw new ChartQueryError(\n `There is no metric \"${spec.metric}\".${suggestion ? ` Did you mean \"${suggestion}\"?` : ''}`,\n 'unknown-metric',\n suggestion,\n )\n }\n\n let by: string | undefined\n if (spec.by !== undefined) {\n const dimension = findChartDimension(metric, spec.by)\n if (!dimension) {\n const ids = metric.dimensions.map((entry) => entry.id)\n const suggestion = closestField(spec.by, ids)\n throw new ChartQueryError(\n `${metric.id} has no dimension \"${spec.by}\". Use one of: ${ids.join(', ')}.`,\n 'unknown-dimension',\n suggestion,\n )\n }\n by = dimension.id\n }\n\n if (!metric.grains.includes(spec.grain)) {\n throw new ChartQueryError(\n `${metric.id} has no bucket \"${spec.grain}\". Use one of: ${metric.grains.join(', ')}.`,\n 'bad-value',\n )\n }\n\n const today = options.today ?? chartToday()\n const { days } = chartWindowRange(spec.window, spec.grain, today)\n if (days > metric.maxWindowDays) {\n throw new ChartQueryError(\n `\"over ${formatDuration(spec.window)}\" reads ${days} days. ${metric.id} reads at most ${metric.maxWindowDays} days.`,\n 'bad-value',\n )\n }\n if (spec.grain === 'day' && days > CHART_DAY_GRAIN_MAX_DAYS) {\n throw new ChartQueryError(\n `\"over ${formatDuration(spec.window)}\" reads ${days} days. With \"every day\", the maximum is ${CHART_DAY_GRAIN_MAX_DAYS} days. Use \"every week\" or \"every month\".`,\n 'bad-value',\n )\n }\n\n let top: number | undefined\n if (spec.top !== undefined && by === undefined) {\n throw new ChartQueryError(\n '\"top\" needs \"by\". Without \"by\", the chart has one series.',\n 'syntax',\n )\n }\n if (by !== undefined) {\n top = spec.top ?? CHART_TOP_DEFAULT\n if (top < 1 || top > CHART_TOP_MAX) {\n throw new ChartQueryError(\n `\"top ${top}\" is out of range. Use 1 to ${CHART_TOP_MAX}.`,\n 'bad-value',\n )\n }\n }\n\n const filter = spec.filter?.trim() || undefined\n if (filter !== undefined) {\n checkFilter(filter, metric.filters)\n }\n\n return {\n metric: metric.id,\n ...(by !== undefined ? { by } : {}),\n grain: spec.grain,\n window: { amount: spec.window.amount, unit: spec.window.unit },\n ...(filter !== undefined ? { filter } : {}),\n ...(top !== undefined ? { top } : {}),\n }\n}\n\nconst checkFilter = (\n filter: string,\n fields: readonly SearchFieldSpec[],\n): void => {\n let ast: QueryNode | undefined\n try {\n ast = parseLuceneQuery(filter)\n } catch (error) {\n if (isLuceneQueryError(error)) {\n throw new ChartQueryError(`In \"where\": ${error.message}`, 'syntax')\n }\n throw error\n }\n if (ast) {\n checkFilterNode(ast, fields)\n }\n}\n\nconst checkFilterNode = (\n node: QueryNode,\n fields: readonly SearchFieldSpec[],\n): void => {\n switch (node.kind) {\n case 'and':\n case 'or':\n checkFilterNode(node.left, fields)\n checkFilterNode(node.right, fields)\n return\n case 'not':\n checkFilterNode(node.child, fields)\n return\n case 'range': {\n const spec = filterField(node.field, fields)\n if (!spec.capabilities.includes('range')) {\n throw new ChartQueryError(\n `\"${spec.field}\" does not take a range.`,\n 'bad-value',\n )\n }\n return\n }\n case 'term': {\n if (node.field === undefined) {\n throw new ChartQueryError(\n `\"${node.value}\" has no field. Write field:value, for example ${fields[0]?.example ?? 'orgId:\u2026'}.`,\n 'syntax',\n )\n }\n const spec = filterField(node.field, fields)\n if (node.operator !== ':' && !spec.capabilities.includes('range')) {\n throw new ChartQueryError(\n `\"${spec.field}\" takes only ${spec.field}:value.`,\n 'bad-value',\n )\n }\n if (node.value.startsWith('$')) {\n throw new ChartQueryError(\n `\"${node.value}\" is a dashboard variable. Dashboard variables are not available yet.`,\n 'bad-value',\n )\n }\n if (\n spec.type === 'enum' &&\n !spec.enumValues?.some(\n (value) => value.toLowerCase() === node.value.toLowerCase(),\n )\n ) {\n throw new ChartQueryError(\n `\"${spec.field}\" takes one of: ${spec.enumValues?.join(', ')}.`,\n 'bad-value',\n )\n }\n return\n }\n }\n}\n\nconst filterField = (\n name: string,\n fields: readonly SearchFieldSpec[],\n): SearchFieldSpec => {\n const spec = findSearchField(fields, name)\n if (!spec) {\n const suggestion = closestField(\n name,\n fields.map((field) => field.field),\n )\n throw new ChartQueryError(\n `There is no filter field \"${name}\".${suggestion ? ` Did you mean \"${suggestion}\"?` : ''}`,\n 'unknown-field',\n suggestion,\n )\n }\n return spec\n}\n\nconst formatDuration = (window: ChartWindow): string =>\n `${window.amount}${window.unit}`\n\n/**\n * The text of a spec, in one canonical form. Parsing it again gives the same\n * spec, so the text field and the builder can never disagree.\n */\nexport const formatChartSpec = (spec: ChartSpec): string =>\n [\n spec.metric,\n ...(spec.by !== undefined ? ['by', spec.by] : []),\n 'every',\n spec.grain,\n 'over',\n formatDuration(spec.window),\n ...(spec.top !== undefined ? ['top', String(spec.top)] : []),\n ...(spec.filter !== undefined ? ['where', spec.filter] : []),\n ].join(' ')\n\n/**\n * Read a spec from JSON, for example a request body or a stored tile. Checks\n * the shape only. Run {@link validateChartSpec} after it.\n */\nexport const readChartSpec = (value: unknown): ChartSpec => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ChartQueryError('The chart query must be an object.', 'syntax')\n }\n const record = value as Record<string, unknown>\n const allowed = new Set(['metric', 'by', 'grain', 'window', 'filter', 'top'])\n for (const key of Object.keys(record)) {\n if (!allowed.has(key)) {\n throw new ChartQueryError(\n `The chart query has an unknown key \"${key}\".`,\n 'syntax',\n )\n }\n }\n const { metric, by, grain, window, filter, top } = record\n if (\n typeof metric !== 'string' ||\n metric.length === 0 ||\n metric.length > CHART_ID_MAX_LENGTH\n ) {\n throw new ChartQueryError('\"metric\" must be a string.', 'syntax')\n }\n if (\n by !== undefined &&\n (typeof by !== 'string' || by.length > CHART_ID_MAX_LENGTH)\n ) {\n throw new ChartQueryError('\"by\" must be a string.', 'syntax')\n }\n if (\n typeof grain !== 'string' ||\n !(CHART_GRAINS as readonly string[]).includes(grain)\n ) {\n throw new ChartQueryError(\n `\"grain\" must be one of: ${CHART_GRAINS.join(', ')}.`,\n 'syntax',\n )\n }\n if (typeof window !== 'object' || window === null) {\n throw new ChartQueryError('\"window\" must be an object.', 'syntax')\n }\n const { amount, unit } = window as Record<string, unknown>\n if (\n typeof amount !== 'number' ||\n !Number.isInteger(amount) ||\n amount < 1 ||\n amount > CHART_WINDOW_AMOUNT_MAX ||\n typeof unit !== 'string' ||\n !(CHART_WINDOW_UNITS as readonly string[]).includes(unit) ||\n Object.keys(window).length !== 2\n ) {\n throw new ChartQueryError(\n `\"window\" must be { amount, unit }, with a whole amount from 1 to ${CHART_WINDOW_AMOUNT_MAX} and a unit of d, w or m.`,\n 'syntax',\n )\n }\n if (filter !== undefined && typeof filter !== 'string') {\n throw new ChartQueryError('\"filter\" must be a string.', 'syntax')\n }\n if (\n top !== undefined &&\n (typeof top !== 'number' || !Number.isInteger(top))\n ) {\n throw new ChartQueryError('\"top\" must be a whole number.', 'syntax')\n }\n // The checks above narrow nothing for the compiler, thus the casts.\n return {\n metric,\n ...(by !== undefined ? { by: by as string } : {}),\n grain: grain as ChartGrain,\n window: { amount, unit: unit as ChartWindowUnit },\n ...(filter !== undefined ? { filter: filter as string } : {}),\n ...(top !== undefined ? { top: top as number } : {}),\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,103 @@
1
+ /** The time buckets of a chart. A week starts on Monday (ISO). */
2
+ export declare const CHART_GRAINS: readonly ["day", "week", "month"];
3
+ export type ChartGrain = (typeof CHART_GRAINS)[number];
4
+ /** `d` is days, `w` is weeks and `m` is calendar months. */
5
+ export declare const CHART_WINDOW_UNITS: readonly ["d", "w", "m"];
6
+ export type ChartWindowUnit = (typeof CHART_WINDOW_UNITS)[number];
7
+ /** A window that ends today (UTC). "The last 90 days" is `{ amount: 90, unit: 'd' }`. */
8
+ export interface ChartWindow {
9
+ amount: number;
10
+ unit: ChartWindowUnit;
11
+ }
12
+ /**
13
+ * One chart query. A tile stores this and never the data, so the chart
14
+ * follows the window as the days go by.
15
+ */
16
+ export interface ChartSpec {
17
+ /** A metric id of `CHART_METRICS`. */
18
+ metric: string;
19
+ /** A dimension id of the metric. Each value of it is one series. */
20
+ by?: string;
21
+ grain: ChartGrain;
22
+ window: ChartWindow;
23
+ /** Lucene source text over the filter fields of the metric. */
24
+ filter?: string;
25
+ /** The number of series to show. Only with `by`. */
26
+ top?: number;
27
+ }
28
+ export declare const CHART_GRAIN_DEFAULT: ChartGrain;
29
+ export declare const CHART_WINDOW_DEFAULT: ChartWindow;
30
+ export declare const CHART_TOP_DEFAULT = 10;
31
+ export declare const CHART_TOP_MAX = 20;
32
+ /** The longest window, in days, for `every day`. */
33
+ export declare const CHART_DAY_GRAIN_MAX_DAYS = 366;
34
+ /**
35
+ * The longest text of a whole chart query. The filter has its own limit,
36
+ * `CHART_FILTER_MAX_LENGTH`.
37
+ */
38
+ export declare const CHART_QUERY_MAX_LENGTH = 700;
39
+ /**
40
+ * The longest filter of a chart query. It is the limit of the Lucene parser,
41
+ * which checks every filter on every run.
42
+ */
43
+ export declare const CHART_FILTER_MAX_LENGTH = 512;
44
+ /** The longest metric id or dimension id that a stored chart query holds. */
45
+ export declare const CHART_ID_MAX_LENGTH = 64;
46
+ /** The largest amount of a window, in its unit. */
47
+ export declare const CHART_WINDOW_AMOUNT_MAX = 9999;
48
+ /**
49
+ * The series key of the sum of every series that is not in the top N. When a
50
+ * real value of the dimension has this key, the key gets a `*`, so the keys
51
+ * of a result stay unique.
52
+ */
53
+ export declare const CHART_OTHER_SERIES_KEY = "(other)";
54
+ /**
55
+ * The series key of the rows with no value for the `by` dimension. It gets a
56
+ * `*` the same way as `CHART_OTHER_SERIES_KEY`.
57
+ */
58
+ export declare const CHART_UNKNOWN_SERIES_KEY = "(unknown)";
59
+ export interface ChartPoint {
60
+ /** The first day of the bucket, `YYYY-MM-DD`. */
61
+ ts: string;
62
+ value: number;
63
+ }
64
+ export interface ChartSeries {
65
+ key: string;
66
+ points: ChartPoint[];
67
+ }
68
+ /** `percent` is 0 to 100. */
69
+ export type ChartUnit = 'count' | 'bytes' | 'usd' | 'percent';
70
+ /** The answer of `POST /api/hdp/charts/query`. */
71
+ export interface ChartResult {
72
+ metric: string;
73
+ unit: ChartUnit;
74
+ grain: ChartGrain;
75
+ /** The first day that the query reads, `YYYY-MM-DD`, inclusive. */
76
+ from: string;
77
+ /** The last day that the query reads, `YYYY-MM-DD`, inclusive. */
78
+ to: string;
79
+ /**
80
+ * Sorted by the total of the series, the largest first. `(other)` is last.
81
+ * The keys are unique.
82
+ */
83
+ series: ChartSeries[];
84
+ /** True when the top N left out series. Their sum is the `(other)` series. */
85
+ truncated: boolean;
86
+ bytesProcessed: number;
87
+ /** When the result came from the cache: the time of the query, ISO. */
88
+ cachedAt?: string;
89
+ }
90
+ /** The first day of the bucket of `day`, as BigQuery's `DATE_TRUNC` gives it. */
91
+ export declare const chartBucketStart: (day: string, grain: ChartGrain) => string;
92
+ /**
93
+ * The days that a chart reads. The window ends on `today` and goes back by its
94
+ * amount. The start moves back to the start of its bucket, so the first
95
+ * bucket of the chart is complete.
96
+ */
97
+ export declare const chartWindowRange: (window: ChartWindow, grain: ChartGrain, today: string) => {
98
+ from: string;
99
+ to: string;
100
+ days: number;
101
+ };
102
+ /** Today in UTC, `YYYY-MM-DD`. */
103
+ export declare const chartToday: (now?: Date) => string;
@@ -0,0 +1,79 @@
1
+ import { LUCENE_QUERY_MAX_LENGTH } from "../search/parser.js";
2
+ const CHART_GRAINS = ["day", "week", "month"];
3
+ const CHART_WINDOW_UNITS = ["d", "w", "m"];
4
+ const CHART_GRAIN_DEFAULT = "day";
5
+ const CHART_WINDOW_DEFAULT = { amount: 30, unit: "d" };
6
+ const CHART_TOP_DEFAULT = 10;
7
+ const CHART_TOP_MAX = 20;
8
+ const CHART_DAY_GRAIN_MAX_DAYS = 366;
9
+ const CHART_QUERY_MAX_LENGTH = 700;
10
+ const CHART_FILTER_MAX_LENGTH = LUCENE_QUERY_MAX_LENGTH;
11
+ const CHART_ID_MAX_LENGTH = 64;
12
+ const CHART_WINDOW_AMOUNT_MAX = 9999;
13
+ const CHART_OTHER_SERIES_KEY = "(other)";
14
+ const CHART_UNKNOWN_SERIES_KEY = "(unknown)";
15
+ const DAY_MS = 24 * 60 * 60 * 1e3;
16
+ const toDay = (date) => date.toISOString().slice(0, 10);
17
+ const parseDay = (day) => /* @__PURE__ */ new Date(`${day}T00:00:00Z`);
18
+ const addDays = (day, delta) => toDay(new Date(parseDay(day).getTime() + delta * DAY_MS));
19
+ const chartBucketStart = (day, grain) => {
20
+ const date = parseDay(day);
21
+ switch (grain) {
22
+ case "day":
23
+ return day;
24
+ case "week": {
25
+ const sinceMonday = (date.getUTCDay() + 6) % 7;
26
+ return addDays(day, -sinceMonday);
27
+ }
28
+ case "month":
29
+ return `${day.slice(0, 7)}-01`;
30
+ }
31
+ };
32
+ const chartWindowRange = (window, grain, today) => {
33
+ let start;
34
+ switch (window.unit) {
35
+ case "d":
36
+ start = addDays(today, -(window.amount - 1));
37
+ break;
38
+ case "w":
39
+ start = addDays(today, -(7 * window.amount - 1));
40
+ break;
41
+ case "m": {
42
+ const date = parseDay(today);
43
+ const shifted = new Date(
44
+ Date.UTC(date.getUTCFullYear(), date.getUTCMonth() - window.amount, 1)
45
+ );
46
+ const lastDay = new Date(
47
+ Date.UTC(shifted.getUTCFullYear(), shifted.getUTCMonth() + 1, 0)
48
+ ).getUTCDate();
49
+ shifted.setUTCDate(Math.min(date.getUTCDate(), lastDay));
50
+ start = addDays(toDay(shifted), 1);
51
+ break;
52
+ }
53
+ }
54
+ const from = chartBucketStart(start, grain);
55
+ const days = Math.round(
56
+ (parseDay(today).getTime() - parseDay(from).getTime()) / DAY_MS
57
+ ) + 1;
58
+ return { from, to: today, days };
59
+ };
60
+ const chartToday = (now = /* @__PURE__ */ new Date()) => toDay(now);
61
+ export {
62
+ CHART_DAY_GRAIN_MAX_DAYS,
63
+ CHART_FILTER_MAX_LENGTH,
64
+ CHART_GRAINS,
65
+ CHART_GRAIN_DEFAULT,
66
+ CHART_ID_MAX_LENGTH,
67
+ CHART_OTHER_SERIES_KEY,
68
+ CHART_QUERY_MAX_LENGTH,
69
+ CHART_TOP_DEFAULT,
70
+ CHART_TOP_MAX,
71
+ CHART_UNKNOWN_SERIES_KEY,
72
+ CHART_WINDOW_AMOUNT_MAX,
73
+ CHART_WINDOW_DEFAULT,
74
+ CHART_WINDOW_UNITS,
75
+ chartBucketStart,
76
+ chartToday,
77
+ chartWindowRange
78
+ };
79
+ //# sourceMappingURL=chart-spec.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/charts/chart-spec.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 { LUCENE_QUERY_MAX_LENGTH } from '../search/parser.js'\n\n// ============================================================================\n// The chart query of a dashboard tile, and the result that the chart route of\n// accounts-backend gives for it. See\n// docs/superpowers/specs/2026-10-02-dashboard-chart-tiles-design.md.\n// ============================================================================\n\n/** The time buckets of a chart. A week starts on Monday (ISO). */\nexport const CHART_GRAINS = ['day', 'week', 'month'] as const\nexport type ChartGrain = (typeof CHART_GRAINS)[number]\n\n/** `d` is days, `w` is weeks and `m` is calendar months. */\nexport const CHART_WINDOW_UNITS = ['d', 'w', 'm'] as const\nexport type ChartWindowUnit = (typeof CHART_WINDOW_UNITS)[number]\n\n/** A window that ends today (UTC). \"The last 90 days\" is `{ amount: 90, unit: 'd' }`. */\nexport interface ChartWindow {\n amount: number\n unit: ChartWindowUnit\n}\n\n/**\n * One chart query. A tile stores this and never the data, so the chart\n * follows the window as the days go by.\n */\nexport interface ChartSpec {\n /** A metric id of `CHART_METRICS`. */\n metric: string\n /** A dimension id of the metric. Each value of it is one series. */\n by?: string\n grain: ChartGrain\n window: ChartWindow\n /** Lucene source text over the filter fields of the metric. */\n filter?: string\n /** The number of series to show. Only with `by`. */\n top?: number\n}\n\nexport const CHART_GRAIN_DEFAULT: ChartGrain = 'day'\nexport const CHART_WINDOW_DEFAULT: ChartWindow = { amount: 30, unit: 'd' }\nexport const CHART_TOP_DEFAULT = 10\nexport const CHART_TOP_MAX = 20\n\n/** The longest window, in days, for `every day`. */\nexport const CHART_DAY_GRAIN_MAX_DAYS = 366\n\n/**\n * The longest text of a whole chart query. The filter has its own limit,\n * `CHART_FILTER_MAX_LENGTH`.\n */\nexport const CHART_QUERY_MAX_LENGTH = 700\n\n/**\n * The longest filter of a chart query. It is the limit of the Lucene parser,\n * which checks every filter on every run.\n */\nexport const CHART_FILTER_MAX_LENGTH = LUCENE_QUERY_MAX_LENGTH\n\n/** The longest metric id or dimension id that a stored chart query holds. */\nexport const CHART_ID_MAX_LENGTH = 64\n\n/** The largest amount of a window, in its unit. */\nexport const CHART_WINDOW_AMOUNT_MAX = 9999\n\n/**\n * The series key of the sum of every series that is not in the top N. When a\n * real value of the dimension has this key, the key gets a `*`, so the keys\n * of a result stay unique.\n */\nexport const CHART_OTHER_SERIES_KEY = '(other)'\n\n/**\n * The series key of the rows with no value for the `by` dimension. It gets a\n * `*` the same way as `CHART_OTHER_SERIES_KEY`.\n */\nexport const CHART_UNKNOWN_SERIES_KEY = '(unknown)'\n\nexport interface ChartPoint {\n /** The first day of the bucket, `YYYY-MM-DD`. */\n ts: string\n value: number\n}\n\nexport interface ChartSeries {\n key: string\n points: ChartPoint[]\n}\n\n/** `percent` is 0 to 100. */\nexport type ChartUnit = 'count' | 'bytes' | 'usd' | 'percent'\n\n/** The answer of `POST /api/hdp/charts/query`. */\nexport interface ChartResult {\n metric: string\n unit: ChartUnit\n grain: ChartGrain\n /** The first day that the query reads, `YYYY-MM-DD`, inclusive. */\n from: string\n /** The last day that the query reads, `YYYY-MM-DD`, inclusive. */\n to: string\n /**\n * Sorted by the total of the series, the largest first. `(other)` is last.\n * The keys are unique.\n */\n series: ChartSeries[]\n /** True when the top N left out series. Their sum is the `(other)` series. */\n truncated: boolean\n bytesProcessed: number\n /** When the result came from the cache: the time of the query, ISO. */\n cachedAt?: string\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\nconst toDay = (date: Date): string => date.toISOString().slice(0, 10)\n\nconst parseDay = (day: string): Date => new Date(`${day}T00:00:00Z`)\n\nconst addDays = (day: string, delta: number): string =>\n toDay(new Date(parseDay(day).getTime() + delta * DAY_MS))\n\n/** The first day of the bucket of `day`, as BigQuery's `DATE_TRUNC` gives it. */\nexport const chartBucketStart = (day: string, grain: ChartGrain): string => {\n const date = parseDay(day)\n switch (grain) {\n case 'day':\n return day\n case 'week': {\n // getUTCDay: Sunday is 0. Monday starts the week.\n const sinceMonday = (date.getUTCDay() + 6) % 7\n return addDays(day, -sinceMonday)\n }\n case 'month':\n return `${day.slice(0, 7)}-01`\n }\n}\n\n/**\n * The days that a chart reads. The window ends on `today` and goes back by its\n * amount. The start moves back to the start of its bucket, so the first\n * bucket of the chart is complete.\n */\nexport const chartWindowRange = (\n window: ChartWindow,\n grain: ChartGrain,\n today: string,\n): { from: string; to: string; days: number } => {\n let start: string\n switch (window.unit) {\n case 'd':\n start = addDays(today, -(window.amount - 1))\n break\n case 'w':\n start = addDays(today, -(7 * window.amount - 1))\n break\n case 'm': {\n const date = parseDay(today)\n // Day 0 of a month is the last day of the month before. Thus a short\n // month clamps the day, and 03-31 minus one month gives 02-28.\n const shifted = new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() - window.amount, 1),\n )\n const lastDay = new Date(\n Date.UTC(shifted.getUTCFullYear(), shifted.getUTCMonth() + 1, 0),\n ).getUTCDate()\n shifted.setUTCDate(Math.min(date.getUTCDate(), lastDay))\n start = addDays(toDay(shifted), 1)\n break\n }\n }\n const from = chartBucketStart(start, grain)\n const days =\n Math.round(\n (parseDay(today).getTime() - parseDay(from).getTime()) / DAY_MS,\n ) + 1\n return { from, to: today, days }\n}\n\n/** Today in UTC, `YYYY-MM-DD`. */\nexport const chartToday = (now: Date = new Date()): string => toDay(now)\n"],
5
+ "mappings": "AAMA,SAAS,+BAA+B;AASjC,MAAM,eAAe,CAAC,OAAO,QAAQ,OAAO;AAI5C,MAAM,qBAAqB,CAAC,KAAK,KAAK,GAAG;AA0BzC,MAAM,sBAAkC;AACxC,MAAM,uBAAoC,EAAE,QAAQ,IAAI,MAAM,IAAI;AAClE,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AAGtB,MAAM,2BAA2B;AAMjC,MAAM,yBAAyB;AAM/B,MAAM,0BAA0B;AAGhC,MAAM,sBAAsB;AAG5B,MAAM,0BAA0B;AAOhC,MAAM,yBAAyB;AAM/B,MAAM,2BAA2B;AAqCxC,MAAM,SAAS,KAAK,KAAK,KAAK;AAE9B,MAAM,QAAQ,CAAC,SAAuB,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAEpE,MAAM,WAAW,CAAC,QAAsB,oBAAI,KAAK,GAAG,GAAG,YAAY;AAEnE,MAAM,UAAU,CAAC,KAAa,UAC5B,MAAM,IAAI,KAAK,SAAS,GAAG,EAAE,QAAQ,IAAI,QAAQ,MAAM,CAAC;AAGnD,MAAM,mBAAmB,CAAC,KAAa,UAA8B;AAC1E,QAAM,OAAO,SAAS,GAAG;AACzB,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK,QAAQ;AAEX,YAAM,eAAe,KAAK,UAAU,IAAI,KAAK;AAC7C,aAAO,QAAQ,KAAK,CAAC,WAAW;AAAA,IAClC;AAAA,IACA,KAAK;AACH,aAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC;AAAA,EAC7B;AACF;AAOO,MAAM,mBAAmB,CAC9B,QACA,OACA,UAC+C;AAC/C,MAAI;AACJ,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,cAAQ,QAAQ,OAAO,EAAE,OAAO,SAAS,EAAE;AAC3C;AAAA,IACF,KAAK;AACH,cAAQ,QAAQ,OAAO,EAAE,IAAI,OAAO,SAAS,EAAE;AAC/C;AAAA,IACF,KAAK,KAAK;AACR,YAAM,OAAO,SAAS,KAAK;AAG3B,YAAM,UAAU,IAAI;AAAA,QAClB,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,IAAI,OAAO,QAAQ,CAAC;AAAA,MACvE;AACA,YAAM,UAAU,IAAI;AAAA,QAClB,KAAK,IAAI,QAAQ,eAAe,GAAG,QAAQ,YAAY,IAAI,GAAG,CAAC;AAAA,MACjE,EAAE,WAAW;AACb,cAAQ,WAAW,KAAK,IAAI,KAAK,WAAW,GAAG,OAAO,CAAC;AACvD,cAAQ,QAAQ,MAAM,OAAO,GAAG,CAAC;AACjC;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,iBAAiB,OAAO,KAAK;AAC1C,QAAM,OACJ,KAAK;AAAA,KACF,SAAS,KAAK,EAAE,QAAQ,IAAI,SAAS,IAAI,EAAE,QAAQ,KAAK;AAAA,EAC3D,IAAI;AACN,SAAO,EAAE,MAAM,IAAI,OAAO,KAAK;AACjC;AAGO,MAAM,aAAa,CAAC,MAAY,oBAAI,KAAK,MAAc,MAAM,GAAG;",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ export { CHART_METRICS, type ChartDimensionSpec, type ChartMetricSpec, findChartDimension, findChartMetric, } from './chart-metrics.js';
2
+ export { type ChartQueryCheck, ChartQueryError, type ChartQueryErrorKind, type ChartQueryOptions, formatChartSpec, isChartQueryError, parseChartQuery, readChartSpec, validateChartSpec, } from './chart-query.js';
3
+ export { CHART_DAY_GRAIN_MAX_DAYS, CHART_FILTER_MAX_LENGTH, CHART_GRAIN_DEFAULT, CHART_GRAINS, CHART_ID_MAX_LENGTH, CHART_OTHER_SERIES_KEY, CHART_QUERY_MAX_LENGTH, CHART_TOP_DEFAULT, CHART_TOP_MAX, CHART_UNKNOWN_SERIES_KEY, CHART_WINDOW_AMOUNT_MAX, CHART_WINDOW_DEFAULT, CHART_WINDOW_UNITS, type ChartGrain, type ChartPoint, type ChartResult, type ChartSeries, type ChartSpec, type ChartUnit, type ChartWindow, type ChartWindowUnit, chartBucketStart, chartToday, chartWindowRange, } from './chart-spec.js';
@@ -0,0 +1,59 @@
1
+ import {
2
+ CHART_METRICS,
3
+ findChartDimension,
4
+ findChartMetric
5
+ } from "./chart-metrics.js";
6
+ import {
7
+ ChartQueryError,
8
+ formatChartSpec,
9
+ isChartQueryError,
10
+ parseChartQuery,
11
+ readChartSpec,
12
+ validateChartSpec
13
+ } from "./chart-query.js";
14
+ import {
15
+ CHART_DAY_GRAIN_MAX_DAYS,
16
+ CHART_FILTER_MAX_LENGTH,
17
+ CHART_GRAIN_DEFAULT,
18
+ CHART_GRAINS,
19
+ CHART_ID_MAX_LENGTH,
20
+ CHART_OTHER_SERIES_KEY,
21
+ CHART_QUERY_MAX_LENGTH,
22
+ CHART_TOP_DEFAULT,
23
+ CHART_TOP_MAX,
24
+ CHART_UNKNOWN_SERIES_KEY,
25
+ CHART_WINDOW_AMOUNT_MAX,
26
+ CHART_WINDOW_DEFAULT,
27
+ CHART_WINDOW_UNITS,
28
+ chartBucketStart,
29
+ chartToday,
30
+ chartWindowRange
31
+ } from "./chart-spec.js";
32
+ export {
33
+ CHART_DAY_GRAIN_MAX_DAYS,
34
+ CHART_FILTER_MAX_LENGTH,
35
+ CHART_GRAINS,
36
+ CHART_GRAIN_DEFAULT,
37
+ CHART_ID_MAX_LENGTH,
38
+ CHART_METRICS,
39
+ CHART_OTHER_SERIES_KEY,
40
+ CHART_QUERY_MAX_LENGTH,
41
+ CHART_TOP_DEFAULT,
42
+ CHART_TOP_MAX,
43
+ CHART_UNKNOWN_SERIES_KEY,
44
+ CHART_WINDOW_AMOUNT_MAX,
45
+ CHART_WINDOW_DEFAULT,
46
+ CHART_WINDOW_UNITS,
47
+ ChartQueryError,
48
+ chartBucketStart,
49
+ chartToday,
50
+ chartWindowRange,
51
+ findChartDimension,
52
+ findChartMetric,
53
+ formatChartSpec,
54
+ isChartQueryError,
55
+ parseChartQuery,
56
+ readChartSpec,
57
+ validateChartSpec
58
+ };
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/charts/index.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 {\n CHART_METRICS,\n type ChartDimensionSpec,\n type ChartMetricSpec,\n findChartDimension,\n findChartMetric,\n} from './chart-metrics.js'\nexport {\n type ChartQueryCheck,\n ChartQueryError,\n type ChartQueryErrorKind,\n type ChartQueryOptions,\n formatChartSpec,\n isChartQueryError,\n parseChartQuery,\n readChartSpec,\n validateChartSpec,\n} from './chart-query.js'\nexport {\n CHART_DAY_GRAIN_MAX_DAYS,\n CHART_FILTER_MAX_LENGTH,\n CHART_GRAIN_DEFAULT,\n CHART_GRAINS,\n CHART_ID_MAX_LENGTH,\n CHART_OTHER_SERIES_KEY,\n CHART_QUERY_MAX_LENGTH,\n CHART_TOP_DEFAULT,\n CHART_TOP_MAX,\n CHART_UNKNOWN_SERIES_KEY,\n CHART_WINDOW_AMOUNT_MAX,\n CHART_WINDOW_DEFAULT,\n CHART_WINDOW_UNITS,\n type ChartGrain,\n type ChartPoint,\n type ChartResult,\n type ChartSeries,\n type ChartSpec,\n type ChartUnit,\n type ChartWindow,\n type ChartWindowUnit,\n chartBucketStart,\n chartToday,\n chartWindowRange,\n} from './chart-spec.js'\n"],
5
+ "mappings": "AAMA;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EASA;AAAA,EACA;AAAA,EACA;AAAA,OACK;",
6
+ "names": []
7
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Customer hardware sizing: a cluster plan that a Camundi creates for an
3
+ * organization of their own, with no admin permission. The approval use cases
4
+ * `create-customer-hardware-sizing` and `remove-customer-hardware-sizing` run
5
+ * on dev only, and the limits in this file keep one plan from asking for a
6
+ * machine park.
7
+ *
8
+ * Every cap below is 10 times the largest value in the cluster plans of prod
9
+ * (dump of 2026-10-01, 27 plans). The cap for storage is 10 times the largest
10
+ * value of a plan that is NOT a load test: `Cisco XXL Year 1` and
11
+ * `G3-M (adapted for Cisco load test)` ask for 10 TB on purpose, and a cap
12
+ * from them would be 100 TB.
13
+ */
14
+ /** The stage where customer hardware sizing runs. */
15
+ export declare const isCustomerHardwareSizingStage: (stage: string) => boolean;
16
+ /**
17
+ * The most plans that one Camundi can own through customer hardware sizing.
18
+ *
19
+ * The count is the number of plans the Camundi created. A plan that the
20
+ * Camundi deleted does not count.
21
+ */
22
+ export declare const CUSTOMER_HARDWARE_SIZING_MAX_PLANS_PER_REQUESTER = 10;
23
+ /** The shortest and longest name of a customer hardware sizing plan. */
24
+ export declare const CUSTOMER_HARDWARE_SIZING_NAME_MIN_LENGTH = 3;
25
+ export declare const CUSTOMER_HARDWARE_SIZING_NAME_MAX_LENGTH = 100;
26
+ /**
27
+ * The longest plan, as JSON text. The largest plan of prod is about 6000
28
+ * characters. The cap stops a request that carries a huge object.
29
+ */
30
+ export declare const CUSTOMER_HARDWARE_SIZING_MAX_PLAN_JSON_LENGTH = 50000;
31
+ /**
32
+ * Caps for the requests and the limits of one component.
33
+ *
34
+ * `other` is every component that is not the Zeebe broker or Elasticsearch:
35
+ * Operate, Tasklist, Optimize, the gateways, Identity and the others. The
36
+ * largest of them in prod is Operate, with 6 CPU and 30 GiB.
37
+ *
38
+ * Prod maximum, before the factor of 10:
39
+ * - broker: 16 CPU, 50 GiB, 500 GiB of storage (no load test)
40
+ * - Elasticsearch: 30 CPU, 100 GiB, 3000 GiB of storage (no load test)
41
+ * - other: 6 CPU, 30 GiB, no storage
42
+ */
43
+ export declare const CUSTOMER_HARDWARE_SIZING_RESOURCE_CAPS: {
44
+ readonly broker: {
45
+ readonly cpu: 160;
46
+ readonly memoryGi: 500;
47
+ readonly storageGi: 5000;
48
+ };
49
+ readonly elasticsearch: {
50
+ readonly cpu: 300;
51
+ readonly memoryGi: 1000;
52
+ readonly storageGi: 30000;
53
+ };
54
+ readonly other: {
55
+ readonly cpu: 60;
56
+ readonly memoryGi: 300;
57
+ readonly storageGi: 5000;
58
+ };
59
+ };
60
+ /** Caps for the count fields of a plan. Prod maximum is in the comments. */
61
+ export declare const CUSTOMER_HARDWARE_SIZING_COUNT_CAPS: {
62
+ readonly clusterSize: 70;
63
+ readonly partitionsCount: 500;
64
+ readonly replicationFactor: 30;
65
+ readonly nodesCount: 50;
66
+ readonly replicas: 30;
67
+ };
68
+ /** `zeebe.broker.storage.autoResizing.increase`. Prod maximum is 18 GiB. */
69
+ export declare const CUSTOMER_HARDWARE_SIZING_MAX_AUTO_RESIZE_INCREASE_GI = 180;
70
+ /**
71
+ * The caps over the whole broker set, which the caps for one broker do not
72
+ * give. A plan with 70 brokers of 160 CPU passes every cap above, and it asks
73
+ * for 11200 CPU. The prod maximum is 84 CPU (7 brokers, `Cisco XXL Year 1`),
74
+ * 250 GiB of memory (5 brokers, `GLS HA`) and 2500 GiB of storage (5 brokers,
75
+ * `GLS HA`, no load test).
76
+ */
77
+ export declare const CUSTOMER_HARDWARE_SIZING_BROKER_TOTAL_CAPS: {
78
+ readonly cpu: 840;
79
+ readonly memoryGi: 2500;
80
+ readonly storageGi: 25000;
81
+ };
82
+ /**
83
+ * The same, for the whole Elasticsearch node set. Ten times the prod maximum:
84
+ * 90 CPU and 300 GiB of memory (3 nodes, `GLS HA`), and 10000 GiB of storage
85
+ * (5 nodes, `CCL G3L HA`). The storage of one node is a claim of one volume,
86
+ * so the total is the claim times the number of nodes.
87
+ */
88
+ export declare const CUSTOMER_HARDWARE_SIZING_ELASTICSEARCH_TOTAL_CAPS: {
89
+ readonly cpu: 900;
90
+ readonly memoryGi: 3000;
91
+ readonly storageGi: 100000;
92
+ };
93
+ /**
94
+ * The same, for the pods of one component that has `replicas`, such as
95
+ * Operate or the gateway. Ten times the prod maximum: 12 CPU (the gateway, 3
96
+ * replicas of 4 CPU) and 60 GiB of memory (Operate, 2 replicas of 30 GiB). No
97
+ * component of prod has storage in its pod resources, so the storage total is
98
+ * the cap for one pod, 10 times over. The check counts a storage request of a
99
+ * pod in `resources` against it.
100
+ */
101
+ export declare const CUSTOMER_HARDWARE_SIZING_REPLICA_SET_TOTAL_CAPS: {
102
+ readonly cpu: 120;
103
+ readonly memoryGi: 600;
104
+ readonly storageGi: 50000;
105
+ };
106
+ /**
107
+ * Reads a Kubernetes quantity such as `500m`, `2`, `4Gi` or `1G`, and returns
108
+ * its value in base units: cores for a CPU, bytes for memory and storage.
109
+ *
110
+ * Returns `undefined` for a text that this function cannot read, so the
111
+ * caller can refuse it. The exponent form (`1e3`) is not read on purpose.
112
+ */
113
+ export declare function parseKubernetesQuantity(value: unknown): number | undefined;
114
+ /**
115
+ * Checks a cluster plan against the caps of customer hardware sizing.
116
+ *
117
+ * Returns the list of violations, and an empty list when the plan is within
118
+ * the caps. It checks the size only. The shape of the plan is the job of the
119
+ * plan validator of console-backend.
120
+ *
121
+ * A value that this function cannot read is a violation too: a cap that the
122
+ * plan can skip with a strange spelling is no cap.
123
+ */
124
+ export declare function checkCustomerHardwareSizing(plan: unknown): string[];