UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 4.77 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import e from"../../request.js";import{isSome as t}from"../../core/arrayUtils.js";import{isDateString as i}from"../../core/date.js";import r from"../../core/Error.js";import{_parseInfo as n}from"../../core/number.js";import{urlToObject as o}from"../../core/urlUtils.js";import l from"./Field.js";import{normalizeFieldName as s,getFieldDefaultLength as a}from"./fieldUtils.js";import{inferLocationInfo as c}from"./locationUtils.js";async function u(t,i={}){const{customParameters:n,signal:l}=i,s=o(t),a=await e(s.path,{query:{...s.query,...n},responseType:"native",signal:l});if(!a.data.body)throw new r("csv-utils:empty-csv","CSV is empty");const[c]=await Promise.allSettled([f(a.data.body)]);if(await a.data.body.cancel(),"rejected"===c.status)throw c.reason;return{url:t,customParameters:n,...c.value}}async function f(e){const t=e.getReader(),i=g(t),n=(await i.next()).value?.trim(),o=(await i.next()).value?.trim();if(t.releaseLock(),!n)throw new r("csv-utils:empty-csv","CSV is empty");const{delimiter:s,locationInfo:a}=F(n,o);if(!s)throw new r("csv-utils:invalid-delimiter","Unable to detect the delimiter from CSV",{firstLine:n,secondLine:o});const{names:c,aliases:u}=T(n,s);return{delimiter:s,fields:(await S(e,s,c,u,a)).map((e=>l.fromJSON(e))),latitudeField:a?.latitudeFieldName,longitudeField:a?.longitudeFieldName}}const d=/^\s*"([\S\s]*)"\s*$/,m=/""/g,p="\n",y=[","," ",";","|","\t"];async function*g(e){const t=/\r?\n/gm,i=new TextDecoder;let r="";for await(const n of h(e)){const e=`${r}${i.decode(n)}`.split(t).filter(Boolean);r=e.pop()||"",yield*e}}async function*h(e){let t=await e.read();for(;!t.done;)yield t.value,t=await e.read();e.releaseLock()}function F(e,t,i){e=e.trim(),t=t?.trim();const r=[],n=Array.from(new Set([i?.delimiter,...y])).filter((e=>null!=e));for(const l of n){const i=v(e,l).length,n=v(t,l).length??i;i>1&&r.push({weight:Math.min(i,n),delimiter:l})}const o=r.sort((({weight:e},{weight:t})=>t-e)).map((({delimiter:e})=>e));for(const l of o){const t=T(e,l).names,r=c(t,i?.longitudeField,i?.latitudeField);if(r.longitudeFieldName&&r.latitudeFieldName)return{delimiter:l,locationInfo:r}}return{delimiter:o[0],locationInfo:null}}async function*w(e,t,i,r=()=>Object.create(null)){let n="",o="",l=0,s=r(),a=0;for await(const c of e){const e=N(c,i);for(const c of e)if(n+=o+c,o="",l+=O(c),l%2==0){if(l>0){const e=d.exec(n);if(!e)return s=r(),a=0,n="",void(l=0);s[t[a]]=D(e[1]).replaceAll(m,'"'),a++}else s[t[a]]=D(n),a++;n="",l=0}else o=i;0===l?(yield s,s=r(),a=0):o=p}}function N(e,t){return b(e,t)}function*b(e,t){let i=0;for(;i<=e.length;){const r=e.indexOf(t,i),n=e.slice(i,r>-1?r:void 0);i+=n.length+t.length,yield n}}function T(e,i){const r=v(e,i).filter(t),n=r.map((e=>s(e)));for(let t=n.length-1;t>=0;t--)n[t]||(n.splice(t,1),r.splice(t,1));return{names:n,aliases:r}}function v(e,t){if(!e?.length)return[];const i=[];let r="",n="",o=0;const l=N(e,t);for(const s of l)if(r+=n+s,n="",o+=O(s),o%2==0){if(o>0){const e=d.exec(r);e&&i.push(e[1].replaceAll(m,'"'))}else i.push(r);r="",o=0}else n=t;return i}async function S(e,t,i,r,n){const o=e.getReader(),l=g(o),s=[],c=[];for await(const a of w(l,i,t)){if(10===c.length)break;c.push(a)}for(let u=0;u<i.length;u++){const e=i[u],t=r[u];if(e===n?.longitudeFieldName||e===n?.latitudeFieldName)s.push({name:e,type:"esriFieldTypeDouble",alias:t});else{const i=x(c.map((t=>t[e])))??"esriFieldTypeString";s.push({name:e,type:i,alias:t,length:a(i)})}}return o.releaseLock(),s}function x(e){if(!e.length)return"esriFieldTypeString";const t=/[^+\-.,0-9]/;return e.map((e=>{if(""!==e){if(!t.test(e)){let t=j(e);if(!isNaN(t))return/[.,]/.test(e)||!Number.isInteger(t)||t>214783647||t<-214783648?"esriFieldTypeDouble":"esriFieldTypeInteger";if(e.includes("E")){if(t=Number(e),!Number.isNaN(t))return"esriFieldTypeDouble";if(e.includes(",")&&(e=e.replace(",","."),t=Number(e),!Number.isNaN(t)))return"esriFieldTypeDouble"}}return i(e)?"esriFieldTypeDate":"esriFieldTypeString"}})).reduce(((e,t)=>void 0===e?t:void 0===t?e:e===t?t:"esriFieldTypeString"===e||"esriFieldTypeString"===t?"esriFieldTypeString":"esriFieldTypeDouble"===e||"esriFieldTypeDouble"===t?"esriFieldTypeDouble":void 0))}const j=function(){const e=n(),t=new RegExp("^"+e.regexp+"$"),i=new RegExp("["+e.group+"\\s\\xa0]","g"),r=e.factor;return n=>{const o=t.exec(n);if(e.factor=r,!o)return NaN;let l=o[1];if(!o[1]){if(!o[2])return NaN;l=o[2],e.factor*=-1}return l=l.replace(i,"").replace(e.decimal,"."),+l*e.factor}}();function D(e){return JSON.parse(JSON.stringify(e))}function O(e){let t=0,i=0;for(i=e.indexOf('"',i);i>=0;)t++,i=e.indexOf('"',i+1);return t}export{u as getCSVLayerInfo};