react-semaphor 0.1.341 → 0.1.342
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics-protocol/index.cjs +1 -1
- package/dist/analytics-protocol/index.js +1 -1
- package/dist/chunks/{validators-YtnkRA1G.js → validators-BqEnmlC6.js} +209 -151
- package/dist/chunks/validators-v8WAqhaN.js +1 -0
- package/dist/dashboard-authoring/index.cjs +1 -1
- package/dist/dashboard-authoring/index.js +1 -1
- package/dist/data-app-sdk/index.cjs +1 -1
- package/dist/data-app-sdk/index.js +41 -37
- package/dist/types/analytics-protocol.d.ts +6 -1
- package/dist/types/dashboard-authoring.d.ts +6 -1
- package/dist/types/data-app-builder.d.ts +6 -1
- package/dist/types/data-app-sdk.d.ts +13 -5
- package/dist/types/main.d.ts +6 -1
- package/package.json +1 -1
- package/dist/chunks/validators-Caj7EMd1.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function _(e){return e?e.kind==="semantic"?[e.kind,e.domainId,e.datasetId||"",e.datasetName].join(":"):e.kind==="physical"?[e.kind,e.connectionId,e.databaseName||"",e.schemaName||"",e.tableName].join(":"):[e.kind,e.connectionId,e.dialect||"",e.label||""].join(":"):""}function b(e,i){return!e||!i?e===i:e.kind!==i.kind?!1:e.kind==="semantic"&&i.kind==="semantic"?e.domainId!==i.domainId?!1:e.datasetId&&i.datasetId?e.datasetId===i.datasetId:e.datasetName===i.datasetName:_(e)===_(i)}function A(e,i){return e.kind!=="semantic"||i.kind!=="semantic"?e:{...e,datasetId:e.datasetId||i.datasetId,label:e.label||i.label,connectionId:e.connectionId||i.connectionId}}function I(e,i){return e.name===i.name&&b(e.source,i.source)}function B(e,i){return{...e,label:e.label||i.label,role:e.role||i.role,dataType:e.dataType||i.dataType,source:e.source&&i.source?A(e.source,i.source):e.source||i.source}}function a(e,i,s){return s?{code:e,message:i,path:s}:{code:e,message:i}}function R(e){for(let i=0;i<e.length;i+=1){const s=e[i];if(e.some((r,o)=>o!==i&&y(r,s)))return!1}return!0}function y(e,i){return I(e,i)}function F(e,i){const s=i.filter(r=>r.name===e.name);return e.source?s.some(r=>y(r,e)&&v(e,r)):s.length===1&&v(e,s[0])}function v(e,i){return i?e.aggregate?i.aggregate===e.aggregate:!0:!1}function j(e,i){const s=i.filter(r=>T(e,r));return e.source?s.some(r=>y(r,e)):s.length===1}function T(e,i){return!(i.name!==e.name||e.role!==void 0&&i.role!==void 0&&i.role!==e.role||e.aggregate!==void 0&&i.aggregate!==e.aggregate)}function d(e){return typeof e=="string"&&e.trim().length>0}function c(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function g(e){const i=new Set;for(const s of e){if(i.has(s))return s;i.add(s)}return null}const D=new Set(["SUM","COUNT","AVG","MIN","MAX","MEDIAN","DISTINCT"]);function S(e,i,s){if(!e||typeof e!="object"){s.push(a("missing_source","Analytics intent needs a source.",i));return}if(e.kind==="semantic"){d(e.domainId)||s.push(a("missing_semantic_domain","Semantic source needs a domainId.",`${i}.domainId`)),d(e.datasetName)||s.push(a("missing_dataset_name","Semantic source needs a datasetName.",`${i}.datasetName`));return}if(e.kind==="physical"){d(e.connectionId)||s.push(a("missing_connection_id","Physical source needs a connectionId.",`${i}.connectionId`)),d(e.tableName)||s.push(a("missing_table_name","Physical source needs a tableName.",`${i}.tableName`));return}if(e.kind==="sql"){d(e.connectionId)||s.push(a("missing_connection_id","SQL source needs a connectionId.",`${i}.connectionId`));return}s.push(a("invalid_source_kind","Source kind is not supported.",i))}function f(e,i,s,r={}){if(!e||!c(e)){r.required&&s.push(a("missing_field_ref","Field reference needs a name.",i));return}d(e.name)||s.push(a("missing_field_ref","Field reference needs a name.",`${i}.name`)),e.source!==void 0&&S(e.source,`${i}.source`,s),x(e.aggregate,`${i}.aggregate`,s)}function x(e,i,s){e!==void 0&&(typeof e!="string"||!D.has(e))&&s.push(a("invalid_aggregate","Field aggregate must be SUM, COUNT, AVG, MIN, MAX, MEDIAN, or DISTINCT.",i))}function q(e,i){if(e.analysis===void 0)return;if(!c(e.analysis)){i.push(a("invalid_metric_analysis","Metric analysis must be a structured object.","analysis"));return}if(e.analysis.kind!=="period_change"){i.push(a("invalid_metric_analysis","Metric analysis kind is not supported.","analysis.kind"));return}e.dateField||i.push(a("missing_analysis_date_field","Period-change analysis needs a dateField.","dateField")),e.timeGrain||i.push(a("missing_analysis_time_grain","Period-change analysis needs a timeGrain.","timeGrain")),e.analysis.orderBy!==void 0&&e.analysis.orderBy!=="absolute_change"&&e.analysis.orderBy!=="positive_change"&&e.analysis.orderBy!=="negative_change"&&e.analysis.orderBy!=="period"&&i.push(a("invalid_metric_analysis","Period-change analysis orderBy must be absolute_change, positive_change, negative_change, or period.","analysis.orderBy"));const{timeWindow:s}=e.analysis;s!==void 0&&k(s,"analysis.timeWindow",i)}function k(e,i,s){if(!c(e)){s.push(a("invalid_time_window","Time window must be a structured object.",i));return}e.unit!=="second"&&e.unit!=="minute"&&e.unit!=="hour"&&e.unit!=="day"&&e.unit!=="week"&&e.unit!=="month"&&e.unit!=="quarter"&&e.unit!=="year"&&s.push(a("invalid_time_window","Time window unit must be second, minute, hour, day, week, month, quarter, or year.",`${i}.unit`)),(typeof e.value!="number"||!Number.isFinite(e.value)||e.value<=0)&&s.push(a("invalid_time_window","Time window value must be a positive number.",`${i}.value`)),e.anchor!==void 0&&e.anchor!=="now"&&e.anchor!=="latest_available"&&s.push(a("invalid_time_window","Time window anchor must be now or latest_available.",`${i}.anchor`)),e.completeness!==void 0&&e.completeness!=="include_partial"&&e.completeness!=="complete_periods"&&s.push(a("invalid_time_window","Time window completeness must be include_partial or complete_periods.",`${i}.completeness`))}function E(e,i,s){if(e!==void 0){if(!Array.isArray(e)){s.push(a("invalid_analytics_filters","Analytics filters must be an array.",i));return}e.forEach((r,o)=>{const n=`${i}.${o}`;if(!c(r)){s.push(a("invalid_analytics_filter","Analytics filter must be a structured object.",n));return}const t=r;f(t.field,`${n}.field`,s,{required:!0});const p=t.operator==="is_null"||t.operator==="is_not_null";if(t.operator!==void 0&&t.operator!=="="&&t.operator!=="!="&&t.operator!=="in"&&t.operator!=="not_in"&&t.operator!=="contains"&&t.operator!=="not_contains"&&t.operator!=="between"&&t.operator!=="not_between"&&t.operator!==">"&&t.operator!==">="&&t.operator!=="<"&&t.operator!=="<="&&t.operator!=="is_null"&&t.operator!=="is_not_null"&&s.push(a("invalid_analytics_filter_operator","Analytics filter operator is not supported.",`${n}.operator`)),t.values===void 0&&!p&&s.push(a("missing_analytics_filter_value","Analytics filter needs values unless it is a null check.",n)),p&&t.values!==void 0){s.push(a("invalid_analytics_filter_values","Null-check analytics filters must not include values.",`${n}.values`));return}t.values!==void 0&&!Array.isArray(t.values)&&s.push(a("invalid_analytics_filter_values","Analytics filter values must be an array when provided.",`${n}.values`))})}}function h(e){var r;const i=[],s=[];if(!e||typeof e!="object")return{ok:!1,errors:[a("invalid_analytics_intent","Analytics intent must be a structured object.")],warnings:s,repairHints:[{code:"invalid_analytics_intent",recommendedNextStep:"Send one structured analytics intent object with kind, source, and required fields."}]};if(e.version!==void 0&&e.version!==1&&i.push(a("invalid_version","Analytics intent version must be 1.","version")),S(e.source,"source",i),e.kind==="metric"){const o=Array.isArray(e.metrics)?e.metrics.filter(n=>c(n)&&d(n.name)):[];if(!Array.isArray(e.metrics)||e.metrics.length===0?i.push(a("missing_metric","Metric intent needs at least one metric.","metrics")):e.metrics.some(n=>!c(n)||!d(n.name))&&i.push(a("invalid_metric_list","Metric intent metrics must be an array of field references with names.","metrics")),o.forEach((n,t)=>{f(n,`metrics.${t}`,i,{required:!0})}),o.length>0&&!R(o)){const n=o.find((t,p)=>o.some((u,l)=>l!==p&&y(u,t)));n&&i.push(a("duplicate_metric",`Metric intent has duplicate metric "${n.name}".`,"metrics"))}if(c(e.primaryMetric)&&d(e.primaryMetric.name)&&e.primaryMetric.source===void 0&&o.filter(n=>{var t;return n.name===((t=e.primaryMetric)==null?void 0:t.name)}).length>1&&i.push(a("ambiguous_primary_metric","Metric intent primaryMetric needs a source when it names a duplicated metric.","primaryMetric")),e.primaryMetric!==void 0&&(f(e.primaryMetric,"primaryMetric",i,{required:!0}),c(e.primaryMetric)&&d(e.primaryMetric.name)&&o.length>0&&!F(e.primaryMetric,o)&&i.push(a("invalid_primary_metric","Metric intent primaryMetric must match one metric field reference.","primaryMetric"))),e.dimensions!==void 0&&!Array.isArray(e.dimensions)?i.push(a("invalid_metric_dimensions","Metric intent dimensions must be an array of field references.","dimensions")):Array.isArray(e.dimensions)&&e.dimensions.some(n=>!c(n)||!d(n.name))&&i.push(a("invalid_metric_dimensions","Metric intent dimensions must be an array of field references with names.","dimensions")),e.dateField!==void 0&&f(e.dateField,"dateField",i),e.timeWindow!==void 0&&(k(e.timeWindow,"timeWindow",i),e.dateField||i.push(a("missing_time_window_date_field","Metric timeWindow needs a dateField.","dateField"))),E(e.filters,"filters",i),Array.isArray(e.dimensions)&&e.dimensions.forEach((n,t)=>{f(n,`dimensions.${t}`,i)}),e.orderBy!==void 0){if(!c(e.orderBy))i.push(a("invalid_metric_order_by","Metric intent orderBy must be a structured object.","orderBy"));else if(f(e.orderBy.field,"orderBy.field",i,{required:!0}),e.orderBy.direction!=="asc"&&e.orderBy.direction!=="desc"&&i.push(a("invalid_metric_order_direction","Metric intent orderBy direction must be asc or desc.","orderBy.direction")),c(e.orderBy.field)&&d(e.orderBy.field.name)){const n=[...o,...e.timeGrain&&e.dateField&&c(e.dateField)?[e.dateField]:[],...Array.isArray(e.dimensions)?e.dimensions.filter(t=>c(t)&&d(t.name)):[]];n.length>0&&!j(e.orderBy.field,n)&&i.push(a("invalid_metric_order_by","Metric intent orderBy.field must match one selected metric, grouped dateField, or dimension.","orderBy.field"))}}q(e,i)}else e.kind==="records"?(!Array.isArray(e.fields)||e.fields.length===0?i.push(a("missing_record_fields","Records intent needs at least one field.","fields")):e.fields.some(o=>!c(o)||!d(o.name))&&i.push(a("invalid_record_fields","Records intent fields must be field references with names.","fields")),Array.isArray(e.fields)&&e.fields.forEach((o,n)=>{f(o,`fields.${n}`,i)}),e.dateField!==void 0&&f(e.dateField,"dateField",i),e.orderBy!==void 0&&(c(e.orderBy)?(f(e.orderBy.field,"orderBy.field",i,{required:!0}),e.orderBy.direction!=="asc"&&e.orderBy.direction!=="desc"&&i.push(a("invalid_record_order_direction","Records intent orderBy direction must be asc or desc.","orderBy.direction"))):i.push(a("invalid_record_order_by","Records intent orderBy must be a structured object.","orderBy")))):e.kind==="inputOptions"?((!e.field||!d(e.field.name))&&i.push(a("missing_input_options_field","Input options intent needs a field.","field")),f(e.field,"field",i,{required:!0})):e.kind==="sql"?(((r=e.source)==null?void 0:r.kind)!=="sql"&&i.push(a("invalid_sql_source","SQL analytics intent must use a SQL execution source.","source")),d(e.sql)||i.push(a("missing_sql","SQL analytics intent needs SQL text.","sql")),Array.isArray(e.fields)&&e.fields.forEach((o,n)=>{f(o,`fields.${n}`,i)})):i.push(a("invalid_analytics_kind","Analytics kind is not supported.","kind"));return{ok:i.length===0,errors:i,warnings:s,repairHints:C(i)}}function w(e){const i=[],s=[];if(!e||typeof e!="object")return{ok:!1,errors:[a("invalid_operation_intent","Operation intent must be a structured object.")],warnings:s,repairHints:[{code:"invalid_operation_intent",recommendedNextStep:"Send one typed operation intent with version, kind, and required operation fields."}]};if(e.version!==1&&i.push(a("invalid_version","Operation intent version must be 1.","version")),e.kind==="answer_obligations")!Array.isArray(e.obligations)||e.obligations.length===0?i.push(a("missing_obligations","Answer-obligations operation intent needs at least one obligation.","obligations")):e.obligations.forEach((r,o)=>{d(r.id)||i.push(a("missing_obligation_id","Each analytics obligation needs an id.",`obligations.${o}.id`)),d(r.prompt)||i.push(a("missing_obligation_prompt","Each analytics obligation needs a prompt.",`obligations.${o}.prompt`))});else if(e.kind==="dashboard_change"||e.kind==="data_app_change"){if(d(e.instruction)||i.push(a("missing_instruction","Change operation intent needs an instruction.","instruction")),e.analyticsIntent){const r=h(e.analyticsIntent);i.push(...r.errors),s.push(...r.warnings)}}else i.push(a("invalid_operation_kind","Operation intent kind is not supported.","kind"));return{ok:i.length===0,errors:i,warnings:s,repairHints:M(i)}}function P(e){const i=[],s=[];if(!e||typeof e!="object")return{ok:!1,errors:[a("invalid_recovery_plan","Analytics recovery plan must be a structured object.")],warnings:s,repairHints:[{code:"invalid_recovery_plan",recommendedNextStep:"Return a typed recovery plan with operationIntent and plannedToolCalls."}]};e.version!==1&&i.push(a("invalid_version","Recovery plan version must be 1.","version")),e.kind!=="analytics_recovery_plan"&&i.push(a("invalid_recovery_plan_kind","Recovery plan kind must be analytics_recovery_plan.","kind"));const r=w(e.operationIntent);return i.push(...r.errors),s.push(...r.warnings),Array.isArray(e.plannedToolCalls)||i.push(a("invalid_planned_tool_calls","Recovery plan plannedToolCalls must be an array.","plannedToolCalls")),{ok:i.length===0,errors:i,warnings:s,repairHints:M(i)}}function M(e){return e.map(i=>({code:i.code,recommendedNextStep:i.code==="missing_obligations"?"Normalize the user request into one or more typed analytics obligations before recovery planning.":"Correct the operation/recovery contract shape before planning execution."}))}function C(e){return e.map(i=>{switch(i.code){case"missing_source":return{code:i.code,fieldRole:"source",recommendedNextStep:"Provide a semantic, physical, or SQL source before executing analytics."};case"missing_metric":return{code:i.code,fieldRole:"metric",recommendedNextStep:"Choose one exact metric from the grounded schema candidates."};case"missing_record_fields":return{code:i.code,fieldRole:"dimension",recommendedNextStep:"Provide at least one field for the records intent."};case"missing_input_options_field":return{code:i.code,fieldRole:"input",recommendedNextStep:"Provide the exact field whose option values should be listed."};case"missing_sql":return{code:i.code,fieldRole:"sql",recommendedNextStep:"Provide bounded read-only SQL with an explicit outer LIMIT."};case"conflicting_sql":return{code:i.code,fieldRole:"sql",recommendedNextStep:"Use one canonical SQL text location for the intent; prefer top-level sql."};case"missing_semantic_domain":case"missing_dataset_name":case"missing_connection_id":case"missing_table_name":return{code:i.code,fieldRole:"source",recommendedNextStep:"Use grounded catalog metadata to fill the missing source reference."};default:return}}).filter(i=>!!i)}function O(e,i,s,r){if(!e||typeof e!="object"){s.push(a("invalid_view","Dashboard view must be an object.",i));return}if(d(e.title)||s.push(a("missing_view_title","Dashboard view needs a title.",i)),!e.presentation||typeof e.presentation!="object"){s.push(a("missing_presentation","Dashboard view needs a presentation.",`${i}.presentation`));return}if(e.presentation.kind==="text"){d(e.text)||r.push(a("missing_text_content","Text views should include text content.",`${i}.text`));return}if(!e.analytics){s.push(a("missing_view_analytics","Non-text dashboard views need analytics intent.",`${i}.analytics`));return}const o=h(e.analytics);for(const n of o.errors)s.push(a(n.code,n.message,`${i}.analytics${n.path?`.${n.path}`:""}`));for(const n of o.warnings)r.push(a(n.code,n.message,`${i}.analytics${n.path?`.${n.path}`:""}`))}function H(e){const i=[],s=[];if(!e||typeof e!="object")return{ok:!1,errors:[a("invalid_dashboard_intent","Dashboard intent must be a structured object.")],warnings:s};e.version!==1&&i.push(a("invalid_version","Dashboard intent version must be 1.")),e.kind!=="dashboard"&&i.push(a("invalid_kind","Experience intent kind must be dashboard.")),d(e.title)||i.push(a("missing_title","Dashboard intent needs a title.","title"));const r=Array.isArray(e.inputs)?e.inputs:[],o=g(r.filter(c).map(u=>u.id).filter(u=>typeof u=="string"));o&&i.push(a("duplicate_input_id",`Duplicate input id: ${o}.`,"inputs"));for(const[u,l]of r.entries()){const m=`inputs.${u}`;if(!c(l)){i.push(a("invalid_input","Dashboard input must be an object.",m));continue}d(l.id)||i.push(a("missing_input_id","Input needs an id.",`${m}.id`)),d(l.label)||i.push(a("missing_input_label","Input needs a label.",`${m}.label`)),!l.field||!d(l.field.name)?i.push(a("missing_input_field","Input needs a field.",`${m}.field`)):f(l.field,`${m}.field`,i)}const n=Array.isArray(e.sections)?e.sections:[];n.length===0&&i.push(a("missing_sections","Dashboard intent needs at least one section.","sections"));const t=n.flatMap(u=>u&&typeof u=="object"&&Array.isArray(u.views)?u.views.filter(c).map(l=>l.id).filter(l=>!!l):[]),p=g(t);p&&i.push(a("duplicate_view_id",`Duplicate dashboard view id: ${p}.`,"sections"));for(const[u,l]of n.entries()){const m=`sections.${u}`;if(!l||typeof l!="object"){i.push(a("invalid_section","Dashboard section must be an object.",m));continue}if(d(l.title)||i.push(a("missing_section_title","Dashboard section needs a title.",m)),!Array.isArray(l.views)||l.views.length===0){i.push(a("missing_section_views","Dashboard section needs at least one view.",`${m}.views`));continue}for(const[$,N]of l.views.entries())O(N,`${m}.views.${$}`,i,s)}return{ok:i.length===0,errors:i,warnings:s}}exports.preferSemaphorFieldRefMetadata=B;exports.preferSemaphorSourceMetadata=A;exports.semaphorFieldRefsMatch=I;exports.semaphorSourceIdentityKey=_;exports.semaphorSourcesReferToSameDataset=b;exports.validateSemaphorAnalyticsIntent=h;exports.validateSemaphorAnalyticsRecoveryPlan=P;exports.validateSemaphorDashboardIntent=H;exports.validateSemaphorOperationIntent=w;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("../chunks/validators-Caj7EMd1.js"),Se=require("../chunks/catalog-field-grounding-Du6mKDcF.js"),re=["lg","md","sm","xs","xxs"],$=10;function _(e){return e&&typeof e=="object"?e:null}function D(e){return typeof e=="string"?e:null}function ae(e){var t,n,r;return!!(e&&typeof e=="object")&&(((t=_(e))==null?void 0:t.kind)==="semantic"||((n=_(e))==null?void 0:n.kind)==="physical"||((r=_(e))==null?void 0:r.kind)==="sql")}function N(e){return ae(e)?e.kind==="semantic"?!!(e.domainId&&e.datasetName):e.kind==="physical"?!!(e.connectionId&&e.tableName):!1:!1}function we(e){return v.semaphorSourceIdentityKey(e)}function G(e,t){return v.semaphorSourcesReferToSameDataset(e,t)}function ie(e,t){return v.preferSemaphorSourceMetadata(e,t)}function M(e){const t=[];for(const n of e){const r=t.findIndex(a=>G(a,n));r===-1?t.push(n):t[r]=ie(t[r],n)}return t}function ve(e){return M(e)[0]}function H(e,t){return e.kind!=="semantic"||e.connectionId||(t==null?void 0:t.kind)!=="semantic"||!v.semaphorSourcesReferToSameDataset(e,t)||!t.connectionId?e:{...e,connectionId:t.connectionId}}function W(e){return N(e)?e:void 0}function ne(e,t){if(!(e.kind!=="semantic"||e.connectionId))return t.find(n=>(n==null?void 0:n.kind)==="semantic"&&v.semaphorSourcesReferToSameDataset(e,n)&&!!n.connectionId)}function w(e,t){const n=W(e==null?void 0:e.source);return n?H(n,t):void 0}function oe({explicitSource:e,field:t,defaultSource:n,fallbackSources:r}){const a=[n,...r||[]],i=W(e),o=i?H(i,ne(i,a)):void 0;if(o)return o;if(e!==void 0)return;const d=w(t,n),s=d?H(d,ne(d,a)):void 0;if(s)return s;if((t==null?void 0:t.source)===void 0)return W(n)}function De(e,t){if(!(e!=null&&e.name)||!(t!=null&&t.name)||e.name!==t.name)return!1;const n=w(e),r=w(t);return!n||!r?!0:G(n,r)}function C(e){var t;return D((t=_(e))==null?void 0:t.kind)}function se(e){var t,n;return C(e)!=="semantic"?null:((n=D((t=_(e))==null?void 0:t.domainId))==null?void 0:n.trim())||null}function Ae(e){var t;return C(e)!=="semantic"?null:D((t=_(e))==null?void 0:t.datasetName)}function Ce(e){var t;return C(e)!=="semantic"?null:D((t=_(e))==null?void 0:t.datasetId)}function ke(e){var t;return C(e)!=="physical"?null:D((t=_(e))==null?void 0:t.connectionId)}function xe(e){var t;return C(e)!=="physical"?null:D((t=_(e))==null?void 0:t.tableName)}function Fe(e){var t;return C(e)!=="physical"?"":D((t=_(e))==null?void 0:t.databaseName)||""}function Te(e){var t;return C(e)!=="physical"?"":D((t=_(e))==null?void 0:t.schemaName)||""}function de(e){if(e.analyticsIntent&&typeof e.analyticsIntent=="object"&&"source"in e.analyticsIntent)return e.analyticsIntent.source}function ce({datasets:e,requireAtLeastOne:t}){if(t&&e.length<1)return{ok:!1,issue:"invalid_dataset_count"};if(e.length<=1)return{ok:!0};const n=e.map(se),r=new Set(n.filter(Boolean));return n.some(a=>!a)||r.size!==1?{ok:!1,issue:"invalid_multi_dataset_scope"}:{ok:!0}}function z(e,t){if(!t)return!1;if(t.kind==="semantic"){const n=Ce(e);return se(e)===t.domainId?n&&t.datasetId?n===t.datasetId:Ae(e)===t.datasetName:!1}return t.kind==="physical"?ke(e)===t.connectionId&&xe(e)===t.tableName&&Fe(e)===(t.databaseName||"")&&Te(e)===(t.schemaName||""):!1}function $e(e,t){return e.find(n=>z(n,t))}function f(e,t,n){return n?{code:e,message:t,cardId:n}:{code:e,message:t}}function B(e){const t=new Set;for(const n of e){if(t.has(n))return n;t.add(n)}return null}function le({card:e,datasets:t,errors:n}){if(e.type==="text")return;const r=de(e);if(!r){if(t.length<=1)return;n.push(f("missing_card_analytics_source","Multi-dataset dashboard cards must include analytics intent with a source so the materializer can choose the correct dataset.",e.id));return}t.some(a=>z(a,r))||n.push(f("invalid_card_analytics_source","Dashboard cards with an explicit analytics source must use one of the selected datasets.",e.id))}function V(e){return e.map(t=>t==null?void 0:t.source).filter(t=>!!t)}function L(e){return Array.isArray(e)?e.filter(t=>!!(t&&typeof t=="object")):[]}function Me(e){return Array.isArray(e)?e.filter(t=>!!(t&&typeof t=="object")):[]}function Ne(e){var n;if(!e)return[];const t=[e.source];return e.kind==="metric"?t.push(...V([...L(e.metrics),e.primaryMetric,e.dateField,...L(e.dimensions),...Me(e.filters).map(r=>r.field)])):e.kind==="records"?t.push(...V([...L(e.fields),e.dateField,(n=e.orderBy)==null?void 0:n.field])):e.kind==="inputOptions"?t.push(...V([e.field])):e.kind==="sql"&&t.push(...V(e.fields||[])),t}function ue({card:e,datasets:t,errors:n}){if(e.type!=="text"){for(const r of Ne(e.analyticsIntent))if(r&&!t.some(a=>z(a,r))){n.push(f("invalid_card_query_source","Dashboard card query field references must use one of the selected datasets.",e.id));return}}}function fe({card:e,errors:t}){if(e.type==="text"||!e.analyticsIntent)return;const n=v.validateSemaphorAnalyticsIntent(e.analyticsIntent);if(!n.ok)for(const r of n.errors)t.push(f(r.code,r.path?`${r.path}: ${r.message}`:r.message,e.id))}function pe({datasets:e,errors:t,requireAtLeastOne:n}){const r=ce({datasets:e,requireAtLeastOne:n});if(!r.ok){if(r.issue==="invalid_dataset_count"){t.push(f("invalid_dataset_count","Dashboard authoring requires at least one selected dataset."));return}t.push(f("invalid_multi_dataset_scope","Multi-dataset dashboard authoring is limited to semantic datasets from one domain."))}}function he(e){var p,S;const t=[];if(!e||typeof e!="object")return{ok:!1,errors:[f("invalid_plan","Dashboard plan must be a structured object.")],warnings:[]};const n=e,r=[...n.warnings||[]];n.version!==1&&t.push(f("invalid_version","Dashboard plan version must be 1.")),(p=n.title)!=null&&p.trim()||t.push(f("missing_title","Dashboard plan needs a title."));const a=Array.isArray(n.datasets)?n.datasets:[],i=Array.isArray(n.sheets)?n.sheets:[];pe({datasets:a,errors:t,requireAtLeastOne:!0}),i.length!==1&&t.push(f("invalid_sheet_count","MVP dashboard authoring creates exactly one dashboard sheet."));const o=i[0];o&&o.kind!=="dashboard"&&t.push(f("invalid_sheet_kind",'Generated sheet must use kind "dashboard".'));const d=(o==null?void 0:o.cards)||[];d.length>$&&t.push(f("too_many_cards",`Generated dashboards can contain at most ${$} cards.`));const s=B(d.map(l=>l.id));s&&t.push(f("duplicate_card_id",`Duplicate generated card id: ${s}.`));const u=B(d.map(l=>l.frameId));u&&t.push(f("duplicate_frame_id",`Duplicate generated frame id: ${u}.`));for(const l of d)(S=l.title)!=null&&S.trim()||t.push(f("missing_card_title","Card title is required.",l.id)),l.type==="custom"&&t.push(f("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",l.id)),l.type!=="text"&&!l.analyticsIntent&&r.push(f("missing_analytics_intent","Non-text card has no analytics intent and may be skipped by the app layer.",l.id)),le({card:l,datasets:a,errors:t}),fe({card:l,errors:t}),ue({card:l,datasets:a,errors:t});const h=Array.isArray(n.filterInputs)?n.filterInputs:[],b=h.map(l=>l.id),y=B(b);y&&t.push(f("duplicate_input_id",`Duplicate dashboard input id: ${y}.`));const c=h.map(l=>l.variableName).filter(Boolean)||[],g=B(c);g&&t.push(f("duplicate_input_variable",`Duplicate dashboard input variable name: ${g}.`));const A=Array.isArray(n.calculatedFields)?n.calculatedFields:[];for(const l of A)l.scope==="domain"&&l.reuseOnly!==!0&&t.push(f("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${l.name}" is outside MVP.`));return{ok:t.length===0,errors:t,warnings:r}}function me(e){var o;const t=[];if(!e||typeof e!="object")return{ok:!1,errors:[f("invalid_change_plan","Dashboard change plan must be a structured object.")],warnings:[]};const n=e,r=[...n.warnings||[]];n.version!==1&&t.push(f("invalid_version","Dashboard change plan version must be 1.")),(o=n.dashboardId)!=null&&o.trim()||t.push(f("missing_dashboard_id","Dashboard change plan needs a dashboard id."));const a=Array.isArray(n.datasets)?n.datasets:[],i=Array.isArray(n.operations)?n.operations:[];pe({datasets:a,errors:t,requireAtLeastOne:!1});for(const d of i){if(d.kind==="unsupported"){r.push(f("unsupported_operation",d.reason||d.requestedAction));continue}d.kind==="addCard"&&d.card.type==="custom"&&t.push(f("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",d.card.id)),d.kind==="addCard"&&(le({card:d.card,datasets:a,errors:t}),fe({card:d.card,errors:t}),ue({card:d.card,datasets:a,errors:t})),d.kind==="addCalculatedField"&&d.field.scope==="domain"&&d.field.reuseOnly!==!0&&t.push(f("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${d.field.name}" is outside MVP.`))}return{ok:t.length===0,errors:t,warnings:r}}const Pe={lg:48,md:36,sm:24,xs:12,xxs:6};function Re(e,t){let n=0,r=0,a=0;return e.map(i=>{const o=Math.min(i.w,t);n>0&&n+o>t&&(n=0,r+=a,a=0);const d={i:i.frameId,x:n,y:r,w:o,h:i.h,minW:Math.min(i.minW,t),minH:i.minH,static:!1};return n+=o,a=Math.max(a,i.h),d})}function Be(e){const t=[...e].sort((s,u)=>s.priority-u.priority),n=t.filter(s=>s.role==="kpi"),r=t.filter(s=>s.role==="chart"),a=t.filter(s=>s.role==="table"),i=t.filter(s=>s.role==="text"),o=i.slice(0,1),d=i.slice(o.length);return{kpis:n,introText:o,charts:r,tables:a,supportingText:d}}function Ve(e,t,n){return t==="xxs"||t==="xs"?n:t==="sm"?Math.min(12,n):t==="md"?e<=1||e===2?18:12:e<=1||e===2?24:e===3?16:12}function ze(e,t,n,r){return n==="xxs"||n==="xs"||n==="sm"||n==="md"||t===1||t%2===1&&e===0?r:r/2}function Oe(e){const{item:t,band:n,index:r,bandCount:a,breakpoint:i,columns:o}=e;return n==="kpi"?{...t,band:n,w:Ve(a,i,o),h:15,minW:Math.min(6,o),minH:12}:n==="table"?{...t,band:n,w:o,h:i==="xxs"||i==="xs"?34:38,minW:Math.min(12,o),minH:18}:n==="introText"?{...t,band:n,w:o,h:i==="xxs"||i==="xs"?12:10,minW:Math.min(12,o),minH:8}:n==="supportingText"?{...t,band:n,w:i==="lg"?o/2:o,h:i==="xxs"||i==="xs"?12:10,minW:Math.min(12,o),minH:8}:{...t,band:n,w:ze(r,a,i,o),h:i==="xxs"||i==="xs"?28:30,minW:Math.min(12,o),minH:16}}function x(e,t,n,r){return e.map((a,i)=>Oe({item:a,band:t,index:i,bandCount:e.length,breakpoint:n,columns:r}))}function O(e){const t=Be(e);return Object.fromEntries(re.map(n=>{const r=Pe[n],a=[...x(t.introText,"introText",n,r),...x(t.kpis,"kpi",n,r),...x(t.charts,"chart",n,r),...x(t.tables,"table",n,r),...x(t.supportingText,"supportingText",n,r)];return[n,Re(a,r)]}))}function qe(e){const t=Se.normalizeAnalyticsCatalogDataType(e);return t==="datetime"?"date":t==="unknown"?"string":t}function Le(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function je(e){return Le(e)&&typeof e.filterId=="string"&&typeof e.operation=="string"&&Array.isArray(e.values)}function Ee(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function He(e){return e.filter(t=>t instanceof Date||typeof t=="string")}function K(e,t){if(t===void 0)return;const n=qe(e.dataType),r=e.operation||"in";if(je(t))return{...t,filterId:e.id,name:t.name||e.column,valueType:n,dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext};if(r==="is null"||r==="is not null")return{filterId:e.id,name:e.column,operation:r,valueType:n,values:[],dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext};const a=Array.isArray(t)?t:[t],i=n==="date"?He(a):Ee(a);if(i.length!==0&&!((r==="between"||r==="not between")&&i.length<2))return{filterId:e.id,name:e.column,operation:r,valueType:n,values:i,dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext}}function We(e,t,n){return n?{code:e,message:t,cardId:n}:{code:e,message:t}}function Ge(e,t,n){const r=(t||[]).filter(a=>a.scope==="card"&&a.targetCardId===n).map(a=>a.field).filter(Boolean);return r.length===0?e:{...e,calculatedFields:[...e.calculatedFields||[],...r]}}function Ke(e){const t={};return{inputs:(e.filterInputs||[]).map((r,a)=>{const i=K(r.filter,r.defaultValue);return i&&(t.shared??(t.shared={}),t.shared[r.id]={status:"set",value:{kind:"filter",filterValue:i}}),{id:r.id,kind:"filter",label:r.label,variableName:r.variableName,scope:r.scope||{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:a},exports:["label","value","start","end","range"],filter:r.filter}}),defaultInputValues:t.shared&&Object.keys(t.shared).length>0?t:void 0}}function Ue(e){var b,y;const t=he(e.plan);if(!t.ok)throw new Error(t.errors.map(c=>c.message).join(`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("../chunks/validators-v8WAqhaN.js"),Se=require("../chunks/catalog-field-grounding-Du6mKDcF.js"),re=["lg","md","sm","xs","xxs"],$=10;function _(e){return e&&typeof e=="object"?e:null}function D(e){return typeof e=="string"?e:null}function ae(e){var t,n,r;return!!(e&&typeof e=="object")&&(((t=_(e))==null?void 0:t.kind)==="semantic"||((n=_(e))==null?void 0:n.kind)==="physical"||((r=_(e))==null?void 0:r.kind)==="sql")}function N(e){return ae(e)?e.kind==="semantic"?!!(e.domainId&&e.datasetName):e.kind==="physical"?!!(e.connectionId&&e.tableName):!1:!1}function we(e){return v.semaphorSourceIdentityKey(e)}function G(e,t){return v.semaphorSourcesReferToSameDataset(e,t)}function ie(e,t){return v.preferSemaphorSourceMetadata(e,t)}function M(e){const t=[];for(const n of e){const r=t.findIndex(a=>G(a,n));r===-1?t.push(n):t[r]=ie(t[r],n)}return t}function ve(e){return M(e)[0]}function H(e,t){return e.kind!=="semantic"||e.connectionId||(t==null?void 0:t.kind)!=="semantic"||!v.semaphorSourcesReferToSameDataset(e,t)||!t.connectionId?e:{...e,connectionId:t.connectionId}}function W(e){return N(e)?e:void 0}function ne(e,t){if(!(e.kind!=="semantic"||e.connectionId))return t.find(n=>(n==null?void 0:n.kind)==="semantic"&&v.semaphorSourcesReferToSameDataset(e,n)&&!!n.connectionId)}function w(e,t){const n=W(e==null?void 0:e.source);return n?H(n,t):void 0}function oe({explicitSource:e,field:t,defaultSource:n,fallbackSources:r}){const a=[n,...r||[]],i=W(e),o=i?H(i,ne(i,a)):void 0;if(o)return o;if(e!==void 0)return;const d=w(t,n),s=d?H(d,ne(d,a)):void 0;if(s)return s;if((t==null?void 0:t.source)===void 0)return W(n)}function De(e,t){if(!(e!=null&&e.name)||!(t!=null&&t.name)||e.name!==t.name)return!1;const n=w(e),r=w(t);return!n||!r?!0:G(n,r)}function C(e){var t;return D((t=_(e))==null?void 0:t.kind)}function se(e){var t,n;return C(e)!=="semantic"?null:((n=D((t=_(e))==null?void 0:t.domainId))==null?void 0:n.trim())||null}function Ae(e){var t;return C(e)!=="semantic"?null:D((t=_(e))==null?void 0:t.datasetName)}function Ce(e){var t;return C(e)!=="semantic"?null:D((t=_(e))==null?void 0:t.datasetId)}function ke(e){var t;return C(e)!=="physical"?null:D((t=_(e))==null?void 0:t.connectionId)}function xe(e){var t;return C(e)!=="physical"?null:D((t=_(e))==null?void 0:t.tableName)}function Fe(e){var t;return C(e)!=="physical"?"":D((t=_(e))==null?void 0:t.databaseName)||""}function Te(e){var t;return C(e)!=="physical"?"":D((t=_(e))==null?void 0:t.schemaName)||""}function de(e){if(e.analyticsIntent&&typeof e.analyticsIntent=="object"&&"source"in e.analyticsIntent)return e.analyticsIntent.source}function ce({datasets:e,requireAtLeastOne:t}){if(t&&e.length<1)return{ok:!1,issue:"invalid_dataset_count"};if(e.length<=1)return{ok:!0};const n=e.map(se),r=new Set(n.filter(Boolean));return n.some(a=>!a)||r.size!==1?{ok:!1,issue:"invalid_multi_dataset_scope"}:{ok:!0}}function z(e,t){if(!t)return!1;if(t.kind==="semantic"){const n=Ce(e);return se(e)===t.domainId?n&&t.datasetId?n===t.datasetId:Ae(e)===t.datasetName:!1}return t.kind==="physical"?ke(e)===t.connectionId&&xe(e)===t.tableName&&Fe(e)===(t.databaseName||"")&&Te(e)===(t.schemaName||""):!1}function $e(e,t){return e.find(n=>z(n,t))}function f(e,t,n){return n?{code:e,message:t,cardId:n}:{code:e,message:t}}function B(e){const t=new Set;for(const n of e){if(t.has(n))return n;t.add(n)}return null}function le({card:e,datasets:t,errors:n}){if(e.type==="text")return;const r=de(e);if(!r){if(t.length<=1)return;n.push(f("missing_card_analytics_source","Multi-dataset dashboard cards must include analytics intent with a source so the materializer can choose the correct dataset.",e.id));return}t.some(a=>z(a,r))||n.push(f("invalid_card_analytics_source","Dashboard cards with an explicit analytics source must use one of the selected datasets.",e.id))}function V(e){return e.map(t=>t==null?void 0:t.source).filter(t=>!!t)}function L(e){return Array.isArray(e)?e.filter(t=>!!(t&&typeof t=="object")):[]}function Me(e){return Array.isArray(e)?e.filter(t=>!!(t&&typeof t=="object")):[]}function Ne(e){var n;if(!e)return[];const t=[e.source];return e.kind==="metric"?t.push(...V([...L(e.metrics),e.primaryMetric,e.dateField,...L(e.dimensions),...Me(e.filters).map(r=>r.field)])):e.kind==="records"?t.push(...V([...L(e.fields),e.dateField,(n=e.orderBy)==null?void 0:n.field])):e.kind==="inputOptions"?t.push(...V([e.field])):e.kind==="sql"&&t.push(...V(e.fields||[])),t}function ue({card:e,datasets:t,errors:n}){if(e.type!=="text"){for(const r of Ne(e.analyticsIntent))if(r&&!t.some(a=>z(a,r))){n.push(f("invalid_card_query_source","Dashboard card query field references must use one of the selected datasets.",e.id));return}}}function fe({card:e,errors:t}){if(e.type==="text"||!e.analyticsIntent)return;const n=v.validateSemaphorAnalyticsIntent(e.analyticsIntent);if(!n.ok)for(const r of n.errors)t.push(f(r.code,r.path?`${r.path}: ${r.message}`:r.message,e.id))}function pe({datasets:e,errors:t,requireAtLeastOne:n}){const r=ce({datasets:e,requireAtLeastOne:n});if(!r.ok){if(r.issue==="invalid_dataset_count"){t.push(f("invalid_dataset_count","Dashboard authoring requires at least one selected dataset."));return}t.push(f("invalid_multi_dataset_scope","Multi-dataset dashboard authoring is limited to semantic datasets from one domain."))}}function he(e){var p,S;const t=[];if(!e||typeof e!="object")return{ok:!1,errors:[f("invalid_plan","Dashboard plan must be a structured object.")],warnings:[]};const n=e,r=[...n.warnings||[]];n.version!==1&&t.push(f("invalid_version","Dashboard plan version must be 1.")),(p=n.title)!=null&&p.trim()||t.push(f("missing_title","Dashboard plan needs a title."));const a=Array.isArray(n.datasets)?n.datasets:[],i=Array.isArray(n.sheets)?n.sheets:[];pe({datasets:a,errors:t,requireAtLeastOne:!0}),i.length!==1&&t.push(f("invalid_sheet_count","MVP dashboard authoring creates exactly one dashboard sheet."));const o=i[0];o&&o.kind!=="dashboard"&&t.push(f("invalid_sheet_kind",'Generated sheet must use kind "dashboard".'));const d=(o==null?void 0:o.cards)||[];d.length>$&&t.push(f("too_many_cards",`Generated dashboards can contain at most ${$} cards.`));const s=B(d.map(l=>l.id));s&&t.push(f("duplicate_card_id",`Duplicate generated card id: ${s}.`));const u=B(d.map(l=>l.frameId));u&&t.push(f("duplicate_frame_id",`Duplicate generated frame id: ${u}.`));for(const l of d)(S=l.title)!=null&&S.trim()||t.push(f("missing_card_title","Card title is required.",l.id)),l.type==="custom"&&t.push(f("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",l.id)),l.type!=="text"&&!l.analyticsIntent&&r.push(f("missing_analytics_intent","Non-text card has no analytics intent and may be skipped by the app layer.",l.id)),le({card:l,datasets:a,errors:t}),fe({card:l,errors:t}),ue({card:l,datasets:a,errors:t});const h=Array.isArray(n.filterInputs)?n.filterInputs:[],b=h.map(l=>l.id),y=B(b);y&&t.push(f("duplicate_input_id",`Duplicate dashboard input id: ${y}.`));const c=h.map(l=>l.variableName).filter(Boolean)||[],g=B(c);g&&t.push(f("duplicate_input_variable",`Duplicate dashboard input variable name: ${g}.`));const A=Array.isArray(n.calculatedFields)?n.calculatedFields:[];for(const l of A)l.scope==="domain"&&l.reuseOnly!==!0&&t.push(f("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${l.name}" is outside MVP.`));return{ok:t.length===0,errors:t,warnings:r}}function me(e){var o;const t=[];if(!e||typeof e!="object")return{ok:!1,errors:[f("invalid_change_plan","Dashboard change plan must be a structured object.")],warnings:[]};const n=e,r=[...n.warnings||[]];n.version!==1&&t.push(f("invalid_version","Dashboard change plan version must be 1.")),(o=n.dashboardId)!=null&&o.trim()||t.push(f("missing_dashboard_id","Dashboard change plan needs a dashboard id."));const a=Array.isArray(n.datasets)?n.datasets:[],i=Array.isArray(n.operations)?n.operations:[];pe({datasets:a,errors:t,requireAtLeastOne:!1});for(const d of i){if(d.kind==="unsupported"){r.push(f("unsupported_operation",d.reason||d.requestedAction));continue}d.kind==="addCard"&&d.card.type==="custom"&&t.push(f("custom_visual_out_of_scope","Whole-dashboard authoring supports built-in visual types only.",d.card.id)),d.kind==="addCard"&&(le({card:d.card,datasets:a,errors:t}),fe({card:d.card,errors:t}),ue({card:d.card,datasets:a,errors:t})),d.kind==="addCalculatedField"&&d.field.scope==="domain"&&d.field.reuseOnly!==!0&&t.push(f("domain_calculated_field_create_out_of_scope",`Creating domain calculated field "${d.field.name}" is outside MVP.`))}return{ok:t.length===0,errors:t,warnings:r}}const Pe={lg:48,md:36,sm:24,xs:12,xxs:6};function Re(e,t){let n=0,r=0,a=0;return e.map(i=>{const o=Math.min(i.w,t);n>0&&n+o>t&&(n=0,r+=a,a=0);const d={i:i.frameId,x:n,y:r,w:o,h:i.h,minW:Math.min(i.minW,t),minH:i.minH,static:!1};return n+=o,a=Math.max(a,i.h),d})}function Be(e){const t=[...e].sort((s,u)=>s.priority-u.priority),n=t.filter(s=>s.role==="kpi"),r=t.filter(s=>s.role==="chart"),a=t.filter(s=>s.role==="table"),i=t.filter(s=>s.role==="text"),o=i.slice(0,1),d=i.slice(o.length);return{kpis:n,introText:o,charts:r,tables:a,supportingText:d}}function Ve(e,t,n){return t==="xxs"||t==="xs"?n:t==="sm"?Math.min(12,n):t==="md"?e<=1||e===2?18:12:e<=1||e===2?24:e===3?16:12}function ze(e,t,n,r){return n==="xxs"||n==="xs"||n==="sm"||n==="md"||t===1||t%2===1&&e===0?r:r/2}function Oe(e){const{item:t,band:n,index:r,bandCount:a,breakpoint:i,columns:o}=e;return n==="kpi"?{...t,band:n,w:Ve(a,i,o),h:15,minW:Math.min(6,o),minH:12}:n==="table"?{...t,band:n,w:o,h:i==="xxs"||i==="xs"?34:38,minW:Math.min(12,o),minH:18}:n==="introText"?{...t,band:n,w:o,h:i==="xxs"||i==="xs"?12:10,minW:Math.min(12,o),minH:8}:n==="supportingText"?{...t,band:n,w:i==="lg"?o/2:o,h:i==="xxs"||i==="xs"?12:10,minW:Math.min(12,o),minH:8}:{...t,band:n,w:ze(r,a,i,o),h:i==="xxs"||i==="xs"?28:30,minW:Math.min(12,o),minH:16}}function x(e,t,n,r){return e.map((a,i)=>Oe({item:a,band:t,index:i,bandCount:e.length,breakpoint:n,columns:r}))}function O(e){const t=Be(e);return Object.fromEntries(re.map(n=>{const r=Pe[n],a=[...x(t.introText,"introText",n,r),...x(t.kpis,"kpi",n,r),...x(t.charts,"chart",n,r),...x(t.tables,"table",n,r),...x(t.supportingText,"supportingText",n,r)];return[n,Re(a,r)]}))}function qe(e){const t=Se.normalizeAnalyticsCatalogDataType(e);return t==="datetime"?"date":t==="unknown"?"string":t}function Le(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function je(e){return Le(e)&&typeof e.filterId=="string"&&typeof e.operation=="string"&&Array.isArray(e.values)}function Ee(e){return e.filter(t=>typeof t=="string"||typeof t=="number")}function He(e){return e.filter(t=>t instanceof Date||typeof t=="string")}function K(e,t){if(t===void 0)return;const n=qe(e.dataType),r=e.operation||"in";if(je(t))return{...t,filterId:e.id,name:t.name||e.column,valueType:n,dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext};if(r==="is null"||r==="is not null")return{filterId:e.id,name:e.column,operation:r,valueType:n,values:[],dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext};const a=Array.isArray(t)?t:[t],i=n==="date"?He(a):Ee(a);if(i.length!==0&&!((r==="between"||r==="not between")&&i.length<2))return{filterId:e.id,name:e.column,operation:r,valueType:n,values:i,dataType:e.dataType,fieldMeta:e.fieldMeta,semanticContext:e.semanticContext}}function We(e,t,n){return n?{code:e,message:t,cardId:n}:{code:e,message:t}}function Ge(e,t,n){const r=(t||[]).filter(a=>a.scope==="card"&&a.targetCardId===n).map(a=>a.field).filter(Boolean);return r.length===0?e:{...e,calculatedFields:[...e.calculatedFields||[],...r]}}function Ke(e){const t={};return{inputs:(e.filterInputs||[]).map((r,a)=>{const i=K(r.filter,r.defaultValue);return i&&(t.shared??(t.shared={}),t.shared[r.id]={status:"set",value:{kind:"filter",filterValue:i}}),{id:r.id,kind:"filter",label:r.label,variableName:r.variableName,scope:r.scope||{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:a},exports:["label","value","start","end","range"],filter:r.filter}}),defaultInputValues:t.shared&&Object.keys(t.shared).length>0?t:void 0}}function Ue(e){var b,y;const t=he(e.plan);if(!t.ok)throw new Error(t.errors.map(c=>c.message).join(`
|
|
2
2
|
`)||"Dashboard plan is invalid.");const n=e.plan.sheets[0],r=[...t.warnings],a=[],i=new Map(e.cardArtifacts.map(c=>[c.planCardId,c])),o=[];for(const c of n.cards){const g=i.get(c.id);if(!g){const p=We("missing_card_artifact",`Card "${c.title}" was skipped because no generated artifact was supplied.`,c.id);a.push(p);continue}r.push(...g.warnings||[]);const A=Ge(g.card,e.plan.calculatedFields,c.id);o.push({id:c.frameId,cards:[A],activeCardId:A.id})}if(o.length===0)throw new Error("Dashboard plan did not produce any persistable cards.");const{inputs:d,defaultInputValues:s}=Ke(e.plan),u=O(n.cards.filter(c=>o.some(g=>g.id===c.frameId)).map(c=>({frameId:c.frameId,priority:c.priority,role:c.role})));return{dashboard:{id:e.dashboardId,title:e.plan.title,description:e.plan.description||"",sheets:[{id:n.id,kind:"dashboard",title:n.title,description:n.description,frames:o,layouts:u,calculatedFields:(b=e.plan.calculatedFields)==null?void 0:b.filter(c=>c.scope==="sheet"&&c.field).map(c=>c.field)}],calculatedFields:(y=e.plan.calculatedFields)==null?void 0:y.filter(c=>c.scope==="dashboard"&&c.field).map(c=>c.field),inputs:d,...s?{defaultInputValues:s}:{}},warnings:r,skippedOperations:a}}function k(e,t,n){return n?{code:e,message:t,cardId:n}:{code:e,message:t}}function Xe(e){return JSON.parse(JSON.stringify(e))}function Je(e){var t;return(t=e.sheets)==null?void 0:t.find(n=>(n.kind||"dashboard")==="dashboard")}function j(e,t){var n;for(const r of e.sheets||[])for(const a of r.frames||[]){const i=(n=a.cards)==null?void 0:n.find(o=>o.id===t);if(i)return{sheet:r,frame:a,card:i}}return null}function ge(e){var n,r;const t=(r=(n=e.cards)==null?void 0:n[0])==null?void 0:r.type;return t==="kpi"?"kpi":t==="table"||t==="detailTable"||t==="pivotTable"?"table":t==="text"?"text":"chart"}function Qe(e){var t;return new Map((((t=e.layouts)==null?void 0:t.lg)||[]).map((n,r)=>[n.i,r]))}function be(e,t=new Map){const n=Qe(e),r=Math.max(n.size,t.size),a=(e.frames||[]).map((i,o)=>({frameId:i.id,role:ge(i),priority:t.get(i.id)??n.get(i.id)??r+o}));e.layouts=O(a)}function Ye(e){return Object.values(e.layouts||{}).some(t=>t.length>0)}function Ze(e,t){if(!Ye(e)){be(e);return}const n=O([{frameId:t.id,role:ge(t),priority:0}]);e.layouts??(e.layouts={});for(const[r,a]of Object.entries(n)){const i=e.layouts[r]||[];if(i.some(s=>s.i===t.id))continue;const o=a[0];if(!o)continue;const d=i.reduce((s,u)=>Math.max(s,u.y+u.h),0);e.layouts[r]=[...i,{...o,y:d}]}}function et(e,t){var r;const n=K(t.filter,t.defaultValue);n&&(e.defaultInputValues??(e.defaultInputValues={}),(r=e.defaultInputValues).shared??(r.shared={}),e.defaultInputValues.shared[t.id]={status:"set",value:{kind:"filter",filterValue:n}})}function tt(e){var d;const t=me(e.changePlan);if(!t.ok)throw new Error(t.errors.map(s=>s.message).join(`
|
|
3
3
|
`)||"Dashboard change plan is invalid.");const n=Xe(e.dashboard),r=[...t.warnings],a=[],i=new Map(e.cardArtifacts.map(s=>[s.planCardId,s])),o=Je(n);if(!o)throw new Error("Dashboard has no editable dashboard sheet.");o.frames??(o.frames=[]);for(const s of e.changePlan.operations)switch(s.kind){case"addCard":{if((o.frames||[]).reduce((y,c)=>{var g;return y+(((g=c.cards)==null?void 0:g.length)||0)},0)>=$){a.push(k("generated_card_limit_reached",`MVP AI refinement is capped at ${$} cards.`,s.card.id));break}const h=i.get(s.card.id);if(!h){a.push(k("missing_card_artifact",`Card "${s.card.title}" was skipped because no generated artifact was supplied.`,s.card.id));break}const b={id:s.card.frameId,cards:[h.card],activeCardId:h.card.id};o.frames.push(b),Ze(o,b);break}case"addFilterInput":{n.inputs??(n.inputs=[]);const u={id:s.input.id,kind:"filter",label:s.input.label,variableName:s.input.variableName,scope:s.input.scope||{kind:"allSheets",sheetKinds:["dashboard"]},runtimeScope:"shared",presentation:{placement:"toolbar",order:n.inputs.length},exports:["label","value","start","end","range"],filter:s.input.filter};n.inputs.push(u),et(n,s.input);break}case"addCalculatedField":{if(s.field.scope==="dashboard"&&s.field.field)n.calculatedFields??(n.calculatedFields=[]),n.calculatedFields.push(s.field.field);else if(s.field.scope==="sheet"&&s.field.field)o.calculatedFields??(o.calculatedFields=[]),o.calculatedFields.push(s.field.field);else if(s.field.scope==="card"&&s.field.field){const u=s.field.targetCardId?j(n,s.field.targetCardId):null;u?((d=u.card).calculatedFields??(d.calculatedFields=[]),u.card.calculatedFields.push(s.field.field)):a.push(k("missing_calculated_field_target",`Calculated field "${s.field.name}" needs a valid target card.`))}break}case"renameCard":{const u=j(n,s.cardId);if(!u){a.push(k("card_not_found",`Card "${s.cardId}" could not be renamed because it was not found.`,s.cardId));break}u.card.title=s.title,s.description!==void 0&&(u.card.description=s.description);break}case"reorderCards":{const u=new Map;for(let h=0;h<s.cardIds.length;h+=1){const b=s.cardIds[h],y=j(n,b);y&&u.set(y.frame.id,h)}be(o,u);break}case"reuseCalculatedField":r.push(k("reused_calculated_field",`Calculated field "${s.fieldId}" is reused by reference.`));break;case"unsupported":a.push(k("unsupported_operation",s.reason||s.requestedAction));break}return{dashboard:n,warnings:r,skippedOperations:a}}function I(e,t,n){return n?{code:e,message:t,cardId:n}:{code:e,message:t}}function T(e,t){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ie(e,t){if(!t.has(e))return t.add(e),e;let n=2,r=`${e}-${n}`;for(;t.has(r);)n+=1,r=`${e}-${n}`;return t.add(r),r}function P(e){return!!(e&&typeof e=="object")}function ye(e){return Array.isArray(e.inputs)?e.inputs.filter(t=>P(t)&&typeof t.id=="string"):[]}function U(e){return Array.isArray(e.sections)?e.sections.filter(t=>P(t)):[]}function X(e){return Array.isArray(e.views)?e.views.filter(t=>P(t)):[]}function F(e){if(!Array.isArray(e))return[];const t=[];for(const n of e){const r=w(n);r&&t.push(r)}return t}function nt(e){var r;if(!e)return[];const t=[];if(N(e.source)&&t.push(e.source),e.kind==="metric"){t.push(...F(e.metrics));const a=w(e.dateField);a&&t.push(a),t.push(...F(e.dimensions)),t.push(...F((r=e.filters)==null?void 0:r.map(i=>i.field)))}else if(e.kind==="records"){const a=w(e.dateField);a&&t.push(a),t.push(...F(e.fields))}else if(e.kind==="inputOptions"){const a=w(e.field);a&&t.push(a)}else e.kind==="sql"&&t.push(...F(e.fields));const n="inputs"in e&&Array.isArray(e.inputs)?e.inputs:[];for(const a of n){const i=w(a.field);i&&t.push(i)}return t}function rt(e){const t=[];for(const n of ye(e)){const r=w(n.field);r&&t.push(r)}for(const n of U(e))for(const r of X(n))t.push(...nt(r.analytics));return t}function at(e){var n;const t=[];for(const r of U(e))for(const a of X(r))N((n=a.analytics)==null?void 0:n.source)&&t.push(a.analytics.source);return t}function it(e,t){const n=M(e).filter(N);if(n.length===0)return t.push(I("missing_materializable_dataset","No semantic or physical source could be converted into the current dashboard authoring dataset reference.")),[];const r=n.every(i=>i.kind==="semantic"),a=Array.from(new Set(n.filter(i=>i.kind==="semantic").map(i=>i.domainId)));return n.length>1&&(!r||a.length!==1)?(t.push(I("multiple_datasets_out_of_scope","The dashboard authoring compiler supports multiple datasets only within one semantic domain; using the first source and deferring the rest.")),[n[0]]):n}function ot(e,t){const n=U(e),r=ye(e),a=M(rt(e)),i=M(at(e));return{sections:n,inputs:r,sources:a,primarySources:i,defaultSource:i.length===1?i[0]:void 0,datasets:it(a,t)}}function st(e){return e&&v.validateSemaphorAnalyticsIntent(e).ok?e:void 0}function dt(e){var t;switch((t=e.presentation)==null?void 0:t.kind){case"kpi":return"kpi";case"lineChart":return"line";case"barChart":return"bar";case"areaChart":return"area";case"table":return"table";case"text":return"text";default:return null}}function ct(e){var t,n,r;return((t=e.presentation)==null?void 0:t.kind)==="kpi"?"kpi":((n=e.presentation)==null?void 0:n.kind)==="table"?"table":((r=e.presentation)==null?void 0:r.kind)==="text"?"text":"chart"}function lt(e){switch(e){case"not_in":return"not in";case"not_between":return"not between";case"contains":return"like";default:return e||"in"}}function ut(e){return P(e.field)?e.field.dataType==="datetime"?"date":e.field.dataType||"string":"string"}function ft(e){if(!(!e||e.kind!=="physical"))return[e.databaseName,e.schemaName,e.tableName].filter(Boolean).join(".")}function pt(e,t,n,r,a,i){if(e.kind!=="filter")return i.push(I("control_inputs_deferred",`Control input "${e.label}" is represented in the protocol but not yet materialized by the dashboard authoring adapter.`)),null;if(!P(e.field)||typeof e.field.name!="string")return i.push(I("filter_requires_field",`Filter "${e.label||e.id}" needs a field before the dashboard compiler can materialize it.`)),null;const o=oe({explicitSource:void 0,field:e.field,defaultSource:t,fallbackSources:n}),d=(o==null?void 0:o.kind)==="semantic"||(o==null?void 0:o.kind)==="physical"?o.connectionId:void 0;if(!d)return i.push(I("filter_requires_connection_id",`Filter "${e.label}" needs a source connectionId before the dashboard compiler can materialize it.`)),null;const h={id:`filter-${Ie(T(e.id,e.field.name),a)}`,variableName:e.id,connectionId:d,title:e.label,column:e.field.name,dataType:ut(e),qualifiedTableName:ft(o),sql:"",operation:lt(e.operator),type:e.multi===!1?"single":"multiple",location:"dashboard",displayMode:"toolbar",fieldMeta:(o==null?void 0:o.kind)==="semantic"?{name:e.field.name,qualifiedFieldName:e.field.name,dataType:e.field.dataType,role:e.field.role==="measure"?"metric":"groupby"}:void 0,semanticContext:(o==null?void 0:o.kind)==="semantic"?{semanticDomainId:o.domainId,connectionId:o.connectionId}:void 0};return{id:e.id,label:e.label,variableName:e.id,scope:r,filter:h,defaultValue:K(h,e.defaultValue)}}function E(e){const t=[],n=[];for(const r of e.viewIds){const a=e.viewIdToCardId.get(r);a?t.push(a):n.push(r)}return n.length>0&&e.warnings.push(I("input_scope_view_not_found",`Filter "${e.inputLabel}" referenced unknown view ids: ${n.join(", ")}.`)),Array.from(new Set(t))}function ht(e){var r,a;if(!e.protocolScope){const i=Array.from(new Set(e.boundCardIds));return i.length>0&&i.length<e.allCardIds.length?{kind:"cards",cardIds:i}:void 0}if(e.protocolScope.level==="dashboard"){if(!((r=e.protocolScope.excludeViewIds)!=null&&r.length))return;const i=new Set(E({inputLabel:e.inputLabel,viewIds:e.protocolScope.excludeViewIds,viewIdToCardId:e.viewIdToCardId,warnings:e.warnings}));return{kind:"cards",cardIds:e.allCardIds.filter(o=>!i.has(o))}}if(e.protocolScope.level==="view"){const i=E({inputLabel:e.inputLabel,viewIds:e.protocolScope.viewIds,viewIdToCardId:e.viewIdToCardId,warnings:e.warnings});return i.length===0?(e.warnings.push(I("input_scope_has_no_materialized_cards",`Filter "${e.inputLabel}" was deferred because its view scope does not match any materialized cards.`)),null):{kind:"cards",cardIds:i}}const t=e.sectionIdToCardIds.get(e.protocolScope.sectionId)||[];if(t.length===0)return e.warnings.push(I("input_scope_section_not_found",`Filter "${e.inputLabel}" was deferred because section "${e.protocolScope.sectionId}" does not match any materialized cards.`)),null;if(!((a=e.protocolScope.excludeViewIds)!=null&&a.length))return{kind:"cards",cardIds:t};const n=new Set(E({inputLabel:e.inputLabel,viewIds:e.protocolScope.excludeViewIds,viewIdToCardId:e.viewIdToCardId,warnings:e.warnings}));return{kind:"cards",cardIds:t.filter(i=>!n.has(i))}}function mt(e){var c,g,A;const t=[],n=v.validateSemaphorDashboardIntent(e);for(const p of n.warnings)t.push(I(p.code,p.message));for(const p of n.errors)t.push(I(p.code,p.message));const r=ot(e,t),a=[],i=new Map,o=new Map,d=new Map,s=new Set,u=new Set;let h=0;for(const[p,S]of r.sections.entries()){const l=typeof S.title=="string"?S.title:`Section ${p+1}`,J=S.id||T(l,`section-${p+1}`);o.set(J,[]);for(const[Q,m]of X(S).entries()){const Y=dt(m),q=T(m.id||`${l}-${m.title||`View ${Q+1}`}`,`card-${p+1}-${Q+1}`);if(!Y){t.push(I("unsupported_presentation",`Dashboard presentation "${((c=m.presentation)==null?void 0:c.kind)||"unknown"}" is not supported by the dashboard authoring adapter.`,`card-${q}`));continue}if(((g=m.analytics)==null?void 0:g.kind)==="sql"){t.push(I("sql_intent_deferred","SQL analytics intent is valid protocol, but the current dashboard authoring adapter only materializes semantic and physical config-card intents.",`card-${q}`));continue}const Z=Ie(q,s),R=`card-${Z}`;m.id&&i.set(m.id,R),(A=o.get(J))==null||A.push(R);const _e=m.analytics&&"inputs"in m.analytics?m.analytics.inputs:void 0;for(const ee of _e||[]){const te=d.get(ee.inputId)||[];te.push(R),d.set(ee.inputId,te)}a.push({id:R,frameId:`frame-${Z}`,title:m.title,description:m.description,type:Y,role:ct(m),priority:h,section:l,analyticsIntent:st(m.analytics),text:m.text}),h+=1}}const b=r.inputs.map(p=>{const S=ht({protocolScope:p.scope,inputLabel:p.label,allCardIds:a.map(l=>l.id),boundCardIds:d.get(p.id)||[],viewIdToCardId:i,sectionIdToCardIds:o,warnings:t});return S===null?null:pt(p,r.defaultSource,r.sources,S,u,t)}).filter(p=>!!p);return{plan:{version:1,id:`plan-${T(e.title,"dashboard")}`,title:e.title,description:e.description,datasets:r.datasets,sheets:[{id:`sheet-${T(e.title,"dashboard")}`,title:e.title,description:e.description,kind:"dashboard",cards:a}],filterInputs:b.length?b:void 0,warnings:t.length?t:void 0,unresolvedRequests:n.ok?void 0:n.errors.map(p=>p.message)},warnings:t}}exports.DASHBOARD_AUTHORING_BREAKPOINTS=re;exports.DASHBOARD_AUTHORING_MAX_GENERATED_CARDS=$;exports.applyDashboardChangePlan=tt;exports.compileDashboardFromPlan=Ue;exports.compileResponsiveDashboardLayouts=O;exports.dashboardAuthoringDatasetMatchesSource=z;exports.dashboardAuthoringFieldsReferToSameTarget=De;exports.dashboardAuthoringSourceFromField=w;exports.dashboardAuthoringSourceKey=we;exports.dashboardAuthoringSourcesReferToSameDataset=G;exports.dashboardPlanFromSemaphorDashboardIntent=mt;exports.findDashboardAuthoringDatasetForSource=$e;exports.getDashboardAuthoringCardSource=de;exports.isMaterializableDashboardAuthoringSource=N;exports.isSemaphorSourceRef=ae;exports.mergeDashboardAuthoringSources=M;exports.preferDashboardAuthoringSourceMetadata=ie;exports.preferredDashboardAuthoringSource=ve;exports.resolveDashboardAuthoringSource=oe;exports.validateDashboardAuthoringDatasetScope=ce;exports.validateDashboardChangePlan=me;exports.validateDashboardPlan=he;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { s as he, d as W, p as me, v as ne, c as ge } from "../chunks/validators-
|
|
1
|
+
import { s as he, d as W, p as me, v as ne, c as ge } from "../chunks/validators-BqEnmlC6.js";
|
|
2
2
|
import { b as be } from "../chunks/catalog-field-grounding-DoEBOXQd.js";
|
|
3
3
|
const Ie = [
|
|
4
4
|
"lg",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("../chunks/validators-v8WAqhaN.js"),K=require("../chunks/index-BxM99sFL.js"),u=require("react"),F=require("react/jsx-runtime");function x(e){var n;const t=z(e);return{version:1,kind:"metric",id:e.id,label:e.label,source:D(e),metrics:t,primaryMetric:U(e,t),dateField:e.dateField?l(e.dateField,"date"):void 0,timeGrain:e.timeGrain,dimensions:(n=e.dimensions)==null?void 0:n.map(o=>l(o,"dimension")),comparison:Q(e.comparison),orderBy:e.orderBy?{field:l(e.orderBy.field),direction:e.orderBy.direction}:void 0,inputs:k(e.inputs),limit:e.limit}}function U(e,t){if(!e.primaryMetric)return t[0]||{name:"",role:"measure"};const n=l(e.primaryMetric,"measure"),o=n.source?t.find(r=>S.semaphorFieldRefsMatch(r,n)):(()=>{const r=t.filter(i=>i.name===n.name);return r.length===1?r[0]:void 0})();return o?E(n,o):n}function z(e){const t=[];for(const n of e.metrics.map(o=>l(o,"measure"))){if(!n.name)continue;const o=t.findIndex(r=>S.semaphorFieldRefsMatch(r,n));if(o===-1){t.push(n);continue}t[o]=E(t[o],n)}return t}function E(e,t){if(e.aggregate&&t.aggregate&&e.aggregate!==t.aggregate)throw new Error(`Metric "${e.name}" was requested with conflicting aggregate semantics: ${e.aggregate} and ${t.aggregate}.`);return{...S.preferSemaphorFieldRefMetadata(e,t),aggregate:e.aggregate||t.aggregate}}function q(e){if("sort"in e)throw new Error("useSemaphorRecords supports orderBy for a single deterministic sort. Multiple sort clauses are not supported by the analytics protocol yet.");if(!L(e))throw new Error("useSemaphorRecords needs at least one field.");const t=V(e.fields);return{version:1,kind:"records",id:e.id,label:e.label,source:D(e),fields:t,dateField:e.dateField?l(e.dateField,"date"):void 0,timeGrain:e.timeGrain,orderBy:e.orderBy?{field:l(e.orderBy.field),direction:e.orderBy.direction}:void 0,inputs:k(e.inputs),limit:e.limit}}function V(e){return e.map(t=>{const n=l(t);if(!n.role)throw new Error(`useSemaphorRecords field "${n.name}" needs an explicit role.`);return n})}function B(e){return{version:1,kind:"inputOptions",id:e.id,label:e.label,source:D(e),field:l(e.field,"dimension"),search:e.search,limit:e.limit}}function w(e){if("toAnalyticsInput"in e){const t=e.toAnalyticsInput();return{inputId:t.inputId,...t.field?{field:t.field}:{}}}return{inputId:e.inputId,...e.field?{field:e.field}:{}}}function j(e){const t=k(e);return t.length>0?t:void 0}function O(e){return(e||[]).map(N)}function A(e){return O(e).filter(t=>t.isActive)}function $(e){return e.kind==="filter"?{inputId:e.id,kind:e.kind,label:e.label,field:l(e.field,"dimension"),operator:e.operator||"in"}:{inputId:e.id,kind:e.kind,label:e.label}}function C(e=[]){return e.map(t=>typeof t=="object"?t:{label:String(t),value:t})}function y(e){return e==null?!1:Array.isArray(e)?e.length>0:typeof e=="string"?e.trim().length>0:!0}function N(e){return"toAnalyticsInput"in e?e.toAnalyticsInput():"kind"in e&&"isActive"in e?e:{...e,kind:"filter",isActive:y(e.value),value:e.value}}function D(e){return e.source}function L(e){var t;return!!((t=e.fields)!=null&&t.length)}function l(e,t){return{...e,role:e.role||t}}function k(e){return(e||[]).map(w)}function Q(e){if(e)return e}function T(){return{executeMetric:(e,t)=>v(e,t),executeRecords:(e,t)=>v(e,t),executeInputOptions:(e,t)=>v(e,t)}}async function v(e,t){if(!t.token)throw new Error("SemaphorDataAppProvider needs a token to execute queries.");const n=await fetch(W(t),{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.token}`},body:JSON.stringify({intent:e,activeInputs:t.activeInputs,resultShape:e.kind})}),o=await G(n);if(!n.ok||o.error)throw new Error(o.error||`Semaphor Data App execution failed with status ${n.status}.`);return o}async function G(e){const t=await e.text().catch(()=>"");if(!t.trim())return e.ok?{error:"Semaphor Data App execution returned an empty response."}:{};try{return JSON.parse(t)}catch{return e.ok?{error:"Semaphor Data App execution returned invalid JSON.",details:t}:{error:J(e,t),details:t}}}function J(e,t){const n=e.statusText?` ${e.statusText}`:"",o=t.replace(/\s+/g," ").trim();return o?`Semaphor Data App execution failed with status ${e.status}${n}: ${o.slice(0,240)}`:`Semaphor Data App execution failed with status ${e.status}${n}.`}function W(e){const t=H(e).replace(/\/+$/,"");return t?t.endsWith("/api")?`${t}/v1/data-app/execute`:`${t}/api/v1/data-app/execute`:"/api/v1/data-app/execute"}function H(e){if(e.apiBaseUrl)return e.apiBaseUrl;if(!e.token)return"";try{return K.jwtDecode(e.token).apiServiceUrl||""}catch{return""}}const R=u.createContext({});function P(){if(!(typeof window>"u"))return window.__SEMAPHOR_DATA_APP_RUNTIME__}function _(){return u.useContext(R)}function X({token:e,apiBaseUrl:t,executor:n,children:o}){var d;const r=P(),i=((d=r==null?void 0:r.authToken)==null?void 0:d.accessToken)||e,a=(r==null?void 0:r.dataApiBaseUrl)||(r==null?void 0:r.apiBaseUrl)||t,m=u.useMemo(()=>T(),[]),s=n||m,p=u.useMemo(()=>({token:i,apiBaseUrl:a,executor:s}),[a,s,i]);return F.jsx(R.Provider,{value:p,children:o})}const g={value:null},Y={records:[]},I={options:[]};function Z(e){const t=A(e.inputs);try{const n=x(e),o=M(n);return o?{error:o,activeInputs:t,queryKey:c(void 0,t,o),idleData:g}:{intent:n,error:null,activeInputs:t,queryKey:c(n,t),idleData:g}}catch(n){const o=h(n);return{error:o,activeInputs:t,queryKey:c(void 0,t,o),idleData:g}}}function ee(e){const t=A(e.inputs),n=Y;try{const o=q(e),r=M(o);return r?{error:r,activeInputs:t,queryKey:c(void 0,t,r),idleData:n}:{intent:o,error:null,activeInputs:t,queryKey:c(o,t),idleData:n}}catch(o){const r=h(o);return{error:r,activeInputs:t,queryKey:c(void 0,t,r),idleData:n}}}function te(e){try{const t=B(e),n=M(t);return n?{error:n,queryKey:c(void 0,void 0,n),idleData:I}:{intent:t,error:null,queryKey:c(t),idleData:I}}catch(t){const n=h(t);return{error:n,queryKey:c(void 0,void 0,n),idleData:I}}}function h(e){return e instanceof Error?e:new Error(String(e))}function M(e){const t=S.validateSemaphorAnalyticsIntent(e);if(t.ok)return null;const n=t.errors.map(o=>o.path?`${o.code} at ${o.path}: ${o.message}`:`${o.code}: ${o.message}`).join("; ");return new Error(`Invalid Semaphor analytics intent. ${n}`)}function c(e,t,n){return JSON.stringify({intent:e,activeInputs:t,error:n==null?void 0:n.message})}function re(e){const[t,n]=u.useState(e.defaultValue),o=Object.prototype.hasOwnProperty.call(e,"value"),r=o?e.value:t,i=u.useMemo(()=>C(e.options),[e.options]),a=u.useCallback(s=>{var d;const p=s;(d=e.onValueChange)==null||d.call(e,p),o||n(p)},[o,e]),m=u.useCallback(()=>a(void 0),[a]);return u.useMemo(()=>{const s=$(e);return{id:e.id,kind:e.kind,label:e.label,field:s.field,operator:s.operator,controlRole:e.kind==="control"?e.role:void 0,value:r,options:i,isActive:y(r),setValue:a,clear:m,toAnalyticsInput:()=>({inputId:s.inputId,field:s.field,kind:e.kind,label:e.label,value:r,isActive:y(r),operator:s.operator,controlRole:e.kind==="control"?e.role:void 0})}},[m,i,a,e,r])}function ne(e){const t=u.useMemo(()=>Z(e),[e]),n=u.useCallback(i=>{var a;return t.intent?(a=i.executor)==null?void 0:a.executeMetric(t.intent,i):void 0},[t.intent]),o=b(t.queryKey,n,t.idleData,t.activeInputs),r=t.error?t.idleData:o.data;return{id:e.id,intent:t.intent,value:(r==null?void 0:r.value)??null,metrics:r==null?void 0:r.metrics,comparisonValue:r==null?void 0:r.comparisonValue,delta:r==null?void 0:r.delta,deltaPercent:r==null?void 0:r.deltaPercent,records:r==null?void 0:r.records,status:t.error?"error":o.status,isLoading:!t.error&&o.status==="loading",error:t.error||o.error}}function oe(e){const t=u.useMemo(()=>ee(e),[e]),n=u.useCallback(i=>{var a;return t.intent?(a=i.executor)==null?void 0:a.executeRecords(t.intent,i):void 0},[t.intent]),o=b(t.queryKey,n,t.idleData,t.activeInputs),r=t.error?t.idleData:o.data;return{id:e.id,intent:t.intent,records:(r==null?void 0:r.records)||[],columns:r==null?void 0:r.columns,rowCount:r==null?void 0:r.rowCount,status:t.error?"error":o.status,isLoading:!t.error&&o.status==="loading",error:t.error||o.error}}function ie(e){const t=u.useMemo(()=>te(e),[e]),n=u.useCallback(i=>{var a;return t.intent?(a=i.executor)==null?void 0:a.executeInputOptions(t.intent,i):void 0},[t.intent]),o=b(t.queryKey,n,t.idleData),r=t.error?t.idleData:o.data;return{id:e.id,intent:t.intent,options:(r==null?void 0:r.options)||[],status:t.error?"error":o.status,isLoading:!t.error&&o.status==="loading",error:t.error||o.error}}function b(e,t,n,o){const r=_(),i=u.useRef(t),a=u.useRef(o),[m,s]=u.useState({status:"idle",data:n,error:null});return i.current=t,a.current=o,u.useEffect(()=>{let p;try{p=i.current({...r,activeInputs:a.current})}catch(f){s({status:"error",data:n,error:h(f)});return}if(!p){s({status:"idle",data:n,error:null});return}let d=!1;return s(f=>({status:"loading",data:f.data,error:null})),p.then(f=>{d||s({status:"success",data:f,error:null})}).catch(f=>{d||s({status:"error",data:n,error:h(f)})}),()=>{d=!0}},[n,e,r]),m}exports.SemaphorDataAppContext=R;exports.SemaphorDataAppProvider=X;exports.createSemaphorDataAppExecutor=T;exports.hasSemaphorInputValue=y;exports.normalizeSemaphorInputOptions=C;exports.readWindowRuntime=P;exports.toSemaphorActiveInputSnapshots=A;exports.toSemaphorInputBinding=w;exports.toSemaphorInputBindings=j;exports.toSemaphorInputOptionsIntent=B;exports.toSemaphorInputSnapshots=O;exports.toSemaphorInputSpec=$;exports.toSemaphorMetricIntent=x;exports.toSemaphorRecordsIntent=q;exports.useSemaphorDataAppRuntime=_;exports.useSemaphorInput=re;exports.useSemaphorInputOptions=ie;exports.useSemaphorMetric=ne;exports.useSemaphorRecords=oe;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { e as b, f as
|
|
2
|
-
import { j as
|
|
1
|
+
import { e as b, f as $, v as q } from "../chunks/validators-BqEnmlC6.js";
|
|
2
|
+
import { j as O } from "../chunks/index-CuHybtft.js";
|
|
3
3
|
import { createContext as T, useContext as _, useMemo as p, useState as R, useCallback as h, useRef as x, useEffect as K } from "react";
|
|
4
4
|
import { jsx as P } from "react/jsx-runtime";
|
|
5
5
|
function C(t) {
|
|
@@ -13,10 +13,14 @@ function C(t) {
|
|
|
13
13
|
source: A(t),
|
|
14
14
|
metrics: e,
|
|
15
15
|
primaryMetric: U(t, e),
|
|
16
|
-
dateField: t.dateField ?
|
|
16
|
+
dateField: t.dateField ? s(t.dateField, "date") : void 0,
|
|
17
17
|
timeGrain: t.timeGrain,
|
|
18
|
-
dimensions: (n = t.dimensions) == null ? void 0 : n.map((o) =>
|
|
18
|
+
dimensions: (n = t.dimensions) == null ? void 0 : n.map((o) => s(o, "dimension")),
|
|
19
19
|
comparison: W(t.comparison),
|
|
20
|
+
orderBy: t.orderBy ? {
|
|
21
|
+
field: s(t.orderBy.field),
|
|
22
|
+
direction: t.orderBy.direction
|
|
23
|
+
} : void 0,
|
|
20
24
|
inputs: D(t.inputs),
|
|
21
25
|
limit: t.limit
|
|
22
26
|
};
|
|
@@ -24,7 +28,7 @@ function C(t) {
|
|
|
24
28
|
function U(t, e) {
|
|
25
29
|
if (!t.primaryMetric)
|
|
26
30
|
return e[0] || { name: "", role: "measure" };
|
|
27
|
-
const n =
|
|
31
|
+
const n = s(t.primaryMetric, "measure"), o = n.source ? e.find((r) => b(r, n)) : (() => {
|
|
28
32
|
const r = e.filter(
|
|
29
33
|
(i) => i.name === n.name
|
|
30
34
|
);
|
|
@@ -34,7 +38,7 @@ function U(t, e) {
|
|
|
34
38
|
}
|
|
35
39
|
function F(t) {
|
|
36
40
|
const e = [];
|
|
37
|
-
for (const n of t.metrics.map((o) =>
|
|
41
|
+
for (const n of t.metrics.map((o) => s(o, "measure"))) {
|
|
38
42
|
if (!n.name)
|
|
39
43
|
continue;
|
|
40
44
|
const o = e.findIndex(
|
|
@@ -54,7 +58,7 @@ function M(t, e) {
|
|
|
54
58
|
`Metric "${t.name}" was requested with conflicting aggregate semantics: ${t.aggregate} and ${e.aggregate}.`
|
|
55
59
|
);
|
|
56
60
|
return {
|
|
57
|
-
|
|
61
|
+
...$(t, e),
|
|
58
62
|
aggregate: t.aggregate || e.aggregate
|
|
59
63
|
};
|
|
60
64
|
}
|
|
@@ -75,10 +79,10 @@ function z(t) {
|
|
|
75
79
|
label: t.label,
|
|
76
80
|
source: A(t),
|
|
77
81
|
fields: e,
|
|
78
|
-
dateField: t.dateField ?
|
|
82
|
+
dateField: t.dateField ? s(t.dateField, "date") : void 0,
|
|
79
83
|
timeGrain: t.timeGrain,
|
|
80
84
|
orderBy: t.orderBy ? {
|
|
81
|
-
field:
|
|
85
|
+
field: s(t.orderBy.field),
|
|
82
86
|
direction: t.orderBy.direction
|
|
83
87
|
} : void 0,
|
|
84
88
|
inputs: D(t.inputs),
|
|
@@ -87,7 +91,7 @@ function z(t) {
|
|
|
87
91
|
}
|
|
88
92
|
function V(t) {
|
|
89
93
|
return t.map((e) => {
|
|
90
|
-
const n =
|
|
94
|
+
const n = s(e);
|
|
91
95
|
if (!n.role)
|
|
92
96
|
throw new Error(
|
|
93
97
|
`useSemaphorRecords field "${n.name}" needs an explicit role.`
|
|
@@ -102,7 +106,7 @@ function j(t) {
|
|
|
102
106
|
id: t.id,
|
|
103
107
|
label: t.label,
|
|
104
108
|
source: A(t),
|
|
105
|
-
field:
|
|
109
|
+
field: s(t.field, "dimension"),
|
|
106
110
|
search: t.search,
|
|
107
111
|
limit: t.limit
|
|
108
112
|
};
|
|
@@ -135,7 +139,7 @@ function Q(t) {
|
|
|
135
139
|
inputId: t.id,
|
|
136
140
|
kind: t.kind,
|
|
137
141
|
label: t.label,
|
|
138
|
-
field:
|
|
142
|
+
field: s(t.field, "dimension"),
|
|
139
143
|
operator: t.operator || "in"
|
|
140
144
|
} : {
|
|
141
145
|
inputId: t.id,
|
|
@@ -171,7 +175,7 @@ function H(t) {
|
|
|
171
175
|
var e;
|
|
172
176
|
return !!((e = t.fields) != null && e.length);
|
|
173
177
|
}
|
|
174
|
-
function
|
|
178
|
+
function s(t, e) {
|
|
175
179
|
return {
|
|
176
180
|
...t,
|
|
177
181
|
role: t.role || e
|
|
@@ -244,18 +248,18 @@ function et(t) {
|
|
|
244
248
|
if (!t.token)
|
|
245
249
|
return "";
|
|
246
250
|
try {
|
|
247
|
-
return
|
|
251
|
+
return O(t.token).apiServiceUrl || "";
|
|
248
252
|
} catch {
|
|
249
253
|
return "";
|
|
250
254
|
}
|
|
251
255
|
}
|
|
252
|
-
const
|
|
256
|
+
const B = T({});
|
|
253
257
|
function rt() {
|
|
254
258
|
if (!(typeof window > "u"))
|
|
255
259
|
return window.__SEMAPHOR_DATA_APP_RUNTIME__;
|
|
256
260
|
}
|
|
257
261
|
function nt() {
|
|
258
|
-
return _(
|
|
262
|
+
return _(B);
|
|
259
263
|
}
|
|
260
264
|
function pt({
|
|
261
265
|
token: t,
|
|
@@ -263,8 +267,8 @@ function pt({
|
|
|
263
267
|
executor: n,
|
|
264
268
|
children: o
|
|
265
269
|
}) {
|
|
266
|
-
var
|
|
267
|
-
const r = rt(), i = ((
|
|
270
|
+
var l;
|
|
271
|
+
const r = rt(), i = ((l = r == null ? void 0 : r.authToken) == null ? void 0 : l.accessToken) || t, a = (r == null ? void 0 : r.dataApiBaseUrl) || (r == null ? void 0 : r.apiBaseUrl) || e, m = p(() => X(), []), u = n || m, c = p(
|
|
268
272
|
() => ({
|
|
269
273
|
token: i,
|
|
270
274
|
apiBaseUrl: a,
|
|
@@ -272,7 +276,7 @@ function pt({
|
|
|
272
276
|
}),
|
|
273
277
|
[a, u, i]
|
|
274
278
|
);
|
|
275
|
-
return /* @__PURE__ */ P(
|
|
279
|
+
return /* @__PURE__ */ P(B.Provider, { value: c, children: o });
|
|
276
280
|
}
|
|
277
281
|
const g = { value: null }, ot = { records: [] }, S = { options: [] };
|
|
278
282
|
function it(t) {
|
|
@@ -282,13 +286,13 @@ function it(t) {
|
|
|
282
286
|
return o ? {
|
|
283
287
|
error: o,
|
|
284
288
|
activeInputs: e,
|
|
285
|
-
queryKey:
|
|
289
|
+
queryKey: d(void 0, e, o),
|
|
286
290
|
idleData: g
|
|
287
291
|
} : {
|
|
288
292
|
intent: n,
|
|
289
293
|
error: null,
|
|
290
294
|
activeInputs: e,
|
|
291
|
-
queryKey:
|
|
295
|
+
queryKey: d(n, e),
|
|
292
296
|
idleData: g
|
|
293
297
|
};
|
|
294
298
|
} catch (n) {
|
|
@@ -296,7 +300,7 @@ function it(t) {
|
|
|
296
300
|
return {
|
|
297
301
|
error: o,
|
|
298
302
|
activeInputs: e,
|
|
299
|
-
queryKey:
|
|
303
|
+
queryKey: d(void 0, e, o),
|
|
300
304
|
idleData: g
|
|
301
305
|
};
|
|
302
306
|
}
|
|
@@ -308,13 +312,13 @@ function at(t) {
|
|
|
308
312
|
return r ? {
|
|
309
313
|
error: r,
|
|
310
314
|
activeInputs: e,
|
|
311
|
-
queryKey:
|
|
315
|
+
queryKey: d(void 0, e, r),
|
|
312
316
|
idleData: n
|
|
313
317
|
} : {
|
|
314
318
|
intent: o,
|
|
315
319
|
error: null,
|
|
316
320
|
activeInputs: e,
|
|
317
|
-
queryKey:
|
|
321
|
+
queryKey: d(o, e),
|
|
318
322
|
idleData: n
|
|
319
323
|
};
|
|
320
324
|
} catch (o) {
|
|
@@ -322,7 +326,7 @@ function at(t) {
|
|
|
322
326
|
return {
|
|
323
327
|
error: r,
|
|
324
328
|
activeInputs: e,
|
|
325
|
-
queryKey:
|
|
329
|
+
queryKey: d(void 0, e, r),
|
|
326
330
|
idleData: n
|
|
327
331
|
};
|
|
328
332
|
}
|
|
@@ -332,19 +336,19 @@ function ut(t) {
|
|
|
332
336
|
const e = j(t), n = k(e);
|
|
333
337
|
return n ? {
|
|
334
338
|
error: n,
|
|
335
|
-
queryKey:
|
|
339
|
+
queryKey: d(void 0, void 0, n),
|
|
336
340
|
idleData: S
|
|
337
341
|
} : {
|
|
338
342
|
intent: e,
|
|
339
343
|
error: null,
|
|
340
|
-
queryKey:
|
|
344
|
+
queryKey: d(e),
|
|
341
345
|
idleData: S
|
|
342
346
|
};
|
|
343
347
|
} catch (e) {
|
|
344
348
|
const n = y(e);
|
|
345
349
|
return {
|
|
346
350
|
error: n,
|
|
347
|
-
queryKey:
|
|
351
|
+
queryKey: d(void 0, void 0, n),
|
|
348
352
|
idleData: S
|
|
349
353
|
};
|
|
350
354
|
}
|
|
@@ -353,7 +357,7 @@ function y(t) {
|
|
|
353
357
|
return t instanceof Error ? t : new Error(String(t));
|
|
354
358
|
}
|
|
355
359
|
function k(t) {
|
|
356
|
-
const e =
|
|
360
|
+
const e = q(t);
|
|
357
361
|
if (e.ok)
|
|
358
362
|
return null;
|
|
359
363
|
const n = e.errors.map(
|
|
@@ -361,7 +365,7 @@ function k(t) {
|
|
|
361
365
|
).join("; ");
|
|
362
366
|
return new Error(`Invalid Semaphor analytics intent. ${n}`);
|
|
363
367
|
}
|
|
364
|
-
function
|
|
368
|
+
function d(t, e, n) {
|
|
365
369
|
return JSON.stringify({
|
|
366
370
|
intent: t,
|
|
367
371
|
activeInputs: e,
|
|
@@ -374,9 +378,9 @@ function mt(t) {
|
|
|
374
378
|
[t.options]
|
|
375
379
|
), a = h(
|
|
376
380
|
(u) => {
|
|
377
|
-
var
|
|
381
|
+
var l;
|
|
378
382
|
const c = u;
|
|
379
|
-
(
|
|
383
|
+
(l = t.onValueChange) == null || l.call(t, c), o || n(c);
|
|
380
384
|
},
|
|
381
385
|
[o, t]
|
|
382
386
|
), m = h(() => a(void 0), [a]);
|
|
@@ -504,26 +508,26 @@ function E(t, e, n, o) {
|
|
|
504
508
|
u({ status: "idle", data: n, error: null });
|
|
505
509
|
return;
|
|
506
510
|
}
|
|
507
|
-
let
|
|
511
|
+
let l = !1;
|
|
508
512
|
return u((f) => ({
|
|
509
513
|
status: "loading",
|
|
510
514
|
data: f.data,
|
|
511
515
|
error: null
|
|
512
516
|
})), c.then((f) => {
|
|
513
|
-
|
|
517
|
+
l || u({ status: "success", data: f, error: null });
|
|
514
518
|
}).catch((f) => {
|
|
515
|
-
|
|
519
|
+
l || u({
|
|
516
520
|
status: "error",
|
|
517
521
|
data: n,
|
|
518
522
|
error: y(f)
|
|
519
523
|
});
|
|
520
524
|
}), () => {
|
|
521
|
-
|
|
525
|
+
l = !0;
|
|
522
526
|
};
|
|
523
527
|
}, [n, t, r]), m;
|
|
524
528
|
}
|
|
525
529
|
export {
|
|
526
|
-
|
|
530
|
+
B as SemaphorDataAppContext,
|
|
527
531
|
pt as SemaphorDataAppProvider,
|
|
528
532
|
X as createSemaphorDataAppExecutor,
|
|
529
533
|
I as hasSemaphorInputValue,
|
|
@@ -560,7 +560,7 @@ export declare type SemaphorMetricAggregateSource = 'semantic_model' | 'caller_o
|
|
|
560
560
|
|
|
561
561
|
export declare type SemaphorMetricAnalysis = {
|
|
562
562
|
kind: 'period_change';
|
|
563
|
-
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change';
|
|
563
|
+
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change' | 'period';
|
|
564
564
|
direction?: 'increase' | 'decrease' | 'both';
|
|
565
565
|
timeWindow?: SemaphorTimeWindow;
|
|
566
566
|
};
|
|
@@ -583,6 +583,10 @@ export declare type SemaphorMetricIntent = {
|
|
|
583
583
|
targetValue?: number;
|
|
584
584
|
};
|
|
585
585
|
analysis?: SemaphorMetricAnalysis;
|
|
586
|
+
orderBy?: {
|
|
587
|
+
field: SemaphorFieldRef;
|
|
588
|
+
direction: 'asc' | 'desc';
|
|
589
|
+
};
|
|
586
590
|
inputs?: SemaphorInputBinding[];
|
|
587
591
|
limit?: number;
|
|
588
592
|
};
|
|
@@ -759,6 +763,7 @@ export declare type SemaphorTimeWindow = {
|
|
|
759
763
|
unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
760
764
|
value: number;
|
|
761
765
|
anchor?: 'now' | 'latest_available';
|
|
766
|
+
completeness?: 'include_partial' | 'complete_periods';
|
|
762
767
|
};
|
|
763
768
|
|
|
764
769
|
export declare type SemaphorValidationResult = {
|
|
@@ -1908,7 +1908,7 @@ declare type SemaphorInputSpec = {
|
|
|
1908
1908
|
|
|
1909
1909
|
declare type SemaphorMetricAnalysis = {
|
|
1910
1910
|
kind: 'period_change';
|
|
1911
|
-
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change';
|
|
1911
|
+
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change' | 'period';
|
|
1912
1912
|
direction?: 'increase' | 'decrease' | 'both';
|
|
1913
1913
|
timeWindow?: SemaphorTimeWindow;
|
|
1914
1914
|
};
|
|
@@ -1931,6 +1931,10 @@ declare type SemaphorMetricIntent = {
|
|
|
1931
1931
|
targetValue?: number;
|
|
1932
1932
|
};
|
|
1933
1933
|
analysis?: SemaphorMetricAnalysis;
|
|
1934
|
+
orderBy?: {
|
|
1935
|
+
field: SemaphorFieldRef;
|
|
1936
|
+
direction: 'asc' | 'desc';
|
|
1937
|
+
};
|
|
1934
1938
|
inputs?: SemaphorInputBinding[];
|
|
1935
1939
|
limit?: number;
|
|
1936
1940
|
};
|
|
@@ -2000,6 +2004,7 @@ declare type SemaphorTimeWindow = {
|
|
|
2000
2004
|
unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
2001
2005
|
value: number;
|
|
2002
2006
|
anchor?: 'now' | 'latest_available';
|
|
2007
|
+
completeness?: 'include_partial' | 'complete_periods';
|
|
2003
2008
|
};
|
|
2004
2009
|
|
|
2005
2010
|
declare type SemaphorViewPresentation = {
|
|
@@ -538,7 +538,7 @@ declare type SemaphorInputOptionsIntent = {
|
|
|
538
538
|
|
|
539
539
|
declare type SemaphorMetricAnalysis = {
|
|
540
540
|
kind: 'period_change';
|
|
541
|
-
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change';
|
|
541
|
+
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change' | 'period';
|
|
542
542
|
direction?: 'increase' | 'decrease' | 'both';
|
|
543
543
|
timeWindow?: SemaphorTimeWindow;
|
|
544
544
|
};
|
|
@@ -561,6 +561,10 @@ declare type SemaphorMetricIntent = {
|
|
|
561
561
|
targetValue?: number;
|
|
562
562
|
};
|
|
563
563
|
analysis?: SemaphorMetricAnalysis;
|
|
564
|
+
orderBy?: {
|
|
565
|
+
field: SemaphorFieldRef;
|
|
566
|
+
direction: 'asc' | 'desc';
|
|
567
|
+
};
|
|
564
568
|
inputs?: SemaphorInputBinding[];
|
|
565
569
|
limit?: number;
|
|
566
570
|
};
|
|
@@ -630,6 +634,7 @@ declare type SemaphorTimeWindow = {
|
|
|
630
634
|
unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
631
635
|
value: number;
|
|
632
636
|
anchor?: 'now' | 'latest_available';
|
|
637
|
+
completeness?: 'include_partial' | 'complete_periods';
|
|
633
638
|
};
|
|
634
639
|
|
|
635
640
|
export declare type WorkspaceContext = {
|
|
@@ -167,6 +167,7 @@ export declare type SemaphorDataAppMetricSpec = SemaphorDataAppSourceSpec & {
|
|
|
167
167
|
timeGrain?: SemaphorTimeGrain;
|
|
168
168
|
dimensions?: SemaphorDataAppFieldSpec[];
|
|
169
169
|
comparison?: SemaphorDataAppMetricComparison;
|
|
170
|
+
orderBy?: SemaphorDataAppOrderBy;
|
|
170
171
|
inputs?: SemaphorDataAppInputReference[];
|
|
171
172
|
limit?: number;
|
|
172
173
|
};
|
|
@@ -175,6 +176,11 @@ export declare type SemaphorDataAppNonEmptyArray<T> = [T, ...T[]];
|
|
|
175
176
|
|
|
176
177
|
export declare type SemaphorDataAppOptionValue = string | number | boolean;
|
|
177
178
|
|
|
179
|
+
export declare type SemaphorDataAppOrderBy = {
|
|
180
|
+
field: SemaphorDataAppFieldSpec;
|
|
181
|
+
direction: 'asc' | 'desc';
|
|
182
|
+
};
|
|
183
|
+
|
|
178
184
|
export declare function SemaphorDataAppProvider({ token, apiBaseUrl, executor, children, }: SemaphorDataAppProviderProps): JSX.Element;
|
|
179
185
|
|
|
180
186
|
export declare type SemaphorDataAppProviderProps = SemaphorDataAppExecutorContext & {
|
|
@@ -215,10 +221,7 @@ export declare type SemaphorDataAppRecordsFieldSpec = SemaphorFieldRef & {
|
|
|
215
221
|
role: NonNullable<SemaphorFieldRef['role']>;
|
|
216
222
|
};
|
|
217
223
|
|
|
218
|
-
export declare type SemaphorDataAppRecordsOrderBy =
|
|
219
|
-
field: SemaphorDataAppFieldSpec;
|
|
220
|
-
direction: 'asc' | 'desc';
|
|
221
|
-
};
|
|
224
|
+
export declare type SemaphorDataAppRecordsOrderBy = SemaphorDataAppOrderBy;
|
|
222
225
|
|
|
223
226
|
export declare type SemaphorDataAppRecordsResult<TRecord extends Record<string, unknown> = Record<string, unknown>> = SemaphorDataAppQueryState & SemaphorDataAppRecordsData<TRecord> & {
|
|
224
227
|
id?: string;
|
|
@@ -280,7 +283,7 @@ declare type SemaphorInputOptionsIntent = {
|
|
|
280
283
|
|
|
281
284
|
declare type SemaphorMetricAnalysis = {
|
|
282
285
|
kind: 'period_change';
|
|
283
|
-
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change';
|
|
286
|
+
orderBy?: 'absolute_change' | 'positive_change' | 'negative_change' | 'period';
|
|
284
287
|
direction?: 'increase' | 'decrease' | 'both';
|
|
285
288
|
timeWindow?: SemaphorTimeWindow;
|
|
286
289
|
};
|
|
@@ -303,6 +306,10 @@ declare type SemaphorMetricIntent = {
|
|
|
303
306
|
targetValue?: number;
|
|
304
307
|
};
|
|
305
308
|
analysis?: SemaphorMetricAnalysis;
|
|
309
|
+
orderBy?: {
|
|
310
|
+
field: SemaphorFieldRef;
|
|
311
|
+
direction: 'asc' | 'desc';
|
|
312
|
+
};
|
|
306
313
|
inputs?: SemaphorInputBinding[];
|
|
307
314
|
limit?: number;
|
|
308
315
|
};
|
|
@@ -372,6 +379,7 @@ declare type SemaphorTimeWindow = {
|
|
|
372
379
|
unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';
|
|
373
380
|
value: number;
|
|
374
381
|
anchor?: 'now' | 'latest_available';
|
|
382
|
+
completeness?: 'include_partial' | 'complete_periods';
|
|
375
383
|
};
|
|
376
384
|
|
|
377
385
|
export declare function toSemaphorActiveInputSnapshots(inputs: SemaphorDataAppInputReference[] | undefined): SemaphorDataAppInputSnapshot[];
|