@vertigis/arcgis-extensions 40.3.0 → 40.3.2

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/data/convert.js CHANGED
@@ -1 +1 @@
1
- import e from"@arcgis/core/geometry/Point";import t from"@arcgis/core/geometry/SpatialReference";import{translate as r}from"../locale/language.js";import{toEsriApiGeometry as o,toPortalGeometry as a}from"../portal/Geometry.js";import{checkArg as n,assertNever as i}from"../utilities/checkArg.js";import{parse as s,format as m,DEFAULT_PARSING_FORMATS as c,DateFormat as l,INVALID_DATE as u}from"../utilities/date.js";import{esriToWKT as f,esriToGeoJSON as d,geoJSONToEsri as p,wktToEsri as y,esriWkidToWkt as g,esriWktToWkid as h,project as w,isPoint as F,isMultipoint as N,isPolyline as S,isPolygon as T,isExtent as O}from"../utilities/geometry.js";import{getLogger as R}from"../utilities/log.js";import{isNumeric as G,parse as E,format as x,NumberFormat as b}from"../utilities/number.js";import{caseInsensitiveEquals as A}from"../utilities/string.js";import{Feature as D}from"./Feature.js";import{FeatureSet as M}from"./FeatureSet.js";const I=["=","-","+","@"],_='"',v="\r\n",L="\n",C=[...c.map(le),"M/d/yy"],P=/(\w+)_(point|multipoint|polyline|polygon)z?/;var $;function U(){return R("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}($||($={}));export const FIELD_NAME_REGEX=/[^a-zA-Z\d_]/g;export var GeometryFormat;!function(e){e.NONE="NONE",e.WKT="WKT",e.XY="XY",e.XYZ="XYZ",e.LAT_LON="LAT_LONG",e.GEO_JSON="GEO_JSON",e.ARCGIS_JSON="ARCGIS_JSON"}(GeometryFormat||(GeometryFormat={}));export const geometryTypeHeaders={[GeometryFormat.XYZ]:[["x","y","z"]],[GeometryFormat.XY]:[["x","y"]],[GeometryFormat.LAT_LON]:[["latitude","longitude"],["lat","lon"],["lat","long"]],[GeometryFormat.ARCGIS_JSON]:[["geometry"]],[GeometryFormat.GEO_JSON]:[["geometry"]],[GeometryFormat.WKT]:[["geometry"]]};const j=[[GeometryFormat.ARCGIS_JSON,te],[GeometryFormat.GEO_JSON,re],[GeometryFormat.WKT,oe]],W=new Map(j);export async function uploadDataToFeatureSet(t){const o=function(t){const{data:r,includeHeaderRow:o,geometryFormat:a,geometryFields:n,locale:s,numberFormat:m,inSpatialReference:c}=t,l=o?r.slice(1):r;if(a===GeometryFormat.NONE)return{columnIndices:[]};const u=(t,r)=>{const o=r===GeometryFormat.XYZ,a=r===GeometryFormat.LAT_LON;return{columnIndices:t,geometries:l.map((r=>{if(r.length>=Math.max(...t)&&G(r[t[0]]?.raw,s)&&G(r[t[1]]?.raw,s)&&(!o||G(r[t[2]]?.raw,s)))return new e({x:E({locale:s,format:m},a?r[t[1]].raw:r[t[0]].raw),y:E({locale:s,format:m},a?r[t[0]].raw:r[t[1]].raw),z:o?E({locale:s,format:m},r[t[2]].raw):0,spatialReference:c})}))}},f=(e,t)=>({columnIndices:[e],geometries:l.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),c)}))}),d=(e,t)=>{switch(t){case GeometryFormat.NONE:return{columnIndices:[0]};case GeometryFormat.LAT_LON:case GeometryFormat.XYZ:case GeometryFormat.XY:return u(e,t);case GeometryFormat.ARCGIS_JSON:return f(e[0],te);case GeometryFormat.GEO_JSON:return f(e[0],re);case GeometryFormat.WKT:return f(e[0],oe);default:return i(t,new Error(`Unknown geometry format "${t}".`))}};if(a){const e=ae(o?r[0]:r[0].map(((e,t)=>({raw:t.toString()}))),a,o?n:n.map((e=>""+(parseInt(e.match(/\d+/g)[0])-1))));if(o&&void 0===e)throw new Error(`Error parsing file data: Expected geometry columns ${geometryTypeHeaders[a][0].join(",")} are missing for GeometryType.${a}`);return d(e??[0],a)}const[p,y]=ie(r,c,o);if(p===GeometryFormat.NONE)return{columnIndices:[]};return y.length>1?u(y,p):f(y[0],W.get(p))}(t),a=function(e,t){const{data:o,displayField:a,includeHeaderRow:n,inSpatialReference:i,outSpatialReference:s,generatePrimaryKey:m}=e,c={fields:[]},l=e=>!(!t.columnIndices||0===t.columnIndices.length)&&t.columnIndices.includes(e);let{primaryKeyField:u}=e,f=0;for(let t=0;t<o[0].length;t++){if(l(t))continue;const a=me(e,t,!m&&!u&&!c.fields.find((e=>"esriFieldTypeOID"===e.type)));let i=o[0][t]?.raw?.toString(),s=i?.replace(FIELD_NAME_REGEX,"_");n&&s||(s="field"+ ++f,i=r("gcx.api.data.convert.import-field-alias",f)),c.fields.push({alias:i,name:s,type:a}),"esriFieldTypeOID"===a&&(u=s)}if(c.spatialReference=s??t.geometries?.[0]?.spatialReference??i,t.geometries?.length){const e=t.geometries.filter((e=>void 0!==e)).map((e=>e.type)),r=e[0];c.geometryType=e.every((e=>e===r))?r:void 0}if(!c.fields.find((e=>"esriFieldTypeOID"===e.type))){const e=c.fields.length+1,t=!!c.fields.find((e=>"objectid"===e.name.toLowerCase()));u=t?`OBJECTID_${e}`:"OBJECTID",c.fields.push({name:u,alias:u,type:"esriFieldTypeOID"})}return c.displayField=a??c.fields.find((e=>e.name!==u&&"esriFieldTypeString"===e.type))?.name??c.fields.find((e=>e.name!==u))?.name??u,c.primaryKeyField=u,c}(t,o),n=await async function(e,t,r){const{data:o,includeHeaderRow:a,outFields:n,escapeFormulaChars:i,locale:s,numberFormat:m,dateFormat:c}=e,{spatialReference:l}=r,u=[],f=a?o.slice(1):o,d=(e,r)=>!t.columnIndices||0===t.columnIndices.length||!t.columnIndices.includes(r);return await Promise.all(f.map((async(e,o)=>{const a=new D;for(let t=0;t<r.fields.length;t++){const l=r.fields[t],u=e.filter(d);if(n.includes("*")||n.includes(l.name)){let e=await ce(u[t]?.raw,l,{escapeFormulaChars:i,dateFormat:c,numberFormat:m,locale:s});"esriFieldTypeOID"===l.type&&null===e&&(e=o),a.attributes.set(l.name,e)}}t.geometries&&(a.geometry=await k(t.geometries[o],l)),u.push(a)}))),u}(t,o,a);return new M({features:n,schema:a})}export async function toCsv(e,r){n("featureSet",e).isNotMissing();const o=Array.from(e),a={...{useFormattedValues:!1,alwaysQuote:!1,escapeFormulaChars:!0,delimiter:",",dateFormat:l.ROUND_TRIP,geometryFormat:o.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,includeByteOrderMark:!0,outSpatialReference:t.WGS84,includeHeaderRow:!0,outFields:J(e.source),rowDelimiter:navigator.platform.startsWith("Win")?v:L},...r},{includeByteOrderMark:i,includeHeaderRow:s,delimiter:m,outFields:c,rowDelimiter:u}=a,f=[];i&&f.push("\ufeff");const d=z(o,a),p=H(o,c,e.schema,!0),y=H(o,c,e.schema,!1);if(s){const e=[];for(const t of d)e.push(B(t,a));for(const t of p)e.push(B(t,a));for(const t of y)e.push(B(t,a));const t=e.join(m)+u;f.push(t)}await Promise.all(o.map((async e=>{const t=[],r=(t,r)=>B(Z(K(e,t,r),r),r);t.push(...await async function(e,t){let r=await Y(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":Z(e,t))));return r.map((e=>""===e?"":B(e,t)))}(e.geometry,a)),t.push(...p.map((e=>r(e,a)))),t.push(...y.map((e=>r(e,a))));const o=`${t.join(m)}${u}`;f.push(o)})));return new Blob(f,{type:"text/plain",endings:u===L||u===v?"transparent":"native"})}export async function csvToUploadData(e,t){let o;if(n("csvData",e).isNotMissing(),e instanceof Blob){const t=new Promise(((t,r)=>{const o=new FileReader;o.onload=()=>{t(o.result)},o.onerror=()=>{r(o.error)},o.readAsText(e)}));o=await t}else o=e;const a=X(t),i=function(e,t,r){const o=[],a=(e,t)=>{const o=[];return ee(e,r,((r,a)=>{const n=e.substring(r,a);return o.push({raw:Q(n,t,o.length)}),!0})),o};if(ee(e,t,((t,r)=>{const n=e.substring(t,r);return n.length>0&&o.push(a(n,o.length)),!0})),o.length){const e=o[0].length;o.forEach(((t,r)=>{if(t.length!==e)throw new Error(`Detected invalid CSV: Row ${r} does not have expected number of columns: ${e}`)}))}return o}(o,a.rowDelimiter||function(e){let t=L;return ee(e,v,((r,o)=>(0===r&&o===e.length||(t=v),!1))),t}(o),a.delimiter);let{geometryFormat:s,geometryFields:m}=t;if(!s){const[e,t]=ie(i,a.inSpatialReference,a.includeHeaderRow);s=e,m=t.map((e=>a.includeHeaderRow?i[0][e]?.raw??r("gcx.api.data.convert.import-field-alias",(e+1).toString()):r("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:i,...a,geometryFormat:s,geometryFields:m}}export async function csvToFeatureSet(e,t){const r=X(t);return uploadDataToFeatureSet(await csvToUploadData(e,r))}export async function toXLSX(e,r){n("featureSet",e).isNotMissing();const o=Array.from(e),a={...{useFormattedValues:!1,includeHeaderRow:!0,escapeFormulaChars:!0,geometryFormat:o.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,outFields:J(e.source),outSpatialReference:t.WGS84,dateFormat:l.DEFAULT,numberFormat:b.DEFAULT,sheetName:"sheet1"},...r},{outFields:i,includeHeaderRow:s,dateFormat:m,numberFormat:c}=a,u=[],f=z(o,a),d=H(o,i,e.schema,!0),p=H(o,i,e.schema,!1);if(s){const t=f.concat(d).concat(function(e,t){const r=t?.schema?.fieldExtensions.initializedItems.map((e=>e.field));return e.map((e=>r?.find((t=>t.name===e))?.alias??e))}(p,e.source));u.push(t)}await Promise.all(o.map((async e=>{const t=[];t.push(...await Y(e.geometry,a));for(const r of d){const o=fe(e.attributes.get(r),a);t.push(o)}for(const r of p){const o=fe(K(e,r,a),a);t.push(o)}t.every((e=>"string"!=typeof e||e.length<=32767))?u.push(t):U().warn(`toXLSX cell limit exceeded, feature (${e.primaryKey??e.id}) omitted.`)})));const y=await import("xlsx"),g={SheetNames:[],Sheets:{}},h=y.utils.aoa_to_sheet(u,{cellDates:!0});for(const e of Object.keys(h).filter((e=>!e.startsWith("!")))){const t=h[e];"d"===t.t?t.z=le(m??l.ROUND_TRIP):"n"===t.t&&(t.z=ue(c))}g.SheetNames.push(a.sheetName),g.Sheets[a.sheetName]=h;const w=y.write(g,{type:"binary",bookType:"xlsx",compression:!0,bookSST:!0,cellDates:!0}),F=new Uint8Array(w.length);for(let e=0;e<w.length;e++)F[e]=w.charCodeAt(e);return new Blob([F.buffer],{type:"text/plain"})}export async function xlsxToUploadData(e,t){n("xlsxData",e).isNotMissing();const o=X(t),a=await async function(e,t){const r=await import("xlsx"),o=new Promise(((o,a)=>{const n=new FileReader;n.onload=()=>{const e=new Uint8Array(n.result);let a="";for(const t of e)a+=String.fromCharCode(t);const i=r.read(a,{type:"binary",cellDates:!0}),s=t.sheetName||i.SheetNames[0],m=i.Sheets[s];o(m)},n.onerror=()=>{a(n.error)},n.readAsArrayBuffer(e)})),a=await o,n=r.utils.decode_range(a["!ref"]),i=[];for(let e=n.s.r;e<=n.e.r;e++){const t=[];for(let o=n.s.c;o<=n.e.c;o++){const n=a[`${r.utils.encode_cell({r:e,c:o})}`];t.push(n?{raw:n.v,formatted:"s"===n.t?void 0:n.w}:{raw:""})}i.push(t)}return i}(e,o);let{geometryFormat:i,geometryFields:s}=t;if(!i){const[e,t]=ie(a,o.inSpatialReference,o.includeHeaderRow);i=e,s=t.map((e=>o.includeHeaderRow?a[0][e]?.raw.toString()??r("gcx.api.data.convert.import-field-alias",(e+1).toString()):r("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:a,...o,geometryFormat:i,geometryFields:s}}export async function xlsxToFeatureSet(e,t){n("xlsxData",e).isNotMissing();const r=X(t);return uploadDataToFeatureSet(await xlsxToUploadData(e,r))}export async function toShapefile(e,r){n("featureSet",e).isNotMissing();const[{default:o},a]=await Promise.all([import("jszip"),import("../forked-libs/shp-write/index.js")]),i=Array.from(e),s={...{useFormattedValues:!1,outFields:J(e.source),fileName:e.title||"export"},...r},{outFields:m,outSpatialReference:c,fileName:l}=s,u=e=>e.geometry.hasZ||e.geometry.hasM,f=new Map,d=i.filter((e=>F(e.geometry)));f.set("POINTZ",d.filter(u)),f.set("POINT",d.filter((e=>!u(e))));const p=i.filter((e=>N(e.geometry)));f.set("MULTIPOINTZ",p.filter(u)),f.set("MULTIPOINT",p.filter((e=>!u(e))));const y=i.filter((e=>S(e.geometry)));f.set("POLYLINEZ",y.filter(u)),f.set("POLYLINE",y.filter((e=>!u(e))));const h=i.filter((e=>T(e.geometry)||O(e.geometry)));f.set("POLYGONZ",h.filter(u)),f.set("POLYGON",h.filter((e=>!u(e))));const w=H(i,m,e.schema,!0);let R=H(i,m,e.schema,!1);R=w.concat(R);const G=new o,E=Array.from(f.keys()).filter((e=>f.get(e).length>0));await Promise.all(E.map((async r=>{const o=f.get(r),n=await Promise.all(o.map((e=>k(e.geometry,c)))),i=await async function(e){const{wkid:r,wkt:o}=e[0].spatialReference;if(!e.every((e=>e.spatialReference.wkid===r&&e.spatialReference.wkt===o)))throw new Error("Cannot create shapefile that contains geometries with different spatial references.");return o??g(r??t.WGS84.wkid)}(n),m=s.useFormattedValues?Object.assign({},...R.map((e=>({[e]:$.STRING})))):function(e,t,r,o){const a={};for(const n of t){if(e.some((e=>V(e,n)))){a[n]=$.STRING;continue}const t=r?r.fields.find((e=>e.name===n)):void 0;if(t){switch(t.type){case"oid":case"double":case"integer":case"single":case"small-integer":a[n]=$.NUMBER;break;case"date":a[n]=o?$.NUMBER:$.DATE;break;default:a[n]=$.STRING}continue}const i=(e,t)=>e.attributes.get(t)??e.presentableAttributes.get(t);e.every((e=>i(e,n)instanceof Date||void 0===i(e,n)))&&e.some((e=>i(e,n)instanceof Date))?a[n]=o?$.NUMBER:$.DATE:e.every((e=>"number"==typeof i(e,n)||void 0===i(e,n)))&&e.some((e=>"number"==typeof i(e,n)))?a[n]=$.NUMBER:e.every((e=>"boolean"==typeof i(e,n)||void 0===i(e,n)))&&e.some((e=>"boolean"==typeof i(e,n)))?a[n]=$.BOOLEAN:a[n]=$.STRING}return a}(o,R,e.schema,"timestamp"===s.dateFormat),u=function(e){return e.map((e=>{if(F(e)){const{x:t,y:r,z:o,m:a}=e,n=[t,r];return e.hasZ&&n.push(o),e.hasM&&n.push(a),de(n,e)}if(N(e))return pe(e.points,e);if(S(e))return ye(e.paths,e);if(T(e))return ye(e.rings,e);if(O(e)){const t=[e.xmin,e.ymax];return[[t,[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin],t]]}throw new Error("Unsupported geometry type.")}))}(n),d=function(e,t,r,o){const a=[];for(const n of e){const e={};for(const a of t){let t=K(n,a,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=ge(t,r[a],o)}e[a]=t}a.push(e)}return a}(o,R,m,s);a.write(d,r,u,((e,t)=>{const o=E.length>1?`${l}_${r.toLowerCase()}`:l;G.file(`${o}.shp`,t.shp.buffer,{binary:!0}),G.file(`${o}.shx`,t.shx.buffer,{binary:!0}),G.file(`${o}.dbf`,t.dbf.buffer,{binary:!0}),G.file(`${o}.prj`,i)}))})));const x=await G.generateAsync({type:"uint8array"});return new Blob([x.buffer],{type:"text/plain"})}export async function shapefileToUploadData(r,o){n("shapefileData",r).isNotMissing();const a=X(o),i=new Promise(((e,t)=>{const o=new FileReader;o.onload=()=>{e(o.result)},o.onerror=()=>{t(o.error)},o.readAsArrayBuffer(r)})),[{default:s},{default:m}]=await Promise.all([import("jszip"),import("shpjs")]),c=await i,l=await s.loadAsync(new Uint8Array(c)),u=l.filter((()=>!0)).map((e=>e.name));let f,d=u.filter((e=>e.endsWith(".shp"))).map((e=>e.substring(0,e.length-4)));if(d=function(e){if(!e.length)return[];let t=e[0];const r=t.match(P);return r?(t=r[1],e.filter((e=>{const r=e.match(P);return r&&r[1]===t}))):[t]}(d),u.some((e=>e.endsWith(".prj")))&&!d.every((e=>u.includes(`${e}.prj`))))throw new Error("Shapefile zip must contain the same prj file for each separate shapefile");await Promise.all(u.filter((e=>e.endsWith(".prj"))).map((async e=>{const t=await l.file(e).async("string");if(f){if(t!==f)throw new Error("Shapefile zip must contain the same prj file for each separate shapefile")}else f=t})));let y=[],g=[];for(const e of d){if(!u.includes(`${e}.shx`)||!u.includes(`${e}.dbf`))throw new Error("Shapefile must contain shp, shx, and dbf files.");const t=await l.file(`${e}.shp`).async("uint8array"),r=m.parseShp(t),o=await l.file(`${e}.dbf`).async("uint8array"),a=m.parseDbf(o);if(a.length!==r.length)throw new Error("Shapefile must contain shp, shx, and dbf files.");y=y.concat(a),g=g.concat(r)}const w=await Promise.all(g.map((r=>async function(r,o){const a=F(r)?function(r){n("geometry.coordinates",r.type).matches("Point"),n("geometry.coordinates",r.coordinates).satisfies((e=>"number"==typeof e||Array.isArray(e)));const[o,a,i]=r.coordinates,s=new e({x:o,y:a,spatialReference:t.WGS84});if(Array.isArray(i)){const[e,t]=i;!e&&!t||e?s.z=e:s.m=t}return s}(r):p(r);if(o){let e;try{const r=await h(o);e=new t({wkid:E(r)})}catch{}e||(e=new t({wkt:o})),a.spatialReference=e}return a}(r,f)))),N=geometryTypeHeaders[GeometryFormat.ARCGIS_JSON][0][0];y.forEach(((e,t)=>e[N]=JSON.stringify(w[t].toJSON())));return{data:function(e){const t=e.map((e=>Object.keys(e))).reduce(((e,t)=>e.concat(t.filter((t=>!e.includes(t))))),[]);return[t.map((e=>({raw:e}))),...e.map((e=>t.map((t=>({raw:e[t]})))))]}(y),...a,geometryFormat:GeometryFormat.ARCGIS_JSON,geometryFields:[N],inSpatialReference:w[0]?.spatialReference??t.fromJSON({wkid:4326})}}export async function shapefileToFeatureSet(e,t){n("shapefileData",e).isNotMissing();const r=X(t);return uploadDataToFeatureSet(await shapefileToUploadData(e,r))}function X(e){return{...{delimiter:",",escapeFormulaChars:!0,includeHeaderRow:!0,outFields:["*"],inSpatialReference:t.WGS84,generatePrimaryKey:!1,locale:"inv"},...e,detectOid:!e?.primaryKeyField}}function z(e,t){return t.geometryFormat===GeometryFormat.XYZ?["x","y","z"]:t.geometryFormat===GeometryFormat.XY?["x","y"]:t.geometryFormat===GeometryFormat.LAT_LON?["latitude","longitude"]:t.geometryFormat===GeometryFormat.NONE?[]:["geometry"]}function H(e,t,r,o){const a=r.fields.filter((e=>"oid"===e.type)).map((e=>e.name)).toArray();if(o)return a;if(t&&!t.includes("*"))return t.filter((e=>!a.includes(e)));{const t=r.fields.filter((e=>"oid"!==e.type)).map((e=>e.name)).toArray();let o=[];for(const r of e)for(const e of r.attributes.keys())t.includes(e)||a.includes(e)||o.includes(e)||o.push(e);return o=o.sort(),t.concat(o)}}function J(e){if(!e)return["*"];const t=e.featureSettings.popupTemplate?.content;return(Array.isArray(t)?t.find((e=>"fields"===e.type))?.fieldInfos?.filter((e=>e.visible))?.map((e=>e.fieldName)):void 0)??e.featureSettings.popupTemplate?.fieldInfos?.filter((e=>e.visible))?.map((e=>e.fieldName))??["*"]}async function Y(e,t){const r=await k(e,t.outSpatialReference);if(t.geometryFormat===GeometryFormat.XYZ){if(!r)return["","",""];if(!F(r))throw new Error("Cannot use geometry format XYZ with non-point geometry");return[r.x,r.y,r.z]}if(t.geometryFormat===GeometryFormat.XY){if(!r)return["",""];if(!F(r))throw new Error("Cannot use geometry format XY with non-point geometry");return[r.x,r.y]}if(t.geometryFormat===GeometryFormat.LAT_LON){if(!r)return["",""];if(!F(r))throw new Error("Cannot use geometry format LAT_LONG with non-point geometry");return[r.y,r.x]}return t.geometryFormat===GeometryFormat.ARCGIS_JSON?r?[JSON.stringify(a(r))]:[""]:t.geometryFormat===GeometryFormat.WKT?r?[f(r)]:[""]:t.geometryFormat===GeometryFormat.GEO_JSON?r?[JSON.stringify(d(r))]:[""]:[]}async function k(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await w([e],t))[0]:e}function B(e,t){const r=[t.delimiter,_,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(_,"g"),`${_}${_}`);return`${_}${t}${_}`}return e}function Z(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e){const r=t.numberFormat||b.ROUND_TRIP;return x(r,e)}if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime().toString():m({format:t.dateFormat,timeZone:"UTC"},e)}let r=e.toString();return t.escapeFormulaChars&&(r=q(r)),r}function K(e,t,r){if(r.useFormattedValues||V(e,t))return e.presentableAttributes.get(t)??e.attributes.get(t);if("date"===e.schema.findFieldByName(t)?.type){const r=s(e.attributes.get(t));if(!isNaN(r.getTime()))return r}return e.attributes.get(t)??e.presentableAttributes.get(t)}function V(e,t){return!!A(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function q(e){for(const t of I)if(e.startsWith(t))return`\t${e}`;return e}function Q(e,t,r){const o=e.startsWith(_),a=e.endsWith(_);if(o&&!a||!o&&a)throw new Error(`Detected invalid CSV: Missing opening or closing quote for value at row:${t} column:${r}`);const n=o?e.substring(_.length,e.length-_.length):e;let i=-1;return ee(n,_,((e,o)=>{if(o===n.length)return!0;if(i<0){if(o!==n.length)return i=o,!0}else if(o===i+_.length)return i=-1,!0;throw new Error(`Detected invalid CSV: Non-escaped quote for value at row:${t} column:${r}`)})),n.replace(new RegExp(`${_}${_}`,"g"),_)}function ee(e,t,r){let o,a=!1,n=0,i=0;for(;o=e.indexOf(t,n),!(o<0);){for(let t=n;t<o;)e.substring(t).startsWith(_)?(a=!a,t+=_.length):t++;const s=o+t.length;if(!a){const e=r(i,o);if(i=s,!e)break}n=s}r(i,e.length)}function te(e,t){const r=JSON.parse(e),a=o(r);return r.spatialReference||(a.spatialReference=t),a}function re(e,t){const r=p(JSON.parse(e));return r.spatialReference=t,r}function oe(e,t){const r=y(e);return r.spatialReference=t,r}function ae(e,t,r){const o=r?[r]:geometryTypeHeaders[t];for(const t of o){const r=t.map((t=>e.map((e=>e?.raw?.toString().trim().toLowerCase())).indexOf(t.trim().toLowerCase())));if(r.every((e=>e>=0)))return r}}function ne(e,t){return e.map(((e,r)=>{const o=e?.raw;if("string"==typeof o&&""!==o)try{return t(o,void 0),r}catch{return}})).find((e=>void 0!==e))}function ie(e,t,r){const o=r?e.slice(1):e;if(r){const r=ae(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,a]of j){try{se(r[0],a,t,o)}catch(e){continue}return[e,[r[0]]]}const a=[GeometryFormat.XYZ,GeometryFormat.XY,GeometryFormat.LAT_LON];for(const t of a){const r=ae(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of j){const a=ne(o[0],r);if(void 0!==a){try{se(a,r,t,o)}catch(e){continue}return[e,[a]]}}return[GeometryFormat.NONE,[]]}function se(e,t,r,o){return{columnIndices:[e],geometries:o.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),r)}))}}function me(e,t,r){let o=!1,a=!0,n=!0,i=!0;const m=new Set,{data:l,includeHeaderRow:f,dateFormat:d,primaryKeyField:p,locale:y}=e,g=f?l[0]:[],h=f?l.slice(1):l;for(const e of h){const r=e[t];r?.raw&&(m.add(r.raw),o=!0,a&&(a=G(r.raw,y)||Number.isNaN(r.raw)),n&&(n=r.raw instanceof Date||s(d||c,r.raw)!==u),i&&(i=s(d||C,r.formatted)!==u))}const w=m.size===h.length;return p&&g[t]?.raw===p||r&&o&&w&&a?"esriFieldTypeOID":o&&i?"esriFieldTypeDate":o&&a?"esriFieldTypeDouble":o&&n?"esriFieldTypeDate":"esriFieldTypeString"}async function ce(e,t,r){const{escapeFormulaChars:o,locale:a,numberFormat:n,dateFormat:i}=r;if("esriFieldTypeDouble"===t.type||"esriFieldTypeOID"===t.type)return"number"==typeof e?e:e?E({locale:a,format:n},e):null;if("esriFieldTypeDate"===t.type){if(e instanceof Date)return e.getTime();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new Date(t.y,t.m-1,t.d,t.H,t.M,t.S).getTime():void 0}return""===e?null:s({locale:a,format:i},e).getTime()}const m=e?.toString()??"";if(o&&m.startsWith("\t"))for(const e of I)if(m.length>1&&m.charAt(1)===e)return m.substring(1);return m}function le(e){switch(e){case l.DATE_SHORT:return"dd/MM/yyyy";case l.DATE_LONG:return"MMMM d, yyyy";case l.TIME_SHORT:return"h:mm AM/PM";case l.TIME_LONG:return"h:mm:ss AM/PM";case l.DATE_TIME_SHORT:case l.DEFAULT:return"MMM d yyyy h:mm AM/PM";case l.DATE_TIME_LONG:return"MMMM d yyyy h:mm AM/PM";case l.FULL:return"dddd, MMMM d yyyy h:mm AM/PM";case l.ISO_8601:case l.ROUND_TRIP:return'yyyy-MM-dd"T"HH:mm:ss';default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("z")&&U().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&U().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function ue(e){switch(e){case b.ACCOUNTING:return'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)';case b.CURRENCY:return'"$"#,##0.00';case b.FIXED_POINT:case b.DEFAULT:return"0.0000";case b.NUMBER:return"#,##0.0000";case b.PERCENT:return"0%";case b.ROUND_TRIP:return"0.00000";default:return e}}function fe(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e)return e;if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime():e}let r=e.toString();return t.escapeFormulaChars&&(r=q(r)),r}function de(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function pe(e,t){return e.map((e=>de(e,t)))}function ye(e,t){return e.map((e=>pe(e,t)))}function ge(e,t,r){switch(t){case $.NUMBER:return e instanceof Date?e.getTime():E(e);case $.STRING:return e instanceof Date?m({format:r.dateFormat??l.ROUND_TRIP,timeZone:"UTC"},e):"number"==typeof e?x(r.numberFormat??b.DEFAULT,e):e.toString();case $.BOOLEAN:return!!e;case $.DATE:return s(e);default:return e.toString()}}
1
+ import e from"@arcgis/core/geometry/Point";import t from"@arcgis/core/geometry/SpatialReference";import{translate as r}from"../locale/language.js";import{toEsriApiGeometry as o,toPortalGeometry as a}from"../portal/Geometry.js";import{checkArg as n,assertNever as i}from"../utilities/checkArg.js";import{parse as s,format as c,DEFAULT_PARSING_FORMATS as m,DateFormat as l,INVALID_DATE as u}from"../utilities/date.js";import{esriToWKT as f,esriToGeoJSON as d,geoJSONToEsri as p,wktToEsri as y,esriWkidToWkt as g,esriWktToWkid as h,project as w,isPoint as F,isMultipoint as N,isPolyline as S,isPolygon as T,isExtent as O}from"../utilities/geometry.js";import{getLogger as R}from"../utilities/log.js";import{isNumeric as G,parse as E,format as x,NumberFormat as b}from"../utilities/number.js";import{caseInsensitiveEquals as A}from"../utilities/string.js";import{Feature as D}from"./Feature.js";import{FeatureSet as M}from"./FeatureSet.js";const I=["=","-","+","@"],_='"',v="\r\n",L="\n",C=[...m.map(ue),"M/d/yy"],P=/(\w+)_(point|multipoint|polyline|polygon)z?/;var $;function U(){return R("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}($||($={}));export const FIELD_NAME_REGEX=/[^a-zA-Z\d_]/g;export var GeometryFormat;!function(e){e.NONE="NONE",e.WKT="WKT",e.XY="XY",e.XYZ="XYZ",e.LAT_LON="LAT_LONG",e.GEO_JSON="GEO_JSON",e.ARCGIS_JSON="ARCGIS_JSON"}(GeometryFormat||(GeometryFormat={}));export const geometryTypeHeaders={[GeometryFormat.XYZ]:[["x","y","z"]],[GeometryFormat.XY]:[["x","y"]],[GeometryFormat.LAT_LON]:[["latitude","longitude"],["lat","lon"],["lat","long"]],[GeometryFormat.ARCGIS_JSON]:[["geometry"]],[GeometryFormat.GEO_JSON]:[["geometry"]],[GeometryFormat.WKT]:[["geometry"]]};const j=[[GeometryFormat.ARCGIS_JSON,te],[GeometryFormat.GEO_JSON,re],[GeometryFormat.WKT,oe]],W=new Map(j);export async function uploadDataToFeatureSet(t){const o=function(t){const{data:r,includeHeaderRow:o,geometryFormat:a,geometryFields:n,locale:s,numberFormat:c,inSpatialReference:m}=t,l=o?r.slice(1):r;if(a===GeometryFormat.NONE)return{columnIndices:[]};const u=e=>ie(e,s,c),f=(t,r)=>{const o=r===GeometryFormat.XYZ,a=r===GeometryFormat.LAT_LON;return{columnIndices:t,geometries:l.map((r=>{if(r.length>=Math.max(...t)&&G(r[t[0]]?.raw,s)&&G(r[t[1]]?.raw,s)&&(!o||G(r[t[2]]?.raw,s)))return new e({x:u(a?r[t[1]].raw:r[t[0]].raw),y:u(a?r[t[0]].raw:r[t[1]].raw),z:o?u(r[t[2]].raw):0,spatialReference:m})}))}},d=(e,t)=>({columnIndices:[e],geometries:l.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),m)}))}),p=(e,t)=>{switch(t){case GeometryFormat.NONE:return{columnIndices:[0]};case GeometryFormat.LAT_LON:case GeometryFormat.XYZ:case GeometryFormat.XY:return f(e,t);case GeometryFormat.ARCGIS_JSON:return d(e[0],te);case GeometryFormat.GEO_JSON:return d(e[0],re);case GeometryFormat.WKT:return d(e[0],oe);default:return i(t,new Error(`Unknown geometry format "${t}".`))}};if(a){const e=ae(o?r[0]:r[0].map(((e,t)=>({raw:t.toString()}))),a,o?n:n.map((e=>""+(parseInt(e.match(/\d+/g)[0])-1))));if(o&&void 0===e)throw new Error(`Error parsing file data: Expected geometry columns ${geometryTypeHeaders[a][0].join(",")} are missing for GeometryType.${a}`);return p(e??[0],a)}const[y,g]=se(r,m,o);if(y===GeometryFormat.NONE)return{columnIndices:[]};return g.length>1?f(g,y):d(g[0],W.get(y))}(t),a=function(e,t){const{data:o,displayField:a,includeHeaderRow:n,inSpatialReference:i,outSpatialReference:s,generatePrimaryKey:c}=e,m={fields:[]},l=e=>!(!t.columnIndices||0===t.columnIndices.length)&&t.columnIndices.includes(e);let{primaryKeyField:u}=e,f=0;for(let t=0;t<o[0].length;t++){if(l(t))continue;const a=me(e,t,!c&&!u&&!m.fields.find((e=>"esriFieldTypeOID"===e.type)));let i=o[0][t]?.raw?.toString(),s=i?.replace(FIELD_NAME_REGEX,"_");n&&s||(s="field"+ ++f,i=r("gcx.api.data.convert.import-field-alias",f)),m.fields.push({alias:i,name:s,type:a}),"esriFieldTypeOID"===a&&(u=s)}if(m.spatialReference=s??t.geometries?.[0]?.spatialReference??i,t.geometries?.length){const e=t.geometries.filter((e=>void 0!==e)).map((e=>e.type)),r=e[0];m.geometryType=e.every((e=>e===r))?r:void 0}if(!m.fields.find((e=>"esriFieldTypeOID"===e.type))){const e=m.fields.length+1,t=!!m.fields.find((e=>"objectid"===e.name.toLowerCase()));u=t?`OBJECTID_${e}`:"OBJECTID",m.fields.push({name:u,alias:u,type:"esriFieldTypeOID"})}return m.displayField=a??m.fields.find((e=>e.name!==u&&"esriFieldTypeString"===e.type))?.name??m.fields.find((e=>e.name!==u))?.name??u,m.primaryKeyField=u,m}(t,o),n=await async function(e,t,r){const{data:o,includeHeaderRow:a,outFields:n,escapeFormulaChars:i,locale:s,numberFormat:c,dateFormat:m}=e,{spatialReference:l}=r,u=[],f=a?o.slice(1):o,d=(e,r)=>!t.columnIndices||0===t.columnIndices.length||!t.columnIndices.includes(r);return await Promise.all(f.map((async(e,o)=>{const a=new D;for(let t=0;t<r.fields.length;t++){const l=r.fields[t],u=e.filter(d);if(n.includes("*")||n.includes(l.name)){let e=await le(u[t]?.raw,l,{escapeFormulaChars:i,dateFormat:m,numberFormat:c,locale:s});"esriFieldTypeOID"===l.type&&null===e&&(e=o),a.attributes.set(l.name,e)}}t.geometries&&(a.geometry=await k(t.geometries[o],l)),u.push(a)}))),u}(t,o,a);return new M({features:n,schema:a})}export async function toCsv(e,r){n("featureSet",e).isNotMissing();const o=Array.from(e),a={...{useFormattedValues:!1,alwaysQuote:!1,escapeFormulaChars:!0,delimiter:",",dateFormat:l.ROUND_TRIP,geometryFormat:o.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,includeByteOrderMark:!0,outSpatialReference:t.WGS84,includeHeaderRow:!0,outFields:J(e.source),rowDelimiter:navigator.platform.startsWith("Win")?v:L},...r},{includeByteOrderMark:i,includeHeaderRow:s,delimiter:c,outFields:m,rowDelimiter:u}=a,f=[];i&&f.push("\ufeff");const d=z(o,a),p=H(o,m,e.schema,!0),y=H(o,m,e.schema,!1);if(s){const e=[];for(const t of d)e.push(B(t,a));for(const t of p)e.push(B(t,a));for(const t of y)e.push(B(t,a));const t=e.join(c)+u;f.push(t)}await Promise.all(o.map((async e=>{const t=[],r=(t,r)=>B(Z(K(e,t,r),r),r);t.push(...await async function(e,t){let r=await Y(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":Z(e,t))));return r.map((e=>""===e?"":B(e,t)))}(e.geometry,a)),t.push(...p.map((e=>r(e,a)))),t.push(...y.map((e=>r(e,a))));const o=`${t.join(c)}${u}`;f.push(o)})));return new Blob(f,{type:"text/plain",endings:u===L||u===v?"transparent":"native"})}export async function csvToUploadData(e,t){let o;if(n("csvData",e).isNotMissing(),e instanceof Blob){const t=new Promise(((t,r)=>{const o=new FileReader;o.onload=()=>{t(o.result)},o.onerror=()=>{r(o.error)},o.readAsText(e)}));o=await t}else o=e;const a=X(t),i=function(e,t,r){const o=[],a=(e,t)=>{const o=[];return ee(e,r,((r,a)=>{const n=e.substring(r,a);return o.push({raw:Q(n,t,o.length)}),!0})),o};if(ee(e,t,((t,r)=>{const n=e.substring(t,r);return n.length>0&&o.push(a(n,o.length)),!0})),o.length){const e=o[0].length;o.forEach(((t,r)=>{if(t.length!==e)throw new Error(`Detected invalid CSV: Row ${r} does not have expected number of columns: ${e}`)}))}return o}(o,a.rowDelimiter||function(e){let t=L;return ee(e,v,((r,o)=>(0===r&&o===e.length||(t=v),!1))),t}(o),a.delimiter);let{geometryFormat:s,geometryFields:c}=t;if(!s){const[e,t]=se(i,a.inSpatialReference,a.includeHeaderRow);s=e,c=t.map((e=>a.includeHeaderRow?i[0][e]?.raw??r("gcx.api.data.convert.import-field-alias",(e+1).toString()):r("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:i,...a,geometryFormat:s,geometryFields:c}}export async function csvToFeatureSet(e,t){const r=X(t);return uploadDataToFeatureSet(await csvToUploadData(e,r))}export async function toXLSX(e,r){n("featureSet",e).isNotMissing();const o=Array.from(e),a={...{useFormattedValues:!1,includeHeaderRow:!0,escapeFormulaChars:!0,geometryFormat:o.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,outFields:J(e.source),outSpatialReference:t.WGS84,dateFormat:l.DEFAULT,numberFormat:b.DEFAULT,sheetName:"sheet1"},...r},{outFields:i,includeHeaderRow:s,dateFormat:c,numberFormat:m}=a,u=[],f=z(o,a),d=H(o,i,e.schema,!0),p=H(o,i,e.schema,!1);if(s){const t=f.concat(d).concat(function(e,t){const r=t?.schema?.fieldExtensions.initializedItems.map((e=>e.field));return e.map((e=>r?.find((t=>t.name===e))?.alias??e))}(p,e.source));u.push(t)}await Promise.all(o.map((async e=>{const t=[];t.push(...await Y(e.geometry,a));for(const r of d){const o=de(e.attributes.get(r),a);t.push(o)}for(const r of p){const o=de(K(e,r,a),a);t.push(o)}t.every((e=>"string"!=typeof e||e.length<=32767))?u.push(t):U().warn(`toXLSX cell limit exceeded, feature (${e.primaryKey??e.id}) omitted.`)})));const y=await import("xlsx"),g={SheetNames:[],Sheets:{}},h=y.utils.aoa_to_sheet(u,{cellDates:!0});for(const e of Object.keys(h).filter((e=>!e.startsWith("!")))){const t=h[e];"d"===t.t?t.z=ue(c??l.ROUND_TRIP):"n"===t.t&&(t.z=fe(m))}g.SheetNames.push(a.sheetName),g.Sheets[a.sheetName]=h;const w=y.write(g,{type:"binary",bookType:"xlsx",compression:!0,bookSST:!0,cellDates:!0}),F=new Uint8Array(w.length);for(let e=0;e<w.length;e++)F[e]=w.charCodeAt(e);return new Blob([F.buffer],{type:"text/plain"})}export async function xlsxToUploadData(e,t){n("xlsxData",e).isNotMissing();const o=X(t),a=await async function(e,t){const r=await import("xlsx"),o=new Promise(((o,a)=>{const n=new FileReader;n.onload=()=>{const e=new Uint8Array(n.result);let a="";for(const t of e)a+=String.fromCharCode(t);const i=r.read(a,{type:"binary",cellDates:!0}),s=t.sheetName||i.SheetNames[0],c=i.Sheets[s];o(c)},n.onerror=()=>{a(n.error)},n.readAsArrayBuffer(e)})),a=await o,n=r.utils.decode_range(a["!ref"]),i=[];for(let e=n.s.r;e<=n.e.r;e++){const t=[];for(let o=n.s.c;o<=n.e.c;o++){const n=a[`${r.utils.encode_cell({r:e,c:o})}`];t.push(n?{raw:n.v,formatted:"s"===n.t?void 0:n.w}:{raw:""})}i.push(t)}return i}(e,o);let{geometryFormat:i,geometryFields:s}=t;if(!i){const[e,t]=se(a,o.inSpatialReference,o.includeHeaderRow);i=e,s=t.map((e=>o.includeHeaderRow?a[0][e]?.raw.toString()??r("gcx.api.data.convert.import-field-alias",(e+1).toString()):r("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:a,...o,geometryFormat:i,geometryFields:s}}export async function xlsxToFeatureSet(e,t){n("xlsxData",e).isNotMissing();const r=X(t);return uploadDataToFeatureSet(await xlsxToUploadData(e,r))}export async function toShapefile(e,r){n("featureSet",e).isNotMissing();const[{default:o},a]=await Promise.all([import("jszip"),import("../forked-libs/shp-write/index.js")]),i=Array.from(e),s={...{useFormattedValues:!1,outFields:J(e.source),fileName:e.title||"export"},...r},{outFields:c,outSpatialReference:m,fileName:l}=s,u=e=>e.geometry.hasZ||e.geometry.hasM,f=new Map,d=i.filter((e=>F(e.geometry)));f.set("POINTZ",d.filter(u)),f.set("POINT",d.filter((e=>!u(e))));const p=i.filter((e=>N(e.geometry)));f.set("MULTIPOINTZ",p.filter(u)),f.set("MULTIPOINT",p.filter((e=>!u(e))));const y=i.filter((e=>S(e.geometry)));f.set("POLYLINEZ",y.filter(u)),f.set("POLYLINE",y.filter((e=>!u(e))));const h=i.filter((e=>T(e.geometry)||O(e.geometry)));f.set("POLYGONZ",h.filter(u)),f.set("POLYGON",h.filter((e=>!u(e))));const w=H(i,c,e.schema,!0);let R=H(i,c,e.schema,!1);R=w.concat(R);const G=new o,E=Array.from(f.keys()).filter((e=>f.get(e).length>0));await Promise.all(E.map((async r=>{const o=f.get(r),n=await Promise.all(o.map((e=>k(e.geometry,m)))),i=await async function(e){const{wkid:r,wkt:o}=e[0].spatialReference;if(!e.every((e=>e.spatialReference.wkid===r&&e.spatialReference.wkt===o)))throw new Error("Cannot create shapefile that contains geometries with different spatial references.");return o??g(r??t.WGS84.wkid)}(n),c=s.useFormattedValues?Object.assign({},...R.map((e=>({[e]:$.STRING})))):function(e,t,r,o){const a={};for(const n of t){if(e.some((e=>V(e,n)))){a[n]=$.STRING;continue}const t=r?r.fields.find((e=>e.name===n)):void 0;if(t){switch(t.type){case"oid":case"double":case"integer":case"single":case"small-integer":a[n]=$.NUMBER;break;case"date":a[n]=o?$.NUMBER:$.DATE;break;default:a[n]=$.STRING}continue}const i=(e,t)=>e.attributes.get(t)??e.presentableAttributes.get(t);e.every((e=>i(e,n)instanceof Date||void 0===i(e,n)))&&e.some((e=>i(e,n)instanceof Date))?a[n]=o?$.NUMBER:$.DATE:e.every((e=>"number"==typeof i(e,n)||void 0===i(e,n)))&&e.some((e=>"number"==typeof i(e,n)))?a[n]=$.NUMBER:e.every((e=>"boolean"==typeof i(e,n)||void 0===i(e,n)))&&e.some((e=>"boolean"==typeof i(e,n)))?a[n]=$.BOOLEAN:a[n]=$.STRING}return a}(o,R,e.schema,"timestamp"===s.dateFormat),u=function(e){return e.map((e=>{if(F(e)){const{x:t,y:r,z:o,m:a}=e,n=[t,r];return e.hasZ&&n.push(o),e.hasM&&n.push(a),pe(n,e)}if(N(e))return ye(e.points,e);if(S(e))return ge(e.paths,e);if(T(e))return ge(e.rings,e);if(O(e)){const t=[e.xmin,e.ymax];return[[t,[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin],t]]}throw new Error("Unsupported geometry type.")}))}(n),d=function(e,t,r,o){const a=[];for(const n of e){const e={};for(const a of t){let t=K(n,a,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=he(t,r[a],o)}e[a]=t}a.push(e)}return a}(o,R,c,s);a.write(d,r,u,((e,t)=>{const o=E.length>1?`${l}_${r.toLowerCase()}`:l;G.file(`${o}.shp`,t.shp.buffer,{binary:!0}),G.file(`${o}.shx`,t.shx.buffer,{binary:!0}),G.file(`${o}.dbf`,t.dbf.buffer,{binary:!0}),G.file(`${o}.prj`,i)}))})));const x=await G.generateAsync({type:"uint8array"});return new Blob([x.buffer],{type:"text/plain"})}export async function shapefileToUploadData(r,o){n("shapefileData",r).isNotMissing();const a=X(o),i=new Promise(((e,t)=>{const o=new FileReader;o.onload=()=>{e(o.result)},o.onerror=()=>{t(o.error)},o.readAsArrayBuffer(r)})),[{default:s},{default:c}]=await Promise.all([import("jszip"),import("shpjs")]),m=await i,l=await s.loadAsync(new Uint8Array(m)),u=l.filter((()=>!0)).map((e=>e.name));let f,d=u.filter((e=>e.endsWith(".shp"))).map((e=>e.substring(0,e.length-4)));if(d=function(e){if(!e.length)return[];let t=e[0];const r=t.match(P);return r?(t=r[1],e.filter((e=>{const r=e.match(P);return r&&r[1]===t}))):[t]}(d),u.some((e=>e.endsWith(".prj")))&&!d.every((e=>u.includes(`${e}.prj`))))throw new Error("Shapefile zip must contain the same prj file for each separate shapefile");await Promise.all(u.filter((e=>e.endsWith(".prj"))).map((async e=>{const t=await l.file(e).async("string");if(f){if(t!==f)throw new Error("Shapefile zip must contain the same prj file for each separate shapefile")}else f=t})));let y=[],g=[];for(const e of d){if(!u.includes(`${e}.shx`)||!u.includes(`${e}.dbf`))throw new Error("Shapefile must contain shp, shx, and dbf files.");const t=await l.file(`${e}.shp`).async("uint8array"),r=c.parseShp(t),o=await l.file(`${e}.dbf`).async("uint8array"),a=c.parseDbf(o);if(a.length!==r.length)throw new Error("Shapefile must contain shp, shx, and dbf files.");y=y.concat(a),g=g.concat(r)}const w=await Promise.all(g.map((r=>async function(r,o){const a=F(r)?function(r){n("geometry.coordinates",r.type).matches("Point"),n("geometry.coordinates",r.coordinates).satisfies((e=>"number"==typeof e||Array.isArray(e)));const[o,a,i]=r.coordinates,s=new e({x:o,y:a,spatialReference:t.WGS84});if(Array.isArray(i)){const[e,t]=i;!e&&!t||e?s.z=e:s.m=t}return s}(r):p(r);if(o){let e;try{const r=await h(o);e=new t({wkid:E(r)})}catch{}e||(e=new t({wkt:o})),a.spatialReference=e}return a}(r,f)))),N=geometryTypeHeaders[GeometryFormat.ARCGIS_JSON][0][0];y.forEach(((e,t)=>e[N]=JSON.stringify(w[t].toJSON())));return{data:function(e){const t=e.map((e=>Object.keys(e))).reduce(((e,t)=>e.concat(t.filter((t=>!e.includes(t))))),[]);return[t.map((e=>({raw:e}))),...e.map((e=>t.map((t=>({raw:e[t]})))))]}(y),...a,geometryFormat:GeometryFormat.ARCGIS_JSON,geometryFields:[N],inSpatialReference:w[0]?.spatialReference??t.fromJSON({wkid:4326})}}export async function shapefileToFeatureSet(e,t){n("shapefileData",e).isNotMissing();const r=X(t);return uploadDataToFeatureSet(await shapefileToUploadData(e,r))}function X(e){return{...{delimiter:",",escapeFormulaChars:!0,includeHeaderRow:!0,outFields:["*"],inSpatialReference:t.WGS84,generatePrimaryKey:!1,locale:"inv"},...e,detectOid:!e?.primaryKeyField}}function z(e,t){return t.geometryFormat===GeometryFormat.XYZ?["x","y","z"]:t.geometryFormat===GeometryFormat.XY?["x","y"]:t.geometryFormat===GeometryFormat.LAT_LON?["latitude","longitude"]:t.geometryFormat===GeometryFormat.NONE?[]:["geometry"]}function H(e,t,r,o){const a=r.fields.filter((e=>"oid"===e.type)).map((e=>e.name)).toArray();if(o)return a;if(t&&!t.includes("*"))return t.filter((e=>!a.includes(e)));{const t=r.fields.filter((e=>"oid"!==e.type)).map((e=>e.name)).toArray();let o=[];for(const r of e)for(const e of r.attributes.keys())t.includes(e)||a.includes(e)||o.includes(e)||o.push(e);return o=o.sort(),t.concat(o)}}function J(e){if(!e)return["*"];const t=e.featureSettings.popupTemplate?.content;return(Array.isArray(t)?t.find((e=>"fields"===e.type))?.fieldInfos?.filter((e=>e.visible))?.map((e=>e.fieldName)):void 0)??e.featureSettings.popupTemplate?.fieldInfos?.filter((e=>e.visible))?.map((e=>e.fieldName))??["*"]}async function Y(e,t){const r=await k(e,t.outSpatialReference);if(t.geometryFormat===GeometryFormat.XYZ){if(!r)return["","",""];if(!F(r))throw new Error("Cannot use geometry format XYZ with non-point geometry");return[r.x,r.y,r.z]}if(t.geometryFormat===GeometryFormat.XY){if(!r)return["",""];if(!F(r))throw new Error("Cannot use geometry format XY with non-point geometry");return[r.x,r.y]}if(t.geometryFormat===GeometryFormat.LAT_LON){if(!r)return["",""];if(!F(r))throw new Error("Cannot use geometry format LAT_LONG with non-point geometry");return[r.y,r.x]}return t.geometryFormat===GeometryFormat.ARCGIS_JSON?r?[JSON.stringify(a(r))]:[""]:t.geometryFormat===GeometryFormat.WKT?r?[f(r)]:[""]:t.geometryFormat===GeometryFormat.GEO_JSON?r?[JSON.stringify(d(r))]:[""]:[]}async function k(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await w([e],t))[0]:e}function B(e,t){const r=[t.delimiter,_,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(_,"g"),`${_}${_}`);return`${_}${t}${_}`}return e}function Z(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e){const r=t.numberFormat||b.ROUND_TRIP;return x(r,e)}if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime().toString():c({format:t.dateFormat,timeZone:"UTC"},e)}let r=e.toString();return t.escapeFormulaChars&&(r=q(r)),r}function K(e,t,r){if(r.useFormattedValues||V(e,t))return e.presentableAttributes.get(t)??e.attributes.get(t);if("date"===e.schema.findFieldByName(t)?.type){const r=s(e.attributes.get(t));if(!isNaN(r.getTime()))return r}return e.attributes.get(t)??e.presentableAttributes.get(t)}function V(e,t){return!!A(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function q(e){for(const t of I)if(e.startsWith(t))return`\t${e}`;return e}function Q(e,t,r){const o=e.startsWith(_),a=e.endsWith(_);if(o&&!a||!o&&a)throw new Error(`Detected invalid CSV: Missing opening or closing quote for value at row:${t} column:${r}`);const n=o?e.substring(_.length,e.length-_.length):e;let i=-1;return ee(n,_,((e,o)=>{if(o===n.length)return!0;if(i<0){if(o!==n.length)return i=o,!0}else if(o===i+_.length)return i=-1,!0;throw new Error(`Detected invalid CSV: Non-escaped quote for value at row:${t} column:${r}`)})),n.replace(new RegExp(`${_}${_}`,"g"),_)}function ee(e,t,r){let o,a=!1,n=0,i=0;for(;o=e.indexOf(t,n),!(o<0);){for(let t=n;t<o;)e.substring(t).startsWith(_)?(a=!a,t+=_.length):t++;const s=o+t.length;if(!a){const e=r(i,o);if(i=s,!e)break}n=s}r(i,e.length)}function te(e,t){const r=JSON.parse(e),a=o(r);return r.spatialReference||(a.spatialReference=t),a}function re(e,t){const r=p(JSON.parse(e));return r.spatialReference=t,r}function oe(e,t){const r=y(e);return r.spatialReference=t,r}function ae(e,t,r){const o=r?[r]:geometryTypeHeaders[t];for(const t of o){const r=t.map((t=>e.map((e=>e?.raw?.toString().trim().toLowerCase())).indexOf(t.trim().toLowerCase())));if(r.every((e=>e>=0)))return r}}function ne(e,t){return e.map(((e,r)=>{const o=e?.raw;if("string"==typeof o&&""!==o)try{return t(o,void 0),r}catch{return}})).find((e=>void 0!==e))}function ie(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:E({locale:t,format:r},e)}function se(e,t,r){const o=r?e.slice(1):e;if(r){const r=ae(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,a]of j){try{ce(r[0],a,t,o)}catch(e){continue}return[e,[r[0]]]}const a=[GeometryFormat.XYZ,GeometryFormat.XY,GeometryFormat.LAT_LON];for(const t of a){const r=ae(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of j){const a=ne(o[0],r);if(void 0!==a){try{ce(a,r,t,o)}catch(e){continue}return[e,[a]]}}return[GeometryFormat.NONE,[]]}function ce(e,t,r,o){return{columnIndices:[e],geometries:o.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),r)}))}}function me(e,t,r){let o=!1,a=!0,n=!0,i=!0;const c=new Set,{data:l,includeHeaderRow:f,dateFormat:d,primaryKeyField:p,locale:y}=e,g=f?l[0]:[],h=f?l.slice(1):l;for(const e of h){const r=e[t];r?.raw&&(c.add(r.raw),o=!0,a&&(a=G(r.raw,y)||Number.isNaN(r.raw)),n&&(n=r.raw instanceof Date||s(d||m,r.raw)!==u),i&&(i=s(d||C,r.formatted)!==u))}const w=c.size===h.length;return p&&g[t]?.raw===p||r&&o&&w&&a?"esriFieldTypeOID":o&&i?"esriFieldTypeDate":o&&a?"esriFieldTypeDouble":o&&n?"esriFieldTypeDate":"esriFieldTypeString"}async function le(e,t,r){const{escapeFormulaChars:o,locale:a,numberFormat:n,dateFormat:i}=r;if("esriFieldTypeDouble"===t.type||"esriFieldTypeOID"===t.type)return"number"==typeof e?e:e?ie(e,a,n):null;if("esriFieldTypeDate"===t.type){if(e instanceof Date)return e.getTime();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new Date(t.y,t.m-1,t.d,t.H,t.M,t.S).getTime():void 0}return""===e?null:s({locale:a,format:i},e).getTime()}const c=e?.toString()??"";if(o&&c.startsWith("\t"))for(const e of I)if(c.length>1&&c.charAt(1)===e)return c.substring(1);return c}function ue(e){switch(e){case l.DATE_SHORT:return"dd/MM/yyyy";case l.DATE_LONG:return"MMMM d, yyyy";case l.TIME_SHORT:return"h:mm AM/PM";case l.TIME_LONG:return"h:mm:ss AM/PM";case l.DATE_TIME_SHORT:case l.DEFAULT:return"MMM d yyyy h:mm AM/PM";case l.DATE_TIME_LONG:return"MMMM d yyyy h:mm AM/PM";case l.FULL:return"dddd, MMMM d yyyy h:mm AM/PM";case l.ISO_8601:case l.ROUND_TRIP:return'yyyy-MM-dd"T"HH:mm:ss';default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("z")&&U().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&U().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function fe(e){switch(e){case b.ACCOUNTING:return'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)';case b.CURRENCY:return'"$"#,##0.00';case b.FIXED_POINT:case b.DEFAULT:return"0.0000";case b.NUMBER:return"#,##0.0000";case b.PERCENT:return"0%";case b.ROUND_TRIP:return"0.00000";default:return e}}function de(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e)return e;if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime():e}let r=e.toString();return t.escapeFormulaChars&&(r=q(r)),r}function pe(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function ye(e,t){return e.map((e=>pe(e,t)))}function ge(e,t){return e.map((e=>ye(e,t)))}function he(e,t,r){switch(t){case $.NUMBER:return e instanceof Date?e.getTime():E(e);case $.STRING:return e instanceof Date?c({format:r.dateFormat??l.ROUND_TRIP,timeZone:"UTC"},e):"number"==typeof e?x(r.numberFormat??b.DEFAULT,e):e.toString();case $.BOOLEAN:return!!e;case $.DATE:return s(e);default:return e.toString()}}
@@ -16,7 +16,7 @@
16
16
  <li><a href="../modules/version.html">version</a></li>
17
17
  <li><a href="version.version.html">version</a></li></ul>
18
18
  <h1>Variable version<code class="tsd-tag ts-flagConst">Const</code> </h1></div>
19
- <div class="tsd-signature"><span class="tsd-kind-variable">version</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">&quot;40.3.0&quot;</span><span class="tsd-signature-symbol"> = &quot;40.3.0&quot;</span></div>
19
+ <div class="tsd-signature"><span class="tsd-kind-variable">version</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">&quot;40.3.2&quot;</span><span class="tsd-signature-symbol"> = &quot;40.3.2&quot;</span></div>
20
20
  <div class="tsd-comment tsd-typography"><p>The current version of the Geocortex ArcGIS Extensions API.</p>
21
21
  </div></div>
22
22
  <div class="col-sidebar">
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vertigis/arcgis-extensions",
3
3
  "license": "SEE LICENSE IN LICENSE",
4
- "version": "40.3.0",
4
+ "version": "40.3.2",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://dev.azure.com/vertigis/Studio/_git/arcgis-extensions-ts"
package/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * The current version of the Geocortex ArcGIS Extensions API.
3
3
  */
4
- export declare const version = "40.3.0";
4
+ export declare const version = "40.3.2";
package/version.js CHANGED
@@ -1 +1 @@
1
- export const version="40.3.0";
1
+ export const version="40.3.2";