react-semaphor 0.1.428 → 0.1.429

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 (96) hide show
  1. package/dist/analytics-protocol/index.cjs +1 -1
  2. package/dist/analytics-protocol/index.js +72 -71
  3. package/dist/brand-studio/index.cjs +1 -1
  4. package/dist/brand-studio/index.js +5 -4
  5. package/dist/briefings/index.cjs +1 -1
  6. package/dist/briefings/index.js +1031 -622
  7. package/dist/chunks/analyze-result-contract-BswhsmWT.js +1 -0
  8. package/dist/chunks/{analyze-result-contract-DnfF8kBb.js → analyze-result-contract-CfOBEwaC.js} +681 -759
  9. package/dist/chunks/{code-editor-CojfM3qp.js → code-editor-C65eEYyU.js} +2980 -2960
  10. package/dist/chunks/code-editor-DOh3aYEh.js +138 -0
  11. package/dist/chunks/{comparison-document-migration-b6c3xiWh.js → comparison-document-migration-DbU_BTxR.js} +1 -1
  12. package/dist/chunks/{comparison-document-migration-BJH1idOd.js → comparison-document-migration-Dj6xZMCb.js} +2 -2
  13. package/dist/chunks/csv-utils-Co0WxHke.js +4 -0
  14. package/dist/chunks/csv-utils-suxSkJGj.js +376 -0
  15. package/dist/chunks/dashboard-CQfAvRYI.js +1401 -0
  16. package/dist/chunks/{dashboard-509sbC4_.js → dashboard-agBXhvKo.js} +47563 -44929
  17. package/dist/chunks/{dashboard-briefing-launcher-B-ZTWJwo.js → dashboard-briefing-launcher-CkH_pthg.js} +1 -1
  18. package/dist/chunks/{dashboard-briefing-launcher-DIdYHNTq.js → dashboard-briefing-launcher-gBNNKqoH.js} +100 -99
  19. package/dist/chunks/{dashboard-controls-CWprw-Pb.js → dashboard-controls-CAZnIGfT.js} +2 -2
  20. package/dist/chunks/{dashboard-controls-CbRzWo1N.js → dashboard-controls-CoIxUTvH.js} +114 -113
  21. package/dist/chunks/{dashboard-json-jO4GQfZk.js → dashboard-json-BMcPjL8-.js} +18 -17
  22. package/dist/chunks/dashboard-json-D4hFrMkX.js +1 -0
  23. package/dist/chunks/{edit-dashboard-visual-KgQTjqWp.js → edit-dashboard-visual-Bc8qNfSr.js} +8721 -8481
  24. package/dist/chunks/edit-dashboard-visual-onhUUXlw.js +182 -0
  25. package/dist/chunks/{metric-comparison-CWweq9RG.js → metric-comparison-CPoDx56y.js} +1 -1
  26. package/dist/chunks/{metric-comparison-BKgkMy9r.js → metric-comparison-DVy3fll_.js} +1 -1
  27. package/dist/chunks/numeric-presentation-CGTcqocU.js +517 -0
  28. package/dist/chunks/numeric-presentation-Dlb-Dk4c.js +1 -0
  29. package/dist/chunks/report-preferences-dialog-CPptr_V9.js +690 -0
  30. package/dist/chunks/report-preferences-dialog-DV_5aHrS.js +1 -0
  31. package/dist/chunks/source-identity-5OPV4gvg.js +92 -0
  32. package/dist/chunks/source-identity-Cbo2LOHQ.js +1 -0
  33. package/dist/chunks/{update-policy-CY2k-pJP.js → update-policy-De2NswtM.js} +1 -1
  34. package/dist/chunks/{update-policy-BgONreNd.js → update-policy-DnF_74zC.js} +1 -1
  35. package/dist/chunks/{use-create-flow-overlay-state-BiMYdjZP.js → use-create-flow-overlay-state-Bs6gqgjo.js} +1 -1
  36. package/dist/chunks/{use-create-flow-overlay-state-CGsLzp9A.js → use-create-flow-overlay-state-CgQbCrni.js} +97 -96
  37. package/dist/chunks/validators-B2vUAqTf.js +1 -0
  38. package/dist/chunks/{validators-Cz-XuORM.js → validators-Bce_J7Vd.js} +19 -13
  39. package/dist/dashboard/index.cjs +1 -1
  40. package/dist/dashboard/index.js +1 -1
  41. package/dist/dashboard-authoring/index.cjs +3 -3
  42. package/dist/dashboard-authoring/index.js +20 -19
  43. package/dist/data-app-builder/index.cjs +1 -1
  44. package/dist/data-app-builder/index.js +50 -50
  45. package/dist/data-app-codegen/index.cjs +1 -1
  46. package/dist/data-app-codegen/index.js +2 -2
  47. package/dist/data-app-codegen-node/index.cjs +1 -1
  48. package/dist/data-app-codegen-node/index.js +3 -3
  49. package/dist/data-app-sdk/index.cjs +2 -2
  50. package/dist/data-app-sdk/index.js +27 -26
  51. package/dist/data-app-sdk-adapters/index.cjs +1 -1
  52. package/dist/data-app-sdk-adapters/index.js +25 -24
  53. package/dist/data-app-sdk-validation/index.cjs +1 -1
  54. package/dist/data-app-sdk-validation/index.js +57 -55
  55. package/dist/format-utils/index.cjs +2 -5
  56. package/dist/format-utils/index.js +136 -161
  57. package/dist/index.cjs +1 -1
  58. package/dist/index.js +158 -155
  59. package/dist/report-runtime-context/index.cjs +1 -0
  60. package/dist/report-runtime-context/index.js +394 -0
  61. package/dist/style.css +1 -1
  62. package/dist/surfboard/index.cjs +1 -1
  63. package/dist/surfboard/index.js +7 -6
  64. package/dist/types/analytics-protocol.d.ts +0 -4
  65. package/dist/types/briefings.d.ts +216 -19
  66. package/dist/types/dashboard-assistant.d.ts +0 -2
  67. package/dist/types/dashboard-authoring.d.ts +34 -9
  68. package/dist/types/dashboard.d.ts +93 -9
  69. package/dist/types/data-app-builder.d.ts +0 -1
  70. package/dist/types/data-app-codegen-node.d.ts +6 -28
  71. package/dist/types/data-app-codegen.d.ts +6 -28
  72. package/dist/types/data-app-sdk-adapters.d.ts +6 -28
  73. package/dist/types/data-app-sdk-validation.d.ts +6 -29
  74. package/dist/types/data-app-sdk.d.ts +6 -31
  75. package/dist/types/format-utils.d.ts +128 -4
  76. package/dist/types/index.cjs +1 -1
  77. package/dist/types/index.js +10 -13
  78. package/dist/types/main.d.ts +249 -89
  79. package/dist/types/report-runtime-context.d.ts +99 -0
  80. package/dist/types/shared.d.ts +34 -9
  81. package/dist/types/surfboard.d.ts +119 -16
  82. package/dist/types/types.d.ts +156 -73
  83. package/dist/types/value-format-preferences.d.ts +126 -0
  84. package/dist/value-format-preferences/index.cjs +1 -0
  85. package/dist/value-format-preferences/index.js +635 -0
  86. package/package.json +11 -1
  87. package/dist/chunks/analyze-result-contract-ege_u6Nl.js +0 -1
  88. package/dist/chunks/calendar-preferences-dialog-BF9bNAF_.js +0 -457
  89. package/dist/chunks/calendar-preferences-dialog-_L9eBQfj.js +0 -1
  90. package/dist/chunks/code-editor-BoowcKU0.js +0 -138
  91. package/dist/chunks/dashboard-CMDXBLnG.js +0 -1402
  92. package/dist/chunks/dashboard-json-BEZrxx_k.js +0 -1
  93. package/dist/chunks/date-formatter-BTTYdAik.js +0 -1
  94. package/dist/chunks/date-formatter-D-89jTjG.js +0 -514
  95. package/dist/chunks/edit-dashboard-visual-D3uhqgm3.js +0 -182
  96. package/dist/chunks/validators-B4VMLX3_.js +0 -1
@@ -1,4 +1,4 @@
1
- import { p as _ } from "./validators-Cz-XuORM.js";
1
+ import { p as _ } from "./validators-Bce_J7Vd.js";
2
2
  const g = "higher_is_better", D = {
3
3
  displayMode: "difference",
4
4
  showComparison: !0,
@@ -1 +1 @@
1
- "use strict";const g=require("./validators-B4VMLX3_.js"),b="higher_is_better",C={displayMode:"difference",showComparison:!0,indicatorStyle:"arrow_badge",showColor:!0,conditionalLabel:!1};function w(o){return g.parseSemaphorIsoInstant(o)!==null}function $(o){var i,e,s,t;if(((i=o.metricComparison)==null?void 0:i.mode)!=="off"){if(((e=o.metricComparison)==null?void 0:e.mode)==="explicit")return{source:"explicit",spec:o.metricComparison.spec};if(!((o.inheritGlobalComparison??((s=o.globalDateComparison)==null?void 0:s.inheritGlobalComparison))===!1||((t=o.globalDateComparison)==null?void 0:t.selection.mode)!=="period"))return{source:"inherited",spec:o.globalDateComparison.selection.spec,...o.globalDateComparison.owner?{owner:o.globalDateComparison.owner}:{}}}}function h(o){if(o.alias)return o.alias;const i=o.entityName&&o.entityName!=="SEMAPHOR_CALCULATED_FIELD"?o.entityName:void 0,e=i&&i!==o.name?`${i}_`:"";if(o.role!=="metric")return`${e}${o.name}`;let s=o.aggregate||"metric";if(o.expression){const t=o.expression.match(/^(COUNT|SUM|AVG|MIN|MAX|MEDIAN|DISTINCT)\s*\(/i);s=t?t[1].toLowerCase():"expr"}else s=s.toLowerCase();return`${e}${o.name}_${s}`}function n(o,i,e){return e?{code:o,message:i,path:e}:{code:o,message:i}}function p(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function a(o,i,e,s){Object.keys(o).forEach(t=>{i.includes(t)||s.push(n("invalid_comparison_spec",`Comparison kind does not accept field "${t}".`,`${e}.${t}`))})}function f(o,i,e){o.alignment!==void 0&&o.alignment!=="calendar"&&o.alignment!=="weekday"&&e.push(n("invalid_comparison_spec",'Comparison alignment must be "calendar" or "weekday".',`${i}.alignment`)),o.toDate!==void 0&&typeof o.toDate!="boolean"&&e.push(n("invalid_comparison_spec","Comparison toDate must be a boolean.",`${i}.toDate`))}function _(o,i,e){o!==void 0&&(typeof o!="number"||!Number.isSafeInteger(o)||o<=0)&&e.push(n("invalid_comparison_spec","Comparison offset must be a positive safe integer.",i))}function d(o,i="comparison"){const e=[];return p(o)?(o.kind==="previous_period"?(a(o,["kind","offsetPeriods","alignment","toDate"],i,e),_(o.offsetPeriods,`${i}.offsetPeriods`,e),f(o,i,e)):o.kind==="previous_year"?(a(o,["kind","offsetYears","alignment","toDate"],i,e),_(o.offsetYears,`${i}.offsetYears`,e),f(o,i,e)):o.kind==="target"?(a(o,["kind","targetValue"],i,e),(typeof o.targetValue!="number"||!Number.isFinite(o.targetValue))&&e.push(n("invalid_comparison_spec","Target comparison requires a finite targetValue.",`${i}.targetValue`))):e.push(n("invalid_comparison_spec","Comparison kind must be previous_period, previous_year, or target.",`${i}.kind`)),{ok:e.length===0,errors:e,warnings:[]}):{ok:!1,errors:[n("invalid_comparison_spec","Comparison spec must be an object.",i)],warnings:[]}}function D(o,i="comparison"){if(!p(o))return{ok:!1,errors:[n("invalid_comparison_config","Comparison config must be an object.",i)],warnings:[]};const e=[];return o.mode==="off"?a(o,["mode"],i,e):o.mode==="explicit"?(a(o,["mode","spec"],i,e),e.push(...d(o.spec,`${i}.spec`).errors)):e.push(n("invalid_comparison_config","Comparison mode must be off or explicit.",`${i}.mode`)),{ok:e.length===0,errors:e,warnings:[]}}function u(o,i="comparisonSelection"){if(!p(o))return{ok:!1,errors:[n("invalid_global_date_comparison","Global Date comparison selection must be an object.",i)],warnings:[]};const e=[];if(o.mode==="off")a(o,["mode"],i,e);else if(o.mode==="period"){a(o,["mode","spec"],i,e);const s=d(o.spec,`${i}.spec`);e.push(...s.errors),p(o.spec)&&o.spec.kind==="target"&&e.push(n("invalid_global_date_comparison","Global Date comparison supports previous_period or previous_year, not target.",`${i}.spec.kind`))}else e.push(n("invalid_global_date_comparison","Global Date comparison mode must be off or period.",`${i}.mode`));return{ok:e.length===0,errors:e,warnings:[]}}function I(o,i="globalDateComparison"){if(!p(o))return{ok:!1,errors:[n("invalid_global_date_comparison","Global Date comparison context must be an object.",i)],warnings:[]};const e=[];return a(o,["selection","inheritGlobalComparison","owner","referenceTime"],i,e),e.push(...u(o.selection,`${i}.selection`).errors),o.inheritGlobalComparison!==void 0&&o.inheritGlobalComparison!==!1&&e.push(n("invalid_global_date_comparison","inheritGlobalComparison may only be false when present.",`${i}.inheritGlobalComparison`)),o.owner!==void 0&&(p(o.owner)?o.owner.kind==="global_date"?a(o.owner,["kind"],`${i}.owner`,e):o.owner.kind==="field_date"?(a(o.owner,["kind","filterId","label"],`${i}.owner`,e),(typeof o.owner.filterId!="string"||!o.owner.filterId.trim())&&e.push(n("invalid_global_date_comparison","Field Date comparison owner requires a non-empty filterId.",`${i}.owner.filterId`)),(typeof o.owner.label!="string"||!o.owner.label.trim())&&e.push(n("invalid_global_date_comparison","Field Date comparison owner requires a non-empty label.",`${i}.owner.label`))):e.push(n("invalid_global_date_comparison","Comparison owner kind must be global_date or field_date.",`${i}.owner.kind`)):e.push(n("invalid_global_date_comparison","Comparison owner must be an object.",`${i}.owner`))),o.referenceTime!==void 0&&(typeof o.referenceTime!="string"||!w(o.referenceTime))&&e.push(n("invalid_global_date_comparison","referenceTime must be a valid ISO date-time string when present.",`${i}.referenceTime`)),{ok:e.length===0,errors:e,warnings:[]}}function M(o,i="comparisonPolarity"){return o==="higher_is_better"||o==="lower_is_better"||o==="neutral"?{ok:!0,errors:[],warnings:[]}:{ok:!1,errors:[n("invalid_comparison_polarity","Comparison polarity must be higher_is_better, lower_is_better, or neutral.",i)],warnings:[]}}function S(o,i="comparisonPresentation"){if(!p(o))return{ok:!1,errors:[n("invalid_comparison_presentation","Comparison presentation must be an object.",i)],warnings:[]};const e=[],s=["displayMode","showComparison","precision","indicatorStyle","showColor","position","conditionalLabel","labelName","conditionalLabels","colors"];return Object.keys(o).forEach(r=>{s.includes(r)||e.push(n("invalid_comparison_presentation",`Comparison presentation does not accept field "${r}".`,`${i}.${r}`))}),[["displayMode",["difference","percent_change","both","ratio"]],["indicatorStyle",["arrow_badge","arrow","badge","none"]],["position",["left","right","top"]]].forEach(([r,l])=>{o[r]!==void 0&&!l.includes(o[r])&&e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} is invalid.`,`${i}.${r}`))}),["showComparison","showColor","conditionalLabel"].forEach(r=>{o[r]!==void 0&&typeof o[r]!="boolean"&&e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} must be a boolean.`,`${i}.${r}`))}),o.precision!==void 0&&(typeof o.precision!="number"||!Number.isInteger(o.precision)||o.precision<0||o.precision>6)&&e.push(n("invalid_comparison_presentation","Comparison presentation precision must be an integer from 0 through 6.",`${i}.precision`)),o.labelName!==void 0&&typeof o.labelName!="string"&&e.push(n("invalid_comparison_presentation","Comparison presentation labelName must be a string.",`${i}.labelName`)),["conditionalLabels","colors"].forEach(r=>{const l=o[r];if(l!==void 0){if(!p(l)){e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} must be an object.`,`${i}.${r}`));return}Object.keys(l).forEach(c=>{["increase","decrease","neutral"].includes(c)||e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} does not accept field "${c}".`,`${i}.${r}.${c}`))}),Object.entries(l).forEach(([c,m])=>{m!==void 0&&typeof m!="string"&&e.push(n("invalid_comparison_presentation",`Comparison presentation ${r}.${c} must be a string.`,`${i}.${r}.${c}`))})}}),{ok:e.length===0,errors:e,warnings:[]}}function N(o){return o===null?"unknown":o>0?"increase":o<0?"decrease":"no_change"}function T(o,i){return o==="unknown"||o==="no_change"||i==="neutral"?"neutral":i==="higher_is_better"&&o==="increase"||i==="lower_is_better"&&o==="decrease"?"favorable":"unfavorable"}function y(o){const{currentValue:i,comparisonValue:e,polarity:s=b}=o,r=i!==null&&e!==null?i-e:null,l=r!==null&&e!==null&&e!==0?r/Math.abs(e):null,c=i!==null&&e!==null&&e!==0?i/e:null,m=N(r);return{status:e===null?"insufficient_history":"available",currentValue:i,comparisonValue:e,delta:r,percentChange:l,ratio:c,direction:m,sentiment:T(m,s)}}exports.COMPARISON_PRESENTATION_DEFAULTS=C;exports.DEFAULT_METRIC_COMPARISON_POLARITY=b;exports.evaluateMetricComparison=y;exports.resolveMetricComparisonRequest=$;exports.resolveMetricResultAlias=h;exports.validateComparisonPresentationSpec=S;exports.validateGlobalDateComparisonContext=I;exports.validateGlobalDateComparisonSelection=u;exports.validateMetricComparisonConfig=D;exports.validateMetricComparisonPolarity=M;exports.validateMetricComparisonSpec=d;
1
+ "use strict";const g=require("./validators-B2vUAqTf.js"),b="higher_is_better",C={displayMode:"difference",showComparison:!0,indicatorStyle:"arrow_badge",showColor:!0,conditionalLabel:!1};function w(o){return g.parseSemaphorIsoInstant(o)!==null}function $(o){var i,e,s,t;if(((i=o.metricComparison)==null?void 0:i.mode)!=="off"){if(((e=o.metricComparison)==null?void 0:e.mode)==="explicit")return{source:"explicit",spec:o.metricComparison.spec};if(!((o.inheritGlobalComparison??((s=o.globalDateComparison)==null?void 0:s.inheritGlobalComparison))===!1||((t=o.globalDateComparison)==null?void 0:t.selection.mode)!=="period"))return{source:"inherited",spec:o.globalDateComparison.selection.spec,...o.globalDateComparison.owner?{owner:o.globalDateComparison.owner}:{}}}}function h(o){if(o.alias)return o.alias;const i=o.entityName&&o.entityName!=="SEMAPHOR_CALCULATED_FIELD"?o.entityName:void 0,e=i&&i!==o.name?`${i}_`:"";if(o.role!=="metric")return`${e}${o.name}`;let s=o.aggregate||"metric";if(o.expression){const t=o.expression.match(/^(COUNT|SUM|AVG|MIN|MAX|MEDIAN|DISTINCT)\s*\(/i);s=t?t[1].toLowerCase():"expr"}else s=s.toLowerCase();return`${e}${o.name}_${s}`}function n(o,i,e){return e?{code:o,message:i,path:e}:{code:o,message:i}}function p(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function a(o,i,e,s){Object.keys(o).forEach(t=>{i.includes(t)||s.push(n("invalid_comparison_spec",`Comparison kind does not accept field "${t}".`,`${e}.${t}`))})}function f(o,i,e){o.alignment!==void 0&&o.alignment!=="calendar"&&o.alignment!=="weekday"&&e.push(n("invalid_comparison_spec",'Comparison alignment must be "calendar" or "weekday".',`${i}.alignment`)),o.toDate!==void 0&&typeof o.toDate!="boolean"&&e.push(n("invalid_comparison_spec","Comparison toDate must be a boolean.",`${i}.toDate`))}function _(o,i,e){o!==void 0&&(typeof o!="number"||!Number.isSafeInteger(o)||o<=0)&&e.push(n("invalid_comparison_spec","Comparison offset must be a positive safe integer.",i))}function d(o,i="comparison"){const e=[];return p(o)?(o.kind==="previous_period"?(a(o,["kind","offsetPeriods","alignment","toDate"],i,e),_(o.offsetPeriods,`${i}.offsetPeriods`,e),f(o,i,e)):o.kind==="previous_year"?(a(o,["kind","offsetYears","alignment","toDate"],i,e),_(o.offsetYears,`${i}.offsetYears`,e),f(o,i,e)):o.kind==="target"?(a(o,["kind","targetValue"],i,e),(typeof o.targetValue!="number"||!Number.isFinite(o.targetValue))&&e.push(n("invalid_comparison_spec","Target comparison requires a finite targetValue.",`${i}.targetValue`))):e.push(n("invalid_comparison_spec","Comparison kind must be previous_period, previous_year, or target.",`${i}.kind`)),{ok:e.length===0,errors:e,warnings:[]}):{ok:!1,errors:[n("invalid_comparison_spec","Comparison spec must be an object.",i)],warnings:[]}}function D(o,i="comparison"){if(!p(o))return{ok:!1,errors:[n("invalid_comparison_config","Comparison config must be an object.",i)],warnings:[]};const e=[];return o.mode==="off"?a(o,["mode"],i,e):o.mode==="explicit"?(a(o,["mode","spec"],i,e),e.push(...d(o.spec,`${i}.spec`).errors)):e.push(n("invalid_comparison_config","Comparison mode must be off or explicit.",`${i}.mode`)),{ok:e.length===0,errors:e,warnings:[]}}function u(o,i="comparisonSelection"){if(!p(o))return{ok:!1,errors:[n("invalid_global_date_comparison","Global Date comparison selection must be an object.",i)],warnings:[]};const e=[];if(o.mode==="off")a(o,["mode"],i,e);else if(o.mode==="period"){a(o,["mode","spec"],i,e);const s=d(o.spec,`${i}.spec`);e.push(...s.errors),p(o.spec)&&o.spec.kind==="target"&&e.push(n("invalid_global_date_comparison","Global Date comparison supports previous_period or previous_year, not target.",`${i}.spec.kind`))}else e.push(n("invalid_global_date_comparison","Global Date comparison mode must be off or period.",`${i}.mode`));return{ok:e.length===0,errors:e,warnings:[]}}function I(o,i="globalDateComparison"){if(!p(o))return{ok:!1,errors:[n("invalid_global_date_comparison","Global Date comparison context must be an object.",i)],warnings:[]};const e=[];return a(o,["selection","inheritGlobalComparison","owner","referenceTime"],i,e),e.push(...u(o.selection,`${i}.selection`).errors),o.inheritGlobalComparison!==void 0&&o.inheritGlobalComparison!==!1&&e.push(n("invalid_global_date_comparison","inheritGlobalComparison may only be false when present.",`${i}.inheritGlobalComparison`)),o.owner!==void 0&&(p(o.owner)?o.owner.kind==="global_date"?a(o.owner,["kind"],`${i}.owner`,e):o.owner.kind==="field_date"?(a(o.owner,["kind","filterId","label"],`${i}.owner`,e),(typeof o.owner.filterId!="string"||!o.owner.filterId.trim())&&e.push(n("invalid_global_date_comparison","Field Date comparison owner requires a non-empty filterId.",`${i}.owner.filterId`)),(typeof o.owner.label!="string"||!o.owner.label.trim())&&e.push(n("invalid_global_date_comparison","Field Date comparison owner requires a non-empty label.",`${i}.owner.label`))):e.push(n("invalid_global_date_comparison","Comparison owner kind must be global_date or field_date.",`${i}.owner.kind`)):e.push(n("invalid_global_date_comparison","Comparison owner must be an object.",`${i}.owner`))),o.referenceTime!==void 0&&(typeof o.referenceTime!="string"||!w(o.referenceTime))&&e.push(n("invalid_global_date_comparison","referenceTime must be a valid ISO date-time string when present.",`${i}.referenceTime`)),{ok:e.length===0,errors:e,warnings:[]}}function M(o,i="comparisonPolarity"){return o==="higher_is_better"||o==="lower_is_better"||o==="neutral"?{ok:!0,errors:[],warnings:[]}:{ok:!1,errors:[n("invalid_comparison_polarity","Comparison polarity must be higher_is_better, lower_is_better, or neutral.",i)],warnings:[]}}function S(o,i="comparisonPresentation"){if(!p(o))return{ok:!1,errors:[n("invalid_comparison_presentation","Comparison presentation must be an object.",i)],warnings:[]};const e=[],s=["displayMode","showComparison","precision","indicatorStyle","showColor","position","conditionalLabel","labelName","conditionalLabels","colors"];return Object.keys(o).forEach(r=>{s.includes(r)||e.push(n("invalid_comparison_presentation",`Comparison presentation does not accept field "${r}".`,`${i}.${r}`))}),[["displayMode",["difference","percent_change","both","ratio"]],["indicatorStyle",["arrow_badge","arrow","badge","none"]],["position",["left","right","top"]]].forEach(([r,l])=>{o[r]!==void 0&&!l.includes(o[r])&&e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} is invalid.`,`${i}.${r}`))}),["showComparison","showColor","conditionalLabel"].forEach(r=>{o[r]!==void 0&&typeof o[r]!="boolean"&&e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} must be a boolean.`,`${i}.${r}`))}),o.precision!==void 0&&(typeof o.precision!="number"||!Number.isInteger(o.precision)||o.precision<0||o.precision>6)&&e.push(n("invalid_comparison_presentation","Comparison presentation precision must be an integer from 0 through 6.",`${i}.precision`)),o.labelName!==void 0&&typeof o.labelName!="string"&&e.push(n("invalid_comparison_presentation","Comparison presentation labelName must be a string.",`${i}.labelName`)),["conditionalLabels","colors"].forEach(r=>{const l=o[r];if(l!==void 0){if(!p(l)){e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} must be an object.`,`${i}.${r}`));return}Object.keys(l).forEach(c=>{["increase","decrease","neutral"].includes(c)||e.push(n("invalid_comparison_presentation",`Comparison presentation ${r} does not accept field "${c}".`,`${i}.${r}.${c}`))}),Object.entries(l).forEach(([c,m])=>{m!==void 0&&typeof m!="string"&&e.push(n("invalid_comparison_presentation",`Comparison presentation ${r}.${c} must be a string.`,`${i}.${r}.${c}`))})}}),{ok:e.length===0,errors:e,warnings:[]}}function N(o){return o===null?"unknown":o>0?"increase":o<0?"decrease":"no_change"}function T(o,i){return o==="unknown"||o==="no_change"||i==="neutral"?"neutral":i==="higher_is_better"&&o==="increase"||i==="lower_is_better"&&o==="decrease"?"favorable":"unfavorable"}function y(o){const{currentValue:i,comparisonValue:e,polarity:s=b}=o,r=i!==null&&e!==null?i-e:null,l=r!==null&&e!==null&&e!==0?r/Math.abs(e):null,c=i!==null&&e!==null&&e!==0?i/e:null,m=N(r);return{status:e===null?"insufficient_history":"available",currentValue:i,comparisonValue:e,delta:r,percentChange:l,ratio:c,direction:m,sentiment:T(m,s)}}exports.COMPARISON_PRESENTATION_DEFAULTS=C;exports.DEFAULT_METRIC_COMPARISON_POLARITY=b;exports.evaluateMetricComparison=y;exports.resolveMetricComparisonRequest=$;exports.resolveMetricResultAlias=h;exports.validateComparisonPresentationSpec=S;exports.validateGlobalDateComparisonContext=I;exports.validateGlobalDateComparisonSelection=u;exports.validateMetricComparisonConfig=D;exports.validateMetricComparisonPolarity=M;exports.validateMetricComparisonSpec=d;
@@ -0,0 +1,517 @@
1
+ import { canonicalizeSupportedLocale as I, canonicalizeSupportedCurrencyCode as o } from "../value-format-preferences/index.js";
2
+ import { parseReportRuntimeContext as K } from "../report-runtime-context/index.js";
3
+ function F(r) {
4
+ if (!r) return !1;
5
+ const e = r.toLowerCase().replace("_", "-");
6
+ return e === "en-in" || e.startsWith("en-in-");
7
+ }
8
+ function $(r, e) {
9
+ const c = Math.abs(r);
10
+ return c >= 1e12 ? { divisor: 1e12, suffix: "T" } : c >= 1e9 ? { divisor: 1e9, suffix: "B" } : F(e) && c >= 1e7 ? { divisor: 1e7, suffix: "Cr" } : c >= 1e6 ? { divisor: 1e6, suffix: "M" } : F(e) && c >= 1e5 ? { divisor: 1e5, suffix: "L" } : c >= 1e3 ? { divisor: 1e3, suffix: "K" } : { divisor: 1, suffix: "" };
11
+ }
12
+ function v(r, e) {
13
+ try {
14
+ const c = h(e);
15
+ return $(r, c);
16
+ } catch {
17
+ return $(r, "en-US");
18
+ }
19
+ }
20
+ function G(r) {
21
+ try {
22
+ return new Intl.NumberFormat(r), !0;
23
+ } catch {
24
+ return !1;
25
+ }
26
+ }
27
+ function h(r) {
28
+ return r && G(r) ? r : "en-US";
29
+ }
30
+ function D(r, e) {
31
+ if (r == null || isNaN(r))
32
+ return "";
33
+ const c = h(e == null ? void 0 : e.locale);
34
+ let i = r;
35
+ if (e != null && e.multiplyBy && (i *= e.multiplyBy), e != null && e.useSuffix) {
36
+ const { divisor: a, suffix: s } = v(i, c);
37
+ i = i / a;
38
+ const m = new Intl.NumberFormat(c, {
39
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
40
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
41
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0
42
+ }).format(i);
43
+ return `${(e == null ? void 0 : e.prefix) ?? ""}${m}${s}${(e == null ? void 0 : e.suffix) ?? ""}`;
44
+ }
45
+ const t = new Intl.NumberFormat(c, {
46
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
47
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
48
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0
49
+ }).format(i);
50
+ if (e != null && e.negativeInParentheses && i < 0) {
51
+ const a = t.replace("-", "");
52
+ return `(${(e == null ? void 0 : e.prefix) ?? ""}${a}${(e == null ? void 0 : e.suffix) ?? ""})`;
53
+ }
54
+ return `${(e == null ? void 0 : e.prefix) ?? ""}${t}${(e == null ? void 0 : e.suffix) ?? ""}`;
55
+ }
56
+ function k(r, e) {
57
+ if (r == null || isNaN(r))
58
+ return "";
59
+ const c = h(e == null ? void 0 : e.locale), i = (e == null ? void 0 : e.currency) || "USD", t = r < 0, a = !!(e != null && e.negativeInParentheses && t), s = a ? Math.abs(r) : r;
60
+ try {
61
+ if (e != null && e.useSuffix) {
62
+ const { divisor: l, suffix: d } = v(s, c), u = s / l, y = `${new Intl.NumberFormat(c, {
63
+ style: "currency",
64
+ currency: i,
65
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
66
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
67
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0
68
+ }).format(u)}${d}`;
69
+ return a ? `(${y})` : y;
70
+ }
71
+ const m = new Intl.NumberFormat(c, {
72
+ style: "currency",
73
+ currency: i,
74
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
75
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
76
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0
77
+ }).format(s);
78
+ return a ? `(${m})` : m;
79
+ } catch {
80
+ const m = Math.abs(r), l = e != null && e.useSuffix ? v(m, c) : { divisor: 1, suffix: "" }, d = D(
81
+ m / l.divisor,
82
+ {
83
+ locale: c,
84
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
85
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
86
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0
87
+ }
88
+ ), u = `${i} ${d}${l.suffix}`;
89
+ return t ? e != null && e.negativeInParentheses ? `(${u})` : `-${u}` : u;
90
+ }
91
+ }
92
+ function S(r, e) {
93
+ if (r == null || isNaN(r))
94
+ return "";
95
+ const c = h(e == null ? void 0 : e.locale), t = (e == null ? void 0 : e.alreadyPercent) ?? (e == null ? void 0 : e.percentValueMode) === "whole" ? r / 100 : r;
96
+ return new Intl.NumberFormat(c, {
97
+ style: "percent",
98
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
99
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
100
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0
101
+ }).format(t);
102
+ }
103
+ function C(r, e) {
104
+ if (r == null || isNaN(r))
105
+ return "";
106
+ const c = h(e == null ? void 0 : e.locale);
107
+ return new Intl.NumberFormat(c, {
108
+ notation: "scientific",
109
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
110
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2
111
+ }).format(r);
112
+ }
113
+ function P(r, e) {
114
+ if (r == null || Number.isNaN(r))
115
+ return "";
116
+ const c = e.scale === void 0 ? r : r * e.scale, i = e.negativeStyle === "parentheses" && c < 0, t = i ? Math.abs(c) : c, a = {
117
+ style: e.type === "number" ? "decimal" : e.type,
118
+ locale: e.locale,
119
+ currency: e.currency,
120
+ minimumFractionDigits: e.minimumFractionDigits,
121
+ maximumFractionDigits: e.maximumFractionDigits,
122
+ useGrouping: e.useGrouping,
123
+ percentValueMode: e.percentValueMode,
124
+ useSuffix: e.compact
125
+ };
126
+ let s;
127
+ switch (e.type) {
128
+ case "currency":
129
+ s = k(t, a);
130
+ break;
131
+ case "percent":
132
+ s = S(t, a);
133
+ break;
134
+ case "scientific":
135
+ s = C(t, a);
136
+ break;
137
+ default:
138
+ s = D(t, a);
139
+ break;
140
+ }
141
+ const m = `${e.prefix ?? ""}${s}${e.suffix ?? ""}`;
142
+ return i ? `(${m})` : m;
143
+ }
144
+ function L(r, e, c = "en-US") {
145
+ if (r == null || isNaN(r))
146
+ return "";
147
+ const i = h((e == null ? void 0 : e.locale) || c), t = (e == null ? void 0 : e.style) || "decimal", a = t === "decimal" ? "number" : t;
148
+ return a === "currency" && new Intl.NumberFormat(i, {
149
+ style: "currency",
150
+ currency: (e == null ? void 0 : e.currency) || "USD"
151
+ }), P(r, {
152
+ type: a,
153
+ locale: i,
154
+ currency: a === "currency" ? (e == null ? void 0 : e.currency) || "USD" : void 0,
155
+ minimumFractionDigits: (e == null ? void 0 : e.minimumFractionDigits) ?? 0,
156
+ maximumFractionDigits: (e == null ? void 0 : e.maximumFractionDigits) ?? 2,
157
+ useGrouping: (e == null ? void 0 : e.useGrouping) ?? !0,
158
+ percentValueMode: a === "percent" ? (e == null ? void 0 : e.percentValueMode) ?? "whole" : void 0,
159
+ scale: e == null ? void 0 : e.scale,
160
+ compact: e == null ? void 0 : e.compact,
161
+ negativeStyle: e == null ? void 0 : e.negativeStyle,
162
+ prefix: e == null ? void 0 : e.prefix,
163
+ suffix: e == null ? void 0 : e.suffix
164
+ });
165
+ }
166
+ function T(r, e, c) {
167
+ const i = {
168
+ style: e === "currency" ? "currency" : e === "percent" ? "percent" : "decimal",
169
+ locale: c == null ? void 0 : c.locale,
170
+ currency: c == null ? void 0 : c.currency,
171
+ minimumFractionDigits: c == null ? void 0 : c.decimalPlaces,
172
+ maximumFractionDigits: c == null ? void 0 : c.decimalPlaces,
173
+ useSuffix: c == null ? void 0 : c.useSuffix,
174
+ prefix: c == null ? void 0 : c.prefix,
175
+ suffix: c == null ? void 0 : c.suffix,
176
+ negativeInParentheses: c == null ? void 0 : c.negativeInParentheses,
177
+ multiplyBy: c == null ? void 0 : c.multiplyBy
178
+ };
179
+ switch (e) {
180
+ case "currency":
181
+ return k(r, i);
182
+ case "percent":
183
+ return S(r, i);
184
+ case "scientific":
185
+ return C(r, i);
186
+ default:
187
+ return D(r, i);
188
+ }
189
+ }
190
+ const V = [
191
+ "type",
192
+ "locale",
193
+ "minimumFractionDigits",
194
+ "maximumFractionDigits",
195
+ "useGrouping",
196
+ "prefix",
197
+ "suffix",
198
+ "negativeStyle",
199
+ "compact",
200
+ "scale",
201
+ "currency",
202
+ "percentValueMode"
203
+ ];
204
+ function x(r) {
205
+ if (r === null || typeof r != "object" || Array.isArray(r))
206
+ return !1;
207
+ const e = Object.getPrototypeOf(r);
208
+ return e === null || e === Object.prototype;
209
+ }
210
+ function b(r) {
211
+ if (!x(r))
212
+ return {
213
+ ok: !1,
214
+ issues: [{ path: "$", message: "Numeric format must be an object." }]
215
+ };
216
+ const e = [], c = new Set(V);
217
+ Object.keys(r).filter((a) => !c.has(a)).forEach(
218
+ (a) => e.push({ path: a, message: `Unknown property "${a}".` })
219
+ ), r.type !== "number" && r.type !== "currency" && r.type !== "percent" && r.type !== "scientific" && e.push({
220
+ path: "type",
221
+ message: "Expected number, currency, percent, or scientific."
222
+ });
223
+ const i = r.locale === void 0 ? void 0 : I(r.locale);
224
+ r.locale !== void 0 && !i && e.push({ path: "locale", message: "Expected a supported BCP 47 locale." });
225
+ const t = r.currency === void 0 ? void 0 : o(r.currency);
226
+ r.currency !== void 0 && !t && e.push({
227
+ path: "currency",
228
+ message: "Expected a supported ISO 4217 currency code."
229
+ });
230
+ for (const a of ["minimumFractionDigits", "maximumFractionDigits"]) {
231
+ const s = r[a];
232
+ s !== void 0 && (!Number.isInteger(s) || typeof s != "number" || s < 0 || s > 20) && e.push({
233
+ path: a,
234
+ message: "Expected an integer from 0 to 20."
235
+ });
236
+ }
237
+ typeof r.minimumFractionDigits == "number" && typeof r.maximumFractionDigits == "number" && r.minimumFractionDigits > r.maximumFractionDigits && e.push({
238
+ path: "maximumFractionDigits",
239
+ message: "Must be greater than or equal to minimumFractionDigits."
240
+ });
241
+ for (const a of ["useGrouping", "compact"])
242
+ r[a] !== void 0 && typeof r[a] != "boolean" && e.push({ path: a, message: "Expected a boolean." });
243
+ for (const a of ["prefix", "suffix"])
244
+ r[a] !== void 0 && typeof r[a] != "string" && e.push({ path: a, message: "Expected a string." });
245
+ return r.negativeStyle !== void 0 && r.negativeStyle !== "minus" && r.negativeStyle !== "parentheses" && e.push({
246
+ path: "negativeStyle",
247
+ message: "Expected minus or parentheses."
248
+ }), r.percentValueMode !== void 0 && r.percentValueMode !== "fraction" && r.percentValueMode !== "whole" && e.push({
249
+ path: "percentValueMode",
250
+ message: "Expected fraction or whole."
251
+ }), r.scale !== void 0 && (typeof r.scale != "number" || !Number.isFinite(r.scale)) && e.push({ path: "scale", message: "Expected a finite number." }), e.length > 0 ? { ok: !1, issues: e } : {
252
+ ok: !0,
253
+ value: {
254
+ type: r.type,
255
+ ...i ? { locale: i } : {},
256
+ ...r.minimumFractionDigits !== void 0 ? { minimumFractionDigits: r.minimumFractionDigits } : {},
257
+ ...r.maximumFractionDigits !== void 0 ? { maximumFractionDigits: r.maximumFractionDigits } : {},
258
+ ...r.useGrouping !== void 0 ? { useGrouping: r.useGrouping } : {},
259
+ ...r.prefix !== void 0 ? { prefix: r.prefix } : {},
260
+ ...r.suffix !== void 0 ? { suffix: r.suffix } : {},
261
+ ...r.negativeStyle !== void 0 ? {
262
+ negativeStyle: r.negativeStyle
263
+ } : {},
264
+ ...r.compact !== void 0 ? { compact: r.compact } : {},
265
+ ...r.scale !== void 0 ? { scale: r.scale } : {},
266
+ ...t ? { currency: t } : {},
267
+ ...r.percentValueMode !== void 0 ? {
268
+ percentValueMode: r.percentValueMode
269
+ } : {}
270
+ }
271
+ };
272
+ }
273
+ function j(r) {
274
+ const e = b(r);
275
+ if (!e.ok)
276
+ return e;
277
+ const c = [];
278
+ return e.value.locale || c.push({
279
+ path: "locale",
280
+ message: "Resolved numeric formats require an explicit locale."
281
+ }), e.value.minimumFractionDigits === void 0 && c.push({
282
+ path: "minimumFractionDigits",
283
+ message: "Resolved numeric formats require minimumFractionDigits."
284
+ }), e.value.maximumFractionDigits === void 0 && c.push({
285
+ path: "maximumFractionDigits",
286
+ message: "Resolved numeric formats require maximumFractionDigits."
287
+ }), e.value.type === "currency" && !e.value.currency && c.push({
288
+ path: "currency",
289
+ message: "Resolved currency formats require an explicit currency."
290
+ }), c.length > 0 ? { ok: !1, issues: c } : e;
291
+ }
292
+ function O(r) {
293
+ if (!Array.isArray(r))
294
+ throw new Error("resolvedNumericFormats must be an array");
295
+ const e = /* @__PURE__ */ new Set();
296
+ return r.map((c, i) => {
297
+ var w;
298
+ if (!x(c))
299
+ throw new Error(`resolvedNumericFormats.${i} must be an object`);
300
+ const t = /* @__PURE__ */ new Set(["scope", "target", "format"]), a = Object.keys(c).find(
301
+ (f) => !t.has(f)
302
+ );
303
+ if (a)
304
+ throw new Error(
305
+ `resolvedNumericFormats.${i} contains unknown property "${a}"`
306
+ );
307
+ if (!x(c.scope))
308
+ throw new Error(`resolvedNumericFormats.${i}.scope must be an object`);
309
+ const s = /* @__PURE__ */ new Set(["dashboardId", "cardId", "attachmentIndex"]), m = Object.keys(c.scope).find(
310
+ (f) => !s.has(f)
311
+ );
312
+ if (m)
313
+ throw new Error(
314
+ `resolvedNumericFormats.${i}.scope contains unknown property "${m}"`
315
+ );
316
+ const l = typeof c.scope.dashboardId == "string" ? c.scope.dashboardId.trim() : "";
317
+ if (!l)
318
+ throw new Error(
319
+ `resolvedNumericFormats.${i}.scope.dashboardId is required`
320
+ );
321
+ if (c.scope.cardId !== void 0 && (typeof c.scope.cardId != "string" || !c.scope.cardId.trim()))
322
+ throw new Error(
323
+ `resolvedNumericFormats.${i}.scope.cardId must be a non-empty string`
324
+ );
325
+ const d = typeof c.scope.cardId == "string" ? c.scope.cardId.trim() : void 0, u = c.scope.attachmentIndex;
326
+ if (u !== void 0 && (!Number.isInteger(u) || typeof u != "number" || u < 0))
327
+ throw new Error(
328
+ `resolvedNumericFormats.${i}.scope.attachmentIndex must be a non-negative integer`
329
+ );
330
+ if (!x(c.target))
331
+ throw new Error(`resolvedNumericFormats.${i}.target must be an object`);
332
+ let n;
333
+ if (c.target.kind === "metric" && typeof c.target.metricId == "string" && c.target.metricId.trim()) {
334
+ const f = Object.keys(c.target).find(
335
+ (g) => g !== "kind" && g !== "metricId"
336
+ );
337
+ if (f)
338
+ throw new Error(
339
+ `resolvedNumericFormats.${i}.target contains unknown property "${f}"`
340
+ );
341
+ n = { kind: "metric", metricId: c.target.metricId.trim() };
342
+ } else if (c.target.kind === "column" && typeof c.target.columnKey == "string" && c.target.columnKey.trim()) {
343
+ const f = Object.keys(c.target).find(
344
+ (g) => g !== "kind" && g !== "columnKey"
345
+ );
346
+ if (f)
347
+ throw new Error(
348
+ `resolvedNumericFormats.${i}.target contains unknown property "${f}"`
349
+ );
350
+ n = { kind: "column", columnKey: c.target.columnKey.trim() };
351
+ } else if (c.target.kind === "matrix_measure" && typeof c.target.measureId == "string" && c.target.measureId.trim()) {
352
+ const f = Object.keys(c.target).find(
353
+ (g) => g !== "kind" && g !== "measureId"
354
+ );
355
+ if (f)
356
+ throw new Error(
357
+ `resolvedNumericFormats.${i}.target contains unknown property "${f}"`
358
+ );
359
+ n = {
360
+ kind: "matrix_measure",
361
+ measureId: c.target.measureId.trim()
362
+ };
363
+ } else
364
+ throw new Error(
365
+ `resolvedNumericFormats.${i}.target is not a valid structured target`
366
+ );
367
+ const y = j(c.format);
368
+ if (!y.ok)
369
+ throw new Error(
370
+ `resolvedNumericFormats.${i}.format is invalid: ${((w = y.issues[0]) == null ? void 0 : w.message) ?? "invalid value"}`
371
+ );
372
+ const M = n.kind === "metric" ? n.metricId : n.kind === "column" ? n.columnKey : n.measureId, N = JSON.stringify([
373
+ l,
374
+ d ?? null,
375
+ u ?? null,
376
+ n.kind,
377
+ M
378
+ ]);
379
+ if (e.has(N))
380
+ throw new Error(
381
+ `resolvedNumericFormats.${i} duplicates a scoped presentation target`
382
+ );
383
+ return e.add(N), {
384
+ scope: {
385
+ dashboardId: l,
386
+ ...d ? { cardId: d } : {},
387
+ ...typeof u == "number" ? { attachmentIndex: u } : {}
388
+ },
389
+ target: n,
390
+ format: y.value
391
+ };
392
+ });
393
+ }
394
+ function q(r) {
395
+ var i;
396
+ const e = /* @__PURE__ */ new Set();
397
+ if (r.entries.forEach((t, a) => {
398
+ if (t.scope.attachmentIndex !== void 0)
399
+ throw new Error(
400
+ `resolvedNumericFormats.${a}.scope.attachmentIndex is not valid for a card export`
401
+ );
402
+ if (t.scope.dashboardId !== r.expectedScope.dashboardId || t.scope.cardId !== r.expectedScope.cardId)
403
+ throw new Error(
404
+ `resolvedNumericFormats.${a}.scope must match the executing dashboard/card`
405
+ );
406
+ if (t.target.kind !== "column")
407
+ throw new Error(
408
+ `resolvedNumericFormats.${a}.target must identify an export column`
409
+ );
410
+ if (e.has(t.target.columnKey))
411
+ throw new Error(
412
+ `resolvedNumericFormats.${a} duplicates export column "${t.target.columnKey}"`
413
+ );
414
+ e.add(t.target.columnKey);
415
+ }), !r.useFormattedValues)
416
+ return;
417
+ if (!((i = r.visibleColumns) != null && i.length))
418
+ throw new Error(
419
+ "visibleColumns must identify every formatted export column"
420
+ );
421
+ const c = r.visibleColumns.find(
422
+ (t) => !e.has(t)
423
+ );
424
+ if (c)
425
+ throw new Error(
426
+ `resolvedNumericFormats is missing visible export column "${c}"`
427
+ );
428
+ }
429
+ function A(r) {
430
+ if (!x(r))
431
+ throw new Error("numeric presentation execution snapshot must be an object");
432
+ const e = /* @__PURE__ */ new Set(["reportContext", "resolvedNumericFormats"]), c = Object.keys(r).find((t) => !e.has(t));
433
+ if (c)
434
+ throw new Error(
435
+ `numeric presentation execution snapshot contains unknown property "${c}"`
436
+ );
437
+ const i = K(r.reportContext);
438
+ if (!i.ok) {
439
+ const t = i.issues[0];
440
+ throw new Error(
441
+ `numeric presentation execution snapshot reportContext is invalid: ${t != null && t.path && t.path !== "$" ? `${t.path}: ` : ""}${(t == null ? void 0 : t.message) ?? "invalid value"}`
442
+ );
443
+ }
444
+ return {
445
+ reportContext: i.value,
446
+ resolvedNumericFormats: O(
447
+ r.resolvedNumericFormats
448
+ )
449
+ };
450
+ }
451
+ function E(r, e) {
452
+ const c = new Intl.NumberFormat(r, {
453
+ style: "currency",
454
+ currency: e
455
+ }).resolvedOptions();
456
+ return {
457
+ minimumFractionDigits: c.minimumFractionDigits,
458
+ maximumFractionDigits: c.maximumFractionDigits
459
+ };
460
+ }
461
+ function R(r) {
462
+ if (r.minimumFractionDigits !== void 0 || r.maximumFractionDigits !== void 0) {
463
+ const c = r.minimumFractionDigits ?? 0;
464
+ return {
465
+ minimumFractionDigits: c,
466
+ maximumFractionDigits: r.maximumFractionDigits ?? Math.max(c, 2)
467
+ };
468
+ }
469
+ const e = r.type === "percent" ? 1 : r.type === "scientific" ? 2 : 0;
470
+ return {
471
+ minimumFractionDigits: e,
472
+ maximumFractionDigits: e
473
+ };
474
+ }
475
+ function W(r, e, c) {
476
+ const i = I(r.locale) ?? e.locale, t = r.type === "number" || r.type === "currency" ? o(c) : void 0;
477
+ if (!(r.type === "currency" || t !== void 0))
478
+ return {
479
+ ...r,
480
+ locale: i,
481
+ ...R(r)
482
+ };
483
+ const s = t ?? o(r.currency) ?? e.defaultCurrency, m = E(
484
+ i,
485
+ s
486
+ ), l = m.minimumFractionDigits ?? 0, d = m.maximumFractionDigits ?? l, u = r.minimumFractionDigits ?? Math.min(
487
+ l,
488
+ r.maximumFractionDigits ?? l
489
+ ), n = r.maximumFractionDigits ?? Math.max(
490
+ u,
491
+ d
492
+ );
493
+ return {
494
+ ...r,
495
+ type: "currency",
496
+ locale: i,
497
+ currency: s,
498
+ minimumFractionDigits: u,
499
+ maximumFractionDigits: n
500
+ };
501
+ }
502
+ export {
503
+ k as a,
504
+ D as b,
505
+ T as c,
506
+ P as d,
507
+ S as e,
508
+ L as f,
509
+ C as g,
510
+ A as h,
511
+ O as i,
512
+ j,
513
+ W as k,
514
+ b as p,
515
+ E as r,
516
+ q as v
517
+ };
@@ -0,0 +1 @@
1
+ "use strict";const h=require("../value-format-preferences/index.cjs"),b=require("../report-runtime-context/index.cjs");function S(r){if(!r)return!1;const e=r.toLowerCase().replace("_","-");return e==="en-in"||e.startsWith("en-in-")}function k(r,e){const c=Math.abs(r);return c>=1e12?{divisor:1e12,suffix:"T"}:c>=1e9?{divisor:1e9,suffix:"B"}:S(e)&&c>=1e7?{divisor:1e7,suffix:"Cr"}:c>=1e6?{divisor:1e6,suffix:"M"}:S(e)&&c>=1e5?{divisor:1e5,suffix:"L"}:c>=1e3?{divisor:1e3,suffix:"K"}:{divisor:1,suffix:""}}function D(r,e){try{const c=y(e);return k(r,c)}catch{return k(r,"en-US")}}function E(r){try{return new Intl.NumberFormat(r),!0}catch{return!1}}function y(r){return r&&E(r)?r:"en-US"}function v(r,e){if(r==null||isNaN(r))return"";const c=y(e==null?void 0:e.locale);let i=r;if(e!=null&&e.multiplyBy&&(i*=e.multiplyBy),e!=null&&e.useSuffix){const{divisor:a,suffix:u}=D(i,c);i=i/a;const s=new Intl.NumberFormat(c,{minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0}).format(i);return`${(e==null?void 0:e.prefix)??""}${s}${u}${(e==null?void 0:e.suffix)??""}`}const t=new Intl.NumberFormat(c,{minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0}).format(i);if(e!=null&&e.negativeInParentheses&&i<0){const a=t.replace("-","");return`(${(e==null?void 0:e.prefix)??""}${a}${(e==null?void 0:e.suffix)??""})`}return`${(e==null?void 0:e.prefix)??""}${t}${(e==null?void 0:e.suffix)??""}`}function N(r,e){if(r==null||isNaN(r))return"";const c=y(e==null?void 0:e.locale),i=(e==null?void 0:e.currency)||"USD",t=r<0,a=!!(e!=null&&e.negativeInParentheses&&t),u=a?Math.abs(r):r;try{if(e!=null&&e.useSuffix){const{divisor:l,suffix:d}=D(u,c),m=u/l,o=`${new Intl.NumberFormat(c,{style:"currency",currency:i,minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0}).format(m)}${d}`;return a?`(${o})`:o}const s=new Intl.NumberFormat(c,{style:"currency",currency:i,minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0}).format(u);return a?`(${s})`:s}catch{const s=Math.abs(r),l=e!=null&&e.useSuffix?D(s,c):{divisor:1,suffix:""},d=v(s/l.divisor,{locale:c,minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0}),m=`${i} ${d}${l.suffix}`;return t?e!=null&&e.negativeInParentheses?`(${m})`:`-${m}`:m}}function F(r,e){if(r==null||isNaN(r))return"";const c=y(e==null?void 0:e.locale),t=(e==null?void 0:e.alreadyPercent)??(e==null?void 0:e.percentValueMode)==="whole"?r/100:r;return new Intl.NumberFormat(c,{style:"percent",minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0}).format(t)}function w(r,e){if(r==null||isNaN(r))return"";const c=y(e==null?void 0:e.locale);return new Intl.NumberFormat(c,{notation:"scientific",minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2}).format(r)}function C(r,e){if(r==null||Number.isNaN(r))return"";const c=e.scale===void 0?r:r*e.scale,i=e.negativeStyle==="parentheses"&&c<0,t=i?Math.abs(c):c,a={style:e.type==="number"?"decimal":e.type,locale:e.locale,currency:e.currency,minimumFractionDigits:e.minimumFractionDigits,maximumFractionDigits:e.maximumFractionDigits,useGrouping:e.useGrouping,percentValueMode:e.percentValueMode,useSuffix:e.compact};let u;switch(e.type){case"currency":u=N(t,a);break;case"percent":u=F(t,a);break;case"scientific":u=w(t,a);break;default:u=v(t,a);break}const s=`${e.prefix??""}${u}${e.suffix??""}`;return i?`(${s})`:s}function j(r,e,c="en-US"){if(r==null||isNaN(r))return"";const i=y((e==null?void 0:e.locale)||c),t=(e==null?void 0:e.style)||"decimal",a=t==="decimal"?"number":t;return a==="currency"&&new Intl.NumberFormat(i,{style:"currency",currency:(e==null?void 0:e.currency)||"USD"}),C(r,{type:a,locale:i,currency:a==="currency"?(e==null?void 0:e.currency)||"USD":void 0,minimumFractionDigits:(e==null?void 0:e.minimumFractionDigits)??0,maximumFractionDigits:(e==null?void 0:e.maximumFractionDigits)??2,useGrouping:(e==null?void 0:e.useGrouping)??!0,percentValueMode:a==="percent"?(e==null?void 0:e.percentValueMode)??"whole":void 0,scale:e==null?void 0:e.scale,compact:e==null?void 0:e.compact,negativeStyle:e==null?void 0:e.negativeStyle,prefix:e==null?void 0:e.prefix,suffix:e==null?void 0:e.suffix})}function O(r,e,c){const i={style:e==="currency"?"currency":e==="percent"?"percent":"decimal",locale:c==null?void 0:c.locale,currency:c==null?void 0:c.currency,minimumFractionDigits:c==null?void 0:c.decimalPlaces,maximumFractionDigits:c==null?void 0:c.decimalPlaces,useSuffix:c==null?void 0:c.useSuffix,prefix:c==null?void 0:c.prefix,suffix:c==null?void 0:c.suffix,negativeInParentheses:c==null?void 0:c.negativeInParentheses,multiplyBy:c==null?void 0:c.multiplyBy};switch(e){case"currency":return N(r,i);case"percent":return F(r,i);case"scientific":return w(r,i);default:return v(r,i)}}const R=["type","locale","minimumFractionDigits","maximumFractionDigits","useGrouping","prefix","suffix","negativeStyle","compact","scale","currency","percentValueMode"];function x(r){if(r===null||typeof r!="object"||Array.isArray(r))return!1;const e=Object.getPrototypeOf(r);return e===null||e===Object.prototype}function M(r){if(!x(r))return{ok:!1,issues:[{path:"$",message:"Numeric format must be an object."}]};const e=[],c=new Set(R);Object.keys(r).filter(a=>!c.has(a)).forEach(a=>e.push({path:a,message:`Unknown property "${a}".`})),r.type!=="number"&&r.type!=="currency"&&r.type!=="percent"&&r.type!=="scientific"&&e.push({path:"type",message:"Expected number, currency, percent, or scientific."});const i=r.locale===void 0?void 0:h.canonicalizeSupportedLocale(r.locale);r.locale!==void 0&&!i&&e.push({path:"locale",message:"Expected a supported BCP 47 locale."});const t=r.currency===void 0?void 0:h.canonicalizeSupportedCurrencyCode(r.currency);r.currency!==void 0&&!t&&e.push({path:"currency",message:"Expected a supported ISO 4217 currency code."});for(const a of["minimumFractionDigits","maximumFractionDigits"]){const u=r[a];u!==void 0&&(!Number.isInteger(u)||typeof u!="number"||u<0||u>20)&&e.push({path:a,message:"Expected an integer from 0 to 20."})}typeof r.minimumFractionDigits=="number"&&typeof r.maximumFractionDigits=="number"&&r.minimumFractionDigits>r.maximumFractionDigits&&e.push({path:"maximumFractionDigits",message:"Must be greater than or equal to minimumFractionDigits."});for(const a of["useGrouping","compact"])r[a]!==void 0&&typeof r[a]!="boolean"&&e.push({path:a,message:"Expected a boolean."});for(const a of["prefix","suffix"])r[a]!==void 0&&typeof r[a]!="string"&&e.push({path:a,message:"Expected a string."});return r.negativeStyle!==void 0&&r.negativeStyle!=="minus"&&r.negativeStyle!=="parentheses"&&e.push({path:"negativeStyle",message:"Expected minus or parentheses."}),r.percentValueMode!==void 0&&r.percentValueMode!=="fraction"&&r.percentValueMode!=="whole"&&e.push({path:"percentValueMode",message:"Expected fraction or whole."}),r.scale!==void 0&&(typeof r.scale!="number"||!Number.isFinite(r.scale))&&e.push({path:"scale",message:"Expected a finite number."}),e.length>0?{ok:!1,issues:e}:{ok:!0,value:{type:r.type,...i?{locale:i}:{},...r.minimumFractionDigits!==void 0?{minimumFractionDigits:r.minimumFractionDigits}:{},...r.maximumFractionDigits!==void 0?{maximumFractionDigits:r.maximumFractionDigits}:{},...r.useGrouping!==void 0?{useGrouping:r.useGrouping}:{},...r.prefix!==void 0?{prefix:r.prefix}:{},...r.suffix!==void 0?{suffix:r.suffix}:{},...r.negativeStyle!==void 0?{negativeStyle:r.negativeStyle}:{},...r.compact!==void 0?{compact:r.compact}:{},...r.scale!==void 0?{scale:r.scale}:{},...t?{currency:t}:{},...r.percentValueMode!==void 0?{percentValueMode:r.percentValueMode}:{}}}}function P(r){const e=M(r);if(!e.ok)return e;const c=[];return e.value.locale||c.push({path:"locale",message:"Resolved numeric formats require an explicit locale."}),e.value.minimumFractionDigits===void 0&&c.push({path:"minimumFractionDigits",message:"Resolved numeric formats require minimumFractionDigits."}),e.value.maximumFractionDigits===void 0&&c.push({path:"maximumFractionDigits",message:"Resolved numeric formats require maximumFractionDigits."}),e.value.type==="currency"&&!e.value.currency&&c.push({path:"currency",message:"Resolved currency formats require an explicit currency."}),c.length>0?{ok:!1,issues:c}:e}function K(r){if(!Array.isArray(r))throw new Error("resolvedNumericFormats must be an array");const e=new Set;return r.map((c,i)=>{var I;if(!x(c))throw new Error(`resolvedNumericFormats.${i} must be an object`);const t=new Set(["scope","target","format"]),a=Object.keys(c).find(f=>!t.has(f));if(a)throw new Error(`resolvedNumericFormats.${i} contains unknown property "${a}"`);if(!x(c.scope))throw new Error(`resolvedNumericFormats.${i}.scope must be an object`);const u=new Set(["dashboardId","cardId","attachmentIndex"]),s=Object.keys(c.scope).find(f=>!u.has(f));if(s)throw new Error(`resolvedNumericFormats.${i}.scope contains unknown property "${s}"`);const l=typeof c.scope.dashboardId=="string"?c.scope.dashboardId.trim():"";if(!l)throw new Error(`resolvedNumericFormats.${i}.scope.dashboardId is required`);if(c.scope.cardId!==void 0&&(typeof c.scope.cardId!="string"||!c.scope.cardId.trim()))throw new Error(`resolvedNumericFormats.${i}.scope.cardId must be a non-empty string`);const d=typeof c.scope.cardId=="string"?c.scope.cardId.trim():void 0,m=c.scope.attachmentIndex;if(m!==void 0&&(!Number.isInteger(m)||typeof m!="number"||m<0))throw new Error(`resolvedNumericFormats.${i}.scope.attachmentIndex must be a non-negative integer`);if(!x(c.target))throw new Error(`resolvedNumericFormats.${i}.target must be an object`);let n;if(c.target.kind==="metric"&&typeof c.target.metricId=="string"&&c.target.metricId.trim()){const f=Object.keys(c.target).find(g=>g!=="kind"&&g!=="metricId");if(f)throw new Error(`resolvedNumericFormats.${i}.target contains unknown property "${f}"`);n={kind:"metric",metricId:c.target.metricId.trim()}}else if(c.target.kind==="column"&&typeof c.target.columnKey=="string"&&c.target.columnKey.trim()){const f=Object.keys(c.target).find(g=>g!=="kind"&&g!=="columnKey");if(f)throw new Error(`resolvedNumericFormats.${i}.target contains unknown property "${f}"`);n={kind:"column",columnKey:c.target.columnKey.trim()}}else if(c.target.kind==="matrix_measure"&&typeof c.target.measureId=="string"&&c.target.measureId.trim()){const f=Object.keys(c.target).find(g=>g!=="kind"&&g!=="measureId");if(f)throw new Error(`resolvedNumericFormats.${i}.target contains unknown property "${f}"`);n={kind:"matrix_measure",measureId:c.target.measureId.trim()}}else throw new Error(`resolvedNumericFormats.${i}.target is not a valid structured target`);const o=P(c.format);if(!o.ok)throw new Error(`resolvedNumericFormats.${i}.format is invalid: ${((I=o.issues[0])==null?void 0:I.message)??"invalid value"}`);const V=n.kind==="metric"?n.metricId:n.kind==="column"?n.columnKey:n.measureId,$=JSON.stringify([l,d??null,m??null,n.kind,V]);if(e.has($))throw new Error(`resolvedNumericFormats.${i} duplicates a scoped presentation target`);return e.add($),{scope:{dashboardId:l,...d?{cardId:d}:{},...typeof m=="number"?{attachmentIndex:m}:{}},target:n,format:o.value}})}function B(r){var i;const e=new Set;if(r.entries.forEach((t,a)=>{if(t.scope.attachmentIndex!==void 0)throw new Error(`resolvedNumericFormats.${a}.scope.attachmentIndex is not valid for a card export`);if(t.scope.dashboardId!==r.expectedScope.dashboardId||t.scope.cardId!==r.expectedScope.cardId)throw new Error(`resolvedNumericFormats.${a}.scope must match the executing dashboard/card`);if(t.target.kind!=="column")throw new Error(`resolvedNumericFormats.${a}.target must identify an export column`);if(e.has(t.target.columnKey))throw new Error(`resolvedNumericFormats.${a} duplicates export column "${t.target.columnKey}"`);e.add(t.target.columnKey)}),!r.useFormattedValues)return;if(!((i=r.visibleColumns)!=null&&i.length))throw new Error("visibleColumns must identify every formatted export column");const c=r.visibleColumns.find(t=>!e.has(t));if(c)throw new Error(`resolvedNumericFormats is missing visible export column "${c}"`)}function q(r){if(!x(r))throw new Error("numeric presentation execution snapshot must be an object");const e=new Set(["reportContext","resolvedNumericFormats"]),c=Object.keys(r).find(t=>!e.has(t));if(c)throw new Error(`numeric presentation execution snapshot contains unknown property "${c}"`);const i=b.parseReportRuntimeContext(r.reportContext);if(!i.ok){const t=i.issues[0];throw new Error(`numeric presentation execution snapshot reportContext is invalid: ${t!=null&&t.path&&t.path!=="$"?`${t.path}: `:""}${(t==null?void 0:t.message)??"invalid value"}`)}return{reportContext:i.value,resolvedNumericFormats:K(r.resolvedNumericFormats)}}function G(r,e){const c=new Intl.NumberFormat(r,{style:"currency",currency:e}).resolvedOptions();return{minimumFractionDigits:c.minimumFractionDigits,maximumFractionDigits:c.maximumFractionDigits}}function L(r){if(r.minimumFractionDigits!==void 0||r.maximumFractionDigits!==void 0){const c=r.minimumFractionDigits??0;return{minimumFractionDigits:c,maximumFractionDigits:r.maximumFractionDigits??Math.max(c,2)}}const e=r.type==="percent"?1:r.type==="scientific"?2:0;return{minimumFractionDigits:e,maximumFractionDigits:e}}function U(r,e,c){const i=h.canonicalizeSupportedLocale(r.locale)??e.locale,t=r.type==="number"||r.type==="currency"?h.canonicalizeSupportedCurrencyCode(c):void 0;if(!(r.type==="currency"||t!==void 0))return{...r,locale:i,...L(r)};const u=t??h.canonicalizeSupportedCurrencyCode(r.currency)??e.defaultCurrency,s=G(i,u),l=s.minimumFractionDigits??0,d=s.maximumFractionDigits??l,m=r.minimumFractionDigits??Math.min(l,r.maximumFractionDigits??l),n=r.maximumFractionDigits??Math.max(m,d);return{...r,type:"currency",locale:i,currency:u,minimumFractionDigits:m,maximumFractionDigits:n}}exports.formatCurrency=N;exports.formatNumber=v;exports.formatNumberCustom=O;exports.formatNumberWithColumnSettings=j;exports.formatNumericCanonical=C;exports.formatPercent=F;exports.formatScientific=w;exports.parseNumericCanonicalFormat=M;exports.parseNumericPresentationExecutionSnapshot=q;exports.parseNumericPresentationSnapshotEntries=K;exports.parseResolvedNumericCanonicalFormat=P;exports.resolveCurrencyFractionDigits=G;exports.resolveNumericPresentation=U;exports.validateCardExportNumericPresentationSnapshot=B;