@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.27 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{ArcadeDate as e}from"../arcade/ArcadeDate.js";import t from"../core/Error.js";import r from"../core/Logger.js";import s from"../geometry/SpatialReference.js";const i=()=>r.getLogger("esri.support.arcadeOnDemand"),a=["geometry","scale","timeProperties"];function n(e,t){if(null!=t)for(const r of a)t.hasArcadeDependency(r)&&e.add(r);return e}let c;function o(){return c||(c=(async()=>{const e=await import("./arcadeUtils.js");return{arcade:e.arcade,arcadeUtils:e,Dictionary:e.Dictionary,Feature:e.arcadeFeature,Voxel:e.Voxel}})()),c}const l=(e,t,r)=>d.create(e,t,r,null,["$feature","$view"],[]),p=(e,t,r)=>d.create(e,t,r,null,["$feature","$view"],[]),u=(e,t,r,s)=>d.create(e,t,r,s,["$feature","$view"],[]);class d{constructor(e,t,r,s,i,a,n){this._dependencies=new Map,this.services=null,this.script=e,this.evaluate=s;const c=Array.isArray(a)?a:a?.fields;this.fields=c??[],this._syntaxTree=r,this._arcade=t,this._arcadeFeature=i,this._spatialReference=n,this._dependencies.set("geometry",t.scriptTouchesGeometry(this._syntaxTree)),this._dependencies.set("scale",this._arcade.referencesMember(this._syntaxTree,"scale")),this._dependencies.set("timeProperties",this._arcade.scriptUsesViewProperties(this._syntaxTree,["timeProperties"]))}static async create(r,a,n,c,l,p){const{arcade:u,Feature:m,Dictionary:f}=await o(),h=a instanceof s?a:s.fromJSON(a);let w;try{w=u.parseScript(r,p)}catch(j){return i().error(new t("arcade-bad-expression","Failed to parse arcade script",{script:r,error:j})),null}const y=l.reduce(((e,t)=>({...e,[t]:null})),{});let v=null;null!=c&&(v=new f(c),v.immutable=!0,y.$config=null);const $=u.scriptUsesGeometryEngine(w),_=$&&u.enableGeometrySupport(),g=u.scriptUsesFeatureSet(w)&&u.enableFeatureSetSupport(),F=u.scriptIsAsync(w),S=F&&u.enableAsyncSupport(),b={vars:y,spatialReference:h,useAsync:!!S};await Promise.all([_,g,S]);const A=new Set;await u.loadDependentModules(A,w,null,F,$);const D=new f;D.immutable=!1,D.setField("scale",0);const P=u.compileScript(w,b),T=(t,r)=>{const s=t.$view?.timeZone;if("$view"in t&&t.$view){let r;if(D.setField("scale","object"==typeof t.$view&&"scale"in t.$view?t.$view.scale:void 0),"object"==typeof t.$view&&"timeProperties"in t.$view&&null!=t.$view.timeProperties){const{currentStart:i,currentEnd:a}=t.$view.timeProperties;r=new f({currentStart:null!=i?null!=s?e.epochToArcadeDate(i,s):e.unknownEpochToArcadeDate(i):void 0,currentEnd:null!=a?null!=s?e.epochToArcadeDate(a,s):e.unknownEpochToArcadeDate(a):void 0,startIncluded:!0,endIncluded:!0})}D.setField("timeProperties",r),t.$view=D}return v&&(t.$config=v),P({vars:t,spatialReference:h,services:r,timeZone:s})};return new d(r,u,w,T,new m,n,h)}repurposeFeature(e){return e.geometry&&!e.geometry.spatialReference&&(e.geometry.spatialReference=this._spatialReference),this._arcadeFeature.repurposeFromGraphicLikeObject(e.geometry,e.attributes,{fields:this.fields}),this._arcadeFeature}references(e){return this._dependencies.get(e)??!1}}export{d as ArcadeExpression,n as collectExpressionDependencies,u as createDictionaryExpression,l as createLabelExpression,p as createRendererExpression,o as loadArcade};